From e178486ce80b64a2a83d5313dd59294b8769680d Mon Sep 17 00:00:00 2001 From: John Calhoun Date: Tue, 26 Jan 2016 20:30:26 -0800 Subject: [PATCH] Initial check-in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There was an effort to organize the files a little bit for presenting in this repository. I hope I have included everything needed for both Glider 4.05 and the Room Editor 1.0.3. The code is in Pascal — THINK Pascal was used to build the original. I’m not sure how someone would open the project files (or for that matter the resource files) these days. Never mind there is also a .o file (SMS.a) representing a statically linked library (from hand-coded 68K assembly) for doing performant 4-channel sound on 68K Macs in the day (this was licensed from Patrick Buckland — I’m sure he won’t mind my preserving it here for posterity, right?). Art files, sound files of unknown format…. What a joy it will be sleuthing through these files…. Enjoy. --- Glider_405/B&W Art | 0 Glider_405/Color Art | 0 Glider_405/Glider Version History.txt | 1 + Glider_405/Glider.project | 0 Glider_405/Glider.rsrc | 0 Glider_405/Sources/G-FileInNOut.p | 1 + Glider_405/Sources/G-GameBody.p | 1 + Glider_405/Sources/G-GlobalUtils.p | 1 + Glider_405/Sources/G-Globals.p | 1 + Glider_405/Sources/G-IdleInput.p | 1 + Glider_405/Sources/G-IdleUtils.p | 1 + Glider_405/Sources/G-Initialize.p | 1 + Glider_405/Sources/G-PlayActive.p | 1 + Glider_405/Sources/G-PlaySetUp.p | 1 + Glider_405/Sources/G-PlayUtils.p | 1 + Glider_405/Sources/Glider Balloons | 0 Glider_405/Sources/SMS.p | 1 + Glider_405/Sources/SMSCore.a.o | Bin 0 -> 3894 bytes Glider_405/Sources/SetPage.Lib | 0 Glider_405/Sources/sms.a.o | Bin 0 -> 2262 bytes Glider_Sound_Files/Aww-22.glide | Bin 0 -> 17408 bytes Glider_Sound_Files/Bass-22.glide | 1 + Glider_Sound_Files/BeamIn-22.glide | Bin 0 -> 18421 bytes Glider_Sound_Files/BlowerOn-22.glide | Bin 0 -> 12864 bytes Glider_Sound_Files/Bounce-22.glide | Bin 0 -> 3376 bytes Glider_Sound_Files/Clock-22.glide | Bin 0 -> 10912 bytes Glider_Sound_Files/Crunch-22.glide | Bin 0 -> 7808 bytes Glider_Sound_Files/Drip-22.glide | 1 + Glider_Sound_Files/Energize-22.glide | Bin 0 -> 14592 bytes Glider_Sound_Files/Extra-22.glide | Bin 0 -> 16512 bytes Glider_Sound_Files/FireBand-22.glide | Bin 0 -> 830 bytes Glider_Sound_Files/GetBand-22.glide | 1 + Glider_Sound_Files/GoodMove-22.glide | Bin 0 -> 9024 bytes Glider_Sound_Files/GreaseFall-22.glide | Bin 0 -> 4869 bytes Glider_Sound_Files/Guitar-22.glide | Bin 0 -> 8389 bytes Glider_Sound_Files/Hey!-22.glide | Bin 0 -> 7468 bytes Glider_Sound_Files/Lightning-22.glide | Bin 0 -> 15066 bytes Glider_Sound_Files/Lightning2-22 | Bin 0 -> 26398 bytes Glider_Sound_Files/LightsOn-22.glide | Bin 0 -> 848 bytes Glider_Sound_Files/MusicBite | 1 + Glider_Sound_Files/Pop-22.glide | Bin 0 -> 814 bytes Glider_Sound_Files/Push-22.glide | Bin 0 -> 1152 bytes Glider_Sound_Files/Shredder-22.glide | 1 + Glider_Sound_Files/TeaKettle | Bin 0 -> 11348 bytes Glider_Sound_Files/Tick-22.glide | 1 + Glider_Sound_Files/ToastDrop-22.glide | Bin 0 -> 2544 bytes Glider_Sound_Files/ToastJump-22.glide | Bin 0 -> 1920 bytes Glider_Sound_Files/Yow!-22.glide | Bin 0 -> 9152 bytes Glider_Sound_Files/Zap-22.glide | Bin 0 -> 3936 bytes Glider_Sound_Files/snd.rsrc | 0 Houses/Combo House | Bin 0 -> 13830 bytes Houses/Combo House 2 | Bin 0 -> 13830 bytes Houses/Combo House 3 | Bin 0 -> 13830 bytes Houses/Combo House 4 | Bin 0 -> 13830 bytes Houses/Combo House Read Me.txt | 1 + Houses/Glass House | Bin 0 -> 13830 bytes Houses/Glass House 2 | Bin 0 -> 13830 bytes Houses/Glass House ReadMe.txt | 1 + Houses/Hands-off House | Bin 0 -> 13830 bytes Houses/Hands-off ReadMe.txt | 1 + Houses/House Full of Stuff | Bin 0 -> 13830 bytes Houses/House Full of Stuff 2 | Bin 0 -> 13830 bytes Houses/House Full of Stuff Next Door | Bin 0 -> 13830 bytes Houses/House Full of Stuff Next Door 2 | Bin 0 -> 13830 bytes Houses/House Full of Stuff Read Me.txt | 1 + Houses/House Next Door Read Me.txt | 1 + Houses/House of Doom | Bin 0 -> 13830 bytes Houses/House of Doom Read Me.txt | 1 + Houses/House of the Rising Sun | Bin 0 -> 13830 bytes Houses/House of the Rising Sun 1 | Bin 0 -> 13830 bytes Houses/House of the Rising Sun 2 | Bin 0 -> 13830 bytes Houses/House of the Rising Sun 3 | Bin 0 -> 13830 bytes Houses/Lumpy's Home | Bin 0 -> 13830 bytes Houses/Lumpy's Home Read Me.txt | 1 + Houses/Mad House | Bin 0 -> 13830 bytes Houses/Mad House 2 | Bin 0 -> 13830 bytes Houses/Mad House Read Me.txt | 1 + Houses/Rising Sun Read Me.txt | 1 + Houses/The House | Bin 0 -> 13830 bytes Houses/The House 2 | Bin 0 -> 13830 bytes Houses/Usher House | Bin 0 -> 13830 bytes Houses/Usher House Read Me.txt | 1 + RoomEditor_103/Editor.project | 0 RoomEditor_103/Editor.rsrc | 0 RoomEditor_103/Room Editor Version History.txt | 1 + RoomEditor_103/Sources/About.lib (2.1) | Bin 0 -> 6944 bytes RoomEditor_103/Sources/About… 2.1 Intf.p | 1 + RoomEditor_103/Sources/E-Drawing.p | 1 + RoomEditor_103/Sources/E-FileInNOut.p | 1 + RoomEditor_103/Sources/E-FlyGlider.p | 1 + RoomEditor_103/Sources/E-GameBody.p | 1 + RoomEditor_103/Sources/E-Globals.p | 1 + RoomEditor_103/Sources/E-HouseStuff.p | 1 + RoomEditor_103/Sources/E-Initialize.p | 1 + RoomEditor_103/Sources/E-ObjectStuff.p | 1 + RoomEditor_103/Sources/E-RoomStuff.p | 1 + RoomEditor_103/Sources/E-TheMenus.p | 1 + RoomEditor_103/Sources/E-Utilities.p | 1 + 98 files changed, 41 insertions(+) create mode 100755 Glider_405/B&W Art create mode 100755 Glider_405/Color Art create mode 100755 Glider_405/Glider Version History.txt create mode 100755 Glider_405/Glider.project create mode 100755 Glider_405/Glider.rsrc create mode 100755 Glider_405/Sources/G-FileInNOut.p create mode 100755 Glider_405/Sources/G-GameBody.p create mode 100755 Glider_405/Sources/G-GlobalUtils.p create mode 100755 Glider_405/Sources/G-Globals.p create mode 100755 Glider_405/Sources/G-IdleInput.p create mode 100755 Glider_405/Sources/G-IdleUtils.p create mode 100755 Glider_405/Sources/G-Initialize.p create mode 100755 Glider_405/Sources/G-PlayActive.p create mode 100755 Glider_405/Sources/G-PlaySetUp.p create mode 100755 Glider_405/Sources/G-PlayUtils.p create mode 100755 Glider_405/Sources/Glider Balloons create mode 100755 Glider_405/Sources/SMS.p create mode 100755 Glider_405/Sources/SMSCore.a.o create mode 100755 Glider_405/Sources/SetPage.Lib create mode 100755 Glider_405/Sources/sms.a.o create mode 100755 Glider_Sound_Files/Aww-22.glide create mode 100755 Glider_Sound_Files/Bass-22.glide create mode 100755 Glider_Sound_Files/BeamIn-22.glide create mode 100755 Glider_Sound_Files/BlowerOn-22.glide create mode 100755 Glider_Sound_Files/Bounce-22.glide create mode 100755 Glider_Sound_Files/Clock-22.glide create mode 100755 Glider_Sound_Files/Crunch-22.glide create mode 100755 Glider_Sound_Files/Drip-22.glide create mode 100755 Glider_Sound_Files/Energize-22.glide create mode 100755 Glider_Sound_Files/Extra-22.glide create mode 100755 Glider_Sound_Files/FireBand-22.glide create mode 100755 Glider_Sound_Files/GetBand-22.glide create mode 100755 Glider_Sound_Files/GoodMove-22.glide create mode 100755 Glider_Sound_Files/GreaseFall-22.glide create mode 100755 Glider_Sound_Files/Guitar-22.glide create mode 100755 Glider_Sound_Files/Hey!-22.glide create mode 100755 Glider_Sound_Files/Lightning-22.glide create mode 100755 Glider_Sound_Files/Lightning2-22 create mode 100755 Glider_Sound_Files/LightsOn-22.glide create mode 100755 Glider_Sound_Files/MusicBite create mode 100755 Glider_Sound_Files/Pop-22.glide create mode 100755 Glider_Sound_Files/Push-22.glide create mode 100755 Glider_Sound_Files/Shredder-22.glide create mode 100755 Glider_Sound_Files/TeaKettle create mode 100755 Glider_Sound_Files/Tick-22.glide create mode 100755 Glider_Sound_Files/ToastDrop-22.glide create mode 100755 Glider_Sound_Files/ToastJump-22.glide create mode 100755 Glider_Sound_Files/Yow!-22.glide create mode 100755 Glider_Sound_Files/Zap-22.glide create mode 100755 Glider_Sound_Files/snd.rsrc create mode 100755 Houses/Combo House create mode 100755 Houses/Combo House 2 create mode 100755 Houses/Combo House 3 create mode 100755 Houses/Combo House 4 create mode 100755 Houses/Combo House Read Me.txt create mode 100755 Houses/Glass House create mode 100755 Houses/Glass House 2 create mode 100755 Houses/Glass House ReadMe.txt create mode 100755 Houses/Hands-off House create mode 100755 Houses/Hands-off ReadMe.txt create mode 100755 Houses/House Full of Stuff create mode 100755 Houses/House Full of Stuff 2 create mode 100755 Houses/House Full of Stuff Next Door create mode 100755 Houses/House Full of Stuff Next Door 2 create mode 100755 Houses/House Full of Stuff Read Me.txt create mode 100755 Houses/House Next Door Read Me.txt create mode 100755 Houses/House of Doom create mode 100755 Houses/House of Doom Read Me.txt create mode 100755 Houses/House of the Rising Sun create mode 100755 Houses/House of the Rising Sun 1 create mode 100755 Houses/House of the Rising Sun 2 create mode 100755 Houses/House of the Rising Sun 3 create mode 100755 Houses/Lumpy's Home create mode 100755 Houses/Lumpy's Home Read Me.txt create mode 100755 Houses/Mad House create mode 100755 Houses/Mad House 2 create mode 100755 Houses/Mad House Read Me.txt create mode 100755 Houses/Rising Sun Read Me.txt create mode 100755 Houses/The House create mode 100755 Houses/The House 2 create mode 100755 Houses/Usher House create mode 100755 Houses/Usher House Read Me.txt create mode 100755 RoomEditor_103/Editor.project create mode 100755 RoomEditor_103/Editor.rsrc create mode 100755 RoomEditor_103/Room Editor Version History.txt create mode 100755 RoomEditor_103/Sources/About.lib (2.1) create mode 100755 RoomEditor_103/Sources/About… 2.1 Intf.p create mode 100755 RoomEditor_103/Sources/E-Drawing.p create mode 100755 RoomEditor_103/Sources/E-FileInNOut.p create mode 100755 RoomEditor_103/Sources/E-FlyGlider.p create mode 100755 RoomEditor_103/Sources/E-GameBody.p create mode 100755 RoomEditor_103/Sources/E-Globals.p create mode 100755 RoomEditor_103/Sources/E-HouseStuff.p create mode 100755 RoomEditor_103/Sources/E-Initialize.p create mode 100755 RoomEditor_103/Sources/E-ObjectStuff.p create mode 100755 RoomEditor_103/Sources/E-RoomStuff.p create mode 100755 RoomEditor_103/Sources/E-TheMenus.p create mode 100755 RoomEditor_103/Sources/E-Utilities.p diff --git a/Glider_405/B&W Art b/Glider_405/B&W Art new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Color Art b/Glider_405/Color Art new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Glider Version History.txt b/Glider_405/Glider Version History.txt new file mode 100755 index 0000000..98ded9f --- /dev/null +++ b/Glider_405/Glider Version History.txt @@ -0,0 +1 @@ + Glider 4.0 Version History 4.00 Original release. 4.01 In previous version, if you renamed "The House" to something else, you went through a maze of "bitch-at-you-dialogs" - this version corrects that - now it's: bitch-once/save-new-name (in preferences - the prefs are a resource type found in the Glider app). Now the Save command is no longer disabled - if a file-not-found comes up, the Save function passes the buck to the Save As function. Also I think I did a little tweaking on the "Sound" dialog box - the way it functions. 4.02 Previous versions obscured the top 20 pixels of the "Help" screens on a Mac Plus, SE, Classic, and SE 30 - this version hides the menu bar on these machines. Added a typewriter sound when you enter your name for the high scores. 4.03 Added 4 or 2 channel sound option to "Sound" dialog box - 2 channel is twice as loud and quicker as well (best for the 68000 machines) - 2 channel can sound a tad sloppy though when many sounds are firing at once (not too often and it's not too bad sounding anyway) - setting is stored in the preferences resource. Added color menu resources for color Macs. updated Casady & Greene address in About Glider 4.0 dialog box. 4.04 Fixed bug where "Can't find default house." message came up. Bumped 'SIZE' resource up from 880K to 920K to fix an out-of-memory problem. 4.05 Added trademark () symbol to all references to "Glider" (i.e. "Glider "). Renamed graphics files to "Color Art" and "B&W Art" (no longer "Art 16" & "Art 2"). Added a color animated cursor (a gray-shaded spinning beach ball - was only b&w). Now refer to the "!Mission Screen Init" as "MacsBug" (the new name we're using). Word-aligned almost all graphics in the color and b&w art files (this makes the game a tad faster - incidentally, now Glider 4.05 is incompatible with older versions of the graphics files - i.e. "Art 2" and "Art 16" will display improperly). Yanked out code that checked screen depth at the start of every game (this supposedly starts to choke up the System heap). If opening an art file fails (file not found), the default name is automatically selected and checked for. If an art file is opened and found to be the wrong pixel depth, the default art file name is looked for before bugging the user. Now updates screen after Quit/Save First/ Cancel sequence. \ No newline at end of file diff --git a/Glider_405/Glider.project b/Glider_405/Glider.project new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Glider.rsrc b/Glider_405/Glider.rsrc new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Sources/G-FileInNOut.p b/Glider_405/Sources/G-FileInNOut.p new file mode 100755 index 0000000..7f11a7b --- /dev/null +++ b/Glider_405/Sources/G-FileInNOut.p @@ -0,0 +1 @@ +unit FileInNOut; interface uses Palettes, Globals, GlobalUtils; function ErrorCheckFile: Boolean; function OpenHouse: Boolean; function DoOpen (whichType: Integer): Boolean; procedure DoClose (volNum: Integer); function GetHouse: Boolean; function ReadGame: Boolean; function SaveGameAs: Boolean; function SaveGame: Boolean; function WriteHouse: Boolean; implementation const dlgTop = 50; dlgLeft = 85; var typeIs: Integer; {=================================} function ErrorCheckFile; var nRooms, index: Integer; begin ErrorCheckFile := FALSE; with thisHouse do begin nRooms := numberORooms; if ((nRooms < 1) or (nRooms > 40)) then {check for valid # of rooms} begin Exit(ErrorCheckFile); end; for index := 1 to nRooms do {check PICT ID numbers} begin if (theRooms[index].backPictID < 200) or (theRooms[index].backPictID > 215) then begin Exit(ErrorCheckFile); end; end; end; ErrorCheckFile := TRUE; end; {=================================} function IOCheck (theErr: OSErr): OSErr; var dummyInt: Integer; line1, line2: Str255; alertHandle: AlertTHndl; alertRect: Rect; begin InitCursor; UseResFile(gliderResNum); if (theErr <> NoErr) then begin case theErr of DskFulErr: GetIndString(line1, rFileStrIDs, 1); FNFErr: begin fileWasLost := TRUE; GetIndString(line1, rFileStrIDs, 2); end; WPrErr: GetIndString(line1, rFileStrIDs, 3); FLckdErr: GetIndString(line1, rFileStrIDs, 4); VLckdErr: GetIndString(line1, rFileStrIDs, 5); FBsyErr, OpWrErr: GetIndString(line1, rFileStrIDs, 6); EOFErr: GetIndString(line1, rFileStrIDs, 7); otherwise GetIndString(line1, rFileStrIDs, 10); end; NumToString(theErr, line2); line2 := CONCAT('Error code = ', line2); ParamText(line1, line2, '', ''); alertHandle := AlertTHndl(Get1Resource('ALRT', rFileAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(rFileAlertID, nil); end; IOCheck := theErr; end; {=================================} function OpenHouse; var index: Integer; textLength: LongInt; ignored: Boolean; begin OpenHouse := FALSE; theErr := SetVol(nil, houseVolNum); if (IOCheck(theErr) <> 0) then Exit(OpenHouse); theErr := FSOpen(housesName, houseVolNum, houseNumber); if (IOCheck(theErr) <> 0) then begin if (not DoOpen(kHouseType)) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(OpenHouse); end; theErr := FSOpen(housesName, houseVolNum, houseNumber); if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(OpenHouse); end; end; theErr := SetFPos(houseNumber, FSFromStart, 0); if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(OpenHouse); end; textLength := SIZEOF(thisHouse); theErr := FSRead(houseNumber, textLength, @thisHouse); if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(OpenHouse); end; OpenHouse := TRUE; end; {=================================} function OpenSFGetHook (theSFitem: integer; theDialog: DialogPtr): integer; const statText = 11; {DITL item number of textAppButton} firstTime = -1; var itemToChange: Handle; {needed for GetDItem and SetCtlValue} itemBox: Rect; {needed for GetDItem} itemType: integer; {needed for GetDItem} statTitle: Str255; {needed for GetIndString} begin OpenSFGetHook := theSFitem; case theSFitem of firstTime: begin GetIndString(statTitle, rMiscStrID, typeIs); if (statTitle <> '') then begin { if we really got the resource} GetDItem(theDialog, statText, itemType, itemToChange, itemBox); SetIText(itemToChange, statTitle); end else GenericAlert(kErrLoadingRes); end; {firstTime} otherwise end; end; {=================================} function SimpleFileFilter (p: ParmBlkPtr): BOOLEAN; const houseType = 1; artType = 2; gameType = 3; begin SimpleFileFilter := TRUE; {Don't show it -- default} with p^.ioFlFndrInfo do case typeIs of houseType: if (fdType = 'GLhs') then SimpleFileFilter := FALSE; {Show it} artType: if (fdType = 'GLbk') then SimpleFileFilter := FALSE; {Show it} gameType: if (fdType = 'GLgm') then SimpleFileFilter := FALSE; {Show it} otherwise ; end; end; {=================================} function DoOpen; var dlgOrigin: Point; theTypeList: SFTypeList; theReply: SFReply; begin UseResFile(gliderResNum); SetPt(dlgOrigin, dlgLeft + rightOffset, dlgTop + downOffset); typeIs := whichType + 1; SFPGetFile(dlgOrigin, '', @SimpleFileFilter, -1, theTypeList, @OpenSFGetHook, theReply, rCustGetID, nil); with theReply do begin if (good) then begin case whichType of kHouseType: begin housesName := fName; houseVolNum := vRefNum; end; kArtType: begin resourceName := fName; resVolNum := vRefNum; end; kGameType: begin gameName := fName; gameVolNum := vRefNum; end; otherwise Exit(DoOpen); end; end; DoOpen := good; end; end; {=================================} procedure DoClose; begin theErr := FSClose(houseNumber); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(DoClose); end; theErr := FlushVol(nil, volNum); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(DoClose); end; end; {=================================} function GetHouse; var i: Integer; begin GetHouse := FALSE; if (not OpenHouse) then begin GenericAlert(kErrExitSansHouse); Exit(GetHouse); end; DoClose(houseVolNum); {$IFC DemoVersion} if (thisHouse.timeStamp <> 16) then begin GenericAlert(kErrNotDemoHouse); Exit(GetHouse); end; {$ENDC} if (not ErrorCheckFile) then begin GenericAlert(kErrWrongHouseVers); Exit(GetHouse); end; GetHouse := TRUE; end; {=================================} function ReadGame; type miniObject = record theAmount: Integer; theExtra: Integer; theIsOn: Boolean; end; roomState = record stateCode: Integer; objectStates: array[1..16] of miniObject; end; gameRec = record version: Integer; houseStamp: LongInt; roomIs, roomsHas: Integer; nMortals, nBands, nEnergy: Integer; isRightFace, hasEnteredLeft: Boolean; theRoomScore, theSuppScore: LongInt; workingGameNumberIs: LongInt; whichHouse: string[32]; firstHouse: string[32]; prefs: Integer; {temporary} roomWasFlags: array[1..40] of Boolean; stateOfRooms: array[1..40] of roomState; end; var theGame: gameRec; i, i2: Integer; bytesIn: LongInt; begin ReadGame := FALSE; bytesIn := SIZEOF(gameRec); theErr := SetVol(nil, gameVolNum); if (IOCheck(theErr) <> 0) then Exit(ReadGame); theErr := FSOpen(gameName, gameVolNum, gameNumber); {open the game} if (IOCheck(theErr) <> 0) then begin if ((theErr = FNFErr) and (DoOpen(kGameType))) then begin theErr := FSOpen(gameName, gameVolNum, gameNumber); if (IOCheck(theErr) <> 0) then Exit(ReadGame) end else Exit(ReadGame); end; theErr := SetFPos(gameNumber, FSFromStart, 0); if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(gameNumber); Exit(ReadGame); end; theErr := FSRead(gameNumber, bytesIn, @theGame); {read in the game} if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(gameNumber); Exit(ReadGame); end; theErr := FSClose(gameNumber); {close game file} if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(gameNumber); Exit(ReadGame); end; with theGame do {extract beginning game info} begin if (version >= $0200) then begin GenericAlert(kErrGameOldVers); Exit(ReadGame); end; roomAt := roomIs; roomsPassed := roomsHas; mortals := nMortals; theGlider.bands := nBands; theGlider.energy := nEnergy; theGlider.forVel := 4; theGlider.isRight := isRightFace; enteredLeft := hasEnteredLeft; roomScore := theRoomScore; suppScore := theSuppScore; workingGameNumber := workingGameNumberIs; housesName := whichHouse; firstFileName := firstHouse; end; CalcRoomScore; rollScore := roomScore + suppScore; if (not GetHouse) then {open said house} begin GenericAlert(kErrExitSansHouse); Exit(ReadGame); end; if (theGame.houseStamp <> thisHouse.timeStamp) then GenericAlert(kErrHouseModified); with theGame do {set remaining game info} begin for i := 1 to 40 do begin roomVisits[i] := roomWasFlags[i]; with stateOfRooms[i], thisHouse.theRooms[i] do begin conditionCode := stateCode; for i2 := 1 to 16 do begin theObjects[i2].amount := objectStates[i2].theAmount; theObjects[i2].extra := objectStates[i2].theExtra; theObjects[i2].isOn := objectStates[i2].theIsOn; end; {for i2} end; {with thisHouse} end; {for i} end; {with theGame} ReadGame := TRUE; end; {=================================} function WriteGame (fileNum, volNum: Integer): Boolean; type miniObject = record theAmount: Integer; theExtra: Integer; theIsOn: Boolean; end; roomState = record stateCode: Integer; objectStates: array[1..16] of miniObject; end; gameRec = record version: Integer; houseStamp: LongInt; roomIs, roomsHas: Integer; nMortals, nBands, nEnergy: Integer; isRightFace, hasEnteredLeft: Boolean; theRoomScore, theSuppScore: LongInt; workingGameNumberIs: LongInt; whichHouse: string[32]; firstHouse: string[32]; prefs: Integer; {temporary} roomWasFlags: array[1..40] of Boolean; stateOfRooms: array[1..40] of roomState; end; var theGame: gameRec; i, i2: Integer; bytesOut: LongInt; begin WriteGame := FALSE; for i := 1 to nObjects do {set current conditions of present room} case (eventKind[i, 0]) of awardIt, extraIt, energizeIt, bandIt: begin thisHouse.theRooms[roomAt].theObjects[i].amount := eventKind[i, 1]; end; lightIt, airOnIt: begin if ((not lightsOut) and (not airOut)) then thisHouse.theRooms[roomAt].conditionCode := 0; end; otherwise end; CalcRoomScore; with theGame do begin version := kGlideVersion; houseStamp := thisHouse.timeStamp; roomIs := roomAt; roomsHas := roomsPassed; nMortals := mortals; nBands := theGlider.bands; nEnergy := theGlider.energy; isRightFace := theGlider.isRight; hasEnteredLeft := enteredLeft; theRoomScore := roomScore; theSuppScore := suppScore; workingGameNumberIs := workingGameNumber; whichHouse := housesName; firstHouse := firstFileName; prefs := 0; for i := 1 to 40 do begin roomWasFlags[i] := roomVisits[i]; with stateOfRooms[i], thisHouse.theRooms[i] do begin stateCode := conditionCode; for i2 := 1 to 16 do begin objectStates[i2].theAmount := theObjects[i2].amount; objectStates[i2].theExtra := theObjects[i2].extra; objectStates[i2].theIsOn := theObjects[i2].isOn; end; {for i2} end; {with thisHouse} end; {for i} end; {with theGame} bytesOut := SIZEOF(gameRec); theErr := SetFPos(fileNum, FSFromStart, 0); if (IOCheck(theErr) <> 0) then begin theErr := FSClose(gameNumber); {close game file} Exit(WriteGame); end; theErr := FSWrite(fileNum, bytesOut, @theGame); if (IOCheck(theErr) <> 0) then begin theErr := FSClose(gameNumber); {close game file} Exit(WriteGame); end; theErr := SetEOF(fileNum, bytesOut); if (IOCheck(theErr) <> 0) then begin theErr := FSClose(gameNumber); {close game file} Exit(WriteGame); end; theErr := FSClose(fileNum); {close game file} if (IOCheck(theErr) <> 0) then begin theErr := FSClose(gameNumber); {close game file} Exit(WriteGame); end; theErr := FlushVol(nil, volNum); if (IOCheck(theErr) <> 0) then Exit(WriteGame); WriteGame := TRUE; end; {=================================} function SaveGameAs; var dlgOrigin: Point; theReply: SFReply; theInfo: FInfo; begin SaveGameAs := FALSE; SetPt(dlgOrigin, dlgLeft + rightOffset + 25, dlgTop + downOffset); SFPutFile(dlgOrigin, 'Name for game:', '', nil, theReply); with theReply do begin if (not good) then Exit(SaveGameAs); gameVolNum := vRefNum; theErr := GetFInfo(fName, gameVolNum, theInfo); case theErr of NoErr: begin if (theInfo.fdType <> 'GLgm') then begin GenericAlert(kErrFileExists); Exit(SaveGameAs); end; end; FNFErr: begin theErr := Create(fname, gameVolNum, 'GLID', 'GLgm'); if (IOCheck(theErr) <> 0) then begin Exit(SaveGameAs); end; end; otherwise begin GenericAlert(theErr); Exit(SaveGameAs); end; end; {end - case} {SetCursor- watch} gameName := fName; theErr := FSOpen(fName, gameVolNum, gameNumber); if (IOCheck(theErr) <> 0) then Exit(SaveGameAs); if (not WriteGame(gameNumber, gameVolNum)) then begin theErr := FSClose(gameNumber); {close game file} Exit(SaveGameAs); end; end; {end - with} refuseHigh := TRUE; SaveGameAs := TRUE; end; {end - function} {=================================} function SaveGame; var gameVolName: Str255; begin SaveGame := FALSE; if (gameName = '') then begin if (not SaveGameAs) then Exit(SaveGame) end else begin theErr := FSOpen(gameName, gameVolNum, gameNumber); if (IOCheck(theErr) <> 0) then begin Exit(SaveGame); end; if (not WriteGame(gameNumber, gameVolNum)) then begin Exit(SaveGame); end; end; refuseHigh := TRUE; SaveGame := TRUE; end; {=================================} function WriteHouse; var fileLength: LongInt; begin SpinBall; WriteHouse := FALSE; fileLength := SIZEOF(houseRec); SpinBall; theErr := SetVol(nil, houseVolNum); if (IOCheck(theErr) <> 0) then Exit(WriteHouse); theErr := FSOpen(housesName, houseVolNum, houseNumber); if (IOCheck(theErr) <> 0) then begin if (not DoOpen(kHouseType)) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(WriteHouse); end; theErr := FSOpen(housesName, houseVolNum, houseNumber); if (IOCheck(theErr) <> 0) then begin playing := FALSE; theErr := FSClose(houseNumber); Exit(WriteHouse); end; end; SpinBall; theErr := SetFPos(houseNumber, FSFromStart, 0); if (IOCheck(theErr) <> 0) then Exit(WriteHouse); SpinBall; theErr := FSWrite(houseNumber, fileLength, @thisHouse); if (IOCheck(theErr) <> 0) then Exit(WriteHouse); SpinBall; theErr := SetEOF(houseNumber, fileLength); if (IOCheck(theErr) <> 0) then Exit(WriteHouse); SpinBall; theErr := FSClose(houseNumber); if (IOCheck(theErr) <> 0) then begin Exit(WriteHouse); end; SpinBall; theErr := FlushVol(nil, houseVolNum); if (IOCheck(theErr) <> 0) then Exit(WriteHouse); SpinBall; WriteHouse := TRUE; end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-GameBody.p b/Glider_405/Sources/G-GameBody.p new file mode 100755 index 0000000..1deaa81 --- /dev/null +++ b/Glider_405/Sources/G-GameBody.p @@ -0,0 +1 @@ + {------------------------------------------------------} { } { G L I D E R } { } { } { Glider 4.05, copyright 1991, Casady & Greene, Inc. } { All code contained herein is by john calhoun } { } { This is version 4.05 compiled with THINK Pascal 3.02 } { } {------------------------------------------------------} program Glider; {$I-} uses SMS, Palettes, Globals, GlobalUtils, IdleUtils, PlayActive, FileInNOut, IdleInput, Initialize; var eventHappened: Boolean; {=================================} procedure SavePrefs; type prefType = record theName: string[24]; houseName: string[32]; resName: string[32]; sndVolume: Integer; controlIs: Integer; leftIs, rightIs, energyIs, bandIs: Integer; musicIs, channel4Is, airVisIs, buttonIs, restoreIs: Boolean; leftNameIs, rightNameIs, energyNameIs, bandNameIs: string[12]; keyBoardIs: Integer; end; prefPtr = ^prefType; prefHand = ^prefPtr; var theirPrefs: prefHand; begin UseResFile(gliderResNum); theirPrefs := prefHand(NewHandle(SIZEOF(prefType))); if (theirPrefs = nil) then begin GenericAlert(kErrMemLow); Exit(SavePrefs); end; Handle(theirPrefs) := Get1Resource('Gprf', 128); if ((ResError = noErr) and (theirPrefs <> nil)) then begin HLock(Handle(theirPrefs)); with theirPrefs^^ do begin houseName := defaultHouse; theName := playerName; resName := resourceName; GetSoundVol(sndVolume); controlIs := controlMethod; leftIs := leftKey; rightIs := rightKey; energyIs := energyKey; bandIs := bandKey; musicIs := musicOn; channel4Is := is4Channel; {presently un-used} airVisIs := airVisible; buttonIs := buttonFires; restoreIs := restoreColor; leftNameIs := leftName; rightNameIs := rightName; energyNameIs := energyName; bandNameIs := bandName; keyBoardIs := herKeyBoard; end; end else begin GenericAlert(kErrLoadingRes); Exit(SavePrefs); end; ChangedResource(Handle(theirPrefs)); WriteResource(Handle(theirPrefs)); if (ResError <> noErr) then begin if ((ResError = FLckdErr) or (ResError = VLckdErr) or (ResError = WPrErr)) then GenericAlert(kErrSavingPrefs) else GenericAlert(ResError); end; HUnlock(Handle(theirPrefs)); ReleaseResource(Handle(theirPrefs)); end; {=================================} procedure DoUpdate; var whichWindow: WindowPtr; begin whichWindow := WindowPtr(theEvent.message); if (whichWindow = mainWndo) then begin BeginUpdate(mainWndo); RedrawWindowFrame; if ((demoMode = highScoreMode) and (not playing)) then DrawHiScores else if (demoMode = helpScreensMode) then DisplayAHelpScreen else begin if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); end; EndUpdate(mainWndo); ClipRect(wholeArea); end; end; {=================================} procedure CloseUpShop; const Color = 1; GDTypeFlag = 1; var theDevice: GDHandle; {-----------} function SetDepth (gd: GDHandle; newDepth, whichFlags, newFlags: Integer): Integer; inline $203C, $000A, $0013, $AAA2; {-----------} begin DropIdle; ShowMenuBar; SpinBall; if (hasMirror) then begin hasMirror := FALSE; HUnlock(Handle(mirrorRgn)); DisposeRgn(mirrorRgn); end; if (hasWindow) then begin hasWindow := FALSE; HUnlock(Handle(windowRgn)); DisposeRgn(windowRgn); end; if (hasToast) then begin hasToast := FALSE; HUnlock(Handle(toastRgn)); DisposeRgn(toastRgn); end; SpinBall; if (smsIsActive) then SMSExit; smsIsActive := FALSE; SpinBall; if (wholeRgn <> nil) then begin HUnlock(Handle(wholeRgn)); DisposeRgn(wholeRgn); end; SpinBall; if (inColor) then begin if (mainPalette <> nil) then DisposePalette(mainPalette); if (mainWndo <> nil) then DisposeWindow(GrafPtr(mainWndo)); CloseCPort(objectCPtr); DisposPtr(objectCBits); CloseCPort(virginCPtr); DisposPtr(virginCBits); CloseCPort(loadCPtr); DisposPtr(loadCBits); CloseCPort(reserveCPtr); DisposPtr(reserveCBits); end else begin if (mainWndo <> nil) then DisposeWindow(mainWndo); ClosePort(offVirginPort); DisposPtr(Ptr(offVirginPort)); ClosePort(offPlayerPort); DisposPtr(Ptr(offPlayerPort)); ClosePort(offLoadPort); DisposPtr(Ptr(offLoadPort)); ClosePort(offMaskPort); DisposPtr(Ptr(offMaskPort)); ClosePort(offReservePort); DisposPtr(Ptr(offReservePort)); end; SpinBall; SavePrefs; SpinBall; SetSoundVol(wasSndVolume); if ((not cantColor) and (restoreColor) and (not cantSwitch)) then begin theDevice := GetMainDevice; if (theDevice <> nil) then begin HLock(Handle(theDevice)); if (theDevice^^.gdPMap^^.pixelSize <> wasDepth) then theErr := SetDepth(theDevice, wasDepth, GDTypeFlag, Color); HUnlock(Handle(theDevice)); end; end; end; {=================================} begin InitializeAll; InitCursor; InitIdle; {$IFC not DemoVersion} DoStartUp; {$ENDC} UnloadSeg(@InitializeAll); UnloadSeg(@DoStartUp); repeat if (hasWNE) then eventHappened := WaitNextEvent(everyEvent, theEvent, kSleep, nil) else begin SystemTask; eventHappened := GetNextEvent(everyEvent, theEvent); end; if (eventHappened) then case (theEvent.what) of MouseDown: DoMouseDown; KeyDown, AutoKey: DoKeyDown; UpDateEvt: DoUpdate; DiskEvt: {call DIBadMount in response to a diskEvt} DoDiskEvent; App4Evt: DoOSEvent; otherwise end; {case} if (not pausing) then begin if (playing) then Coordinate else if ((not inBackground) and (mainWndo = FrontWindow)) then DoIdle; end; until doneFlag; {End of the event loop} CloseUpShop; {Dispose of all data structures, etc....} end. {Finis} \ No newline at end of file diff --git a/Glider_405/Sources/G-GlobalUtils.p b/Glider_405/Sources/G-GlobalUtils.p new file mode 100755 index 0000000..dff9968 --- /dev/null +++ b/Glider_405/Sources/G-GlobalUtils.p @@ -0,0 +1 @@ +unit GlobalUtils; interface uses SMS, Palettes, Globals; procedure SetPage (secondPage: Boolean); procedure SpinBall; procedure GenericAlert (whatGives: Integer); procedure DoTheSound (whichOne: Integer); procedure DoTheBass (whichOne: Integer); procedure DoTheMusic (whichOne: Integer); function Randomize (range: Integer): Integer; procedure CalcRoomScore; procedure DoErrorSound (soundNumber: Integer); procedure DissBlocks; procedure DrawHiScores; procedure HideMenuBar; procedure ShowMenuBar; procedure FatalError; procedure RedrawWindowFrame; implementation {=================================} procedure SetPage (secondPage: Boolean); EXTERNAL; {=================================} procedure SpinBall; var tempByte: SignedByte; begin if (ballList = nil) then Exit(SpinBall); tempByte := HGetState(Handle(ballList)); HLock(Handle(ballList)); with ballList^^ do begin if (whichBall = -1) then Exit(SpinBall); if (whichBall >= kCursCount) then whichBall := 1 else whichBall := whichBall + 1; if (useColorCursor) then SetCCursor(ballC[whichBall]) else SetCursor(ball[whichBall]^^); end; HSetState(Handle(ballList), tempByte); end; {=================================} procedure GenericAlert; var dummyInt: Integer; line1, line2: Str255; alertHandle: AlertTHndl; alertRect: Rect; begin if ((areFlipping) and (mainScreenHidden)) then begin mainScreenHidden := FALSE; SetPage(mainScreenHidden); end; UseResFile(gliderResNum); InitCursor; if (whatGives > 0) then begin GetIndString(line1, rAlertStrIDs, whatGives); line2 := ''; end else begin GetIndString(line1, rAlertStrIDs, 1); NumToString(whatGives, line2); line2 := CONCAT('Error = ', line2); end; ParamText(line1, line2, '', ''); alertHandle := AlertTHndl(Get1Resource('ALRT', rAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(rAlertID, nil); end; {=================================} procedure DoTheMusic; begin if (musicOn and soundOn) then SMSStartChan(whichOne, 1); end; {=================================} procedure DoTheBass; begin if (musicOn) then SMSStart(whichOne); end; {=================================} procedure DoTheSound; begin if (soundOn) then SMSStart(whichOne); end; {=================================} function Randomize; var rawResult: LongInt; begin rawResult := ABS(Random); Randomize := (rawResult * range) div 32768; end; {=================================} procedure CalcRoomScore; var index: Integer; begin roomScore := 0; for index := 1 to 40 do if (roomVisits[index]) then roomScore := roomScore + (500 * (index div 10 + 1)) + (roomsPassed div 41) * 2000; end; {=================================} procedure DoErrorSound; var dummyLong: LongInt; tempVolume, i: Integer; begin GetSoundVol(tempVolume); if (tempVolume <> 0) then for i := 0 to soundNumber do begin FlashMenuBar(0); Delay(8, dummyLong); FlashMenuBar(0); end; end; {=================================} procedure DissBlocks; var h, v: Integer; value: LongInt; maskR: Rect; begin value := 1; repeat if (BTST(value, 0)) then begin value := BSR(value, 1); value := BitXor(value, $240); end else begin value := BSR(value, 1); end; h := (value mod 32) * 16; v := (value div 32) * 16; SetRect(maskR, h, v, h + 16, v + 16); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, maskR, maskR, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, maskR, maskR, srcCopy, wholeRgn); until (value = 1); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); end; {=================================} procedure DrawHiScores; var i, ranking: Integer; leftRect, rightRect, hole, tempRect: Rect; tempStr: Str255; wasPort: GrafPtr; begin if (playing) then begin demoMode := Randomize(lastDemo) + 1; Exit(DrawHiScores); end; GetPort(wasPort); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; ranking := scoreList.rank; SetRect(leftRect, 10, 30, 251, 332); FillRect(leftRect, white); FrameRect(leftRect); PenPat(gray); if (inColor) then RGBForeColor(rgbLtBlue); for i := 0 to 20 do begin MoveTo(leftRect.left + 1, leftRect.top + 35 + (i * 13)); LineTo(leftRect.right - 2, leftRect.top + 35 + (i * 13)); end; if (inColor) then RGBForeColor(rgbBlack); if ((ranking < 20) and (inColor)) then begin RGBForeColor(rgbYellow); i := (ranking * 13) + leftRect.top + 36; SetRect(tempRect, leftRect.left + 32, i, leftRect.right - 2, i + 12); PaintRect(tempRect); RGBForeColor(rgbBlack); end; TextFont(16); TextSize(12); if (inColor) then RGBForeColor(rgbRed); MoveTo(leftRect.left + 33, leftRect.top + 30); DrawString('Rank'); MoveTo(leftRect.left + 108, leftRect.top + 30); DrawString('Name'); MoveTo(leftRect.left + 186, leftRect.top + 30); DrawString('Room #'); if (inColor) then RGBForeColor(rgbBlack); for i := 0 to 19 do begin MoveTo(leftRect.left + 38, leftRect.top + 47 + (i * 13)); NumToString(i + 1, tempStr); DrawString(tempStr); MoveTo(leftRect.left + 58, leftRect.top + 47 + (i * 13)); DrawString(thisHouse.hiName[i]); MoveTo(leftRect.left + 206, leftRect.top + 47 + (i * 13)); if (thisHouse.hiLevel[i] = 0) then tempStr := '+' else NumToString(thisHouse.hiLevel[i], tempStr); DrawString(tempStr); end; if ((ranking < 20) and (not inColor)) then begin i := (ranking * 13) + leftRect.top + 36; SetRect(tempRect, leftRect.left + 32, i, leftRect.right - 2, i + 12); InvertRect(tempRect); end; if (inColor) then RGBForeColor(rgbViolet); MoveTo(leftRect.left + 30, leftRect.top + 1); LineTo(leftRect.left + 30, leftRect.bottom); if (inColor) then RGBForeColor(rgbBlack); SetRect(hole, 0, 0, 12, 12); OffsetRect(hole, leftRect.left + 10, leftRect.top + 30); FillOval(hole, black); OffsetRect(hole, 0, 30); FillOval(hole, black); OffsetRect(hole, 0, 85); FillOval(hole, black); OffsetRect(hole, 0, 85); FillOval(hole, black); OffsetRect(hole, 0, 30); FillOval(hole, black); PenNormal; SetRect(rightRect, 261, 30, 502, 332); FillRect(rightRect, white); FrameRect(rightRect); PenPat(gray); if (inColor) then RGBForeColor(rgbLtBlue); for i := 0 to 20 do begin MoveTo(rightRect.left + 1, rightRect.top + 35 + (i * 13)); LineTo(rightRect.right - 2, rightRect.top + 35 + (i * 13)); end; if (inColor) then RGBForeColor(rgbBlack); if ((ranking < 20) and (inColor)) then begin RGBForeColor(rgbYellow); i := (ranking * 13) + rightRect.top + 36; SetRect(tempRect, rightRect.left + 32, i, rightRect.right - 2, i + 12); PaintRect(tempRect); RGBForeColor(rgbBlack); end; TextFont(16); TextSize(12); if (inColor) then RGBForeColor(rgbRed); MoveTo(rightRect.left + 33, rightRect.top + 30); DrawString('Score'); MoveTo(rightRect.left + 98, rightRect.top + 30); DrawString('Room Name'); if (inColor) then RGBForeColor(rgbBlack); for i := 0 to 19 do begin MoveTo(rightRect.left + 33, rightRect.top + 47 + (i * 13)); NumToString(thisHouse.hiScores[i], tempStr); DrawString(tempStr); MoveTo(rightRect.left + 81, rightRect.top + 47 + (i * 13)); DrawString(thisHouse.hiRoom[i]); end; if ((ranking < 20) and (not inColor)) then begin i := (ranking * 13) + rightRect.top + 36; SetRect(tempRect, rightRect.left + 32, i, rightRect.right - 2, i + 12); InvertRect(tempRect); end; if (inColor) then RGBForeColor(rgbViolet); MoveTo(rightRect.left + 30, rightRect.top + 1); LineTo(rightRect.left + 30, rightRect.bottom); if (inColor) then RGBForeColor(rgbBlack); SetRect(hole, 0, 0, 12, 12); OffsetRect(hole, rightRect.left + 10, rightRect.top + 30); FillOval(hole, black); OffsetRect(hole, 0, 30); FillOval(hole, black); OffsetRect(hole, 0, 85); FillOval(hole, black); OffsetRect(hole, 0, 85); FillOval(hole, black); OffsetRect(hole, 0, 30); FillOval(hole, black); if (inColor) then begin CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, leftRect, leftRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, rightRect, rightRect, srcCopy, wholeRgn); end else begin CopyBits(offLoadMap, MainWndo^.portBits, leftRect, leftRect, srcCopy, wholeRgn); CopyBits(offLoadMap, MainWndo^.portBits, rightRect, rightRect, srcCopy, wholeRgn); end; SetPort(wasPort); demoMode := highScoreMode; end; {=================================} function GetGrayRgn: RgnHandle; inline $2EB8, $09EE; {=================================} function GetMBarHeight: Integer; inline $3EB8, $0BAA; {=================================} procedure SetMBarHeight (newHeight: Integer); inline $31DF, $0BAA; {=================================} function GetWindowList: WindowPtr; inline $2EB8, $9D6; {=================================} function GetMBarRgn: RgnHandle; var theRect: Rect; worldRgn, mBarRgn: RgnHandle; begin theRect := GetGrayRgn^^.rgnBBox; UnionRect(theRect, screenBits.bounds, theRect); worldRgn := NewRgn; OpenRgn; FrameRoundRect(theRect, 16, 16); CloseRgn(worldRgn); theRect := screenBits.bounds; theRect.bottom := theRect.top + wasMBarHeight; mBarRgn := NewRgn; RectRgn(mBarRgn, theRect); SectRgn(worldRgn, mBarRgn, mBarRgn); DisposeRgn(worldRgn); GetMBarRgn := mBarRgn; end; {=================================} procedure HideMenuBar; var theRect: Rect; mBarHeight: Integer; grayRgn, menuBarRgn: RgnHandle; startWindow: WindowPeek; begin mBarHeight := GetMBarHeight; if (mBarHeight <> 0) then begin grayRgn := GetGrayRgn; wasMBarHeight := mBarHeight; menuBarRgn := GetMBarRgn; SetMBarHeight(0); UnionRgn(grayRgn, menuBarRgn, grayRgn); startWindow := WindowPeek(GetWindowList); PaintBehind(startWindow, menuBarRgn); CalcVisBehind(startWindow, menuBarRgn); DisposeRgn(menuBarRgn); end; end; {=================================} procedure ShowMenuBar; var grayRgn, menuBarRgn: RgnHandle; begin if (GetMBarHeight = 0) then begin grayRgn := GetGrayRgn; menuBarRgn := GetMBarRgn; SetMBarHeight(wasMBarHeight); DiffRgn(grayRgn, menuBarRgn, grayRgn); CalcVisBehind(WindowPeek(GetWindowList), menuBarRgn); DisposeRgn(menuBarRgn); DrawMenuBar; end; end; {=================================} procedure FatalError; begin InitCursor; ShowMenuBar; ExitToShell; end; {=================================} procedure RedrawWindowFrame; var tempRect: Rect; tempByte: SignedByte; thePict: PicHandle; begin SetPort(GrafPtr(mainWndo)); PenNormal; if (inColor) then RGBForeColor(rgbBlack); ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + (2 * rightOffset), 0); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 342, 512 + (2 * rightOffset), 342 + downOffset); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 0, 0, 342); FillRect(tempRect, black); SetRect(tempRect, 512, 0, 512 + rightOffset, 342); FillRect(tempRect, black); UseResFile(gliderResNum); if (inColor) then begin SetRect(tempRect, -64, 0, 0, 342); thePict := GetPicture(rSidePict1); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else GenericAlert(kErrNotEnoughMem); ReleaseResource(Handle(thePict)); end; if (inColor) then begin SetRect(tempRect, 512, 0, 512 + 64, 342); thePict := GetPicture(rSidePict2); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else GenericAlert(kErrNotEnoughMem); ReleaseResource(Handle(thePict)); end; ClipRect(wholeArea); end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-Globals.p b/Glider_405/Sources/G-Globals.p new file mode 100755 index 0000000..f320b86 --- /dev/null +++ b/Glider_405/Sources/G-Globals.p @@ -0,0 +1 @@ +unit Globals; interface uses Palettes; const kGlideVersion = $0100; {version of house format} kStackSize = 24576; {must be even - stack size} kSleep = 1; {sleep time in Ticks} kSuspendResumeBit = $0001; {for WNE} kResuming = 1; {for WNE} kSecondaryAddr = $3F2700; {address of alternate page buffer} kSlowScoreIncrement = 17; {fast machine extend score-odometer} kFastScoreIncrement = 37; {slow machine race score-odometer} kMouseSlop = 1; {who knows} kMinBassLoop = 14; {quickest pace of duh-dum} kBassFract = 8; {smaller = slower bass @ 1st / larger = quicker} kBonusTimeToBeat = 256; {number of passes for time bonus} kCeilingVert = 24; {absolute ceiling in pixels} kFloorVert = 325; {absolute floor in pixels} kFloorLimit = kFloorVert + 5; kMaxThrust = 5; {maximum speed (in pixels) of glider} kLastHelpScreen = 7; {number of help screens} kCursCount = 12; {number of frames for animated cursor} rAcurID = 128; {resource ID numbers} rMainWndoID = 128; rAlertID = 128; rFileAlertID = 129; rSoundDlgID = 131; rQuitNoSaveAlertID = 132; rDepthAlertID = 136; rCustomKeysID = 137; rCustGetID = 256; rAlertStrIDs = 128; rFileStrIDs = 129; rMiscStrID = 130; rDemoStrIDs = 131; rObjectPictID = 128; rMaskPictID = 129; rFarmPict = 130; rSidePict1 = 140; rSidePict2 = 141; rIdleID = 200; rColorIdleID = 210; rHelpBasePictID = 1000; kDefaultLeftKey = $2B; {default control keys} kDefaultRightKey = $2F; kDefaultEnergyKey = $24; kDefaultBandKey = $31; kDefaultLeftName = ', key'; {default names for control keys} kDefaultRightName = '. key'; kDefaultEnergyName = 'return'; kDefaultBandName = 'space'; kTabKey = $09; {misc. ascii codes} kReturnKey = $0D; kSpaceBar = $20; kSKeyMap = $01; {misc. keymap codes} kQKeyMap = $0C; kEKeyMap = $0E; kReturnKeyMap = $24; kTabKeyMap = $30; kControlKeyMap = $3B; kCommandKeyMap = $37; kShiftKey = $38; kErrUnaccounted = 1; {error codes} kErrMacPlusNeeded = 2; {these correspond with STR#} kErr2Or16Colors = 4; {resources for the TEXT part} kErrNotEnoughMem = 5; {of the message} kErrUnknownAtInit = 6; kErrMemLow = 7; kErrGraphicsNotFound = 8; kErrGraphicLoad = 9; kErrSavingPrefs = 10; kErrAirChange = 11; kErrLoadingRes = 12; kErrFileExists = 13; kErrNothingToPrint = 14; kErrWrongHouseVers = 15; kErrLoadingDfltHouse = 16; kErrLoadingPrefs = 17; kErrNotDemoHouse = 18; kErrExitSansGraphics = 19; kErrGraphicsAre2Bit = 20; kErrGraphicsAre16Bit = 21; kErrGameOldVers = 22; kErrExitSansHouse = 23; kErrHouseModified = 24; kErrBackgroundMusic = 25; kErrDepthSwitched = 26; kErrStartUpWrongType = 27; kErrNoSounds = 28; kErrVolLocked = 29; kErrMissionINIT = 30; kErrNotFirstHouse = 31; kErrDemoRefuseHouse = 32; kErrNewKeyboard = 33; kHouseType = 0; kArtType = 1; kGameType = 2; nulObj = 0; {room object codes} {furniture} table = 1; shelf = 2; books = 3; cabnet = 4; extRct = 5; obsRct = 6; {blowers} flrVnt = 8; celVnt = 9; celDct = 10; candle = 11; lftFan = 12; ritFan = 13; {table objects} clock = 16; paper = 17; grease = 18; bnsRct = 19; battry = 20; rbrBnd = 21; {wall objects} litSwt = 24; outlet = 25; thermo = 26; shredr = 27; pwrSwt = 28; guitar = 29; {animate objects} drip = 32; toastr = 33; ball = 34; fshBwl = 35; teaKtl = 36; window = 37; {jewelry} paintg = 40; mirror = 41; basket = 42; macTsh = 43; upStar = 44; dnStar = 45; normal = 0; {glider situational modes} fadingIn = 1; fadingOut = 2; turnRt2Lf = 3; turnLf2Rt = 4; burning = 5; ascending = 6; descending = 7; shredding = 8; {objects effects codes} ignoreIt = 0; {null or unknown objects} crashIt = 1; {tables, shelves, cabinets, etc...} liftIt = 2; {floor vents} dropIt = 3; {ceiling blower, some ducts} moveIt = 4; {exit rects/suction ceiling ducts} burnIt = 5; {candle if too close} turnItLeft = 6; {left fan} turnItRight = 7; {right fan} awardIt = 8; {clocks} extraIt = 9; {folded pieces of paper} slideIt = 10; {grease fallen} trickIt = 11; {bonus rect} energizeIt = 12; {battery} bandIt = 13; {rubber bands} playIt = 14; {guitar} lightIt = 15; {light switch} zapIt = 16; {wall outlet} airOnIt = 17; {thermostats} shredIt = 18; {shredder} toggleIt = 19; {power switch} weightIt = 20; {?} spillIt = 21; {grease standing up} ascendIt = 22; {up stair case} descendIt = 23; {down stair case} steamIt = 24; highScoreMode = 0; {demo mode numbers} balloonMode = 1; copterMode = 2; dartMode = 3; controlMode = 4; tabMode = 5; adMode = 6; editorMode = 7; colorMusicMode = 8; ventCandleMode = 9; bandBatteryMode = 10; paperClockMode = 11; lastDemo = 11; helpScreensMode = 99; iNothing = 0; mApple = 128; {Menu resource ID} iAbout = 1; {Menu items} mGame = 129; {Menu resource ID} iBegin = 1; {Menu items} iLoadHouse = 2; iEndGame = 3; iLoadGame = 5; iSaveGame = 6; iSaveGameAs = 7; iQuit = 9; mOption = 130; {Menu resource ID} iControls = 1; {Menu items} iSound = 2; iShowAir = 3; iRestoreDeep = 4; iHiScores = 6; iHelp = 8; mControls = 131; {Menu resource ID} iHoldKeyboard = 1; {Menu items} iDropKeyboard = 2; iAbsMouse = 3; iRelMouse = 4; iConfigure = 6; whoCares = 0; {place where entered room} topOfRoom = 1; bottomOfRoom = 2; leftOfRoom = 3; rightOfRoom = 4; kWhistleSound = 13; kTapSound = 27; kCRSound = 28; kMusicSound = 29; {ID of music sound} kDuhDumSound = 30; {ID of bass beat} type objectData = record objectIs: Integer; boundRect: Rect; amount: Integer; extra: Integer; isOn: Boolean; end; roomData = record roomName: string[24]; numberOObjects: Integer; backPictID: Integer; tileOrder: array[0..7] of Integer; leftOpen, rightOpen: Boolean; animateKind: Integer; animateNumber: Integer; animateDelay: LongInt; conditionCode: Integer; theObjects: array[1..16] of objectData; end; houseRec = record version: Integer; numberORooms: Integer; timeStamp: LongInt; hiScores: array[0..19] of LongInt; hiLevel: array[0..19] of Integer; hiName: array[0..19] of string[24]; hiRoom: array[0..19] of string[24]; pictFile: string[32]; nextFile: string[32]; firstFile: string[32]; theRooms: array[1..40] of roomData; end; gliderRec = record destRect, oldRect, wholeRect: Rect; shadoDest, oldShado, wholeShado: Rect; touchRect: Rect; timeStamp: LongInt; mode, phase: Integer; srcNum: Integer; forVel: Integer; mass: Integer; bands, energy: Integer; isRight, isForward: Boolean; end; animateRec = record destRect, wholeRect, oldRect: Rect; horiOff, vertOff: Integer; kind, phase: Integer; tickStamp, delay: LongInt; unSeen: Boolean; end; cycleRec = record holdRect, wholeRect, oldRect: Rect; tiedTo, kindIs, phase: Integer; reset, position: LongInt; accel, velocity: Integer; end; bandRec = record dest, whole, old: Rect; phase, velocity: Integer; end; scoreRec = record rank: Integer; changed: Boolean; end; pointRec = record whereR: Rect; tickStamp: LongInt; saysWhat: string[16]; out: Boolean; end; lightningRec = record theBolts: array[1..3, 0..7, 0..1] of Integer; whichBolt, whatPhase: Integer; whatTime: LongInt; end; BitMapPtr = ^BitMap; IntPtr = ^Integer; LongintPtr = ^Longint; acur = record whichBall: LongInt; ball: array[1..kCursCount] of CursHandle; end; acurPtr = ^acur; acurHand = ^acurPtr; var theEvent: EventRecord; mainWndo: WindowPtr; mainPalette: PaletteHandle; wholeArea, fullArea, nullRect, smScoreRect, lgScoreRect: Rect; wholeRgn: RgnHandle; offMaskMap, offVirginMap, offLoadMap, offPlayerMap, offReserveMap: BitMap; offMaskPort, offVirginPort, offLoadPort, offPlayerPort, offReservePort: GrafPtr; offMaskBits, offVirginBits, offLoadBits, offPlayerBits, offReserveBits: Ptr; virginCPort, loadCPort, objectCPort, reserveCPort: CGrafPort; virginCPtr, loadCPtr, objectCPtr, reserveCPtr: CGrafPtr; virginCBits, loadCBits, objectCBits, reserveCBits: Ptr; rgbBlack, rgbWhite, rgbLtBlue, rgbRed, rgbBlue, rgbLtGreen: RGBColor; rgbYellow, rgbViolet, rgbBrown, rgbLtBrown, rgbDkGray: RGBColor; noCursor: CursHandle; thisHouse: houseRec; theKeys: KeyMap; theErr: OSErr; currentBall: Integer; ballList: acurHand; ballC: array[1..kCursCount] of CCrsrHandle; theAnimates: array[1..16] of animateRec; animateRct: array[0..2, -1..16] of Rect; cycleObjects: array[1..16] of cycleRec; floatPoints: pointRec; theGlider: GliderRec; roomVisits: array[1..40] of Boolean; glideRct: array[0..27] of Rect; shadoRct: array[0..1] of Rect; nextPhase: array[1..4, 0..16] of Integer; theBand: BandRec; bandRct: array[0..2] of Rect; roomScore, suppScore, rollScore, loopsThruRoom, workingGameNumber: LongInt; scoreList: scoreRec; rightOffset, downOffset, gliderResNum, wasSndVolume: Integer; controlMethod, demoMode, demoCount, wasDepth: Integer; liftAmount, mortals, shiftAmount, sideYouCantExit: Integer; leftKey, rightKey, energyKey, bandKey, scoreIncrement: Integer; roomAt, roomsPassed, nObjects, binaryFlip: Integer; gameNumber, houseNumber, wasMBarHeight: Integer; houseVolNum, gameVolNum, resVolNum, bassLoop, playBassTime: Integer; nAnimates, nCycleObs, herKeyBoard, iGlidersHelp: Integer; leftName, rightName, energyName, bandName: string[12]; playerName: string[24]; musicName, gameName, resourceName: string[32]; firstFileName, defaultHouse, housesName: string[32]; mirrorRgn, windowRgn, toastRgn: RgnHandle; theLightning: LightningRec; tileRects: array[0..7] of Rect; srcRect: array[0..69] of Rect; eventRect, reserveRects: array[0..16] of Rect; eventKind: array[0..16, 0..2] of LongInt; windowOpen, hasWindow, leftIsOpen, rightIsOpen, enteredLeft: Boolean; cantSwitch, airVisible, hasMirror, hasToast, lightsOut, airOut: Boolean; bandBorne, cantColor, soundOn, musicOn, inhibitSound, hasSys7: Boolean; buttonFires, cantMusic, smsIsActive, doneFlag, inColor: Boolean; inBackground, playing, pausing, hasWNE, restoreColor, refuseHigh: Boolean; scoreIsRolling, lifeNormal, didntExitEntrance, areFlipping: Boolean; mainScreenHidden, fileWasLost, is4Channel, useColorCursor: Boolean; implementation end. \ No newline at end of file diff --git a/Glider_405/Sources/G-IdleInput.p b/Glider_405/Sources/G-IdleInput.p new file mode 100755 index 0000000..1d3890c --- /dev/null +++ b/Glider_405/Sources/G-IdleInput.p @@ -0,0 +1 @@ +unit IdleInput; interface uses SMS, Balloons, Palettes, Globals, GlobalUtils, FileInNOut, IdleUtils, PlayUtils, PlaySetUp; procedure StartNewGame; function GetGame: Boolean; procedure HandleMenu (theMenu, theItem: integer); procedure DoMouseDown; procedure DoKeyDown; procedure DoDiskEvent; procedure DoOSEvent; {=================================} implementation {=================================} procedure StartNewGame; var i: Integer; tempRect: Rect; firstIs: string[32]; begin if (not smsIsActive) then SMSInit; smsIsActive := TRUE; if (is4Channel) then SMSSetMode(4) else SMSSetMode(2); if (not GetHouse) then Exit(StartNewGame); firstIs := thisHouse.firstFile; if (firstIs <> housesName) and (firstIs <> '') and (firstIs <> 'nil') then begin GenericAlert(kErrNotFirstHouse); housesName := firstIs; if (not OpenHouse) then begin GenericAlert(kErrExitSansHouse); Exit(StartNewGame); end; DoClose(houseVolNum); {$IFC DemoVersion} if (thisHouse.timeStamp <> 16) then begin GenericAlert(kErrNotDemoHouse); Exit(StartNewGame); end; {$ENDC} thisHouse.firstFile := ''; if (not WriteHouse) then ; end; firstFileName := housesName; HideMenuBar; if (screenBits.bounds.bottom > 382) then begin SetPort(GrafPtr(mainWndo)); PenNormal; ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + 2 * rightOffset, -downOffset + 20); FillRect(tempRect, black); ClipRect(wholeArea); end; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); with scoreList do begin changed := FALSE; rank := 20; end; roomAt := 1; roomsPassed := 1; roomScore := 0; suppScore := 0; rollScore := 0; GetDateTime(workingGameNumber); sideYouCantExit := whoCares; loopsThruRoom := 0; bassLoop := 0; playBassTime := kBonusTimeToBeat div kBassFract + kMinBassLoop; for i := 1 to 40 do roomVisits[i] := FALSE; if (ozmaFlags[3]) then begin mortals := 50; refuseHigh := TRUE; end else begin mortals := 5; refuseHigh := FALSE; end; for i := 0 to 3 do ozmaFlags[i] := FALSE; enteredLeft := TRUE; with theGlider do begin isRight := TRUE; bands := 0; forVel := 4; energy := 0; end; ResetGlider; playing := TRUE; pausing := FALSE; hasMirror := FALSE; hasWindow := FALSE; hasToast := FALSE; scoreIsRolling := FALSE; floatPoints.out := FALSE; ReadyRoom; gameName := ''; DisableItem(GetMenu(mGame), iLoadHouse); EnableItem(GetMenu(mGame), iEndGame); DisableItem(GetMenu(mGame), iLoadGame); {$IFC not DemoVersion} EnableItem(GetMenu(mGame), iSaveGame); EnableItem(GetMenu(mGame), iSaveGameAs); {$ENDC} DisableItem(GetMenu(mOption), iHiScores); SetPort(GrafPtr(mainWndo)); PenNormal; TextFont(0); TextSize(12); TextMode(patOr); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); SetCursor(noCursor^^); DissBlocks; FlushEvents(everyEvent, 0); end; {=================================} procedure DoLoadHouse; var killed: Boolean; begin {$IFC not DemoVersion} if DoOpen(kHouseType) then begin demoMode := Randomize(lastDemo) + 1; HideMenuBar; StartNewGame; end; {$ENDC} end; {=================================} procedure DoEndGame; begin SetItem(GetMenu(mGame), iBegin, 'Begin Game'); WrapItUp; DrawMenuBar; end; {=================================} function GetGame; var tempRect: Rect; begin GetGame := FALSE; if (not ReadGame) then Exit(GetGame); if (not smsIsActive) then SMSInit; smsIsActive := TRUE; if (is4Channel) then SMSSetMode(4) else SMSSetMode(2); demoMode := Randomize(lastDemo) + 1; HideMenuBar; if (screenBits.bounds.bottom > 382) then begin SetPort(GrafPtr(mainWndo)); PenNormal; ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + 2 * rightOffset, -downOffset + 20); FillRect(tempRect, black); ClipRect(wholeArea); end; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); ResetGlider; playing := TRUE; pausing := FALSE; hasMirror := FALSE; hasWindow := FALSE; hasToast := FALSE; scoreIsRolling := FALSE; refuseHigh := TRUE; floatPoints.out := FALSE; sideYouCantExit := whoCares; loopsThruRoom := 0; bassLoop := 0; playBassTime := kBonusTimeToBeat div kBassFract + kMinBassLoop; ReadyRoom; DisableItem(GetMenu(mGame), iLoadHouse); EnableItem(GetMenu(mGame), iEndGame); DisableItem(GetMenu(mGame), iLoadGame); EnableItem(GetMenu(mGame), iSaveGame); EnableItem(GetMenu(mGame), iSaveGameAs); DisableItem(GetMenu(mOption), iHiScores); SetPort(GrafPtr(mainWndo)); PenNormal; TextFont(0); TextSize(12); TextMode(patOr); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); SetCursor(noCursor^^); DissBlocks; FlushEvents(everyEvent, 0); GetGame := TRUE; end; {=================================} procedure ResumeGame; var tempRect: Rect; begin if (not smsIsActive) then SMSInit; smsIsActive := TRUE; if (is4Channel) then SMSSetMode(4) else SMSSetMode(2); HideMenuBar; SetItem(GetMenu(mGame), iBegin, 'Begin Game'); SetCursor(noCursor^^); pausing := FALSE; if (screenBits.bounds.bottom < 382) then begin SetPort(GrafPtr(mainWndo)); SetRect(tempRect, 0, 0, 512, 20); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, nil) else CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, nil); end else begin SetPort(GrafPtr(mainWndo)); PenNormal; ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + 2 * rightOffset, -downOffset + 20); FillRect(tempRect, black); ClipRect(wholeArea); end; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); end; {=================================} procedure HandleMenu; {Handle menu selections realtime} var DNA, i, volNum: integer; BoolHolder, cancelIt: boolean; DAName: Str255; SavePort: GrafPtr; tempRect: Rect; begin case theMenu of mApple: case theItem of iNothing: ; iAbout: DoAbout; otherwise begin GetPort(SavePort); GetItem(GetMenu(mApple), theItem, DAName); DNA := OpenDeskAcc(DAName); SetPort(SavePort); end; end; mGame: case theItem of iBegin: begin demoMode := Randomize(lastDemo) + 1; if (pausing and playing) then ResumeGame else StartNewGame; end; iLoadHouse: DoLoadHouse; iEndGame: DoEndGame; iLoadGame: begin {$IFC not DemoVersion} if (DoOpen(kGameType)) then begin if (not GetGame) then ; end; {$ENDC} end; iSaveGame: begin {$IFC not DemoVersion} if (not SaveGame) then ; {$ENDC} end; iSaveGameAs: begin {$IFC not DemoVersion} if (not SaveGameAs) then ; {$ENDC} end; iQuit: begin {$IFC DemoVersion} playing := FALSE; pausing := FALSE; doneFlag := TRUE; {$ELSEC} if DoQuit then begin playing := FALSE; pausing := FALSE; doneFlag := TRUE; end else if (SaveGame) then begin playing := FALSE; pausing := FALSE; doneFlag := TRUE; end; {$ENDC} end; otherwise end; mOption: case theItem of iControls: ; iSound: DoSoundSettings; iShowAir: begin airVisible := not airVisible; if (airVisible) then SetItem(GetMenu(mOption), iShowAir, 'Air is Visible') else SetItem(GetMenu(mOption), iShowAir, 'Air is Invisible'); if (playing) then GenericAlert(kErrAirChange); end; iRestoreDeep: begin restoreColor := not restoreColor; if (restoreColor) then SetItem(GetMenu(mOption), iRestoreDeep, 'Depth Restore is On') else SetItem(GetMenu(mOption), iRestoreDeep, 'Depth Restore is Off'); end; iHiScores: DrawHiScores; iHelp: OpenHelpScreens; otherwise end; mControls: case theItem of iHoldKeyboard..iRelMouse: begin for i := iHoldKeyboard to iRelMouse do CheckItem(GetMenu(mControls), i, FALSE); CheckItem(GetMenu(mControls), theItem, TRUE); controlMethod := theItem; end; iConfigure: DoCustomizeKeys; otherwise end; kHMHelpMenuID: if (theItem = iGlidersHelp) then OpenHelpScreens; otherwise end; HiliteMenu(0); end; {=================================} procedure DoMouseDown; var whichWindow: WindowPtr; theMenu, theItem, code: Integer; mResult: LongInt; begin code := FindWindow(theEvent.where, whichWindow); if (demoMode = highScoreMode) then CloseHiScores else if (demoMode = helpScreensMode) then NextPageHelpScreens else case (code) of inMenuBar: begin mResult := MenuSelect(theEvent.Where); theMenu := HiWord(mResult); theItem := LoWord(mResult); HandleMenu(theMenu, theItem); end; inSysWindow: SystemClick(theEvent, whichWindow); otherwise end; end; {=================================} procedure DoKeyDown; var chCode, theMenu, theItem: Integer; mResult: LongInt; begin with theEvent do begin chCode := BitAnd(message, CharCodeMask); if (ODD(modifiers div CmdKey)) then begin mResult := MenuKey(CHR(chCode)); theMenu := HiWord(mResult); theItem := LoWord(mResult); if (theMenu <> 0) then HandleMenu(theMenu, theItem); end else begin {knock through the demo messages} if ((chCode = kSpaceBar) and (demoMode <> highScoreMode)) then begin if (demoMode = helpScreensMode) then NextPageHelpScreens else begin demoMode := demoMode + 1; if (demoMode > lastDemo) then demoMode := 1; demoCount := 0; NewMode(FALSE); end; end; if (chCode = kReturnKey) then begin if (demoMode = helpScreensMode) then CloseHelpScreens else if (demoMode = highScoreMode) then CloseHiScores; end; {return from a paused game} if ((chCode = kTabKey) and (playing) and (pausing)) then begin demoMode := Randomize(lastDemo) + 1; HideMenuBar; ResumeGame; repeat GetKeys(theKeys); until (not theKeys[kTabKeyMap]); end; {check for secret code entered!} if (chCode = $4F) then ozmaFlags[0] := TRUE; if ((chCode = $7A) and (ozmaFlags[0])) then ozmaFlags[1] := TRUE; if ((chCode = $6D) and (ozmaFlags[1])) then ozmaFlags[2] := TRUE; if ((chCode = $61) and (ozmaFlags[2])) then begin ozmaFlags[3] := TRUE; refuseHigh := TRUE; end; end; {if (Odd(mod...} end; {with theEvent} end; {procedure} {=================================} procedure DoDiskEvent; var cornerPt: Point; begin if (HiWrd(theEvent.message) <> noErr) then begin SetPt(cornerPt, 85 + rightOffset, 50 + downOffset); theErr := DIBadMount(cornerPt, theEvent.message); end; end; {=================================} procedure DoOSEvent; begin case BSR(theEvent.message, 24) of {high byte of message} 1: {suspendResumeMessage} if (BitAnd(theEvent.message, kSuspendResumeBit) = kResuming) then begin inBackground := FALSE; {it was a resume event} if (not smsIsActive) then SMSInit; smsIsActive := TRUE; if (is4Channel) then SMSSetMode(4) else SMSSetMode(2); {re-grow window's right edge} end else begin if (smsIsActive) then SMSExit; smsIsActive := FALSE; inBackground := TRUE; {it was a suspend event} {shrink window's right edge} ShowMenuBar; end; otherwise end; {CASE} end; {osEvt} {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-IdleUtils.p b/Glider_405/Sources/G-IdleUtils.p new file mode 100755 index 0000000..26124ec --- /dev/null +++ b/Glider_405/Sources/G-IdleUtils.p @@ -0,0 +1 @@ +unit IdleUtils; interface uses Palettes, Globals, GlobalUtils; var ozmaFlags: array[0..3] of Boolean; procedure CloseHiScores; procedure NewMode (randomIt: Boolean); procedure DisplayAHelpScreen; procedure CloseHelpScreens; procedure NextPageHelpScreens; procedure OpenHelpScreens; procedure InitIdle; procedure DoIdle; procedure DropIdle; procedure DoAbout; procedure DoSoundSettings; procedure DoCustomizeKeys; {=================================} implementation var idleR1, idleR2, frameR, loadR: Rect; maskRgn: RgnHandle; colorPoint, loopDelay, screenNum, helpScreenNum: Integer; timeWas, tickStamp: LongInt; demoAnimate: animateRec; {=================================} procedure CloseHiScores; begin if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn); NewMode(TRUE); end; {=================================} procedure NewMode; var tempR, smallR: Rect; {----------------} procedure GetTheStrings (starting: Integer); var tempStr: Str255; begin if (inColor) then RGBForeColor(rgbBlue) else TextMode(srcXOr); MoveTo(300, 57); GetIndString(tempStr, rDemoStrIDs, starting); DrawString(tempStr); MoveTo(300, 70); GetIndString(tempStr, rDemoStrIDs, starting + 1); DrawString(tempStr); MoveTo(300, 83); GetIndString(tempStr, rDemoStrIDs, starting + 2); DrawString(tempStr); MoveTo(300, 96); GetIndString(tempStr, rDemoStrIDs, starting + 3); DrawString(tempStr); if (inColor) then RGBForeColor(rgbBlack) else PenNormal; end; {----------------} begin if (randomIt) then demoMode := Randomize(lastDemo) + 1; UseResFile(gliderResNum); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; SetRect(tempR, 298, 20, 508, 100); FillRect(tempR, black); TextFont(16); TextSize(12); case demoMode of balloonMode: begin with demoAnimate do begin phase := 0; kind := 2; vertOff := 4; destRect := animateRct[kind, phase]; OffsetRect(destRect, -destRect.left, -destRect.top); OffsetRect(destRect, 460, 45); oldRect := destRect; wholeRect := destRect; end; GetTheStrings(1); end; copterMode: begin with demoAnimate do begin phase := 0; kind := 1; vertOff := 3; destRect := animateRct[kind, phase]; OffsetRect(destRect, -destRect.left, -destRect.top); OffsetRect(destRect, 460, 45); oldRect := destRect; wholeRect := destRect; end; GetTheStrings(5); end; dartMode: begin with demoAnimate do begin phase := 0; kind := 0; vertOff := 4; destRect := animateRct[kind, phase]; OffsetRect(destRect, -destRect.left, -destRect.top); OffsetRect(destRect, 435, 45); oldRect := destRect; wholeRect := destRect; end; GetTheStrings(9); end; controlMode: GetTheStrings(13); tabMode: GetTheStrings(17); adMode: GetTheStrings(21); editorMode: GetTheStrings(25); colorMusicMode: GetTheStrings(29); ventCandleMode: begin GetTheStrings(33); smallR := SrcRect[flrVnt]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 456, 51); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[flrVnt], SrcRect[flrVnt], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[flrVnt], SrcRect[flrVnt], smallR); smallR := SrcRect[candle]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 466, 75); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[candle], SrcRect[candle], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[candle], SrcRect[candle], smallR); end; bandBatteryMode: begin GetTheStrings(37); smallR := SrcRect[rbrBnd]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 470, 45); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[rbrBnd], SrcRect[rbrBnd], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[rbrBnd], SrcRect[rbrBnd], smallR); smallR := SrcRect[battry]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 476, 75); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[battry], SrcRect[battry], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[battry], SrcRect[battry], smallR); end; paperClockMode: begin GetTheStrings(41); smallR := SrcRect[paper]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 460, 45); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[paper], SrcRect[paper], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[paper], SrcRect[paper], smallR); smallR := SrcRect[clock]; OffsetRect(smallR, -smallR.left, -smallR.top); OffsetRect(smallR, 468, 69); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, SrcRect[clock], SrcRect[clock], smallR) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, SrcRect[clock], SrcRect[clock], smallR); end; otherwise end; SetPort(GrafPtr(mainWndo)); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempR, tempR, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offVirginMap, mainWndo^.portBits, tempR, tempR, srcCopy, mainWndo^.visRgn); end; {=================================} procedure DisplayAHelpScreen; var destRect: Rect; thePict: PicHandle; tempByte: SignedByte; begin SetRect(destRect, 4, 4, 507, 130); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); thePict := GetPicture(helpScreenNum + rHelpBasePictID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, destRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; {CHANGE ME} end; ReleaseResource(Handle(thePict)); if (inColor) then begin BackColor(cyanColor); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destRect, destRect, srcCopy, mainWndo^.visRgn); BackColor(whiteColor); end else begin CopyBits(offLoadMap, mainWndo^.portBits, destRect, destRect, srcCopy, mainWndo^.visRgn); end; end; {=================================} procedure CloseHelpScreens; begin if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); end else begin CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); end; if (screenBits.bounds.bottom <= 342) then ShowMenuBar; if (playing) then demoMode := Randomize(lastDemo) + 1 else NewMode(TRUE); end; {=================================} procedure NextPageHelpScreens; begin if (helpScreenNum < kLastHelpScreen) then begin helpScreenNum := helpScreenNum + 1; DisplayAHelpScreen; FlushEvents(everyEvent, 0); end else CloseHelpScreens; end; {=================================} procedure OpenHelpScreens; begin helpScreenNum := 1; demoMode := helpScreensMode; if (screenBits.bounds.bottom <= 342) then HideMenuBar; DisplayAHelpScreen; repeat until (not Button); end; {=================================} procedure InitIdle; var i: Integer; begin for i := 0 to 3 do ozmaFlags[i] := FALSE; SetRect(idleR1, 0, 0, 48, 20); OffsetRect(idleR1, -512 + Randomize(450), 130 + Randomize(70)); SetRect(idleR2, 0, 0, 35, 15); OffsetRect(idleR2, -512 + Randomize(450), 130 + Randomize(70)); tickStamp := TickCount; MoveTo(3, 222); maskRgn := NewRgn; OpenRgn; LineTo(29, 222); LineTo(16, 183); LineTo(82, 183); LineTo(93, 161); LineTo(204, 161); LineTo(214, 200); LineTo(329, 200); LineTo(335, 206); LineTo(352, 206); LineTo(368, 221); LineTo(396, 221); LineTo(509, 278); LineTo(509, 130); LineTo(3, 130); LineTo(3, 222); CloseRgn(maskRgn); loopDelay := 0; colorPoint := 0; demoCount := 0; NewMode(TRUE); end; {=================================} procedure DoAnimate; begin with demoAnimate do begin phase := phase + 1; if (phase > 7) then begin phase := 0; vertOff := -vertOff; end; OffsetRect(destRect, 0, vertOff); if (inColor) then begin SetPort(GrafPtr(loadCPtr)); UnionRect(destRect, oldRect, wholeRect); FillRect(wholeRect, black); SetPort(GrafPtr(mainWndo)); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, animateRct[kind, phase], animateRct[kind, phase], destRect); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, GrafPtr(mainWndo)^.visRgn); end else begin SetPort(offLoadPort); UnionRect(destRect, oldRect, wholeRect); FillRect(wholeRect, black); SetPort(GrafPtr(mainWndo)); CopyMask(offPlayerMap, offMaskMap, offLoadMap, animateRct[kind, phase], animateRct[kind, phase], destRect); CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, mainWndo^.visRgn); end; oldRect := destRect; end; end; {=================================} procedure DoIdle; var combinedRgn: RgnHandle; dummyLong: longInt; tempR1, tempR2, srcR: Rect; begin if (demoMode = highScoreMode) then Exit(DoIdle); if (demoMode <> helpScreensMode) then begin demoCount := demoCount + 1; if (demoCount >= 159) then begin demoCount := 0; NewMode(TRUE); end; if ((demoMode >= balloonMode) and (demoMode <= dartMode)) then DoAnimate; end; OffsetRect(idleR1, 4, 0); OffsetRect(idleR2, 3, 0); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); tempR1 := idleR1; tempR1.left := tempR1.left - 4; FillRect(tempR1, black); tempR2 := idleR2; tempR2.left := tempR2.left - 3; FillRect(tempR2, black); SetRect(srcR, 0, 318, 35, 333); SetPort(GrafPtr(mainWndo)); combinedRgn := NewRgn; if (inColor) then begin SectRgn(maskRgn, GrafPtr(mainWndo)^.visRgn, combinedRgn); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcR, srcR, idleR2); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[0], glideRct[0], idleR1); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempR1, tempR1, srcCopy, combinedRgn); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempR2, tempR2, srcCopy, combinedRgn); end else begin SectRgn(maskRgn, mainWndo^.visRgn, combinedRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcR, srcR, idleR2); CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[0], glideRct[0], idleR1); CopyBits(offLoadMap, mainWndo^.portBits, tempR1, tempR1, srcCopy, combinedRgn); CopyBits(offLoadMap, mainWndo^.portBits, tempR2, tempR2, srcCopy, combinedRgn); end; DisposeRgn(combinedRgn); if (idleR1.left > 512) then begin SetRect(idleR1, 0, 0, 48, 20); OffsetRect(idleR1, -512 + Randomize(450), 130 + Randomize(70)); end; if (idleR2.left > 512) then begin SetRect(idleR2, 0, 0, 35, 15); OffsetRect(idleR2, -512 + Randomize(450), 130 + Randomize(70)); end; PenNormal; if (inColor) then case colorPoint of 0: begin frameR := wholeArea; RGBForeColor(rgbBlue); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbViolet); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbLtBlue); FrameRect(frameR); RGBForeColor(rgbBlack); end; 1: begin frameR := wholeArea; RGBForeColor(rgbLtBlue); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbBlue); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbViolet); FrameRect(frameR); RGBForeColor(rgbBlack); end; 2: begin frameR := wholeArea; RGBForeColor(rgbViolet); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbLtBlue); FrameRect(frameR); InsetRect(frameR, 1, 1); RGBForeColor(rgbBlue); FrameRect(frameR); RGBForeColor(rgbBlack); end; end; loopDelay := loopDelay + 1; if (loopDelay > 5) then begin loopDelay := 0; colorPoint := colorPoint + 1; if (colorPoint > 2) then colorPoint := 0; end; repeat until (TickCount >= tickStamp + 2); tickStamp := TickCount; end; {=================================} procedure DropIdle; begin DisposeRgn(maskRgn); end; {=================================} function idleFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: integer): boolean; var iconNum, iType: Integer; timeIs: LongInt; tempRect: Rect; iHand, icnHand: Handle; cicnHand: CIconHandle; begin idleFilter := FALSE; if ((theEvent.what = KeyDown) and (BitAnd(theEvent.message, CharCodeMask) = kReturnKey)) then begin itemHit := 1; idleFilter := TRUE; end; timeIs := TickCount; if (timeIs > timeWas + 90) then begin timeWas := TickCount; screenNum := screenNum + 1; if (screenNum > 3) then screenNum := 0; for iconNum := 2 to 10 do begin SpinBall; Delay(1, timeIs); SpinBall; Delay(1, timeIs); GetDItem(theDialog, iconNum, iType, iHand, tempRect); if (inColor) then begin cicnHand := GetCIcon(1226 + iconNum + (screenNum * 9)); if (cicnHand <> nil) then begin PlotCIcon(tempRect, cicnHand); DisposCIcon(cicnHand); end; end else begin icnHand := GetIcon(1226 + iconNum + (screenNum * 9)); if (icnHand <> nil) then PlotIcon(tempRect, icnHand); end; InitCursor; end; {end - for iconnum} end; {end - if (timeIs } end; {=================================} procedure DoAbout; const okayButton = 1; var savePort: GrafPtr; DType, itemHit: Integer; DItem: Handle; GetSelection: DialogPtr; tempRect: Rect; {----------------------------------} procedure RefreshIt; {Refresh the dialogs non-controls} begin SetPort(GetSelection); {Point to our dialog window} GetDItem(GetSelection, okayButton, DType, DItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenSize(1, 1); end; {----------------------------------} begin GetPort(savePort); GetSelection := GetNewDialog(228, nil, Pointer(-1));{Bring in the dialog resource} tempRect := GetSelection^.portRect; {Get window size, we will now center it} tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(GetSelection, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(GetSelection); {Open a dialog box} SelectWindow(GetSelection); {Lets see it} SetPort(GetSelection); {Prepare to add conditional text} RefreshIt; {Draw any Lists, lines, or rectangles} timeWas := TickCount; {Initialize the tick counter} screenNum := 0; {Initialize the set of icons displaying} repeat {Start of dialog handle loop} ModalDialog(@idleFilter, itemHit);{Wait until an item is hit} {End for this item selected} until (ItemHit = okayButton); {Handle dialog items until exit selected} SetPort(GrafPtr(savePort)); {Restore the previous grafport} DisposDialog(GetSelection); {Flush the dialog out of memory} end; {End of procedure} {=================================} procedure DoSoundSettings; const okayItem = 1; cancelItem = 2; soundOnItem = 3; musicOnItem = 4; incVolItem = 5; decVolItem = 6; iconItem = 7; volEqualsItem = 12; lineItem = 13; channel4Radio = 14; channel2Radio = 15; var wasPort: GrafPtr; itemT, itemHit, tempVolume, holdVolume: Integer; tempStr: Str255; itemH: Handle; theDlgPtr: DialogPtr; tempRect: Rect; leaveDlg, holdSound, holdMusic, thisSound, thisMusic, holdChannel: boolean; {----------------------------------} function FixedVolume (theVolume: Integer): Integer; begin case theVolume of 0: begin SetSoundVol(0); theVolume := 800; end; 1, 2: begin SetSoundVol(1); theVolume := 801; end; 3, 4: begin SetSoundVol(3); theVolume := 802; end; 5, 6: begin SetSoundVol(5); theVolume := 803; end; otherwise begin SetSoundVol(7); theVolume := 804; end; end; FixedVolume := theVolume; end; {----------------------------------} procedure RefreshIt; var offset, isVolume: Integer; cicnH: CIconHandle; iconH: Handle; begin SetPort(theDlgPtr); GetDItem(theDlgPtr, lineItem, itemT, itemH, tempRect); FillRect(tempRect, black); GetDItem(theDlgPtr, okayItem, itemT, itemH, tempRect); PenSize(3, 3); InsetRect(tempRect, -4, -4); FrameRoundRect(tempRect, 16, 16); PenSize(1, 1); GetSoundVol(isVolume); GetDItem(theDlgPtr, volEqualsItem, itemT, itemH, tempRect); NumToString(isVolume, tempStr); SetIText(itemH, tempStr); offset := FixedVolume(isVolume); GetDItem(theDlgPtr, iconItem, itemT, itemH, tempRect); if (inColor) then begin cicnH := GetCIcon(offset); if (cicnH <> nil) then begin PlotCIcon(tempRect, cicnH); ReleaseResource(Handle(iconH)); DisposCIcon(cicnH); end; end else begin iconH := GetIcon(offset); if (iconH <> nil) then begin PlotIcon(tempRect, iconH); ReleaseResource(iconH); end; end; end; {----------------------------------} begin FlushEvents(EveryEvent, 0); GetPort(wasPort); UseResFile(gliderResNum); GetSoundVol(holdVolume); holdSound := soundOn; holdMusic := musicOn; thisSound := soundOn; thisMusic := musicOn; holdChannel := is4Channel; theDlgPtr := GetNewDialog(rSoundDlgID, nil, Pointer(-1)); tempRect := theDlgPtr^.portRect; tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(theDlgPtr, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); GetDItem(theDlgPtr, soundOnItem, itemT, itemH, tempRect); if (soundOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); GetDItem(theDlgPtr, musicOnItem, itemT, itemH, tempRect); if (musicOn) then {set or hide Music On checkbox} SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); if (cantMusic) then HideDItem(theDlgPtr, musicOnItem); if (is4Channel) then {set radio buttons for 4/2 channel sound} GetDItem(theDlgPtr, channel4Radio, itemT, itemH, tempRect) else GetDItem(theDlgPtr, channel2Radio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); RefreshIt; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); if (ItemHit = okayItem) then {clicked on Okay button} begin leaveDlg := TRUE; GetSoundVol(tempVolume); soundOn := ((thisSound) and (tempVolume <> 0)); end; if (ItemHit = cancelItem) then {clicked on Cancle button} begin leaveDlg := TRUE; SetSoundVol(holdVolume); soundOn := holdSound; musicOn := holdMusic; is4Channel := holdChannel; end; if (ItemHit = soundOnItem) then begin soundOn := not soundOn; thisSound := not thisSound; GetDItem(theDlgPtr, soundOnItem, itemT, itemH, tempRect); if (soundOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); end; if (ItemHit = musicOnItem) then begin thisMusic := not thisMusic; musicOn := not musicOn; GetDItem(theDlgPtr, musicOnItem, itemT, itemH, tempRect); if (musicOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); end; if (ItemHit = incVolItem) then begin GetSoundVol(tempVolume); case tempVolume of 0: tempVolume := 1; 1, 2: tempVolume := 3; 3, 4: tempVolume := 5; otherwise tempVolume := 7; end; SetSoundVol(tempVolume); soundOn := ((thisSound) and (tempVolume <> 0)); GetDItem(theDlgPtr, soundOnItem, itemT, itemH, tempRect); if (soundOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); musicOn := ((thisMusic) and (tempVolume <> 0)); GetDItem(theDlgPtr, musicOnItem, itemT, itemH, tempRect); if (musicOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); RefreshIt; end; if (ItemHit = decVolItem) then begin GetSoundVol(tempVolume); case tempVolume of 1, 2: tempVolume := 0; 3, 4: tempVolume := 1; 5, 6: tempVolume := 3; 7: tempVolume := 5; otherwise tempVolume := 0; end; SetSoundVol(tempVolume); soundOn := ((thisSound) and (tempVolume <> 0)); GetDItem(theDlgPtr, soundOnItem, itemT, itemH, tempRect); if (soundOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); musicOn := ((thisMusic) and (tempVolume <> 0)); GetDItem(theDlgPtr, musicOnItem, itemT, itemH, tempRect); if (musicOn) then SetCtlValue(ControlHandle(itemH), 1) else SetCtlValue(ControlHandle(itemH), 0); RefreshIt; end; if (ItemHit = channel4Radio) then begin GetDItem(theDlgPtr, channel4Radio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, channel2Radio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); is4Channel := TRUE; end; if (ItemHit = channel2Radio) then begin GetDItem(theDlgPtr, channel2Radio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, channel4Radio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); is4Channel := FALSE; end; until leaveDlg; SetPort(GrafPtr(wasPort)); DisposDialog(theDlgPtr); end; {=================================} procedure DoCustomizeKeys; const okayItem = 1; cancelItem = 2; leftIcon = 3; rightIcon = 4; energyIcon = 5; bandIcon = 6; leftStat = 7; rightStat = 8; energyStat = 9; bandStat = 10; modeStat = 11; energyRadio = 12; bandRadio = 13; type string12 = string[12]; var wasPort: GrafPtr; itemT, itemHit, i, rawKey, rawChar: Integer; newLeftKey, newRightKey, newEnergyKey, newBandKey: Integer; theState, tempLong: LongInt; tempStr: Str255; itemH, keyHandle: Handle; theDlgPtr: DialogPtr; tempRect: Rect; newLeftName, newRightName, newEnergyName, newBandName: string[12]; leaveDlg, newButtonFires: Boolean; {------------------} procedure RefreshIt; begin SetPort(theDlgPtr); GetDItem(theDlgPtr, okayItem, itemT, itemH, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; end; {------------------} function ShowKeyName (rawKeyCode, rawCharCode: Integer): string12; begin if ((rawCharCode >= $21) and (rawCharCode <= $7A)) then begin if ((rawKeyCode >= $41) and (rawKeyCode <= $5C)) then tempStr := CONCAT(CHR(rawCharCode), ' keypad') else tempStr := CONCAT(CHR(rawCharCode), ' key'); end else case rawCharCode of $01: tempStr := 'home'; $03: tempStr := 'enter'; $04: tempStr := 'end'; $05: tempStr := 'help'; $08: tempStr := 'delete'; $09: tempStr := 'tab'; $0B: tempStr := 'page up'; $0C: tempStr := 'page down'; $0D: tempStr := 'return'; $10: case rawKeyCode of $60: tempStr := 'F5 key'; $61: tempStr := 'F6 key'; $62: tempStr := 'F7 key'; $63: tempStr := 'F3 key'; $64: tempStr := 'F8 key'; $65: tempStr := 'F9 key'; $67: tempStr := 'F11 key'; $69: tempStr := 'F13 key'; $6B: tempStr := 'F14 key'; $6D: tempStr := 'F10 key'; $6F: tempStr := 'F12 key'; $71: tempStr := 'F15 key'; $76: tempStr := 'F4 key'; $78: tempStr := 'F2 key'; $7A: tempStr := 'F1 key'; otherwise NumToString(rawKeyCode, tempStr); end; $1A: tempStr := 'clear'; $1B: if (rawKeyCode = $47) then tempStr := 'clear' else tempStr := 'escape'; $1C: tempStr := 'left arrow'; $1D: tempStr := 'right arrow'; $1E: tempStr := 'up arrow'; $1F: tempStr := 'down arrow'; $20: tempStr := 'space'; $7F: tempStr := 'del key'; otherwise tempStr := 'unknown'; end; ShowKeyName := tempStr; end; {------------------} begin FlushEvents(EveryEvent, 0); GetPort(wasPort); UseResFile(gliderResNum); theDlgPtr := GetNewDialog(rCustomKeysID, nil, Pointer(-1)); tempRect := theDlgPtr^.portRect; tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(theDlgPtr, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); newLeftKey := leftKey; newRightKey := rightKey; newEnergyKey := energyKey; newBandKey := bandKey; newButtonFires := buttonFires; newLeftName := leftName; newRightName := rightName; newEnergyName := energyName; newBandName := bandName; GetDItem(theDlgPtr, leftStat, itemT, itemH, tempRect); SetIText(itemH, newLeftName); GetDItem(theDlgPtr, rightStat, itemT, itemH, tempRect); SetIText(itemH, newRightName); GetDItem(theDlgPtr, energyStat, itemT, itemH, tempRect); SetIText(itemH, newEnergyName); GetDItem(theDlgPtr, bandStat, itemT, itemH, tempRect); SetIText(itemH, newBandName); if (newButtonFires) then GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect) else GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); RefreshIt; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); if ((itemHit >= leftIcon) and (itemHit <= bandIcon)) then begin GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); InvertRect(tempRect); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'The next key you strike will control this function.'); InvertRect(tempRect); repeat until not Button; FlushEvents(everyEvent, 0); repeat until GetNextEvent(keyDownMask, theEvent); rawKey := LoWord(BitAnd(KeyCodeMask, theEvent.message) div $FF); rawChar := LoWord(BitAnd(CharCodeMask, theEvent.message)); FlushEvents(everyEvent, 0); InvertRect(tempRect); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); InvertRect(tempRect); tempStr := ShowKeyName(rawKey, rawChar); GetDItem(theDlgPtr, itemHit + 4, itemT, itemH, tempRect); SetIText(itemH, tempStr); if (tempStr = 'tab') then begin SysBeep(3); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'The TAB key is reserved for pausing Glider.'); Delay(180, tempLong); case itemHit of leftIcon: tempStr := newLeftName; rightIcon: tempStr := newRightName; energyIcon: tempStr := newEnergyName; otherwise tempStr := newBandName; end; GetDItem(theDlgPtr, itemHit + 4, itemT, itemH, tempRect); SetIText(itemH, tempStr); end else case itemHit of leftIcon: begin newLeftKey := rawKey; newLeftName := COPY(tempStr, 1, 12); end; rightIcon: begin newRightKey := rawKey; newRightName := COPY(tempStr, 1, 12); end; energyIcon: begin newEnergyKey := rawKey; newEnergyName := COPY(tempStr, 1, 12); end; otherwise begin newBandKey := rawKey; newBandName := COPY(tempStr, 1, 12); end; end; GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); end; if (itemHit = energyRadio) then begin newButtonFires := FALSE; GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); end; if (itemHit = bandRadio) then begin newButtonFires := TRUE; GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); end; if (itemHit = okayItem) then begin leaveDlg := TRUE; if ((newLeftKey = newRightKey) or (newLeftKey = newEnergyKey) or (newLeftKey = newBandKey)) then begin SysBeep(3); newLeftKey := leftKey; newLeftName := leftName; GetDItem(theDlgPtr, leftStat, itemT, itemH, tempRect); SetIText(itemH, newLeftName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Left Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if ((newRightKey = newEnergyKey) or (newRightKey = newBandKey)) then begin SysBeep(3); newRightKey := rightKey; newRightName := rightName; GetDItem(theDlgPtr, rightStat, itemT, itemH, tempRect); SetIText(itemH, newRightName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Right Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if (newEnergyKey = newBandKey) then begin SysBeep(3); newEnergyKey := energyKey; newEnergyName := energyName; GetDItem(theDlgPtr, energyStat, itemT, itemH, tempRect); SetIText(itemH, newEnergyName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Energize Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if (leaveDlg) then begin leftKey := newLeftKey; rightKey := newRightKey; energyKey := newEnergyKey; bandKey := newBandKey; buttonFires := newButtonFires; leftName := newLeftName; rightName := newRightName; energyName := newEnergyName; bandName := newBandName; end; end; if (ItemHit = cancelItem) then leaveDlg := TRUE; until leaveDlg; SetPort(GrafPtr(wasPort)); DisposDialog(theDlgPtr); end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-Initialize.p b/Glider_405/Sources/G-Initialize.p new file mode 100755 index 0000000..a3836ee --- /dev/null +++ b/Glider_405/Sources/G-Initialize.p @@ -0,0 +1 @@ +unit Initialize; interface uses Balloons, Palettes, Globals, GlobalUtils, FileInNOut, IdleInput; procedure InitializeAll; procedure DoStartUp; {=================================} implementation {=================================} procedure InitializeAll; var i: Integer; ignoreStr: Str255; {------------------------} procedure InitToolBox; var ignore: Boolean; begin gliderResNum := CurResFile; SetApplLimit(Ptr(LongInt(GetApplLimit) - kStackSize)); MaxApplZone; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; MoreMasters; InitGraf(@thePort); InitFonts; FlushEvents(everyEvent, 0); InitWindows; InitMenus; TEInit; InitDialogs(nil); ignore := EventAvail(EveryEvent, theEvent); inBackground := FALSE; end; {------------------------} procedure CheckOurEnvirons; const WNETrapNum = $60; unimplTrapNum = $9F; SoundBase = $0266; ASCBase = $0CC0; Color = 1; Monochrome = 0; GDTypeFlag = 1; kPointerBase = $3F2700 - $20; var thisWorld: SysEnvRec; tempRes: Handle; theDevice: GDHandle; initsPointer: Ptr; theResponse, initData: LongInt; sheSaid: Integer; hasINIT: Boolean; {-----------} function DepthAlert: Integer; var dummyInt: Integer; alertHandle: AlertTHndl; alertRect: Rect; begin UseResFile(gliderResNum); InitCursor; alertHandle := AlertTHndl(Get1Resource('ALRT', rDepthAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(rDepthAlertID, nil); DepthAlert := dummyInt; end; {-----------} function SetDepth (gd: GDHandle; newDepth, whichFlags, newFlags: Integer): Integer; inline $203C, $000A, $0013, $AAA2; {-----------} procedure ForceBlackAndWhite; begin with theDevice^^.gdPMap^^ do if (pixelSize <> 1) then if (cantSwitch) then {if we can't switch via software} begin GenericAlert(kErr2Or16Colors); {say, "Hey, set the Control Panel"} ExitToShell; end else begin {we can switch via software} theErr := SetDepth(theDevice, 1, GDTypeFlag, Color); inColor := FALSE; end; {end - we can switch via software} end; {-----------} procedure CheckAndSwitch; begin with theDevice^^.gdPMap^^ do if ((pixelSize <> 4) and (pixelSize <> 1)) then if (cantSwitch) then {if we can't switch via software} begin GenericAlert(kErr2Or16Colors); {say, "Hey, set the Control Panel"} ExitToShell; end else begin {we can switch via software} sheSaid := DepthAlert; {bring up monitor switch alert} case sheSaid of {what button did they click?} 1: {switch to 16 color} theErr := SetDepth(theDevice, 4, GDTypeFlag, Color); 2: {switch to B&W} begin theErr := SetDepth(theDevice, 1, GDTypeFlag, Color); inColor := FALSE; end; otherwise begin InitCursor; ExitToShell; end; end; end; {end - we can switch via software} end; {-----------} begin tempRes := Get1Resource('CURS', 128); if (tempRes <> nil) then begin HLock(tempRes); SetResInfo(tempRes, 128, 'oz'); if (ResError = WPrErr) or (ResError = FLckdErr) or (ResError = VLckdErr) then begin GenericAlert(kErrVolLocked); ExitToShell; end; ChangedResource(tempRes); if (ResError = WPrErr) or (ResError = FLckdErr) or (ResError = VLckdErr) then begin GenericAlert(kErrVolLocked); ExitToShell; end; WriteResource(tempRes); if (ResError = WPrErr) or (ResError = FLckdErr) or (ResError = VLckdErr) then begin GenericAlert(kErrVolLocked); ExitToShell; end; HUnlock(tempRes); ReleaseResource(tempRes); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; rightOffset := (ScreenBits.bounds.right - 512) div 2; downOffset := (ScreenBits.bounds.bottom - 342) div 2; theErr := SysEnvirons(1, thisWorld); {Check on the set up of the Mac game is on } with thisWorld do begin if (machineType < envMacPlus) then {If less than a Mac 512KE (=1) then quit now!} begin GenericAlert(kErrMacPlusNeeded); ExitToShell; end; inhibitSound := FALSE; cantSwitch := (systemVersion < $0605); hasSys7 := (systemVersion >= $0700); areFlipping := (machineType = envMacPlus) or (machineType = envSE) or (machineType = 15); if (areFlipping) then begin hasINIT := TRUE; initsPointer := Pointer(kPointerBase + 1); initData := initsPointer^; if (initData <> $61) and (initData <> $48) then hasINIT := FALSE; initsPointer := Pointer(kPointerBase + 2); initData := initsPointer^; if (initData <> $6C) and (initData <> $6F) then hasINIT := FALSE; initsPointer := Pointer(kPointerBase + 3); initData := initsPointer^; if (initData <> $74) and (initData <> $6C) then hasINIT := FALSE; if ((not hasINIT) and (areFlipping)) then begin GenericAlert(kErrMissionINIT); areFlipping := FALSE; end; scoreIncrement := kFastScoreIncrement; end else scoreIncrement := kSlowScoreIncrement; herKeyboard := keyBoardType; cantColor := not hasColorQD; inColor := hasColorQD; if (inColor) then begin theDevice := GetMainDevice; if (theDevice = nil) then begin GenericAlert(kErrUnaccounted); ExitToShell; end; HLock(Handle(theDevice)); with theDevice^^.gdPMap^^ do begin wasDepth := pixelSize; GetKeys(theKeys); if (theKeys[kCommandKeyMap]) then ForceBlackAndWhite else CheckAndSwitch; if (pixelSize = 1) then inColor := FALSE; end; HUnlock(Handle(theDevice)); end; end; {end - with thisWorld} hasWNE := (NGetTrapAddress(WNETrapNum, ToolTrap) <> NGetTrapAddress(unimplTrapNum, toolTrap)); end; {------------------------} procedure LoadCursors; var count: Integer; tempByte: SignedByte; begin useColorCursor := inColor; UseResFile(gliderResNum); noCursor := GetCursor(128); ballList := acurHand(GetResource('acur', rAcurID)); if (ballList = nil) then begin GenericAlert(kErrLoadingRes); Exit(LoadCursors); end; tempByte := HGetState(Handle(ballList)); HLock(Handle(ballList)); with ballList^^ do begin for count := 1 to kCursCount do begin if (useColorCursor) then begin ballC[count] := GetCCursor(HiWord(LongInt(ball[count]))); if (ballC[count] = nil) then useColorCursor := FALSE; end; ball[count] := GetCursor(HiWord(LongInt(ball[count]))); if (ball[count] = nil) then begin GenericAlert(kErrLoadingRes); whichBall := -1; Exit(LoadCursors); end; end; whichBall := 0; end; HSetState(Handle(ballList), tempByte); end; {------------------------} procedure InitGlobalRects; begin SetRect(wholeArea, 0, 0, 512, 342); SetRect(fullArea, -rightOffset, -downOffset, 512 + rightOffset, 342 + downOffset); SetRect(nullRect, -500, -500, -500, -500); SetRect(smScoreRect, 224, 8, 296, 17); SetRect(lgScoreRect, 222, 4, 296, 21); wholeRgn := NewRgn; RectRgn(wholeRgn, wholeArea); MoveHHi(Handle(wholeRgn)); HLock(Handle(wholeRgn)); end; {------------------------} procedure SetUpColors; begin rgbBlack.red := 0; rgbBlack.green := 0; rgbBlack.blue := 0; rgbWhite.red := -1; rgbWhite.green := -1; rgbWhite.blue := -1; rgbYellow.red := -1; rgbYellow.green := -1; rgbYellow.blue := 0; rgbViolet.red := -1; rgbViolet.green := 0; rgbViolet.blue := -1; rgbRed.red := -1; rgbRed.green := 0; rgbRed.blue := 0; rgbLtBlue.red := 0; rgbLtBlue.green := -1; rgbLtBlue.blue := -1; rgbBrown.red := 22016; rgbBrown.green := 11421; rgbBrown.blue := 1316; rgbLtBrown.red := -28457; rgbLtBrown.green := 29024; rgbLtBrown.blue := 14900; rgbDkGray.red := 16384; rgbDkGray.green := 16384; rgbDkGray.blue := 16384; rgbBlue.red := 0; rgbBlue.green := 0; rgbBlue.blue := -1; rgbLtGreen.red := 7967; rgbLtGreen.green := -18503; rgbLtGreen.blue := 5140; end; {------------------------} procedure SetUpMainWndo; var thePict: PicHandle; tempRect: Rect; tempByte: SignedByte; begin {Init main window} mainWndo := nil; if (inColor) then {load the window template from resource} mainWndo := GetNewCWindow(rMainWndoID, nil, Pointer(-1)) else mainWndo := GetNewWindow(rMainWndoID, nil, WindowPtr(-1)); if (mainWndo = nil) then begin mainWndo := nil; GenericAlert(kErrNotEnoughMem); ExitToShell; end; {properly size and then show window} SizeWindow(GrafPtr(mainWndo), 512 + (2 * rightOffset), 342 + (2 * downOffset), FALSE); ShowWindow(mainWndo); SelectWindow(GrafPtr(mainWndo)); SetPort(GrafPtr(mainWndo)); {set up windows coordinate system} SetOrigin(-rightOffset, -downOffset); {fill black all around the border} SetRect(tempRect, -rightOffset, -downOffset, 512 + (2 * rightOffset), 0); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 342, 512 + (2 * rightOffset), 342 + downOffset); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 0, 0, 342); FillRect(tempRect, black); SetRect(tempRect, 512, 0, 512 + rightOffset, 342); FillRect(tempRect, black); if (inColor) then begin RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); {assign palette} mainPalette := GetNewPalette(rMainWndoID); SetPalette(mainWndo, mainPalette, TRUE); {load side-bar PICTs} SetRect(tempRect, -64, 0, 0, 342); thePict := GetPicture(rSidePict1); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); end else begin TextFont(201); {This is to preload the fonts} DrawString('o'); {needed so that there is no } TextFont(200); {disk-access delay when they } DrawString('z'); {are needed in the game. } end; {load in other side-bar PICT} if (inColor) then begin SetRect(tempRect, 512, 0, 512 + 64, 342); thePict := GetPicture(rSidePict2); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); end; ClipRect(wholeArea); {load in splash PICT} if (inColor) then thePict := GetPicture(rColorIdleID) else thePict := GetPicture(rIdleID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); {$IFC DemoVersion} MoveTo(13, 113); TextFont(SystemFont); if (inColor) then begin ForeColor(redColor); TextMode(patOr); DrawString('DEMO VERSION'); ForeColor(blackColor); end else begin TextMode(patXOr); DrawString('DEMO VERSION'); end; {$ENDC} end; {------------------------} function NewBitMap (var theBitMap: BitMap; theRect: Rect): Ptr; begin SpinBall; with theBitMap, theRect do begin rowBytes := ((right - left + 15) div 16) * 2; baseAddr := NewPtr(rowBytes * (bottom - top)); bounds := theRect; if (MemError <> noErr) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end else NewBitMap := baseAddr; end; end; {------------------------} procedure SetUpBitMaps; var thePict: PicHandle; rawPointer: Ptr; tempRect: Rect; tempByte: SignedByte; begin {Init b&w Bitmaps} {Init offscreen virgin map} offVirginPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offVirginPort); offVirginBits := NewBitMap(offVirginMap, wholeArea); SetPortBits(offVirginMap); ClipRect(wholeArea); EraseRect(offVirginMap.bounds); thePict := GetPicture(rIdleID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); {$IFC DemoVersion} MoveTo(13, 113); TextFont(SystemFont); TextMode(patXOr); DrawString('DEMO VERSION'); {$ENDC} SpinBall; {Init offscreen load map} if (areFlipping) then begin offLoadPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offLoadPort); with offLoadMap, ScreenBits.bounds do begin rowBytes := ((right - left + 15) div 16) * 2; baseAddr := Pointer(kSecondaryAddr); bounds := ScreenBits.bounds; if (MemError <> noErr) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end else offLoadBits := baseAddr; end; SetPortBits(offLoadMap); ClipRect(ScreenBits.bounds); EraseRect(offLoadMap.bounds); end else begin offLoadPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offLoadPort); offLoadBits := NewBitMap(offLoadMap, wholeArea); SetPortBits(offLoadMap); ClipRect(wholeArea); EraseRect(offLoadMap.bounds); end; {Init offscreen object map} offPlayerPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offPlayerPort); offPlayerBits := NewBitMap(offPlayerMap, wholeArea); SetPortBits(offPlayerMap); ClipRect(wholeArea); EraseRect(offPlayerMap.bounds); {Init offscreen reserve map} SetRect(tempRect, 0, 0, 192, 116); offReservePort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offReservePort); offReserveBits := NewBitMap(offReserveMap, tempRect); SetPortBits(offReserveMap); ClipRect(offReserveMap.bounds); EraseRect(offReserveMap.bounds); end; {black and white set-up} {------------------------} procedure SetUpPixMaps; var thePict: PicHandle; sizeOfOff, offRowBytes: LongInt; tempRect: Rect; theDepth: Integer; tempByte: SignedByte; begin virginCPtr := @virginCPort; OpenCPort(virginCPtr); theDepth := 4; offRowBytes := ((((theDepth * (wholeArea.right - wholeArea.left)) + 15)) div 16) * 2; sizeOfOff := LONGINT(wholeArea.bottom - wholeArea.top) * offRowBytes; virginCBits := NewPtr(sizeOfOff); if (virginCPtr = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with virginCPtr^.portPixMap^^ do begin baseAddr := virginCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); {load virgin ports PICT} SpinBall; thePict := GetPicture(rColorIdleID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); {$IFC DemoVersion} MoveTo(13, 113); TextFont(SystemFont); ForeColor(redColor); TextMode(patOr); DrawString('DEMO VERSION'); ForeColor(blackColor); {$ENDC} SpinBall; loadCPtr := @loadCPort; OpenCPort(loadCPtr); loadCBits := NewPtr(sizeOfOff); if (loadCBits = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with loadCPtr^.portPixMap^^ do begin baseAddr := loadCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); objectCPtr := @objectCPort; OpenCPort(objectCPtr); objectCBits := NewPtr(sizeOfOff); if (objectCBits = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with objectCPtr^.portPixMap^^ do begin baseAddr := objectCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); {Init offscreen reserve map} reserveCPtr := @reserveCPort; OpenCPort(reserveCPtr); SetRect(tempRect, 0, 0, 192, 116); offRowBytes := ((((theDepth * (tempRect.right - tempRect.left)) + 15)) div 16) * 2; sizeOfOff := LONGINT(tempRect.bottom - tempRect.top) * offRowBytes; reserveCBits := NewPtr(sizeOfOff); if (reserveCBits = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with reserveCPtr^.portPixMap^^ do begin baseAddr := reserveCBits; rowBytes := offRowBytes + $8000; bounds := tempRect; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(thePort^.portRect); end; {------------------------} procedure SetUpOffMask; begin {Init offscreen mask map} offMaskPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offMaskPort); offMaskBits := NewBitMap(offMaskMap, wholeArea); SetPortBits(offMaskMap); ClipRect(wholeArea); EraseRect(offMaskMap.bounds); end; {------------------------} procedure GetPrefs; type prefType = record theName: string[24]; houseName: string[32]; resName: string[32]; sndVolume: Integer; controlIs: Integer; leftIs, rightIs, energyIs, bandIs: Integer; musicIs, channel4Is, airVisIs, buttonIs, restoreIs: Boolean; leftNameIs, rightNameIs, energyNameIs, bandNameIs: string[12]; keyBoardIs: Integer; end; prefPtr = ^prefType; prefHand = ^prefPtr; pictDeepPt = ^Integer; pictDeepHn = ^pictDeepPt; var theirPrefs: prefHand; pictDeep: pictDeepHn; refNumber, tempVol: Integer; satisfactory: Boolean; {-----------------} procedure DefaultControls; begin leftKey := kDefaultLeftKey; rightKey := kDefaultRightKey; energyKey := kDefaultEnergyKey; bandKey := kDefaultBandKey; buttonFires := FALSE; leftName := kDefaultLeftName; rightName := kDefaultRightName; energyName := kDefaultEnergyName; bandName := kDefaultBandName; end; {-----------------} procedure Default; begin {$IFC DemoVersion} housesName := 'Demo House'; {$ELSEC} housesName := 'The House'; {$ENDC} playerName := 'Your name here...'; if (inColor) then resourceName := 'Color Art' else resourceName := 'B&W Art'; controlMethod := 3; CheckItem(GetMenu(mControls), controlMethod, TRUE); musicOn := TRUE; airVisible := FALSE; buttonFires := FALSE; restoreColor := TRUE; is4Channel := TRUE; DefaultControls; end; {-----------------} begin UseResFile(gliderResNum); theirPrefs := prefHand(NewHandle(SIZEOF(prefType))); if (theirPrefs = nil) then begin GenericAlert(kErrLoadingPrefs); Default; end else begin Handle(theirPrefs) := GetResource('Gprf', 128); if ((ResError = noErr) and (theirPrefs <> nil)) then begin HLock(Handle(theirPrefs)); with theirPrefs^^ do begin housesName := houseName; playerName := theName; resourceName := resName; SetSoundVol(sndVolume); controlMethod := controlIs; leftKey := leftIs; rightKey := rightIs; energyKey := energyIs; bandKey := bandIs; musicOn := musicIs; channel4Is := is4Channel; airVisible := airVisIs; buttonFires := buttonIs; restoreColor := restoreIs; leftName := leftNameIs; rightName := rightNameIs; energyName := energyNameIs; bandName := bandNameIs; if (keyBoardIs <> herKeyBoard) then begin GenericAlert(kErrNewKeyboard); DefaultControls; end; end; HUnlock(Handle(theirPrefs)); ReleaseResource(Handle(theirPrefs)); end else begin GenericAlert(kErrLoadingPrefs); Default; end; end; refNumber := OpenResFile(resourceName); {test to see if res legit} if (refNumber = -1) then begin if (ResError = resFNotFound) then {Hmmm. Maybe color depth has changed} begin if (inColor) then resourceName := 'Color Art' {Try the default color name} else resourceName := 'B&W Art'; {Or default B&W file name} refNumber := OpenResFile(resourceName); {test to see if res legit yet} if (refNumber = -1) then begin UseResFile(gliderResNum); {back to Gilder res file} GenericAlert(kErrGraphicsNotFound); {bitch about all this} if (not DoOpen(kArtType)) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end else begin UseResFile(gliderResNum); {back to Gilder res file} GenericAlert(kErrGraphicsNotFound); {bitch about all this} if (not DoOpen(kArtType)) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end; satisfactory := FALSE; {default to failure} repeat UseResFile(refNumber); {make sure we're current} pictDeep := pictDeepHn(NewHandle(SIZEOF(Integer))); if (pictDeep = nil) then {prepare for 'deep' resource} begin GenericAlert(kErrGraphicLoad); ExitToShell; end; Handle(pictDeep) := GetResource('deep', 128); if ((ResError = noErr) and (pictDeep <> nil)) then begin HLock(Handle(pictDeep)); if (inColor) then begin if (pictDeep^^ <> $0004) then {is it a 4-bit color file?} begin if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; CloseResFile(refNumber); if (resourceName <> 'Color Art') then begin resourceName := 'Color Art'; refNumber := OpenResFile(resourceName);{lets try this one} end else begin GenericAlert(kErrGraphicsAre2Bit); {sorry, not 4-bit!} if (not DoOpen(kArtType)) then {last chance} begin GenericAlert(kErrExitSansGraphics); {you blew it - bye!} ExitToShell; end; refNumber := OpenResFile(resourceName);{okay, we'll try this one} end; end else satisfactory := TRUE; end {end - inColor} else {not inColor so...} begin {were in b&w mode} if (pictDeep^^ <> $0001) then begin if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; CloseResFile(refNumber); if (resourceName <> 'B&W Art') then begin resourceName := 'B&W Art'; refNumber := OpenResFile(resourceName);{lets try this one} end else begin GenericAlert(kErrGraphicsAre16Bit); if (not DoOpen(kArtType)) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end else satisfactory := TRUE; end; end {end - if ((ResError = noErr)...} else {there was an error} begin GenericAlert(kErrGraphicLoad); ExitToShell; end; if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; until satisfactory; CloseResFile(refNumber); UseResFile(gliderResNum); GetSoundVol(tempVol); case tempVol of 0: SetSoundVol(0); 1, 2: SetSoundVol(1); 3, 4: SetSoundVol(3); 5, 6: SetSoundVol(5); otherwise SetSoundVol(7); end; if (tempVol = 0) then soundOn := FALSE else soundOn := not inhibitSound; end; {------------------------} procedure LoadPICTs; var wasPort: GrafPtr; thePict: PicHandle; refNumber: Integer; tempByte: SignedByte; begin refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin UseResFile(gliderResNum); GenericAlert(kErrGraphicsNotFound); if (not DoOpen(kArtType)) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin GenericAlert(kErrGraphicsNotFound); ExitToShell; end; end; SpinBall; GetPort(wasPort); if (inColor) then {load the objects up} SetPort(GrafPtr(objectCPtr)) else SetPort(offPlayerPort); UseResFile(refNumber); thePict := GetPicture(rObjectPictID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); SpinBall; SetPort(offMaskPort); UseResFile(refNumber); thePict := GetPicture(rMaskPictID); {load the masks up} if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); SetPort(wasPort); CloseResFile(refNumber); UseResFile(gliderResNum); end; {------------------------} procedure SetUpMenus; var tempMenu: MenuHandle; i: Integer; {-------------------} begin {Init MENU bar} ClearMenuBar; tempMenu := GetMenu(mApple); if (tempMenu <> nil) then begin AddResMenu(tempMenu, 'DRVR'); InsertMenu(tempMenu, 0); end else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; tempMenu := GetMenu(mGame); if (tempMenu <> nil) then begin InsertMenu(tempMenu, 0); DisableItem(tempMenu, iEndGame); DisableItem(tempMenu, iSaveGame); DisableItem(tempMenu, iSaveGameAs); {$IFC DemoVersion} DisableItem(tempMenu, iLoadHouse); DisableItem(tempMenu, iLoadGame); {$ENDC} end else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; tempMenu := GetMenu(mOption); if (tempMenu <> nil) then InsertMenu(tempMenu, 0) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; if (hasSys7) then {add a Help menu item} begin theErr := HMGetHelpMenuHandle(tempMenu); if (theErr = noErr) then if (tempMenu <> nil) then begin AppendMenu(tempMenu, 'Glider Help'); iGlidersHelp := CountMItems(tempMenu); end else begin tempMenu := GetMenu(mOption); AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end else begin tempMenu := GetMenu(mOption); AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end; end else begin AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end; tempMenu := GetMenu(mControls); if (tempMenu <> nil) then InsertMenu(tempMenu, -1) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; if (airVisible) then SetItem(GetMenu(mOption), iShowAir, 'Air is Visible') else SetItem(GetMenu(mOption), iShowAir, 'Air is Invisible'); if (restoreColor) then SetItem(GetMenu(mOption), iRestoreDeep, 'Depth Restore is On') else SetItem(GetMenu(mOption), iRestoreDeep, 'Depth Restore is Off'); if ((cantColor) or (cantSwitch)) then DisableItem(GetMenu(mOption), iRestoreDeep); CheckItem(GetMenu(mControls), controlMethod, TRUE); SetPort(GrafPtr(mainWndo)); HideMenuBar; ShowMenuBar; end; {------------------------} function PrepareSounds: Boolean; const lastSound = 28; var theSnd: Handle; i: Integer; itFailed: Boolean; begin itFailed := FALSE; cantMusic := FALSE; smsIsActive := FALSE; ErrorSound(@DoErrorSound); UseResFile(gliderResNum); for i := 1 to lastSound do begin theSnd := GetResource('SMSD', i); if ((theSnd <> nil) and (MemError = NoErr)) then begin MoveHHi(theSnd); HLock(theSnd); end else begin itFailed := TRUE; inhibitSound := TRUE; soundOn := FALSE; Leave; end; end; if (musicOn) then begin theSnd := GetResource('SMSD', kDuhDumSound); if ((theSnd <> nil) and (MemError = NoErr)) then begin MoveHHi(theSnd); HLock(theSnd); end else begin cantMusic := TRUE; musicOn := FALSE; GenericAlert(kErrBackgroundMusic); end; theSnd := GetResource('SMSD', kMusicSound); if ((theSnd <> nil) and (MemError = NoErr)) then begin MoveHHi(theSnd); HLock(theSnd); end else begin cantMusic := TRUE; musicOn := FALSE; GenericAlert(kErrBackgroundMusic); end; end; PrepareSounds := not itFailed; end; {------------------------} procedure InitAllOtherGlobalVars; var i, i2: Integer; begin doneFlag := FALSE; playing := FALSE; pausing := FALSE; refuseHigh := FALSE; mainScreenHidden := FALSE; binaryFlip := 0; GetDateTime(RandSeed); scoreList.rank := 20; for i := 0 to 7 do begin SpinBall; SetRect(tileRects[i], i * 64, 0, (i + 1) * 64, 342); end; SetRect(shadoRct[0], 256, 0, 304, 11); SetRect(shadoRct[1], 256, 12, 304, 23); SetRect(glideRct[0], 0, 0, 48, 20); {right forward} SetRect(glideRct[1], 0, 21, 48, 41); {right tipped} SetRect(glideRct[2], 0, 42, 48, 62); {left forward} SetRect(glideRct[3], 0, 63, 48, 83); {left tipped} SetRect(glideRct[4], 208, 0, 256, 20); {turn endpoint} SetRect(glideRct[5], 208, 21, 256, 41); { " } SetRect(glideRct[6], 208, 42, 256, 62); { " } SetRect(glideRct[7], 208, 63, 256, 83); { " } SetRect(glideRct[8], 208, 84, 256, 104); { " } SetRect(glideRct[9], 208, 105, 256, 125); {turn endpoint} SetRect(glideRct[10], 414, 53, 462, 73); {glider fading masks right} SetRect(glideRct[11], 414, 74, 462, 94); SetRect(glideRct[12], 414, 95, 462, 115); SetRect(glideRct[13], 414, 116, 462, 136); SetRect(glideRct[14], 414, 137, 462, 157); SetRect(glideRct[15], 414, 158, 462, 178); SetRect(glideRct[16], 414, 179, 462, 199); SetRect(glideRct[17], 463, 53, 511, 73); {glider fading masks left} SetRect(glideRct[18], 463, 74, 511, 94); SetRect(glideRct[19], 463, 95, 511, 115); SetRect(glideRct[20], 463, 116, 511, 136); SetRect(glideRct[21], 463, 137, 511, 157); SetRect(glideRct[22], 463, 158, 511, 178); SetRect(glideRct[23], 463, 179, 511, 199); SetRect(glideRct[24], 256, 24, 304, 60); {burning} SetRect(glideRct[25], 256, 61, 304, 97); SetRect(glideRct[26], 256, 98, 304, 134); SetRect(glideRct[27], 256, 135, 304, 171); for i2 := 0 to 3 do {column} for i := 0 to 3 do {row} SetRect(reserveRects[i2 * 4 + i + 1], i * 48, i2 * 29, 1 * 48 + 48, i2 * 29 + 29); SpinBall; nextPhase[1, 0] := 10; nextPhase[1, 1] := 11; nextPhase[1, 2] := 10; nextPhase[1, 3] := 11; nextPhase[1, 4] := 12; nextPhase[1, 5] := 11; nextPhase[1, 6] := 12; nextPhase[1, 7] := 13; nextPhase[1, 8] := 12; nextPhase[1, 9] := 13; nextPhase[1, 10] := 14; nextPhase[1, 11] := 13; nextPhase[1, 12] := 14; nextPhase[1, 13] := 15; nextPhase[1, 14] := 14; nextPhase[1, 15] := 15; nextPhase[1, 16] := 16; nextPhase[2, 0] := 16; nextPhase[2, 1] := 15; nextPhase[2, 2] := 16; nextPhase[2, 3] := 15; nextPhase[2, 4] := 14; nextPhase[2, 5] := 15; nextPhase[2, 6] := 14; nextPhase[2, 7] := 13; nextPhase[2, 8] := 14; nextPhase[2, 9] := 13; nextPhase[2, 10] := 12; nextPhase[2, 11] := 13; nextPhase[2, 12] := 12; nextPhase[2, 13] := 11; nextPhase[2, 14] := 12; nextPhase[2, 15] := 11; nextPhase[2, 16] := 10; nextPhase[3, 0] := 4; nextPhase[3, 1] := 4; nextPhase[3, 2] := 5; nextPhase[3, 3] := 5; nextPhase[3, 4] := 6; nextPhase[3, 5] := 6; nextPhase[3, 6] := 7; nextPhase[3, 7] := 7; nextPhase[3, 8] := 8; nextPhase[3, 9] := 8; nextPhase[3, 10] := 9; nextPhase[3, 11] := 9; nextPhase[4, 0] := 9; nextPhase[4, 1] := 9; nextPhase[4, 2] := 8; nextPhase[4, 3] := 8; nextPhase[4, 4] := 7; nextPhase[4, 5] := 7; nextPhase[4, 6] := 6; nextPhase[4, 7] := 6; nextPhase[4, 8] := 5; nextPhase[4, 9] := 5; nextPhase[4, 10] := 4; nextPhase[4, 11] := 4; SpinBall; SetRect(srcRect[celVnt], 0, 84, 48, 96); SetRect(srcRect[celDct], 0, 97, 48, 110); SetRect(srcRect[flrVnt], 0, 111, 48, 124); SetRect(srcRect[paper], 0, 125, 48, 146); SetRect(srcRect[toastr], 0, 147, 38, 174); SetRect(srcRect[60], 304, 84, 336, 115); {toast 1} SetRect(srcRect[61], 304, 116, 336, 147); {toast 2} SetRect(srcRect[62], 304, 148, 336, 179); {toast 3} SetRect(srcRect[63], 304, 180, 336, 211); {toast 4} SetRect(srcRect[64], 304, 212, 336, 243); {toast 5} SetRect(srcRect[65], 304, 244, 336, 275); {toast 6} SetRect(srcRect[teaKtl], 0, 175, 41, 205); SetRect(srcRect[lftFan], 0, 206, 35, 261); SetRect(srcRect[ritFan], 0, 262, 35, 316); SetRect(srcRect[table], 48, 23, 112, 45); SetRect(srcRect[shredr], 48, 46, 112, 70); SetRect(srcRect[books], 48, 71, 112, 126); SetRect(srcRect[clock], 112, 0, 144, 29); SetRect(srcRect[candle], 112, 30, 144, 51); SetRect(srcRect[rbrBnd], 112, 52, 144, 75); SetRect(srcRect[ball], 112, 76, 144, 108); SetRect(srcRect[fshBwl], 112, 109, 144, 138); SetRect(srcRect[66], 144, 109, 160, 125); {fish 1} SetRect(srcRect[67], 144, 126, 160, 142); {fish 2} SetRect(srcRect[68], 144, 143, 160, 159); {fish 3} SetRect(srcRect[69], 144, 160, 160, 176); {fish 4} SetRect(srcRect[grease], 112, 139, 144, 168); SetRect(srcRect[58], 112, 169, 144, 198); {grease falling 1} SetRect(srcRect[59], 112, 199, 144, 228); {grease fallen} SetRect(srcRect[litSwt], 142, 0, 160, 26); SetRect(srcRect[thermo], 144, 27, 162, 54); SetRect(srcRect[outlet], 160, 264, 192, 289); SetRect(srcRect[51], 160, 290, 192, 315); {outlet sparking 1} SetRect(srcRect[52], 160, 316, 192, 341); {outlet sparking 2} SetRect(srcRect[pwrSwt], 144, 82, 162, 108); SetRect(srcRect[guitar], 48, 127, 112, 297); SetRect(srcRect[drip], 192, 42, 208, 55); SetRect(srcRect[shelf], 192, 71, 208, 100); SetRect(srcRect[basket], 448, 270, 511, 341); SetRect(srcRect[paintg], 408, 53, 510, 146); SetRect(srcRect[battry], 144, 55, 160, 81); SetRect(srcRect[macTsh], 256, 209, 301, 267); SetRect(srcRect[upStar], 0, 0, 161, 254); SetRect(srcRect[dnStar], 0, 0, 161, 254); SetRect(srcRect[48], 144, 189, 160, 201); {candle flame} SetRect(srcRect[49], 144, 202, 160, 214); {candle flame} SetRect(srcRect[50], 144, 215, 160, 227); {candle flame} SetRect(srcRect[53], 192, 0, 208, 13); {drip} SetRect(srcRect[54], 192, 14, 208, 27); {drip} SetRect(srcRect[55], 192, 28, 208, 41); {drip} SetRect(srcRect[56], 192, 42, 208, 55); {drip} SetRect(srcRect[57], 192, 56, 208, 70); {drip} SpinBall; SetRect(animateRct[0, -1], 304, 0, 368, 22); {crushed dart} SetRect(animateRct[0, 0], 48, 0, 112, 22); {dart...} SetRect(animateRct[0, 1], 48, 0, 112, 22); SetRect(animateRct[0, 2], 48, 0, 112, 22); SetRect(animateRct[0, 3], 48, 0, 112, 22); SetRect(animateRct[0, 4], 48, 0, 112, 22); SetRect(animateRct[0, 5], 48, 0, 112, 22); SetRect(animateRct[0, 6], 48, 0, 112, 22); SetRect(animateRct[0, 7], 48, 0, 112, 22); SetRect(animateRct[1, -1], 304, 276, 336, 308); {crushed 'copter} SetRect(animateRct[1, 0], 160, 0, 192, 32); {'copter...} SetRect(animateRct[1, 1], 160, 33, 192, 65); SetRect(animateRct[1, 2], 160, 66, 192, 98); SetRect(animateRct[1, 3], 160, 99, 192, 131); SetRect(animateRct[1, 4], 160, 132, 192, 164); SetRect(animateRct[1, 5], 160, 165, 192, 197); SetRect(animateRct[1, 6], 160, 198, 192, 230); SetRect(animateRct[1, 7], 160, 231, 192, 263); SetRect(animateRct[2, -1], 304, 309, 336, 341); {popped balloon} SetRect(animateRct[2, 0], 112, 229, 144, 261); {balloon...} SetRect(animateRct[2, 1], 112, 229, 144, 261); SetRect(animateRct[2, 2], 112, 262, 144, 294); SetRect(animateRct[2, 3], 112, 262, 144, 294); SetRect(animateRct[2, 4], 112, 295, 144, 327); SetRect(animateRct[2, 5], 112, 295, 144, 327); SetRect(animateRct[2, 6], 112, 262, 144, 294); SetRect(animateRct[2, 7], 112, 262, 144, 294); SetRect(bandRct[0], 192, 155, 208, 162); SetRect(bandRct[1], 192, 163, 208, 170); SetRect(bandRct[2], 192, 171, 208, 178); end; {------------------------} begin InitToolbox; CheckOurEnvirons; LoadCursors; for i := 0 to 32 do SpinBall; InitGlobalRects; for i := 0 to 32 do SpinBall; if (inColor) then SetUpColors; for i := 0 to 32 do SpinBall; SetUpMainWndo; for i := 0 to 32 do SpinBall; if (inColor) then SetUpPixMaps else SetUpBitMaps; for i := 0 to 32 do SpinBall; SetUpOffMask; for i := 0 to 32 do SpinBall; GetSoundVol(wasSndVolume); for i := 0 to 32 do SpinBall; theErr := GetVol(@ignoreStr, houseVolNum); for i := 0 to 32 do SpinBall; GetPrefs; for i := 0 to 32 do SpinBall; if (not GetHouse) then begin GenericAlert(kErrLoadingDfltHouse); ExitToShell; end; defaultHouse := housesName; for i := 0 to 32 do SpinBall; LoadPICTs; for i := 0 to 32 do SpinBall; SetUpMenus; for i := 0 to 32 do SpinBall; if (not PrepareSounds) then GenericAlert(kErrNoSounds); if (inhibitSound) then DisableItem(GetMenu(mOption), iSound); for i := 0 to 32 do SpinBall; InitAllOtherGlobalVars; InitCursor; end; {=================================} procedure DoStartUp; var cancelIt: Boolean; theMessage, numDocs, thisDoc, ignore: Integer; docInfo: AppFile; begin CountAppFiles(theMessage, numDocs); if (theMessage = AppPrint) then begin GenericAlert(kErrNothingToPrint); ExitToShell; end; if (numDocs <> 0) then begin GetAppFiles(1, docInfo); with docInfo do begin if (fType = 'GLgm') then begin {$IFC DemoVersion} GenericAlert(kErrDemoRefuseHouse); {$ELSEC} gameName := fName; gameVolNum := vRefNum; if (not GetGame) then begin Exit(DoStartUp); end; EnableItem(GetMenu(mGame), iSaveGame); {$ENDC} end {if fType = 'GLgm'} else {if fType <> 'GLgm'} if (fType = 'GLhs') then begin {$IFC DemoVersion} GenericAlert(kErrDemoRefuseHouse); {$ELSEC} houseVolNum := vRefNum; housesName := fName; demoMode := Randomize(lastDemo) + 1; HideMenuBar; StartNewGame; {$ENDC} end else GenericAlert(kErrStartUpWrongType); ClrAppFiles(1); end; {with docInfo do} end; {if (numDocs <> 0) then} end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-PlayActive.p b/Glider_405/Sources/G-PlayActive.p new file mode 100755 index 0000000..8b2eb28 --- /dev/null +++ b/Glider_405/Sources/G-PlayActive.p @@ -0,0 +1 @@ +unit PlayActive; interface uses SMS, Palettes, Globals, GlobalUtils, FileInNOut, PlayUtils, PlaySetUp; procedure Coordinate; var timeIs: LongInt; hotRect: Rect; sliding: Boolean; {=================================} implementation {=================================} procedure CenterMouse; const MBState = $172; MTemp = $828; RawMouse = $82C; Mouse = $830; CrsrNew = $8CE; CrsrCouple = $8CF; Couple = $FF; Uncouple = $00; var center: Point; lowGlob: Integer; lowMem: Ptr; pointPtr: ^Point; begin SetPt(center, 256, 171); lowMem := Pointer(rawMouse); pointPtr := @lowMem^; pointPtr^ := center; lowMem := Pointer(MTemp); pointPtr := @lowMem^; pointPtr^ := center; lowMem := Pointer(CrsrNew); lowMem^ := $FFFF; end; {=================================} procedure IncInt (var i: integer); inline $205F, {MOVEA.W (A7)+, A0 } $5250; {ADDQ.W #$1, (A0) } {=================================} procedure IncLong (var l: longint); inline $205F, {MOVEA.L (A7)+, A0 } $5290; {ADDQ.L #$1, (A0) } {=================================} procedure FloatTheScore (whatPoints: Integer); var tempStr: Str255; begin with floatPoints do begin if (out) then begin if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn); if (areFlipping) then CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn); end; out := TRUE; whereR := theGlider.destRect; if (inColor) then whereR.top := whereR.bottom else whereR.top := whereR.top - 30; whereR.bottom := whereR.top + 12; NumToString(whatPoints, tempStr); saysWhat := tempStr; SetPort(GrafPtr(mainWndo)); if (inColor) then begin PenNormal; TextFont(16); TextSize(12); MoveTo(whereR.left, whereR.bottom - 2); RGBForeColor(rgbYellow); PenMode(srcOr); DrawString(saysWhat); PenNormal; RGBForeColor(rgbBlack); tickStamp := TickCount + 120; SetPort(GrafPtr(virginCPtr)) end else begin TextFont(201); TextMode(patBic); MoveTo(whereR.left, whereR.bottom - 2); DrawString(tempStr); TextFont(200); TextMode(patOr); MoveTo(whereR.left, whereR.bottom - 2); DrawString(tempStr); tickStamp := TickCount + 120; PenNormal; SetPort(offVirginPort); end; if (areFlipping) then begin SetPort(offLoadPort); TextFont(201); TextMode(patBic); MoveTo(whereR.left, whereR.bottom - 2); DrawString(tempStr); TextFont(200); TextMode(patOr); MoveTo(whereR.left, whereR.bottom - 2); DrawString(tempStr); tickStamp := TickCount + 120; PenNormal; SetPort(offVirginPort); end; end; end; {=================================} procedure Collision (whatKind, who: Integer); var tempStr: Str255; tempRect, srcR, destReserve: Rect; tempInt: Integer; begin case (whatKind) of ignoreIt: ; crashIt: begin lifeNormal := FALSE; with theGlider do begin DoTheSound(1); mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; liftIt: if (not airOut) then liftAmount := -7; dropIt: if (not airOut) then liftAmount := 7; moveIt: begin DoTheSound(16); Transport(eventKind[who, 1]); hotRect := nullRect; {don't die in rest of SearchRects} end; turnItLeft: begin shiftAmount := -7; if (lifeNormal) then with theGlider do if (isRight) then begin lifeNormal := FALSE; theGlider.mode := turnRt2Lf; end; end; turnItRight: begin shiftAmount := 7; if (lifeNormal) then with theGlider do if (not isRight) then begin lifeNormal := FALSE; theGlider.mode := turnLf2Rt; end; end; burnIt: begin liftAmount := -7; if ((lifeNormal) and (theGlider.destRect.bottom > eventKind[who, 1])) then with theGlider do begin DoTheSound(8); lifeNormal := FALSE; if (isRight) then phase := 1; mode := burning; timeStamp := TickCount + 300; destRect.top := destRect.bottom - 36; end; end; awardIt: {clock} if (eventKind[who, 1] <> 0) then begin DoTheSound(5); StartScoreRolling; suppScore := suppScore + eventKind[who, 1]; FloatTheScore(eventKind[who, 1]); eventKind[who, 1] := 0; thisHouse.theRooms[roomAt].theObjects[who].amount := 0; destReserve := eventRect[who]; OffsetRect(destReserve, -destReserve.left, -destReserve.top); OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top); if (not lightsOut) then if (inColor) then begin CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end else begin CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end; end; extraIt: {folded piece of paper} if (eventKind[who, 1] <> 0) then begin DoTheSound(10); StartScoreRolling; suppScore := suppScore + eventKind[who, 1]; FloatTheScore(eventKind[who, 1]); eventKind[who, 1] := 0; thisHouse.theRooms[roomAt].theObjects[who].amount := 0; IncInt(mortals); if (mortals <= 4) then begin SetRect(tempRect, 507, 5, 542, 20); OffsetRect(tempRect, -37 * (mortals - 1), 0); SetRect(srcR, 0, 318, 35, 333); if (inColor) then begin CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, srcR, tempRect); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcR, srcR, tempRect); CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; if (mortals = 4) then begin PenNormal; SetRect(tempRect, 384, 5, 396, 20); PaintRect(tempRect); MoveTo(tempRect.left, tempRect.bottom - 2); TextFont(16); TextSize(12); NumToString(mortals - 1, tempStr); if (inColor) then begin RGBForeColor(rgbRed); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; end; end else begin PenNormal; SetRect(tempRect, 384, 5, 396, 20); PaintRect(tempRect); MoveTo(tempRect.left, tempRect.bottom - 2); TextFont(16); TextSize(12); NumToString(mortals - 1, tempStr); if (inColor) then begin RGBForeColor(rgbRed); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; end; destReserve := eventRect[who]; OffsetRect(destReserve, -destReserve.left, -destReserve.top); OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top); if (not lightsOut) then if (inColor) then begin CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end else begin CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end; end; spillIt: {grease upright} begin eventRect[who].left := eventRect[who].right; eventRect[who].right := eventRect[who].right; eventRect[who].top := eventRect[who].bottom - 5; eventKind[who, 0] := ignoreIt; {signal to the cycleOb loop that a spill has occurred} thisHouse.theRooms[roomAt].theObjects[who].isOn := FALSE; end; slideIt: {grease spilt} begin with theGlider do begin tempInt := eventRect[who].top - touchRect.bottom + 1; destRect.top := destRect.top + tempInt; destRect.bottom := destRect.bottom + tempInt; touchRect.top := touchRect.top + tempInt; touchRect.bottom := touchRect.bottom + tempInt; end; sliding := TRUE; end; bandIt: {rubber bands} if (eventKind[who, 1] <> 0) then begin DoTheSound(12); theGlider.bands := theGlider.bands + eventKind[who, 1]; FloatTheScore(eventKind[who, 1]); eventKind[who, 1] := 0; thisHouse.theRooms[roomAt].theObjects[who].amount := 0; PopTokenBand; UpdateBandNumbers; destReserve := eventRect[who]; OffsetRect(destReserve, -destReserve.left, -destReserve.top); OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top); if (not lightsOut) then if (inColor) then begin CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end else begin CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end; end; energizeIt: {battery} if (eventKind[who, 1] <> 0) then begin DoTheSound(9); theGlider.energy := theGlider.energy + eventKind[who, 1]; FloatTheScore(eventKind[who, 1]); eventKind[who, 1] := 0; thisHouse.theRooms[roomAt].theObjects[who].amount := 0; PopTokenBattery; UpdateBatteryEnergy; destReserve := eventRect[who]; OffsetRect(destReserve, -destReserve.left, -destReserve.top); OffsetRect(destReserve, reserveRects[who].left, reserveRects[who].top); if (not lightsOut) then if (inColor) then begin CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destReserve, eventRect[who], srcCopy, nil); CopyBits(BitMapPtr(reserveCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end else begin CopyBits(offReserveMap, offVirginMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, offLoadMap, destReserve, eventRect[who], srcCopy, nil); CopyBits(offReserveMap, mainWndo^.portBits, destReserve, eventRect[who], srcCopy, wholeRgn); end; end; trickIt: {good move!} if (eventKind[who, 1] <> 0) then begin DoTheSound(kWhistleSound); StartScoreRolling; suppScore := suppScore + eventKind[who, 1]; FloatTheScore(eventKind[who, 1]); eventKind[who, 1] := 0; end; lightIt: if (lightsOut) then begin DoTheSound(18); lightsOut := FALSE; thisHouse.theRooms[roomAt].conditionCode := 0; LoadABackground(thisHouse.theRooms[roomAt].backPictID); ArrangeTiles; DrawAllObjects; DrawHeadline; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn); end; end; airOnIt: if (airOut) then begin DoTheSound(3); airOut := FALSE; end; zapIt: if (eventKind[who, 1] <> 0) then begin lifeNormal := FALSE; DoTheSound(24); with theGlider do begin mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; toggleIt: if (eventKind[who, 2] < TickCount) then begin DoTheSound(18); tempInt := eventKind[who, 1]; with thisHouse.theRooms[roomAt].theObjects[tempInt] do begin isOn := not isOn; case objectIs of lftFan: if (eventKind[tempInt, 0] = ignoreIt) then begin DoTheSound(3); eventKind[tempInt, 0] := turnItLeft; end else eventKind[tempInt, 0] := ignoreIt; ritFan: if (eventKind[tempInt, 0] = ignoreIt) then begin DoTheSound(3); eventKind[tempInt, 0] := turnItRight; end else eventKind[tempInt, 0] := ignoreIt; shredr: if (eventKind[tempInt, 0] = ignoreIt) then eventKind[tempInt, 0] := shredIt else eventKind[tempInt, 0] := ignoreIt; otherwise end; {case} end; {with} eventKind[who, 2] := TickCount + 90; end; playIt: if (eventKind[who, 1] < TickCount) then begin DoTheSound(15); eventKind[who, 1] := TickCount + 120; end; ascendIt: begin lifeNormal := FALSE; theGlider.mode := ascending; UpAFlight(eventKind[who, 1]); hotRect := nullRect; {don't die in rest of SearchRects} end; descendIt: begin lifeNormal := FALSE; theGlider.mode := descending; DownAFlight(eventKind[who, 1]); hotRect := nullRect; {don't die in rest of SearchRects} end; shredIt: begin lifeNormal := FALSE; with theGlider do begin mode := shredding; destRect.top := eventRect[who].bottom; destRect.bottom := destRect.top; destRect.left := eventRect[who].left + 12; destRect.right := destRect.left + 48; shadoDest.left := destRect.left; shadoDest.right := destRect.right; phase := 0; end; end; steamIt: begin liftAmount := -7; shiftAmount := -7; end; otherwise end; {case} end; {=================================} procedure SearchRects; var index, outside: Integer; tempRect: Rect; {----------------} function RectLap (rect1, rect2: Rect): Boolean; var dumRect: Rect; begin RectLap := FALSE; if (rect1.right < rect2.left) then Exit(RectLap); if (rect2.right < rect2.left) then Exit(RectLap); if (rect1.bottom < rect2.top) then Exit(RectLap); if (rect2.bottom < rect2.top) then Exit(RectLap); RectLap := SectRect(rect1, rect2, dumRect); end; {----------------} procedure BiteIt; begin with theGlider do begin DoTheSound(1); lifeNormal := FALSE; mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; {----------------} procedure GetItLegal; begin {do a bump sound here} with theGlider do begin with destRect do begin left := left + outside; right := right + outside; end; with shadoDest do begin left := left + outside; right := right + outside; end; with touchRect do begin left := left + outside; right := right + outside; end; end; end; {----------------} begin with theGlider do begin hotRect := touchRect; {get 'hot rect'} if (rightIsOpen) then {check right edge} begin if (destRect.left > 500) then begin AdvanceARoom; Exit(SearchRects); end end else if (destRect.right > 512) then begin outside := 512 - destRect.right; GetItLegal; end; if (leftIsOpen) then {check left edge} begin if (destRect.right < 12) then begin RetreatARoom; Exit(SearchRects); end; end else if (destRect.left < 0) then begin outside := -destRect.left; GetItLegal; end; if (destRect.bottom > kFloorLimit) then {check floor} BiteIt; end; {---with theGlider do---} shiftAmount := 0; for index := 1 to nObjects do if (RectLap(eventRect[index], hotRect)) then Collision(eventKind[index, 0], index); if (nAnimates <> 0) then for index := 1 to nAnimates do if (RectLap(theAnimates[index].destRect, hotRect)) then begin BiteIt; Leave; end; end; {=================================} procedure HandleBand; var index: Integer; tempRect: Rect; {----------------} function RectLap (rect1, rect2: Rect): Boolean; var dumRect: Rect; begin RectLap := FALSE; if (rect1.right < rect2.left) then Exit(RectLap); if (rect2.right < rect2.left) then Exit(RectLap); if (rect1.bottom < rect2.top) then Exit(RectLap); if (rect2.bottom < rect2.top) then Exit(RectLap); RectLap := SectRect(rect1, rect2, dumRect); end; {----------------} begin with theBand do begin if ((whole.left > 512) or (whole.left < -16)) then bandBorne := FALSE; IncInt(phase); if (phase > 2) then phase := 0; whole := dest; with dest do begin left := left + velocity; right := right + velocity; end; if (velocity > 0) then whole.right := whole.right + velocity else whole.left := whole.left + velocity; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do if (vertOff <> 12) then if (RectLap(destRect, dest)) then begin case kind of 0: DoTheSound(6); 1: DoTheSound(6); 2: DoTheSound(19); otherwise end; phase := -1; StartScoreRolling; suppScore := suppScore + 100 * (3 - kind); horiOff := 0; vertOff := 12; end; end; {with} end; {=================================} procedure GetInput; const holdKey = 1; dropKey = 2; absMouse = 3; relMouse = 4; var pull: Integer; thePt: Point; dest: Rect; {--------------------} procedure PushIt (howFast: Integer); begin with theGlider do if (energy > 0) then begin energy := energy - 1; DoTheSound(26); UpdateBatteryEnergy; if (energy = 0) then begin SetRect(dest, 308, 5, 335, 20); FillRect(dest, black); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, wholeRgn) end else begin CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, wholeRgn); end; end; forVel := howFast; end; end; {--------------------} procedure FireBand; begin with theGlider do if (bands > 0) then begin DoTheSound(11); bands := bands - 1; UpdateBandNumbers; if (bands = 0) then begin SetRect(dest, 346, 5, 368, 20); FillRect(dest, black); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, wholeRgn); end; end; bandBorne := TRUE; with theBand do begin dest.top := destRect.top + 6; dest.bottom := dest.top + 7; if (isRight) then begin dest.left := destRect.right; velocity := 16; end else begin dest.left := destRect.left - 16; velocity := -16; end; dest.right := dest.left + 16; whole := dest; old := dest; end; end; end; {--------------------} begin with theGlider do begin case controlMethod of holdKey: begin if (theKeys[leftKey]) then if (isRight) then begin isForward := FALSE; srcNum := 1; forVel := -kMaxThrust; end else begin isForward := TRUE; srcNum := 2; forVel := -kMaxThrust; end else if (theKeys[rightKey]) then if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := kMaxThrust; end else begin isForward := FALSE; srcNum := 3; forVel := kMaxThrust; end else {no key of import down} begin if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := 0; end else begin isForward := TRUE; srcNum := 2; forVel := 0; end; end; if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; if (theKeys[energyKey]) then begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then PushIt(16) else PushIt(-16); end; end; dropKey: begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then forVel := kMaxThrust else forVel := -kMaxThrust; if (theKeys[leftKey]) then if (isRight) then begin isForward := FALSE; srcNum := 1; forVel := -kMaxThrust; end else begin isForward := TRUE; srcNum := 2; forVel := -kMaxThrust; end else if (theKeys[rightKey]) then if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := kMaxThrust; end else begin isForward := FALSE; srcNum := 3; forVel := kMaxThrust; end; if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; if (theKeys[energyKey]) then begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then PushIt(16) else PushIt(-16); end; end; {end - dropKey} absMouse: begin if ((theKeys[bandKey]) and (not bandBorne)) then FireBand; GetMouse(thePt); HorizonMouse; pull := (thePt.h - 256) div 32; if (pull > kMaxThrust) then pull := kMaxThrust else if (pull < -kMaxThrust) then pull := -kMaxThrust; forVel := pull; if (isRight) then if (forVel < 0) then begin isForward := FALSE; srcNum := 1; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := TRUE; srcNum := 0; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin if (forVel < 0) then begin isForward := TRUE; srcNum := 2; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := FALSE; srcNum := 3; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end; end; end; {end - absMouse} relMouse: begin if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; GetMouse(thePt); forVel := (thePt.h - 256); if (forVel > kMaxThrust) then forVel := kMaxThrust else if (forVel < -kMaxThrust) then forVel := -kMaxThrust; CenterMouse; if (isRight) then if (forVel < 0) then begin isForward := FALSE; srcNum := 1; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := TRUE; srcNum := 0; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin if (forVel < 0) then begin isForward := TRUE; srcNum := 2; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := FALSE; srcNum := 3; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end; end; end; {end - relMouse} otherwise end; {case} end; {with theGlider} end; {=================================} procedure MoveGlider; begin if (windowOpen) then {randomly move glider} begin liftAmount := liftAmount + Randomize(11) - 5; shiftAmount := shiftAmount + Randomize(11) - 5; end; with theGlider do begin liftAmount := liftAmount + 1; {add gravity} if (sliding) then begin liftAmount := 0; {zero out lift} sliding := FALSE; end else begin {vertical offset of glider} destRect.top := destRect.top + liftAmount; destRect.bottom := destRect.bottom + liftAmount; touchRect.top := touchRect.top + liftAmount; touchRect.bottom := touchRect.bottom + liftAmount; end; forVel := forVel + shiftAmount; {horizontal offset of glider} destRect.left := destRect.left + forVel; destRect.right := destRect.right + forVel; touchRect.left := destRect.left + 10; {touch rect is inset from dest} touchRect.right := destRect.right - 10; shadoDest.left := destRect.left; {shadow has same l. & r. as dest} shadoDest.right := destRect.right; end; end; {=================================} procedure MoveAnimates; var index: Integer; tempRect: Rect; {----------------} function RectLap (rect1, rect2: Rect): Boolean; var dumRect: Rect; begin RectLap := FALSE; if (rect1.right < rect2.left) then Exit(RectLap); if (rect2.right < rect2.left) then Exit(RectLap); if (rect1.bottom < rect2.top) then Exit(RectLap); if (rect2.bottom < rect2.top) then Exit(RectLap); RectLap := SectRect(rect1, rect2, dumRect); end; {----------------} begin for index := 1 to nAnimates do with theAnimates[index] do begin if (unSeen) then begin if (TickCount > tickStamp) then begin ResetAnimate(-1, index); unSeen := FALSE; end; end else begin if (phase > -1) then begin IncInt(phase); if (phase > 7) then phase := 0; end; wholeRect := destRect; with destRect do begin case kind of 0: begin left := left + horiOff; right := right + horiOff; top := top + vertOff; bottom := bottom + vertOff; wholeRect.left := wholeRect.left + horiOff; wholeRect.bottom := wholeRect.bottom + vertOff; end; 1: begin left := left + horiOff; right := right + horiOff; top := top + vertOff; bottom := bottom + vertOff; wholeRect.left := wholeRect.left + horiOff; wholeRect.bottom := wholeRect.bottom + vertOff; end; 2: begin top := top + vertOff; bottom := bottom + vertOff; if (vertOff > 0) then wholeRect.bottom := wholeRect.bottom + vertOff else wholeRect.top := wholeRect.top + vertOff; end; otherwise end; {case kind of} end; {with destRect} if (not unseen) then if (not RectLap(wholeRect, wholeArea)) then begin tickStamp := TickCount + delay; destRect := nullRect; wholeRect := nullRect; unSeen := TRUE; end; end; {if NOT (unSeen)} end; {with / for} end; {=================================} procedure MoveCycleObs; var index, diff: Integer; begin for index := 1 to nCycleObs do with cycleObjects[index] do case kindIs of candle: begin IncLong(position); if (position > 50) then position := 48; end; grease: begin if (eventKind[tiedTo, 0] = ignoreIt) then begin DoTheSound(14); eventKind[tiedTo, 0] := slideIt; reset := 1; end else if ((reset <> 0) and (reset <> 999)) then begin reset := reset + 1; if (reset > 4) then begin velocity := velocity + 1; eventRect[tiedTo].right := eventRect[tiedTo].right + 1; if (velocity > position) then reset := 999; end else begin if (reset < 3) then accel := 58 else accel := 59; end; end; end; outlet: begin if (accel = 25) then begin if (TickCount > position) then begin accel := binaryFlip + 51; {go into zap mode} position := TickCount; eventKind[tiedTo, 1] := 1; end; end else begin if (TickCount > (position + 60)) then begin accel := 25; {stop zapping} position := TickCount + reset; eventKind[tiedTo, 1] := 0; end else begin DoTheSound(24); {zapping} accel := binaryFlip + 51; end; end; end; drip: begin if (phase < 57) then begin if (binaryFlip <> 0) then begin IncInt(phase); if (phase = 57) then position := position + 160; end; end else begin velocity := velocity + accel; position := position + velocity; if (position > reset) then begin DoTheSound(7); velocity := 0; position := holdRect.bottom * 32; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); end; eventRect[tiedTo] := holdRect; phase := 53; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := LoWord(BSR(position, 5)) - bottom; bottom := bottom + diff; top := top + diff; end; wholeRect.bottom := wholeRect.bottom + diff end; {else } end; {drip} toastr: if (phase <> 0) then begin if (binaryFlip = 0) then begin phase := phase + 1; if (phase > 65) then phase := 60; end; velocity := velocity + accel; position := position + velocity; if (position > reset) then begin DoTheSound(22); velocity := -velocity; position := reset; reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra; phase := 0; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := LoWord(BSR(position, 5)) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end else begin if (TickCount > reset) then begin DoTheSound(23); reset := position; phase := 60; end; end; {toastr} ball: begin velocity := velocity + accel; position := position + velocity; if (position > reset) then begin DoTheSound(4); velocity := -velocity; position := reset; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := LoWord(BSR(position, 5)) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end; {ball} fshBwl: if (phase <> 0) then begin if ((velocity > -16) and (velocity < 16)) then phase := 69 else begin if (velocity < 0) then phase := 66 else phase := 68; end; velocity := velocity + accel; position := position + velocity; if (position > reset) then begin DoTheSound(7); velocity := -velocity; position := reset; reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra; phase := 0; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := LoWord(BSR(position, 5)) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end else begin if (TickCount > reset) then begin DoTheSound(7); reset := position; phase := 66; end; end; {fish bowl} teaKtl: begin if (TickCount > reset) then begin eventKind[tiedTo, 0] := steamIt; if (phase = 0) then DoTheSound(25); phase := phase + 1; if (phase > 10) then begin phase := 0; eventKind[tiedTo, 0] := ignoreIt; reset := TickCount + position; end; end; end; otherwise end; {case / with / index} end; {=================================} procedure MonitorStorm; begin with theLightning do begin if (whatPhase = 0) then begin if (TickCount > whatTime) then whatPhase := 1; end else if (whatPhase > 3) then begin whatPhase := 0; whichBolt := Randomize(3) + 1; whatTime := TickCount + Randomize(300); DoTheSound(17); end else whatPhase := whatPhase + 1; end; end; {=================================} procedure DrawFlipScene; var index, tempInt: Integer; tempRect, tempSmRect: Rect; begin if (mainScreenHidden) then begin if (hasWindow) then if (theLightning.whatPhase <> 0) then with theLightning do begin if (whatPhase = 4) then begin SetPort(mainWndo); SetClip(windowRgn); PenNormal; FillRgn(windowRgn, black); ClipRect(wholeArea); SetPort(offLoadPort); SetClip(windowRgn); FillRgn(windowRgn, black); ClipRect(wholeArea); SetPort(offVirginPort); end else begin SetPort(mainWndo); SetClip(windowRgn); PenNormal; PenSize(2, 2); PenMode(patXOr); MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]); for index := 1 to 7 do begin LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]); Move(0, 2); end; ClipRect(wholeArea); SetPort(offVirginPort); end; end; {-----pop masks on-----} if (hasMirror) then with theGlider do begin tempSmRect := destRect; tempSmRect.left := tempSmRect.left - 16; tempSmRect.right := tempSmRect.right - 16; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; SetPort(mainWndo); SetClip(mirrorRgn); CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], tempSmRect); ClipRect(wholeArea); SetPort(offVirginPort); end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[position], srcRect[position], wholeRect); outlet: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[accel], srcRect[accel], wholeRect); grease: begin CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[accel], srcRect[accel], wholeRect); SetPort(offLoadPort); PenNormal; PenSize(2, 2); MoveTo(velocity - 2, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then Line(2, 0); PenNormal; SetPort(offVirginPort); PenNormal; PenSize(2, 2); MoveTo(velocity - 2, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then Line(2, 0); PenNormal; end; ball: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(mainWndo); SetClip(toastRgn); CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo]); ClipRect(wholeArea); SetPort(offVirginPort); end; fshBwl: if (phase <> 0) then CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, srcRect[69], srcRect[69], eventRect[tiedTo]); otherwise end; {case} end; with theGlider do begin if (isRight) then CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[0], shadoRct[0], shadoDest) else CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[1], shadoRct[1], shadoDest); if (lifeNormal) then CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect); shredding: begin SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208); CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, tempRect, tempRect, destRect); end; otherwise end; {case} end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, animateRct[kind, phase], animateRct[kind, phase], destRect); if (bandBorne) then with theBand do CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, bandRct[phase], bandRct[phase], dest); with (floatPoints) do if ((out) and (tickCount > tickStamp)) then begin out := FALSE; CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn); end; {-----flip to 'other' page-----} mainScreenHidden := not mainScreenHidden; SetPage(mainScreenHidden); {-----restore 'other' page-----} if (hasMirror) then with theGlider do begin tempSmRect := oldRect; tempSmRect.left := tempSmRect.left - 16; tempSmRect.right := tempSmRect.right - 16; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; CopyBits(offVirginMap, offLoadMap, tempSmRect, tempSmRect, srcCopy, wholeRgn); end; with theGlider do begin CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, oldShado, oldShado, srcCopy, wholeRgn); oldRect := destRect; oldShado := shadoDest; end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do begin CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil); oldRect := destRect; end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil); oldRect := wholeRect; end; if (bandBorne) then with theBand do begin CopyBits(offVirginMap, offLoadMap, old, old, srcCopy, nil); old := dest; end; end else {main screen is NOT hidden (is visible)} begin if (hasWindow) then if (theLightning.whatPhase <> 0) then with theLightning do begin if (whatPhase = 4) then begin SetPort(mainWndo); SetClip(windowRgn); PenNormal; FillRgn(windowRgn, black); ClipRect(wholeArea); SetPort(offLoadPort); SetClip(windowRgn); FillRgn(windowRgn, black); ClipRect(wholeArea); SetPort(offVirginPort); end else begin SetPort(offLoadPort); SetClip(windowRgn); PenNormal; PenSize(2, 2); PenMode(patXOr); MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]); for index := 1 to 7 do begin LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]); Move(0, 2); end; ClipRect(wholeArea); SetPort(offVirginPort); end; end; {-----pop masks on-----} if (hasMirror) then with theGlider do begin tempSmRect := destRect; tempSmRect.left := tempSmRect.left - 16; tempSmRect.right := tempSmRect.right - 16; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; SetPort(offLoadPort); SetClip(mirrorRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], tempSmRect); ClipRect(wholeArea); SetPort(offVirginPort); end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[position], srcRect[position], wholeRect); outlet: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect); grease: begin CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect); SetPort(mainWndo); PenNormal; PenSize(2, 2); MoveTo(velocity - 2, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then Line(2, 0); PenNormal; SetPort(offVirginPort); PenNormal; PenSize(2, 2); MoveTo(velocity - 2, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then Line(2, 0); PenNormal; end; ball: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(offLoadPort); SetClip(toastRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); ClipRect(wholeArea); SetPort(offVirginPort); end; fshBwl: if (phase <> 0) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[69], srcRect[69], eventRect[tiedTo]); otherwise end; {case} end; with theGlider do begin if (isRight) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[0], shadoRct[0], shadoDest) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[1], shadoRct[1], shadoDest); if (lifeNormal) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect); shredding: begin SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208); CopyMask(offPlayerMap, offMaskMap, offLoadMap, tempRect, tempRect, destRect); end; otherwise end; {case} end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyMask(offPlayerMap, offMaskMap, offLoadMap, animateRct[kind, phase], animateRct[kind, phase], destRect); if (bandBorne) then with theBand do CopyMask(offPlayerMap, offMaskMap, offLoadMap, bandRct[phase], bandRct[phase], dest); with (floatPoints) do if ((out) and (tickCount > tickStamp)) then begin out := FALSE; CopyBits(offVirginMap, offLoadMap, whereR, whereR, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn); end; {-----flip to 'other' page-----} mainScreenHidden := not mainScreenHidden; SetPage(mainScreenHidden); {-----restore 'other' page-----} if (hasMirror) then with theGlider do begin tempSmRect := oldRect; tempSmRect.left := tempSmRect.left - 16; tempSmRect.right := tempSmRect.right - 16; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; CopyBits(offVirginMap, mainWndo^.portBits, tempSmRect, tempSmRect, srcCopy, wholeRgn); end; with theGlider do begin CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, oldShado, oldShado, srcCopy, wholeRgn); oldRect := destRect; oldShado := shadoDest; end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do begin CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, nil); oldRect := destRect; end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin CopyBits(offVirginMap, mainWndo^.portBits, oldRect, oldRect, srcCopy, nil); oldRect := wholeRect; end; if (bandBorne) then with theBand do begin CopyBits(offVirginMap, mainWndo^.portBits, old, old, srcCopy, nil); old := dest; end; end; end; {=================================} procedure DrawScene; var index, tempInt: Integer; tempRect, tempSmRect: Rect; begin if (hasWindow) then if (theLightning.whatPhase <> 0) then with theLightning do begin SetPort(mainWndo); SetClip(windowRgn); PenNormal; if (whatPhase = 4) then FillRgn(windowRgn, black) else begin PenSize(2, 2); PenMode(patXOr); MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]); for index := 1 to 7 do begin LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]); Move(0, 2); end; end; ClipRect(wholeArea); SetPort(offVirginPort); end; if (hasMirror) then begin tempRect := theGlider.oldRect; tempRect.left := tempRect.left - 16; tempRect.right := tempRect.right - 16; tempRect.top := tempRect.top - 32; tempRect.bottom := tempRect.bottom - 32; CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, mirrorRgn); end; with theGlider do begin UnionRect(destRect, oldRect, wholeRect); UnionRect(shadoDest, oldShado, wholeShado); CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, oldShado, oldShado, srcCopy, wholeRgn); oldRect := destRect; oldShado := shadoDest; end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil); if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do CopyBits(offVirginMap, offLoadMap, oldRect, oldRect, srcCopy, nil); if (bandBorne) then with theBand do CopyBits(offVirginMap, offLoadMap, old, old, srcCopy, nil); {-----pop masks on-----} if (hasMirror) then with theGlider do begin tempSmRect := destRect; tempSmRect.left := tempSmRect.left - 16; tempSmRect.right := tempSmRect.right - 16; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; SetPort(offLoadPort); SetClip(mirrorRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], tempSmRect); ClipRect(wholeArea); SetPort(offVirginPort); UnionRect(tempRect, tempSmRect, tempRect); end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[position], srcRect[position], wholeRect); outlet, grease: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect); ball: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(offLoadPort); SetClip(toastRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); ClipRect(wholeArea); SetPort(offVirginPort); end; fshBwl: if (phase <> 0) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[69], srcRect[69], eventRect[tiedTo]); otherwise end; {case} oldRect := wholeRect; end; with theGlider do begin if (isRight) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[0], shadoRct[0], shadoDest) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, shadoRct[1], shadoRct[1], shadoDest); if (lifeNormal) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(offPlayerMap, offMaskMap, offLoadMap, glideRct[srcNum], glideRct[srcNum], destRect); shredding: begin SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208); CopyMask(offPlayerMap, offMaskMap, offLoadMap, tempRect, tempRect, destRect); end; otherwise end; {case} end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do begin CopyMask(offPlayerMap, offMaskMap, offLoadMap, animateRct[kind, phase], animateRct[kind, phase], destRect); oldRect := wholeRect; end; if (bandBorne) then with theBand do begin CopyMask(offPlayerMap, offMaskMap, offLoadMap, bandRct[phase], bandRct[phase], dest); old := dest; end; {-----pop to visible screen-----} with (floatPoints) do if ((out) and (tickCount > tickStamp)) then begin out := FALSE; CopyBits(offVirginMap, mainWndo^.portBits, whereR, whereR, srcCopy, wholeRgn); end; if (hasMirror) then CopyBits(offLoadMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, mirrorRgn); if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin if (kindIs <> grease) then CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn) else begin CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); SetPort(mainWndo); PenNormal; PenSize(2, 2); MoveTo(wholeRect.right, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then LineTo(velocity, wholeRect.bottom - 2); PenNormal; SetPort(offVirginPort); PenNormal; PenSize(2, 2); MoveTo(wholeRect.right, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then LineTo(velocity, wholeRect.bottom - 2); PenNormal; end; end; with theGlider do begin CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(offLoadMap, mainWndo^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn); end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); if (bandBorne) then with theBand do CopyBits(offLoadMap, mainWndo^.portBits, whole, whole, srcCopy, wholeRgn); end; {=================================} procedure DrawCScene; var index, tempInt: Integer; tempRect, tempSmRect: Rect; begin if ((hasWindow) and (theLightning.whatPhase <> 0)) then with theLightning do begin SetPort(GrafPtr(mainWndo)); SetClip(windowRgn); PenNormal; if (whatPhase = 4) then FillRgn(windowRgn, black) else begin PenMode(srcXOr); PenSize(2, 2); MoveTo(theBolts[whichBolt, 0, 0], theBolts[whichBolt, 0, 1]); for index := 1 to 7 do begin LineTo(theBolts[whichBolt, index, 0], theBolts[whichBolt, index, 1]); Move(0, 2); end; end; ClipRect(wholeArea); SetPort(GrafPtr(virginCPtr)); end; if (hasMirror) then begin with theGlider do UnionRect(destRect, oldRect, tempRect); tempRect.left := tempRect.left - 32; tempRect.right := tempRect.right - 32; tempRect.top := tempRect.top - 32; tempRect.bottom := tempRect.bottom - 32; CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, mirrorRgn); end; with theGlider do begin UnionRect(destRect, oldRect, wholeRect); UnionRect(shadoDest, oldShado, wholeShado); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldShado, oldShado, srcCopy, wholeRgn); oldRect := destRect; oldShado := shadoDest; end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn); if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn); if (bandBorne) then with theBand do CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, old, old, srcCopy, wholeRgn); {-----pop masks on-----} if (hasMirror) then with theGlider do begin tempSmRect := destRect; tempSmRect.left := tempSmRect.left - 32; tempSmRect.right := tempSmRect.right - 32; tempSmRect.top := tempSmRect.top - 32; tempSmRect.bottom := tempSmRect.bottom - 32; SetPort(GrafPtr(loadCPtr)); SetClip(mirrorRgn); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], tempSmRect); ClipRect(wholeArea); SetPort(GrafPtr(virginCPtr)); end; if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[position], srcRect[position], wholeRect); outlet, grease: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[accel], srcRect[accel], wholeRect); ball: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(GrafPtr(loadCPtr)); SetClip(toastRgn); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]); ClipRect(wholeArea); SetPort(GrafPtr(virginCPtr)); end; fshBwl: begin if (phase <> 0) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[69], srcRect[69], eventRect[tiedTo]); end; otherwise ; end; {case} oldRect := wholeRect; end; with theGlider do begin if (isRight) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, shadoRct[0], shadoRct[0], shadoDest) else CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, shadoRct[1], shadoRct[1], shadoDest); if (lifeNormal) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, glideRct[srcNum], glideRct[srcNum], destRect); shredding: begin SetRect(tempRect, 256, 208 - (destRect.bottom - destRect.top), 304, 208); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, destRect); end; otherwise end; {case} end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do begin CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, animateRct[kind, phase], animateRct[kind, phase], destRect); oldRect := wholeRect; end; if (bandBorne) then with theBand do begin CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, bandRct[phase], bandRct[phase], dest); old := dest; end; {-----pop to visible screen-----} with (floatPoints) do if (out) then begin if (tickCount > tickStamp) then begin out := FALSE; CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn); end else begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whereR, whereR, srcCopy, wholeRgn); SetPort(GrafPtr(mainWndo)); PenNormal; whereR.right := whereR.right + 2; whereR.left := whereR.left + 2; whereR.top := whereR.top - 1; whereR.bottom := whereR.bottom - 1; TextFont(16); TextSize(12); MoveTo(whereR.left, whereR.bottom - 2); if (binaryFlip = 0) then RGBForeColor(rgbBlue) else RGBForeColor(rgbRed); PenMode(srcOr); DrawString(saysWhat); PenNormal; RGBForeColor(rgbBlack); SetPort(GrafPtr(virginCPtr)) end; end; if (hasMirror) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, mirrorRgn); if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin if (kindIs <> grease) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn) else begin CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); SetPort(GrafPtr(mainWndo)); PenNormal; PenSize(2, 2); MoveTo(wholeRect.right, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then LineTo(velocity, wholeRect.bottom - 2); PenNormal; SetPort(GrafPtr(virginCPtr)); PenNormal; PenSize(2, 2); MoveTo(wholeRect.right, wholeRect.bottom - 2); if (velocity > wholeRect.right + 1) then LineTo(velocity, wholeRect.bottom - 2); PenNormal; end; end; with theGlider do begin CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn); end; if (nAnimates > 0) then for index := 1 to nAnimates do with theAnimates[index] do CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); if (bandBorne) then with theBand do CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, whole, whole, srcCopy, wholeRgn); end; {=================================} procedure DoSpecial; begin GetKeys(theKeys); with theGlider do case mode of fadingIn: begin if (phase = 1) then DoTheSound(2); IncInt(phase); if (phase > 16) then begin if (isRight) then srcNum := 0 else srcNum := 2; lifeNormal := TRUE; phase := 0; mode := normal; end end; fadingOut: begin IncInt(phase); if (isRight) then srcNum := 0 else srcNum := 2; if (phase > 16) then OffAMortal; end; turnRt2Lf: begin IncInt(phase); if (phase > 11) then begin lifeNormal := TRUE; phase := 0; mode := normal; shiftAmount := 0; isRight := FALSE; end; SearchRects; destRect.left := destRect.left + shiftAmount; destRect.right := destRect.right + shiftAmount; touchRect.left := touchRect.left + shiftAmount; touchRect.right := touchRect.right + shiftAmount; shadoDest.left := shadoDest.left + shiftAmount; shadoDest.right := shadoDest.right + shiftAmount; end; turnLf2Rt: begin IncInt(phase); if (phase > 11) then begin lifeNormal := TRUE; phase := 0; mode := normal; shiftAmount := 0; isRight := TRUE; end; SearchRects; destRect.left := destRect.left + shiftAmount; destRect.right := destRect.right + shiftAmount; touchRect.left := touchRect.left + shiftAmount; touchRect.right := touchRect.right + shiftAmount; shadoDest.left := shadoDest.left + shiftAmount; shadoDest.right := shadoDest.right + shiftAmount; end; burning: begin phase := 1 - phase; if (isRight) then begin srcNum := 24 + phase; forVel := 1; end else begin srcNum := 26 + phase; forVel := -1; end; SearchRects; MoveGlider; if (TickCount > timeStamp) then begin DoTheSound(1); mode := fadingOut; phase := 0; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; ascending: begin destRect.left := destRect.left - 2; destRect.right := destRect.left + 48; destRect.top := destRect.top - 6; destRect.bottom := destRect.top + 20; shadoDest.left := destRect.left; shadoDest.right := destRect.right; touchRect := destRect; InsetRect(touchRect, 10, 5); if (destRect.top < 220) then begin lifeNormal := TRUE; phase := 0; mode := normal; end; end; descending: begin destRect.left := destRect.left + 2; destRect.right := destRect.left + 48; destRect.top := destRect.top + 6; destRect.bottom := destRect.top + 20; shadoDest.left := destRect.left; shadoDest.right := destRect.right; touchRect := destRect; InsetRect(touchRect, 10, 5); if (destRect.top > 120) then begin lifeNormal := TRUE; phase := 0; mode := normal; end; end; shredding: begin if (phase = 0) then begin DoTheSound(20); destRect.bottom := destRect.bottom + 1; if (destRect.bottom >= destRect.top + 36) then phase := 1; end else begin destRect.top := destRect.top + 8; destRect.bottom := destRect.bottom + 8; if (destRect.top > 342) then begin phase := 0; OffAMortal; end; end; end; {end - shred} otherwise end; end; {=================================} procedure LetsPause; begin if (smsIsActive) then SMSExit; smsIsActive := FALSE; demoMode := Randomize(lastDemo) + 1; pausing := TRUE; ForceMainToVisible; InitCursor; ShowMenuBar; SetItem(GetMenu(mGame), iBegin, 'Continue Game'); DrawMenuBar; FlushEvents(everyEvent, 0); theErr := PostEvent(KeyDown, 65); end; {=================================} procedure LetsQuit; begin ForceMainToVisible; ShowMenuBar; {$IFC DemoVersion} playing := FALSE; pausing := FALSE; doneFlag := TRUE; {$ELSEC} if DoQuit then begin playing := FALSE; pausing := FALSE; doneFlag := TRUE; end else begin if (SaveGame) then begin playing := FALSE; pausing := FALSE; doneFlag := TRUE; end else begin SetCursor(noCursor^^); SetPort(GrafPtr(mainWndo)); BeginUpdate(GrafPtr(mainWndo)); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, nil) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, nil); EndUpdate(GrafPtr(mainWndo)); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); end; end; {$ENDC} end; {=================================} procedure LetsSave; begin {$IFC not DemoVersion} InitCursor; SpinBall; ForceMainToVisible; if (not SaveGame) then ; SpinBall; SetCursor(noCursor^^); SetPort(GrafPtr(mainWndo)); BeginUpdate(GrafPtr(mainWndo)); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, nil) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, nil); EndUpdate(GrafPtr(mainWndo)); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); {$ENDC} end; {=================================} procedure LetsEnd; begin SetItem(GetMenu(mGame), iBegin, 'Begin Game'); WrapItUp; DrawMenuBar; end; {=================================} procedure Coordinate; var i: Integer; begin GetKeys(theKeys); while ((playing) and (not pausing)) do begin timeIs := TickCount; liftAmount := 2; binaryFlip := BitXOr(binaryFlip, 1); if (bandBorne) then HandleBand; if (lifeNormal) then begin SearchRects; GetKeys(theKeys); GetInput; MoveGlider; end else DoSpecial; if (playing) then begin if (nAnimates > 0) then MoveAnimates; if (nCycleObs > 0) then MoveCycleObs; if (hasWindow) then MonitorStorm; if (areFlipping) then DrawFlipScene else begin if (inColor) then DrawCScene else DrawScene; end; if (scoreIsRolling) then BumpTheScore; end; if (theKeys[kCommandKeyMap]) and (theKeys[kQKeyMap]) then LetsQuit; if (theKeys[kCommandKeyMap]) and (theKeys[kSKeyMap]) then LetsSave; if (theKeys[kCommandKeyMap]) and (theKeys[kEKeyMap]) then LetsEnd; if (theKeys[kTabKeyMap]) then LetsPause; SetCursor(noCursor^^); repeat until (TickCount >= (timeIs + 2)); loopsThruRoom := loopsThruRoom + 1; bassLoop := bassLoop + 1; if (bassLoop >= playBassTime) then begin bassLoop := 0; DoTheBass(kDuhDumSound); playBassTime := (kBonusTimeToBeat - loopsThruRoom) div kBassFract + kMinBassLoop; if (playBassTime < kMinBassLoop) then playBassTime := kMinBassLoop; end; end; FlushEvents(everyEvent, 0); InitCursor; DrawMenuBar; if (scoreList.rank <> 20) then DrawHiScores; end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-PlaySetUp.p b/Glider_405/Sources/G-PlaySetUp.p new file mode 100755 index 0000000..1bf8d37 --- /dev/null +++ b/Glider_405/Sources/G-PlaySetUp.p @@ -0,0 +1 @@ +unit PlaySetUp; interface uses SMS, Balloons, Palettes, Globals, GlobalUtils, FileInNOut, PlayUtils; procedure HorizonMouse; procedure WrapItUp; procedure OffAMortal; procedure AdvanceARoom; procedure RetreatARoom; procedure UpAFlight (whatRoom: Integer); procedure DownAFlight (whatRoom: Integer); procedure Transport (whatRoom: Integer); implementation {=================================} procedure HorizonMouse; const MBState = $172; MTemp = $828; RawMouse = $82C; Mouse = $830; CrsrNew = $8CE; CrsrCouple = $8CF; Couple = $FF; Uncouple = $00; var horizon: Point; lowGlob: Integer; lowMem: Ptr; pointPtr: ^Point; begin GetMouse(horizon); horizon.v := 160; lowMem := Pointer(rawMouse); pointPtr := @lowMem^; pointPtr^ := horizon; lowMem := Pointer(MTemp); pointPtr := @lowMem^; pointPtr^ := horizon; lowMem := Pointer(CrsrNew); lowMem^ := $FFFF; end; {=================================} procedure ClosingAnimation; const waitTicks = 4; var i, refNumber, whichTwist: Integer; twisterDst, tinyGliderDst, tinyGliderSrc, wasRect, wasGlider, boltRect: Rect; twisterSrc: array[0..3] of Rect; timeWas: LongInt; tempByte: SignedByte; thePict: PicHandle; boltWasCast, hasLetUpOnButton: Boolean; {--------------} procedure CastBolt; const cloudBottom = 140; boltLength = 8; var i, start, finish: Integer; begin SetRect(boltRect, 512, cloudBottom, 0, (boltLength + 1) * 8 + cloudBottom + 2); if (inColor) then RGBForeColor(rgbWhite) else PenPat(white); start := Randomize(100) + 200; for i := 0 to boltLength do begin finish := Randomize(7) - 3 + start; MoveTo(start, i * 8 + cloudBottom + 1); LineTo(finish, (i + 1) * 8 + cloudBottom); if (start <= boltRect.left) then boltRect.left := start; if (finish <= boltRect.left) then boltRect.left := finish; if (start >= boltRect.right) then boltRect.right := start; if (finish >= boltRect.right) then boltRect.right := finish; start := finish; end; if (inColor) then RGBForeColor(rgbBlack) else PenPat(black); boltWasCast := TRUE; InsetRect(boltRect, -2, 0); end; {--------------} begin RedrawWindowFrame; SetRect(twisterSrc[0], 208, 126, 256, 188); SetRect(twisterSrc[1], 208, 189, 256, 251); SetRect(twisterSrc[2], 208, 252, 256, 314); SetRect(twisterSrc[3], 256, 268, 304, 330); SetRect(tinyGliderSrc, 235, 315, 256, 325); twisterDst := twisterSrc[0]; OffsetRect(twisterDst, -twisterDst.left, -twisterDst.top); OffsetRect(twisterDst, 230, 138); tinyGliderDst := tinyGliderSrc; OffsetRect(tinyGliderDst, -tinyGliderDst.left, -tinyGliderDst.top); OffsetRect(tinyGliderDst, 420, 90); wasGlider := tinyGliderDst; boltWasCast := FALSE; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin UseResFile(gliderResNum); GenericAlert(kErrGraphicsNotFound); ShowMenuBar; if (not DoOpen(kArtType)) then Exit(ClosingAnimation); refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin GenericAlert(kErrGraphicsNotFound); ShowMenuBar; Exit(ClosingAnimation); end; end; thePict := GetPicture(rFarmPict); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); ReleaseResource(Handle(thePict)); end else GenericAlert(kErrGraphicLoad); CloseResFile(refNumber); UseResFile(gliderResNum); DissBlocks; whichTwist := 0; PenNormal; if (inColor) then SetPort(GrafPtr(mainWndo)) else SetPort(mainWndo); hasLetUpOnButton := FALSE; for i := 1 to 200 do begin timeWas := TickCount + waitTicks; wasRect := twisterDst; whichTwist := i mod 4; if ((i mod 4) = 0) then begin whichTwist := whichTwist + 1; if (whichTwist > 3) then whichTwist := 0; OffsetRect(twisterDst, -1, 0); wasRect.right := wasRect.right + 1; end; OffsetRect(tinyGliderDst, -2, -(i mod 2)); wasGlider := tinyGliderDst; wasGlider.right := wasGlider.right + 2; wasGlider.bottom := wasGlider.bottom + 1; if (Randomize(20) = 0) then CastBolt; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wasRect, wasRect, srcCopy, nil); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, twisterSrc[whichTwist], twisterSrc[whichTwist], twisterDst); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wasRect, wasRect, srcCopy, nil); end else begin CopyBits(offVirginMap, offLoadMap, wasRect, wasRect, srcCopy, nil); CopyMask(offPlayerMap, offMaskMap, offLoadMap, twisterSrc[whichTwist], twisterSrc[whichTwist], twisterDst); CopyBits(offLoadMap, mainWndo^.portBits, wasRect, wasRect, srcCopy, nil); end; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wasGlider, wasGlider, srcCopy, nil); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, tinyGliderSrc, tinyGliderSrc, tinyGliderDst); CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wasGlider, wasGlider, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, wasGlider, wasGlider, srcCopy, nil); CopyMask(offPlayerMap, offMaskMap, offLoadMap, tinyGliderSrc, tinyGliderSrc, tinyGliderDst); CopyBits(offLoadMap, mainWndo^.portBits, wasGlider, wasGlider, srcCopy, wholeRgn); end; repeat if (Button) then begin if (hasLetUpOnButton) then Leave; end else hasLetUpOnButton := TRUE; GetKeys(theKeys); if (theKeys[kReturnKeyMap]) then Leave; until (TickCount > timeWas); timeWas := TickCount + waitTicks; if (Button) then begin if (hasLetUpOnButton) then Leave; end else hasLetUpOnButton := TRUE; GetKeys(theKeys); if (theKeys[kReturnKeyMap]) then Leave; if (boltWasCast) then begin DoTheSound(17); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, boltRect, boltRect, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, boltRect, boltRect, srcCopy, wholeRgn); boltWasCast := FALSE; end; end; end; {=================================} procedure GameOver; const timeBetween = 6; var i, i2, leftOff, topOff, whichLetter: Integer; dummyLong: LongInt; letters: array[0..6] of Rect; dest: Rect; tempStr: Str255; hasLetUpOnButton: Boolean; begin SetRect(letters[0], 375, 33, 409, 78); {G} SetRect(letters[1], 375, 77, 409, 122); {a} SetRect(letters[2], 375, 121, 409, 166); {m} SetRect(letters[3], 375, 165, 409, 210); {e} SetRect(letters[4], 375, 209, 409, 254); {O} SetRect(letters[5], 375, 253, 409, 298); {v} SetRect(letters[6], 375, 297, 409, 342); {r} hasLetUpOnButton := FALSE; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); FillRect(wholeArea, black); NumToString(roomScore + suppScore, tempStr); if (inColor) then begin PenNormal; TextFont(204); TextSize(32); MoveTo(120, 80); RGBForeColor(rgbYellow); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); TextFont(SystemFont); TextSize(12); end else begin TextFont(204); TextSize(32); TextMode(patXOr); MoveTo(120, 80); DrawString(tempStr); TextFont(SystemFont); TextSize(12); end; DissBlocks; SetRect(dest, 0, 0, 34, 45); OffsetRect(dest, 113, 100); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[0], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[0], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[1], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[1], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[2], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[2], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[3], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[3], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[4], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[4], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[5], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[5], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[3], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[3], dest, srcCopy, nil); OffsetRect(dest, 36, 0); Delay(timeBetween, dummyLong); DoTheSound(21); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[6], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[6], dest, srcCopy, nil); for i := 1 to 20 do begin if (Button) then begin if (hasLetUpOnButton) then Leave; end else hasLetUpOnButton := TRUE; GetKeys(theKeys); if (theKeys[kReturnKeyMap]) then Leave; SetRect(dest, 0, 0, 34, 45); OffsetRect(dest, 113, 100 + i * 8); for i2 := 0 to 7 do begin SetRect(letters[0], 375, 33, 409, 78); {G} SetRect(letters[1], 375, 77, 409, 122); {a} SetRect(letters[2], 375, 121, 409, 166); {m} SetRect(letters[3], 375, 165, 409, 210); {e} SetRect(letters[4], 375, 209, 409, 254); {O} SetRect(letters[5], 375, 253, 409, 298); {v} SetRect(letters[6], 375, 297, 409, 342); {r} if (i2 = 6) then whichLetter := 3 else if (i2 = 7) then whichLetter := 6 else whichLetter := i2; OffsetRect(dest, Randomize(i * 2 + 1) - i, 0); Delay(1, dummyLong); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, letters[whichLetter], dest, srcCopy, nil) else CopyBits(offPlayerMap, mainWndo^.portBits, letters[whichLetter], dest, srcCopy, nil); OffsetRect(dest, 36, 0); end; end; for i := 1 to 200 do begin Delay(1, dummyLong); if (Button) then begin if (hasLetUpOnButton) then Leave; end else hasLetUpOnButton := TRUE; GetKeys(theKeys); if (theKeys[kReturnKeyMap]) then Leave; end; end; {=================================} procedure WrapItUp; var tempByte: SignedByte; tempRect: Rect; thePict: PicHandle; begin playing := FALSE; pausing := FALSE; if (hasMirror) then begin hasMirror := FALSE; HUnlock(Handle(mirrorRgn)); DisposeRgn(mirrorRgn); end; if (hasWindow) then begin hasWindow := FALSE; HUnlock(Handle(windowRgn)); DisposeRgn(windowRgn); end; if (hasToast) then begin hasToast := FALSE; HUnlock(Handle(toastRgn)); DisposeRgn(toastRgn); end; ForceMainToVisible; FlushEvents(everyEvent, 0); theErr := PostEvent(KeyDown, 65); RedrawWindowFrame; GameOver; ShowMenuBar; if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); if (inColor) then thePict := GetPicture(rColorIdleID) else thePict := GetPicture(rIdleID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); ReleaseResource(Handle(thePict)); end else GenericAlert(kErrGraphicLoad); {$IFC DemoVersion} MoveTo(13, 113); TextFont(SystemFont); if (inColor) then begin ForeColor(redColor); TextMode(patOr); DrawString('DEMO VERSION'); ForeColor(blackColor); end else begin TextMode(patXOr); DrawString('DEMO VERSION'); end; {$ENDC} DissBlocks; {$IFC not DemoVersion} EnableItem(GetMenu(mGame), iLoadHouse); {$ENDC} DisableItem(GetMenu(mGame), iEndGame); {$IFC not DemoVersion} EnableItem(GetMenu(mGame), iLoadGame); {$ENDC} DisableItem(GetMenu(mGame), iSaveGame); DisableItem(GetMenu(mGame), iSaveGameAs); EnableItem(GetMenu(mOption), iHiScores); InitCursor; SortHiScores; if (smsIsActive) then SMSExit; smsIsActive := FALSE; end; {=================================} procedure AdvanceAFile; var i: Integer; wasHouse, newHouse: string[32]; {----------} procedure ExitGracefully; begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(AdvanceAFile); end; {----------} begin wasHouse := housesName; housesName := thisHouse.nextFile; fileWasLost := FALSE; if (not GetHouse) then ExitGracefully; if (fileWasLost) then begin newHouse := housesName; housesName := wasHouse; if (not GetHouse) then ExitGracefully; thisHouse.nextFile := newHouse; if (not WriteHouse) then ExitGracefully; housesName := thisHouse.nextFile; if (not GetHouse) then ExitGracefully; end; CalcRoomScore; suppScore := suppScore + roomScore; for i := 1 to 40 do roomVisits[i] := FALSE; roomScore := 0; end; {=================================} procedure OffAMortal; var tempRect: Rect; tempStr: Str255; begin with theGlider do begin if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeShado, wholeShado, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn); end else begin UnionRect(destRect, oldRect, wholeRect); UnionRect(shadoDest, oldShado, wholeShado); CopyBits(offVirginMap, offLoadMap, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, wholeShado, wholeShado, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, wholeShado, wholeShado, srcCopy, wholeRgn); end; end; if (hasMirror) then begin SetPort(GrafPtr(mainWndo)); EraseRgn(mirrorRgn); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); EraseRgn(mirrorRgn); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); end; if (hasWindow) then begin SetPort(GrafPtr(mainWndo)); FillRgn(windowRgn, black); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); FillRgn(windowRgn, black); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); end; mortals := mortals - 1; if (mortals < 1) then begin WrapItUp; Exit(OffAMortal); end; if (mortals < 4) then {hide a token glider} begin SetRect(tempRect, 470, 5, 505, 20); OffsetRect(tempRect, -37 * (mortals - 1), 0); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; PaintRect(tempRect); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; SetRect(tempRect, 384, 5, 397, 20); PaintRect(tempRect); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; end else begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; SetRect(tempRect, 384, 5, 396, 20); PaintRect(tempRect); MoveTo(tempRect.left, tempRect.bottom - 2); TextFont(16); TextSize(12); NumToString(mortals - 1, tempStr); if (inColor) then begin RGBForeColor(rgbRed); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, tempRect, tempRect, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; CopyBits(offVirginMap, offLoadMap, tempRect, tempRect, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, tempRect, tempRect, srcCopy, wholeRgn); end; end; ResetGlider; end; {=================================} procedure CheckForTimeBonus; var tempStr: Str255; tempRect: Rect; timeBonus, dummyLong: LongInt; i: Integer; begin timeBonus := 0; if (loopsThruRoom < kBonusTimeToBeat) then timeBonus := (kBonusTimeToBeat - loopsThruRoom) * ((roomAt div 5) + 1); suppScore := suppScore + timeBonus; loopsThruRoom := 0; NumToString(timeBonus, tempStr); tempStr := CONCAT('Time Bonus = ', tempStr); SetRect(tempRect, 190, 100, 312, 117); SetPort(GrafPtr(mainWndo)); if (inColor) then begin PenNormal; PaintRect(tempRect); PenMode(patXOr); InsetRect(tempRect, 1, 1); FrameRect(tempRect); PenNormal; InsetRect(tempRect, -1, -1); RGBForeColor(rgbYellow); TextFont(16); TextSize(12); PenMode(srcOr); MoveTo(tempRect.left + 3, tempRect.bottom - 4); DrawString(tempStr); RGBForeColor(rgbBlack); SetPort(GrafPtr(virginCPtr)); PenNormal; PaintRect(tempRect); PenMode(patXOr); InsetRect(tempRect, 1, 1); FrameRect(tempRect); PenNormal; InsetRect(tempRect, -1, -1); RGBForeColor(rgbYellow); PenNormal; TextFont(16); TextSize(12); PenMode(srcOr); MoveTo(tempRect.left + 3, tempRect.bottom - 4); DrawString(tempStr); RGBForeColor(rgbBlack); end else begin PenNormal; PaintRect(tempRect); PenMode(patXOr); InsetRect(tempRect, 1, 1); FrameRect(tempRect); PenNormal; InsetRect(tempRect, -1, -1); TextFont(16); TextSize(12); TextMode(patXOr); MoveTo(tempRect.left + 3, tempRect.bottom - 4); DrawString(tempStr); PenNormal; SetPort(offVirginPort); PenNormal; PaintRect(tempRect); PenMode(patXOr); InsetRect(tempRect, 1, 1); FrameRect(tempRect); PenNormal; InsetRect(tempRect, -1, -1); TextFont(16); TextSize(12); TextMode(patXOr); MoveTo(tempRect.left + 3, tempRect.bottom - 4); DrawString(tempStr); PenNormal; SetPort(offLoadPort); PenNormal; PaintRect(tempRect); PenMode(patXOr); InsetRect(tempRect, 1, 1); FrameRect(tempRect); PenNormal; InsetRect(tempRect, -1, -1); TextFont(16); TextSize(12); TextMode(patXOr); MoveTo(tempRect.left + 3, tempRect.bottom - 4); DrawString(tempStr); PenNormal; end; for i := 1 to 30 do begin HorizonMouse; Delay(1, dummyLong); end; end; {=================================} procedure SetRoomState; var oldRoomScore: LongInt; i: Integer; begin if (didntExitEntrance) then roomVisits[roomAt] := TRUE; bassLoop := 0; playBassTime := kBonusTimeToBeat div kBassFract + kMinBassLoop; StartScoreRolling; oldRoomScore := roomScore; CalcRoomScore; if ((oldRoomScore < roomScore) and (didntExitEntrance)) then CheckForTimeBonus; loopsThruRoom := 0; for i := 1 to nObjects do case (eventKind[i, 0]) of awardIt, extraIt, energizeIt, bandIt, trickIt: begin thisHouse.theRooms[roomAt].theObjects[i].amount := eventKind[i, 1]; end; lightIt, airOnIt: begin if ((not lightsOut) and (not airOut)) then thisHouse.theRooms[roomAt].conditionCode := 0; end; otherwise end; if (hasMirror) then begin SetPort(GrafPtr(mainWndo)); EraseRgn(mirrorRgn); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); EraseRgn(mirrorRgn); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); end; with theGlider do begin if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destRect, destRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, shadoDest, shadoDest, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destRect, destRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, destRect, destRect, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, shadoDest, shadoDest, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, destRect, destRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn); end; end; end; {=================================} procedure ScrollForward; var srcRect: Rect; waitTicks: LongInt; index: Integer; begin with theGlider do begin destRect.left := 0; destRect.right := 48; oldRect := destRect; wholeRect := destRect; shadoDest.left := 0; shadoDest.right := 48; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; SetRect(srcRect, 496, 0, 512, 342); for index := 0 to 31 do begin HorizonMouse; waitTicks := TickCount; repeat until (TickCount > waitTicks); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(GrafPtr(mainWndo)); PenNormal; MoveTo(srcRect.left - 1, srcRect.top); Line(0, 322); SetPort(GrafPtr(virginCPtr)); end else begin CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(mainWndo); PenNormal; MoveTo(srcRect.left - 1, srcRect.top); Line(0, 322); SetPort(offVirginPort); end; srcRect.right := srcRect.right - 16; srcRect.left := srcRect.left - 16; end; end; {=================================} procedure ScrollBackward; var srcRect: Rect; waitTicks: LongInt; index: Integer; begin with theGlider do begin destRect.left := 464; destRect.right := 512; oldRect := destRect; wholeRect := destRect; shadoDest.left := 464; shadoDest.right := 512; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; SetRect(srcRect, 0, 0, 16, 342); if (inColor) then CopyBits(GrafPtr(mainWndo)^.portBits, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil) else CopyBits(mainWndo^.portBits, offLoadMap, wholeArea, wholeArea, srcCopy, nil); for index := 0 to 31 do begin HorizonMouse; waitTicks := TickCount; repeat until (TickCount > waitTicks); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(GrafPtr(mainWndo)); PenNormal; MoveTo(srcRect.right, srcRect.top); Line(0, 322); SetPort(GrafPtr(virginCPtr)); end else begin CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(mainWndo); PenNormal; MoveTo(srcRect.right, srcRect.top); Line(0, 322); SetPort(offVirginPort); end; srcRect.right := srcRect.right + 16; srcRect.left := srcRect.left + 16; end; end; {=================================} procedure ScrollUp; var srcRect: Rect; waitTicks: LongInt; index, leftCorner: Integer; begin leftCorner := 232; for index := 1 to 16 do with thisHouse.theRooms[roomAt].theObjects[index] do if (objectIs = dnStar) then leftCorner := boundRect.left + 64; with theGlider do begin destRect.left := leftCorner; destRect.right := leftCorner + 48; destRect.top := kFloorVert - 20; destRect.bottom := kFloorVert; oldRect := destRect; wholeRect := destRect; shadoDest.left := destRect.left; shadoDest.right := destRect.right; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; SetRect(srcRect, 0, 0, 512, 18); for index := 0 to 18 do begin HorizonMouse; waitTicks := TickCount; repeat until (TickCount > waitTicks); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(GrafPtr(mainWndo)); PenNormal; MoveTo(srcRect.left, srcRect.bottom); Line(512, 0); SetPort(GrafPtr(virginCPtr)); end else begin CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(mainWndo); PenNormal; MoveTo(srcRect.left, srcRect.bottom); Line(512, 0); SetPort(offVirginPort); end; srcRect.bottom := srcRect.bottom + 18; srcRect.top := srcRect.top + 18; end; end; {=================================} procedure ScrollDown; var srcRect: Rect; waitTicks: LongInt; index, leftCorner: Integer; begin leftCorner := 232; for index := 1 to 16 do with thisHouse.theRooms[roomAt].theObjects[index] do if (objectIs = upStar) then leftCorner := boundRect.left + 64; with theGlider do begin destRect.left := leftCorner; destRect.right := leftCorner + 48; destRect.top := kCeilingVert + 20; destRect.bottom := kCeilingVert + 40; oldRect := destRect; wholeRect := destRect; shadoDest.left := destRect.left; shadoDest.right := destRect.right; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; SetRect(srcRect, 0, 324, 512, 342); for index := 0 to 18 do begin waitTicks := TickCount; repeat until (TickCount > waitTicks); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(GrafPtr(mainWndo)); PenNormal; MoveTo(srcRect.left, srcRect.top - 1); Line(512, 0); SetPort(GrafPtr(virginCPtr)); end else begin CopyBits(offVirginMap, mainWndo^.portBits, srcRect, srcRect, srcCopy, nil); SetPort(mainWndo); PenNormal; MoveTo(srcRect.left, srcRect.top - 1); Line(512, 0); SetPort(offVirginPort); end; srcRect.bottom := srcRect.bottom - 18; srcRect.top := srcRect.top - 18; end; end; {=================================} procedure AdvanceARoom; begin didntExitEntrance := (sideYouCantExit <> rightOfRoom); SetRoomState; enteredLeft := TRUE; sideYouCantExit := leftOfRoom; roomAt := roomAt + 1; roomsPassed := roomsPassed + 1; {$IFC DemoVersion} if (roomAt > 5) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(AdvanceARoom); end; {$ENDC} if (roomAt > thisHouse.numberORooms) then begin if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '')) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(AdvanceARoom); end else begin AdvanceAFile; roomAt := 1; end; end; if (roomAt <> 0) then begin ReadyRoom; ScrollForward; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); end; end; {=================================} procedure RetreatARoom; begin didntExitEntrance := (sideYouCantExit <> leftOfRoom); SetRoomState; enteredLeft := FALSE; sideYouCantExit := rightOfRoom; roomAt := roomAt - 1; roomsPassed := roomsPassed - 1; if (roomAt < 1) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(RetreatARoom); end; ReadyRoom; ScrollBackward; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); end; {=================================} procedure UpAFlight; var addToIt: Integer; begin didntExitEntrance := (sideYouCantExit <> topOfRoom); SetRoomState; sideYouCantExit := bottomOfRoom; addToIt := whatRoom - roomAt; roomAt := whatRoom; roomsPassed := roomsPassed + addToIt; if ((roomAt > thisHouse.numberORooms) or (roomAt < 0)) then begin if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(UpAFlight); end else begin AdvanceAFile; roomAt := roomAt - 40; end; end else if (roomAt = 0) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(UpAFlight); end; if (roomAt <> 0) then begin ReadyRoom; ScrollUp; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); end; end; {=================================} procedure DownAFlight; var addToIt: Integer; begin didntExitEntrance := (sideYouCantExit <> bottomOfRoom); SetRoomState; sideYouCantExit := topOfRoom; addToIt := whatRoom - roomAt; roomAt := whatRoom; roomsPassed := roomsPassed + addToIt; if ((roomAt < 0) or (roomAt > thisHouse.numberORooms)) then begin if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then begin roomAt := 0; roomsPassed := roomsPassed - 1; ClosingAnimation; WrapItUp; Exit(DownAFlight); end else begin AdvanceAFile; roomAt := roomAt - 40; end; end else if (roomAt = 0) then begin ClosingAnimation; WrapItUp; Exit(DownAFlight); end; if (roomAt <> 0) then begin ReadyRoom; ScrollDown; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); end; end; {=================================} procedure Transport; var addToIt, leftCorner, index, localRoomNumber: Integer; newRoom: Boolean; begin newRoom := (whatRoom <> roomAt); if (newRoom) then begin didntExitEntrance := TRUE; SetRoomState; sideYouCantExit := whoCares; addToIt := whatRoom - roomAt; roomAt := whatRoom; roomsPassed := roomsPassed + addToIt; if ((roomAt < 0) or (roomAt > thisHouse.numberORooms)) then begin if ((thisHouse.nextFile = 'nil') or (thisHouse.nextFile = '') or (roomAt < 0)) then begin ClosingAnimation; roomAt := 0; WrapItUp; Exit(Transport); end else begin localRoomNumber := roomAt - thisHouse.numberORooms; AdvanceAFile; roomAt := localRoomNumber; if (roomAt > thisHouse.numberORooms) then begin ClosingAnimation; roomAt := 0; WrapItUp; Exit(Transport); end end; end else if (roomAt = 0) then begin ClosingAnimation; WrapItUp; Exit(Transport); end; if (roomAt <> 0) then ReadyRoom; end else {we're transporting to the room we're in} with theGlider do if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, destRect, destRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, shadoDest, shadoDest, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, destRect, destRect, srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, destRect, destRect, srcCopy, wholeRgn); CopyBits(offVirginMap, offLoadMap, shadoDest, shadoDest, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, destRect, destRect, srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, shadoDest, shadoDest, srcCopy, wholeRgn); end; if (roomAt <> 0) then begin leftCorner := 232; for index := 1 to 16 do with thisHouse.theRooms[roomAt].theObjects[index] do if ((objectIs = celDct) and (isOn)) then leftCorner := boundRect.left; with theGlider do begin destRect.left := leftCorner; destRect.right := leftCorner + 48; destRect.top := kCeilingVert; destRect.bottom := kCeilingVert + 20; oldRect := destRect; wholeRect := destRect; shadoDest.left := destRect.left; shadoDest.right := destRect.right; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; if (newRoom) then begin HorizonMouse; DissBlocks; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, nil); end; end; end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/G-PlayUtils.p b/Glider_405/Sources/G-PlayUtils.p new file mode 100755 index 0000000..59b092a --- /dev/null +++ b/Glider_405/Sources/G-PlayUtils.p @@ -0,0 +1 @@ +unit PlayUtils; interface uses Palettes, Globals, SMS, GlobalUtils, FileInNOut; procedure ForceMainToVisible; procedure LoadABackground (whichID: Integer); procedure ArrangeTiles; procedure DrawAllObjects; procedure BumpTheScore; procedure StartScoreRolling; procedure UpdateBandNumbers; procedure PopTokenBand; procedure UpdateBatteryEnergy; procedure PopTokenBattery; procedure DrawHeadline; procedure ResetGlider; procedure ResetAnimate (typeIs, index: Integer); procedure ExtractEventRects; procedure ReadyRoom; procedure SortHiScores; function DoQuit: Boolean; implementation {=================================} procedure ForceMainToVisible; begin if ((areFlipping) and (mainScreenHidden)) then begin CopyBits(offLoadMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, nil); mainScreenHidden := FALSE; SetPage(mainScreenHidden); CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, nil); end; end; {=================================} procedure ArrangeTiles; var wasPort: GrafPtr; i, panel: Integer; begin for i := 0 to 7 do begin panel := thisHouse.theRooms[roomAt].tileOrder[i]; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, tileRects[panel], tileRects[i], srcCopy, nil) else CopyBits(offLoadMap, offVirginMap, tileRects[panel], tileRects[i], srcCopy, nil); end; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, nil); end; {=================================} procedure LoadABackground; var refNumber: Integer; tempByte: SignedByte; thePict: PicHandle; wasPort: GrafPtr; begin refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin UseResFile(gliderResNum); GenericAlert(kErrGraphicsNotFound); if (not DoOpen(kArtType)) then begin ShowMenuBar; Exit(LoadABackground); end; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin GenericAlert(kErrGraphicsNotFound); ShowMenuBar; playing := FALSE; Exit(LoadABackground); end; end; if (areFlipping) then ForceMainToVisible; GetPort(wasPort); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); thePict := GetPicture(whichID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin case whichID of {try to substitute} 205: thePict := GetPicture(201); 206: thePict := GetPicture(204); 207: thePict := GetPicture(200); 208: thePict := GetPicture(203); 209: thePict := GetPicture(200); otherwise begin GenericAlert(kErrGraphicLoad); ShowMenuBar; playing := FALSE; Exit(LoadABackground); end; end; if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); ShowMenuBar; playing := FALSE; Exit(LoadABackground); end; end; ReleaseResource(Handle(thePict)); SetPort(wasPort); CloseResFile(refNumber); UseResFile(gliderResNum); end; {=================================} procedure FillNFrame (theColor: RGBColor; theRect: Rect); begin RGBForeColor(theColor); PaintRect(theRect); RGBForeColor(rgbBlack); FrameRect(theRect); end; {=================================} procedure GrayNFrame (theRect: Rect); begin FillRect(theRect, gray); FrameRect(theRect); end; {=================================} procedure HiLiteARect (theColor: RGBColor; theRect: Rect); begin RGBForeColor(theColor); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); LineTo(theRect.right - 2, theRect.bottom - 2); RGBForeColor(rgbBlack); end; {=================================} procedure GrayLiteARect (theRect: Rect); begin PenPat(white); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); LineTo(theRect.right - 2, theRect.bottom - 2); PenNormal; MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 2, theRect.bottom - 2); end; {=================================} procedure LoLiteARect (theRect: Rect); begin RGBForeColor(rgbLtBrown); MoveTo(theRect.left - 1, theRect.top); LineTo(theRect.left - 1, theRect.bottom); LineTo(theRect.right - 1, theRect.bottom); RGBForeColor(rgbDkGray); MoveTo(theRect.left, theRect.top - 1); LineTo(theRect.right, theRect.top - 1); LineTo(theRect.right, theRect.bottom); RGBForeColor(rgbBlack); end; {=================================} procedure GrayLoARect (theRect: Rect); begin PenPat(white); MoveTo(theRect.left - 1, theRect.top); LineTo(theRect.left - 1, theRect.bottom); LineTo(theRect.right - 1, theRect.bottom); PenNormal; MoveTo(theRect.left, theRect.top - 1); LineTo(theRect.right, theRect.top - 1); LineTo(theRect.right, theRect.bottom); end; {=================================} procedure DrawTable (whichItem: Integer); var kind: Integer; theRect, tempRect: Rect; wasPort: GrafPtr; begin GetPort(wasPort); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; with thisHouse.theRooms[roomAt].theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; if (inColor) then {***** Draw table top} begin RGBForeColor(rgbBrown); PaintRect(theRect); RGBForeColor(rgbBlack); FrameRect(theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); RGBForeColor(rgbLtBrown); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); RGBForeColor(rgbBlack); end else begin FillRect(theRect, gray); FrameRect(theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); PenPat(white); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); end; PenNormal; {***** Draw table shadow} SetRect(tempRect, theRect.left, kFloorVert - 0, theRect.right, kFloorVert + 20); OffsetRect(tempRect, (theRect.top - kFloorVert) div 5, 0); if (inColor) then begin PenMode(patCopy + transparent); PenPat(gray); PaintOval(tempRect); end else begin PenMode(patOr); PenPat(gray); PaintOval(tempRect); end; PenNormal; if (inColor) then {***** Draw table support} begin RGBForeColor(rgbBlack); PenSize(5, 1); MoveTo(((theRect.left + theRect.right) div 2) - 2, theRect.bottom); LineTo(((theRect.left + theRect.right) div 2) - 2, kFloorVert - 7); RGBForeColor(rgbWhite); PenSize(1, 1); MoveTo(((theRect.left + theRect.right) div 2) + 1, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 1, kFloorVert - 7); RGBForeColor(rgbLtBrown); MoveTo(((theRect.left + theRect.right) div 2) + 0, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 0, kFloorVert - 7); RGBForeColor(rgbBlack); end else begin PenSize(5, 1); MoveTo(((theRect.left + theRect.right) div 2) - 2, theRect.bottom); LineTo(((theRect.left + theRect.right) div 2) - 2, kFloorVert - 7); PenPat(white); PenSize(1, 1); MoveTo(((theRect.left + theRect.right) div 2) + 1, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 1, kFloorVert - 7); PenPat(gray); MoveTo(((theRect.left + theRect.right) div 2) + 0, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 0, kFloorVert - 7); end; PenNormal; tempRect := srcRect[kind];{***** Draw table base} OffsetRect(tempRect, -tempRect.left, -tempRect.top); OffsetRect(tempRect, ((theRect.left + theRect.right) div 2) - 31, kFloorVert - 7); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[kind], srcRect[kind], tempRect); SetPort(wasPort); end; {=================================} procedure DrawShelf (whichItem: Integer); var kind: Integer; theRect, tempRect: Rect; tempRgn: RgnHandle; wasPort: GrafPtr; begin GetPort(wasPort); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; with thisHouse.theRooms[roomAt].theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; if (inColor) then {***** Draw shelf top} begin RGBForeColor(rgbLtBrown); PaintRect(theRect); FrameRect(theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); RGBForeColor(rgbWhite); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); end else begin FillRect(theRect, gray); FrameRect(theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); PenPat(white); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); end; PenNormal; tempRgn := NewRgn; {***** Draw shelf shadow} MoveTo(theRect.right, theRect.bottom - 1); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom + 14); Line(0, -5); Line(15, -15); Line(0, 5); LineTo(theRect.right, theRect.bottom - 1); CloseRgn(tempRgn); PenPat(gray); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(tempRgn); end else begin PenMode(patOr); PaintRgn(tempRgn); end; DisposeRgn(tempRgn); PenNormal; tempRect := srcRect[kind]; {***** Draw shelf bracket 1} OffsetRect(tempRect, -tempRect.left, -tempRect.top); {0 it out} OffsetRect(tempRect, theRect.left + 15, theRect.bottom - 2); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[kind], srcRect[kind], tempRect); tempRect := srcRect[kind]; {***** Draw shelf bracket 2} OffsetRect(tempRect, -tempRect.left, -tempRect.top); {0 it out} OffsetRect(tempRect, theRect.right - 25, theRect.bottom - 2); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[kind], srcRect[kind], tempRect); SetPort(wasPort); end; {=================================} procedure DrawMirror (whichItem: Integer); var theRect: Rect; wasPort: GrafPtr; begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; with thisHouse.theRooms[roomAt].theObjects[whichItem] do theRect := boundRect; if (inColor) then begin RGBForeColor(rgbBrown); PaintRect(theRect); RGBForeColor(rgbBlack); end else begin FillRect(theRect, gray); end; FrameRect(theRect); InsetRect(theRect, 3, 3); FillRect(theRect, white); FrameRect(theRect); PenNormal; end; {=================================} procedure DrawCabinet (whichItem: Integer); var panels, width, index, offIt: Integer; theRect, tempR: Rect; shadoRgn: RgnHandle; begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; with thisHouse.theRooms[roomAt].theObjects[whichItem] do theRect := boundRect; tempR := theRect; if (theRect.bottom > 280) then begin tempR.bottom := tempR.bottom - 5; if (inColor) then begin RGBForeColor(rgbBrown); PenMode(srcCopy + transparent); PaintRect(tempR); RGBForeColor(rgbBlack); end else begin FillRect(tempR, gray); end; FrameRect(tempR); tempR := theRect; InsetRect(tempR, 2, 0); tempR.top := tempR.bottom - 5; if (inColor) then PaintRect(tempR) else FillRect(tempR, dkGray); FrameRect(tempR); SetRect(tempR, theRect.left - 2, theRect.top, theRect.right + 2, theRect.top + 7); if (inColor) then begin RGBForeColor(rgbLtBrown); PenMode(srcCopy + transparent); PaintRect(tempR); RGBForeColor(rgbBlack); end else begin FillRect(tempR, ltGray); end; FrameRect(tempR); MoveTo(tempR.left + 2, tempR.bottom); LineTo(tempR.right - 3, tempR.bottom); shadoRgn := NewRgn; MoveTo(theRect.left, theRect.top + 5); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom - 10); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top + 5); CloseRgn(shadoRgn); HLock(Handle(shadoRgn)); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(shadoRgn); end else begin PenMode(patOr); PenPat(gray); PaintRgn(shadoRgn); end; HUnlock(Handle(shadoRgn)); DisposeRgn(shadoRgn); PenNormal; offIt := 5; end else begin if (inColor) then begin RGBForeColor(rgbBrown); PenMode(srcCopy + transparent); PaintRect(theRect); RGBForeColor(rgbBlack); end else begin FillRect(theRect, gray); end; FrameRect(theRect); shadoRgn := NewRgn; MoveTo(theRect.left, theRect.top); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom + 15); LineTo(theRect.right - 15, theRect.bottom + 15); Line(15, -15); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top); CloseRgn(shadoRgn); HLock(Handle(shadoRgn)); if (inColor) then begin PenMode(srcCopy + transparent); PenPat(gray); PaintRgn(shadoRgn); end else begin PenMode(patOr); PenPat(gray); PaintRgn(shadoRgn); end; HUnlock(Handle(shadoRgn)); DisposeRgn(shadoRgn); PenNormal; offIt := 0; end; panels := (theRect.right - theRect.left) div 48; if (panels = 0) then begin tempR := theRect; InsetRect(tempR, 5, 5 + offIt); FrameRect(tempR); if (inColor) then begin RGBForeColor(rgbLtBrown); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); RGBForeColor(rgbBlack); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end else begin PenPat(white); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); PenPat(black); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end; end else begin width := ((theRect.right - theRect.left) - (panels + 1) * 5) div panels; SetRect(tempR, theRect.left + 5, theRect.top + 5 + offIt, theRect.left + 5 + width, theRect.bottom - 5 - offIt); for index := 1 to panels do begin if (inColor) then begin RGBForeColor(rgbLtBrown); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); RGBForeColor(rgbBlack); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end else begin FrameRect(tempR); PenPat(white); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); PenPat(black); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end; OffsetRect(tempR, width + 5, 0); end; end; PenNormal; end; {=================================} procedure DrawWindow (whichItem: Integer); var theRect, tempRect: Rect; kind: Integer; tempRgn: RgnHandle; windowOpen: Boolean; begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; with thisHouse.theRooms[roomAt].theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; windowOpen := isOn; end; tempRgn := NewRgn; {***** Draw window shadow} MoveTo(theRect.left, theRect.top); OpenRgn; Line(-10, 10); Line(0, 5); Line(5, 5); LineTo(theRect.left - 5, theRect.bottom - 10); Line(-5, 5); Line(0, 5); Line(5, 5); LineTo(theRect.right - 5, theRect.bottom + 5); LineTo(theRect.right, theRect.bottom); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top); CloseRgn(tempRgn); PenPat(gray); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(tempRgn); end else begin PenMode(patOr); PaintRgn(tempRgn); end; DisposeRgn(tempRgn); PenNormal; if (inColor) then begin FillNFrame(rgbBrown, theRect); {***** Draw window frame and sill} HiLiteARect(rgbLtBrown, theRect); SetRect(tempRect, theRect.left - 4, theRect.top, theRect.right + 4, theRect.top + 6); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); SetRect(tempRect, theRect.left - 2, theRect.top + 6, theRect.right + 2, theRect.top + 10); FillNFrame(rgbBrown, tempRect); SetRect(tempRect, theRect.left - 4, theRect.bottom - 6, theRect.right + 4, theRect.bottom); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); SetRect(tempRect, theRect.left - 2, theRect.bottom - 10, theRect.right + 2, theRect.bottom - 5); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); tempRect := theRect; InsetRect(tempRect, 8, 16); FillNFrame(rgbBrown, tempRect); LoLiteARect(tempRect); tempRect := theRect; {***** Draw the top window pane} InsetRect(tempRect, 8, 16); tempRect.bottom := ((theRect.bottom + theRect.top) div 2) + 2; FillNFrame(rgbBrown, tempRect); InsetRect(tempRect, 6, 6); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); FillNFrame(rgbBlack, tempRect); LoLiteARect(tempRect); tempRect := theRect; {Fill bottom black} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) + 2; FillRect(tempRect, black); tempRect := theRect; {***** Draw the bottom window pane} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) - 2; if (windowOpen) then OffsetRect(tempRect, 0, 26 - ((theRect.bottom - theRect.top) div 2)); FillNFrame(rgbBrown, tempRect); InsetRect(tempRect, 6, 6); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); FillNFrame(rgbBlack, tempRect); LoLiteARect(tempRect); RGBForeColor(rgbBlack); end else begin GrayNFrame(theRect); {***** Draw window frame and sill} GrayLiteARect(theRect); SetRect(tempRect, theRect.left - 4, theRect.top, theRect.right + 4, theRect.top + 6); GrayNFrame(tempRect); GrayLiteARect(tempRect); SetRect(tempRect, theRect.left - 2, theRect.top + 6, theRect.right + 2, theRect.top + 10); GrayNFrame(tempRect); SetRect(tempRect, theRect.left - 4, theRect.bottom - 6, theRect.right + 4, theRect.bottom); GrayNFrame(tempRect); GrayLiteARect(tempRect); SetRect(tempRect, theRect.left - 2, theRect.bottom - 10, theRect.right + 2, theRect.bottom - 5); GrayNFrame(tempRect); GrayLiteARect(tempRect); tempRect := theRect; InsetRect(tempRect, 8, 16); GrayNFrame(tempRect); GrayLoARect(tempRect); tempRect := theRect; {***** Draw the top window pane} InsetRect(tempRect, 8, 16); tempRect.bottom := ((theRect.bottom + theRect.top) div 2) + 2; GrayNFrame(tempRect); InsetRect(tempRect, 6, 6); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); FillRect(tempRect, black); GrayLoARect(tempRect); tempRect := theRect; {Fill bottom black} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) + 2; FillRect(tempRect, black); tempRect := theRect; {***** Draw the bottom window pane} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) - 2; if (windowOpen) then OffsetRect(tempRect, 0, 26 - ((theRect.bottom - theRect.top) div 2)); GrayNFrame(tempRect); InsetRect(tempRect, 6, 6); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); FillRect(tempRect, black); GrayLoARect(tempRect); end; end; {=================================} procedure DrawStair (whichItem: Integer); var refNumber, kind: Integer; tempByte: SignedByte; theRect: Rect; thePict: PicHandle; begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); with thisHouse.theRooms[roomAt].theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin CloseResFile(refNumber); UseResFile(gliderResNum); GenericAlert(kErrGraphicsNotFound); Exit(DrawStair); end; if (kind = upStar) then thePict := GetPicture(198) else thePict := GetPicture(199); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, theRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); CloseResFile(refNumber); UseResFile(gliderResNum); end; {=================================} procedure DrawAllObjects; var index: Integer; theSrc, destRect, destReserve: Rect; airPat: Pattern; airCPat: PixPatHandle; begin if ((nObjects < 0) or (nObjects > 16)) then begin GenericAlert(kErrWrongHouseVers); ShowMenuBar; Exit(DrawAllObjects); end; if (nObjects = 0) then begin if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, wholeRgn); Exit(DrawAllObjects); end; if (lightsOut) then begin if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); PenNormal; PaintRect(wholeArea); for index := 1 to thisHouse.theRooms[roomAt].numberOObjects do with thisHouse.theRooms[roomAt].theObjects[index] do if (objectIs = litSwt) then begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; Exit(DrawAllObjects); end; for index := 1 to thisHouse.theRooms[roomAt].numberOObjects do with thisHouse.theRooms[roomAt].theObjects[index] do case objectIs of table: DrawTable(index); shelf: DrawShelf(index); cabNet: DrawCabinet(index); books: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; flrVnt..candle: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); if (airVisible) then begin if (inColor) then begin SetPort(GrafPtr(virginCPtr)); PenNormal; RGBForeColor(rgbBlack); airCPat := GetPixPat(128); if (airCPat <> nil) then PenPixPat(airCPat); PenMode(srcCopy + transparent); PaintRect(eventRect[index]); if (airCPat <> nil) then DisposPixPat(airCPat); PenNormal; end else begin SetPort(offVirginPort); PenNormal; GetIndPattern(airPat, 128, 1); PenPat(airPat); PaintRect(eventRect[index]); PenNormal; end; end; end; lftFan, ritFan: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); if (airVisible) then begin if (inColor) then begin SetPort(GrafPtr(virginCPtr)); PenNormal; RGBForeColor(rgbBlack); airCPat := GetPixPat(129); if (airCPat <> nil) then PenPixPat(airCPat); PenMode(srcCopy + transparent); PaintRect(eventRect[index]); if (airCPat <> nil) then DisposPixPat(airCPat); PenNormal; end else begin SetPort(offVirginPort); PenNormal; GetIndPattern(airPat, 128, 2); PenPat(airPat); PaintRect(eventRect[index]); end; end; end; grease: begin destRect := boundRect; if (not isOn) then begin theSrc := srcRect[59]; {spilled grease} if (inColor) then begin SetPort(GrafPtr(virginCPtr)); PenNormal; RGBForeColor(rgbBlack); PenSize(2, 2); MoveTo(destRect.right, destRect.bottom - 2); LineTo(amount, destRect.bottom - 2); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect); end else begin SetPort(offVirginPort); PenNormal; PenSize(2, 2); MoveTo(destRect.right, destRect.bottom - 2); LineTo(amount, destRect.bottom - 2); CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; end; end; clock, paper, battry, rbrBnd: if (amount > 0) then begin theSrc := srcRect[objectIs]; destRect := boundRect; destReserve := destRect; OffsetRect(destReserve, -destReserve.left, -destReserve.top); OffsetRect(destReserve, reserveRects[index].left, reserveRects[index].top); if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(reserveCPtr^.portPixMap^)^, destRect, destReserve, srcCopy, nil); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) end else begin CopyBits(offVirginMap, offReserveMap, destRect, destReserve, srcCopy, nil); CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; end; litSwt..guitar: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; drip: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; toastr, fshBwl, teaKtl: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; window: DrawWindow(index); mirror: DrawMirror(index); paintg: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, destRect, srcCopy, nil) else CopyBits(offPlayerMap, offVirginMap, theSrc, destRect, srcCopy, nil); end; basket, macTsh: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, theSrc, theSrc, destRect); end; upStar, dnStar: DrawStair(index); otherwise Cycle; end; end; {=================================} procedure PopTheScore (whatScore: LongInt); var tempStr: Str255; begin PenNormal; PaintRect(lgScoreRect); NumToString(whatScore, tempStr); MoveTo(224, 17); TextFont(SystemFont); TextSize(12); if (inColor) then begin RGBForeColor(rgbLtBlue); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, smScoreRect, smScoreRect, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); if (mainScreenHidden) then CopyBits(offVirginMap, offLoadMap, smScoreRect, smScoreRect, srcCopy, nil) else CopyBits(offVirginMap, mainWndo^.portBits, smScoreRect, smScoreRect, srcCopy, nil); end; end; {=================================} procedure BumpTheScore; begin rollScore := rollScore + scoreIncrement; if (rollScore < (roomScore + suppScore)) then begin PopTheScore(rollScore); DoTheSound(21); end else begin scoreIsRolling := FALSE; rollScore := roomScore + suppScore; PopTheScore(rollScore); if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, smScoreRect, smScoreRect, srcCopy, nil) else begin CopyBits(offVirginMap, mainWndo^.portBits, smScoreRect, smScoreRect, srcCopy, nil); CopyBits(offVirginMap, offLoadMap, smScoreRect, smScoreRect, srcCopy, nil); end; end; end; {=================================} procedure StartScoreRolling; begin if (rollScore < (roomScore + suppScore)) then begin rollScore := roomScore + suppScore; PopTheScore(rollScore); end; scoreIsRolling := TRUE; end; {=================================} procedure UpdateBandNumbers; var tempStr: Str255; dest: Rect; begin SetRect(dest, 346, 5, 359, 20); FillRect(dest, black); MoveTo(dest.left, dest.bottom - 2); TextFont(16); TextSize(12); if (theGlider.bands < 100) then NumToString(theGlider.bands, tempStr) else tempStr := '++'; if (inColor) then begin RGBForeColor(rgbLtGreen); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn); end; end; {=================================} procedure PopTokenBand; var src, dest: Rect; begin SetRect(src, 36, 301, 45, 316); SetRect(dest, 359, 5, 368, 20); if (inColor) then begin CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, src, src, dest); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn) end else begin CopyMask(offPlayerMap, offMaskMap, offVirginMap, src, src, dest); CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, nil); CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, nil); end; end; {=================================} procedure UpdateBatteryEnergy; var tempStr: Str255; dest: Rect; begin SetRect(dest, 308, 5, 326, 20); FillRect(dest, black); MoveTo(dest.left, dest.bottom - 2); TextFont(16); TextSize(12); if (theGlider.energy < 1000) then NumToString(theGlider.energy, tempStr) else tempStr := '+++'; if (inColor) then begin RGBForeColor(rgbYellow); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, dest, dest, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, wholeRgn); end; end; {=================================} procedure PopTokenBattery; var src, dest: Rect; begin SetRect(src, 46, 301, 55, 316); SetRect(dest, 326, 5, 335, 20); if (inColor) then begin CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, src, src, dest); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, dest, dest, srcCopy, wholeRgn); end else begin CopyMask(offPlayerMap, offMaskMap, offVirginMap, src, src, dest); CopyBits(offVirginMap, mainWndo^.portBits, dest, dest, srcCopy, nil); CopyBits(offVirginMap, offLoadMap, dest, dest, srcCopy, nil); end; end; {=================================} procedure DrawHeadline; var index, shown: Integer; srcR, tempRect: Rect; tempStr: Str255; begin if (inColor) then {Draw the title of room} SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); SetRect(tempRect, 3, 2, 162, 23); EraseRect(tempRect); PenNormal; TextFont(SystemFont); TextSize(12); FrameRect(tempRect); MoveTo(tempRect.left - 1, tempRect.top + 2); LineTo(tempRect.left - 1, tempRect.bottom); LineTo(tempRect.right - 2, tempRect.bottom); tempStr := thisHouse.theRooms[roomAt].roomName; MoveTo(tempRect.left + 4, tempRect.top + 15); if (inColor) then begin InsetRect(tempRect, 2, 2); InvertRect(tempRect); RGBForeColor(rgbRed); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); end else begin DrawString(tempStr); InsetRect(tempRect, 2, 2); InvertRect(tempRect); end; SetRect(srcR, 36, 318, 54, 341); {Pop up number of room} SetRect(tempRect, 165, 1, 183, 24); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, tempRect, srcCopy, wholeRgn) else CopyBits(offPlayerMap, offVirginMap, srcR, tempRect, srcCopy, wholeRgn); if (roomsPassed > 99) then shown := roomsPassed div 100 else begin if (roomsPassed > 9) then shown := roomsPassed div 10 else shown := roomsPassed; end; MoveTo(tempRect.left + 5, tempRect.bottom - 6); NumToString(shown, tempStr); DrawString(tempStr); if (roomsPassed > 9) then begin OffsetRect(srcR, 18, 0); OffsetRect(tempRect, 20, 0); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, tempRect, srcCopy, wholeRgn) else CopyBits(offPlayerMap, offVirginMap, srcR, tempRect, srcCopy, wholeRgn); if (roomsPassed > 99) then shown := (roomsPassed div 10) - (roomsPassed mod 10) else shown := roomsPassed mod 10; MoveTo(tempRect.left + 6, tempRect.bottom - 6); NumToString(shown, tempStr); DrawString(tempStr); if (roomsPassed > 99) then begin OffsetRect(srcR, -18, 0); OffsetRect(tempRect, 20, 0); if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, tempRect, srcCopy, wholeRgn) else CopyBits(offPlayerMap, offVirginMap, srcR, tempRect, srcCopy, wholeRgn); shown := roomsPassed mod 100; MoveTo(tempRect.left + 5, tempRect.bottom - 6); NumToString(shown, tempStr); DrawString(tempStr); end; end; PenNormal; {Draw all 'token' gliders} SetRect(tempRect, 302, 2, 510, 23); EraseRect(tempRect); FrameRect(tempRect); MoveTo(tempRect.left - 1, tempRect.top + 2); LineTo(tempRect.left - 1, tempRect.bottom); LineTo(tempRect.right - 2, tempRect.bottom); InsetRect(tempRect, 2, 2); InvertRect(tempRect); if (Mortals > 1) then begin if (Mortals > 3) then begin SetRect(tempRect, 384, 5, 396, 20); MoveTo(tempRect.left, tempRect.bottom - 2); TextFont(16); TextSize(12); NumToString(mortals - 1, tempStr); if (inColor) then begin RGBForeColor(rgbRed); PenMode(srcOr); DrawString(tempStr); PenNormal; RGBForeColor(rgbBlack); end else begin TextMode(patXOr); DrawString(tempStr); PenNormal; end; shown := 3; end else shown := Mortals - 1; SetRect(tempRect, 470, 5, 505, 20); SetRect(srcR, 0, 318, 35, 333); for index := 1 to shown do begin if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcR, srcR, tempRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcR, srcR, tempRect); OffsetRect(tempRect, -37, 0); end; end; PenNormal; {Draw score box} SetRect(tempRect, 220, 2, 298, 23); EraseRect(tempRect); FrameRect(tempRect); MoveTo(tempRect.left - 1, tempRect.top + 2); LineTo(tempRect.left - 1, tempRect.bottom); LineTo(tempRect.right - 2, tempRect.bottom); InsetRect(tempRect, 2, 2); InvertRect(tempRect); PopTheScore(rollScore); if (theGlider.bands > 0) then begin PopTokenBand; UpdateBandNumbers; end; if (theGlider.energy > 0) then begin PopTokenBattery; UpdateBatteryEnergy; end; end; {=================================} procedure ResetGlider; begin with theGlider do begin if (mode <> burning) then begin timeStamp := 0; mode := fadingIn; phase := 0; isForward := TRUE; if (isRight) then srcNum := 0 else srcNum := 2; end; if (enteredLeft) then SetRect(destRect, 0, 40, 48, 60) else SetRect(destRect, 464, 40, 512, 60); oldRect := destRect; wholeRect := destRect; shadoDest := destRect; shadoDest.top := kFloorVert; shadoDest.bottom := kFloorVert + 11; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); end; lifeNormal := FALSE; end; {=================================} procedure ResetAnimate; begin with theAnimates[index] do begin if (typeIs <> -1) then begin delay := thisHouse.theRooms[roomAt].animateDelay; kind := typeIs; unSeen := TRUE; end; case kind of 0: {dart} begin with destRect do begin left := 512; right := left + 64; top := Randomize(150); bottom := top + 22; end; phase := 0; horiOff := -8; vertOff := 1; end; 1: {copter} begin with destRect do begin left := Randomize(256) + 256; right := left + 32; top := -32; bottom := 0; end; phase := Randomize(8); horiOff := -4; vertOff := 2; end; 2: {balloon} begin with destRect do begin left := Randomize(400) + 50; right := left + 32; top := 342; bottom := 374; end; phase := Randomize(8); horiOff := 0; vertOff := -3; end; otherwise ; end; wholeRect := destRect; oldRect := destRect; tickStamp := Randomize(LoWord(delay) + 120) + TickCount + 60; end; {with theAnimates[index]} end; {=================================} procedure ExtractEventRects; var index, tempInt, tempNum: Integer; tempRect: Rect; {-------------------------} procedure SetUpGrease; begin nCycleObs := nCycleObs + 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin if (isOn) then {hasn't been spilled} begin eventRect[index] := boundRect; with cycleObjects[nCycleObs] do begin kindIs := grease; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := 0; {phase=not spilled} accel := grease; {graphic # to display} velocity := wholeRect.right;{current length of spill} position := amount; {full length of spill} end; end else {has been spilled} begin with cycleObjects[nCycleObs] do begin kindIs := grease; tiedTo := index; wholeRect := boundRect; oldRect := wholeRect; eventRect[index].left := boundRect.right; eventRect[index].bottom := boundRect.bottom; eventRect[index].right := amount; eventRect[index].top := boundRect.bottom - 5; reset := 999; {phase=spilled} accel := 59; {graphic # to display} velocity := amount; {current length of spill} position := amount; {length of spill} end; end; end; end; {-------------------------} procedure FrameOutlet; begin nCycleObs := nCycleObs + 1; eventRect[index] := thisHouse.theRooms[roomAt].theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := outlet; tiedTo := index; eventKind[tiedTo, 1] := 0; accel := 25; wholeRect := thisHouse.theRooms[roomAt].theObjects[index].boundRect; oldRect := wholeRect; reset := thisHouse.theRooms[roomAt].theObjects[index].amount; position := TickCount; end; end; {-------------------------} procedure FrameCandle; begin nCycleObs := nCycleObs + 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 12, amount, tempInt + 4, boundRect.top); end; with cycleObjects[nCycleObs] do begin wholeRect := thisHouse.theRooms[roomAt].theObjects[index].boundRect; wholeRect.bottom := wholeRect.top; wholeRect.top := wholeRect.bottom - 12; wholeRect.left := wholeRect.left + 5; wholeRect.right := wholeRect.left + 16; oldRect := wholeRect; kindIs := candle; position := Randomize(3) + 48; end; end; {-------------------------} procedure FrameDrip; begin nCycleObs := nCycleObs + 1; eventRect[index] := thisHouse.theRooms[roomAt].theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := drip; tiedTo := index; holdRect := thisHouse.theRooms[roomAt].theObjects[index].boundRect; wholeRect := holdRect; oldRect := wholeRect; reset := thisHouse.theRooms[roomAt].theObjects[index].amount * 32; accel := 12; position := holdRect.bottom * 32; velocity := 0; phase := 53; end; end; {-------------------------} procedure ReadyToast; begin nCycleObs := nCycleObs + 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin tempInt := boundRect.left + 3; tempNum := boundRect.bottom - 3; SetRect(eventRect[index], 0, 0, 32, 31); OffsetRect(eventRect[index], tempInt, tempNum); SetRect(tempRect, tempInt, amount, tempInt + 32, boundRect.top); end; toastRgn := NewRgn; RectRgn(toastRgn, tempRect); HLock(Handle(toastRgn)); hasToast := TRUE; with cycleObjects[nCycleObs] do begin phase := 60; kindIs := toastr; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := tempNum * 32; accel := 8; position := reset; tempInt := (thisHouse.theRooms[roomAt].theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure FrameBall; begin nCycleObs := nCycleObs + 1; eventRect[index] := thisHouse.theRooms[roomAt].theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := ball; tiedTo := index; wholeRect := thisHouse.theRooms[roomAt].theObjects[index].boundRect; oldRect := wholeRect; reset := thisHouse.theRooms[roomAt].theObjects[index].boundRect.bottom * 32; accel := 8; position := reset; tempInt := (thisHouse.theRooms[roomAt].theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure ReadyFish; begin nCycleObs := nCycleObs + 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin tempInt := boundRect.left + 8; tempNum := boundRect.top + 24; SetRect(eventRect[index], 0, 0, 16, 16); {fish rectangle} OffsetRect(eventRect[index], tempInt, tempNum); end; with cycleObjects[nCycleObs] do begin phase := 69; {# of fish rect} kindIs := fshBwl; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := tempNum * 32; accel := 8; position := reset; tempInt := (thisHouse.theRooms[roomAt].theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure ReadyTea; begin nCycleObs := nCycleObs + 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin tempInt := boundRect.left; tempNum := boundRect.top; SetRect(eventRect[index], tempInt - 128, tempNum - 128, tempInt, tempNum); if (eventRect[index].top < kCeilingVert) then eventRect[index].top := kCeilingVert; if (eventRect[index].left < 0) then eventRect[index].left := 0; end; with cycleObjects[nCycleObs] do begin phase := 0; kindIs := teaKtl; tiedTo := index; SetRect(wholeRect, 0, 0, 0, 0); oldRect := wholeRect; position := thisHouse.theRooms[roomAt].theObjects[index].amount; reset := position + Randomize(120); end; end; {-------------------------} procedure FrameWindow; var i, joint: Integer; topRect, bottomRect: Rect; tempRgn: RgnHandle; begin nObjects := nObjects - 1; with thisHouse.theRooms[roomAt].theObjects[index] do begin if (isOn) then begin topRect := boundRect; {create top opening} InsetRect(topRect, 8, 16); topRect.top := ((boundRect.bottom + boundRect.top) div 2) - 2; OffsetRect(topRect, 0, 26 - ((boundRect.bottom - boundRect.top) div 2)); InsetRect(topRect, 10, 10); bottomRect := boundRect; {create bottom opening} InsetRect(bottomRect, 8, 16); bottomRect.top := ((boundRect.bottom + boundRect.top) div 2) + 10; windowOpen := TRUE; end else begin topRect := boundRect; {create top opening} InsetRect(topRect, 8, 16); topRect.bottom := ((boundRect.bottom + boundRect.top) div 2) + 2; InsetRect(topRect, 10, 10); bottomRect := boundRect; {create bottom opening} InsetRect(bottomRect, 8, 16); bottomRect.top := ((boundRect.bottom + boundRect.top) div 2) - 2; InsetRect(bottomRect, 10, 10); end; end; windowRgn := NewRgn; RectRgn(windowRgn, topRect); tempRgn := NewRgn; RectRgn(tempRgn, bottomRect); UnionRgn(windowRgn, tempRgn, windowRgn); HLock(Handle(windowRgn)); DisposeRgn(tempRgn); UnionRect(topRect, bottomRect, tempRect); tempInt := (tempRect.bottom - tempRect.top) div 7; with theLightning do begin for i := 1 to 3 do begin theBolts[i, 0, 0] := tempRect.left + Randomize(tempRect.right - tempRect.left); theBolts[i, 0, 1] := tempRect.top; for joint := 1 to 7 do repeat theBolts[i, joint, 0] := theBolts[i, joint - 1, 0] + Randomize(tempInt * 4) - tempInt * 2; theBolts[i, joint, 1] := tempInt * joint + tempRect.top; until ((theBolts[i, joint, 0] > tempRect.left) and (theBolts[i, joint, 0] < tempRect.right)); end; whichBolt := Randomize(3) + 1; whatTime := TickCount + 120 + Randomize(120); whatPhase := 0; end; hasWindow := TRUE; end; {-------------------------} procedure FrameMirror; begin nObjects := nObjects - 1; with thisHouse.theRooms[roomAt].theObjects[index] do tempRect := boundRect; InsetRect(tempRect, 5, 5); mirrorRgn := NewRgn; RectRgn(mirrorRgn, tempRect); HLock(Handle(mirrorRgn)); hasMirror := TRUE; end; {-------------------------} begin if (hasMirror) then begin hasMirror := FALSE; HUnlock(Handle(mirrorRgn)); DisposeRgn(mirrorRgn); end; if (hasWindow) then begin hasWindow := FALSE; HUnlock(Handle(windowRgn)); DisposeRgn(windowRgn); end; if (hasToast) then begin hasToast := FALSE; HUnlock(Handle(toastRgn)); DisposeRgn(toastRgn); end; windowOpen := FALSE; if (thisHouse.theRooms[roomAt].conditionCode = 2) then lightsOut := TRUE else lightsOut := FALSE; if (thisHouse.theRooms[roomAt].conditionCode = 1) then airOut := TRUE else airOut := FALSE; nCycleObs := 0; nObjects := thisHouse.theRooms[roomAt].numberOObjects; tempNum := nObjects; for index := 1 to tempNum do with thisHouse.theRooms[roomAt].theObjects[index] do begin case objectIs of table..obsRct: eventRect[index] := boundRect; flrVnt: begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, amount, tempInt + 8, kFloorVert); end; celVnt: begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, kCeilingVert, tempInt + 8, amount); end; celDct: if (isOn) then begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, kCeilingVert, tempInt + 8, amount); end else begin eventRect[index] := boundRect; eventRect[index].bottom := eventRect[index].top + 8; end; candle: FrameCandle; lftFan: SetRect(eventRect[index], amount, boundRect.top + 10, boundRect.left, boundRect.top + 30); ritFan: SetRect(eventRect[index], boundRect.right, boundRect.top + 10, amount, boundRect.top + 30); clock, paper: eventRect[index] := boundRect; grease: SetUpGrease; bnsRct..rbrBnd: eventRect[index] := boundRect; litSwt, thermo, pwrSwt: eventRect[index] := boundRect; shredr: begin eventRect[index] := boundRect; eventRect[index].top := eventRect[index].top - 4; eventRect[index].bottom := eventRect[index].bottom - 12; end; outlet: FrameOutlet; guitar: with boundRect do SetRect(eventRect[index], left + 36, top + 24, left + 38, bottom - 56); ball: FrameBall; drip: FrameDrip; toastr: ReadyToast; fshBwl: ReadyFish; teaKtl: ReadyTea; window: FrameWindow; paintg: nObjects := nObjects - 1; mirror: FrameMirror; basket, macTsh: eventRect[index] := boundRect; upStar: with boundRect do SetRect(eventRect[index], left + 32, top, right - 32, top + 8); dnStar: with boundRect do SetRect(eventRect[index], left + 32, bottom - 8, right - 32, bottom); otherwise eventRect[index] := nullRect; end; {case} eventKind[index, 1] := 0; case objectIs of table, shelf, books, cabnet, obsRct, drip, toastr, ball, fshBwl, basket, macTsh: eventKind[index, 0] := crashIt; extRct: begin eventKind[index, 0] := moveIt; eventKind[index, 1] := amount; end; flrVnt: eventKind[index, 0] := liftIt; celVnt: eventKind[index, 0] := dropIt; celDct: if (isOn) then eventKind[index, 0] := dropIt else begin eventKind[index, 0] := moveIt; eventKind[index, 1] := extra; end; candle: begin eventKind[index, 0] := burnIt; eventKind[index, 1] := boundRect.bottom - 48; end; lftFan: if (isOn) then eventKind[index, 0] := turnItLeft else eventKind[index, 0] := ignoreIt; ritFan: if (isOn) then eventKind[index, 0] := turnItRight else eventKind[index, 0] := ignoreIt; clock: begin eventKind[index, 0] := awardIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; paper: begin eventKind[index, 0] := extraIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; grease: if (isOn) then eventKind[index, 0] := spillIt else eventKind[index, 0] := slideIt; bnsRct: begin eventKind[index, 0] := trickIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; battry: begin eventKind[index, 0] := energizeIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; rbrBnd: begin eventKind[index, 0] := bandIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; litSwt: eventKind[index, 0] := lightIt; outlet: eventKind[index, 0] := zapIt; thermo: eventKind[index, 0] := airOnIt; shredr: if (isOn) then eventKind[index, 0] := shredIt else eventKind[index, 0] := ignoreIt; pwrSwt: begin eventKind[index, 0] := toggleIt; eventKind[index, 1] := amount; {object# linked to} eventKind[index, 2] := TickCount;{delay from when hit} end; guitar: begin eventKind[index, 0] := playIt; eventKind[index, 1] := 0; end; upStar: begin eventKind[index, 0] := ascendIt; eventKind[index, 1] := amount; {room # linked to} end; dnStar: begin eventKind[index, 0] := descendIt; eventKind[index, 1] := amount; {room # linked to} end; otherwise eventKind[index, 0] := ignoreIt; end; {case} end; end; {=================================} procedure ReadyRoom; var index: Integer; begin with thisHouse.theRooms[roomAt] do begin rightIsOpen := rightOpen; leftIsOpen := leftOpen; if (animateNumber > 0) then begin nAnimates := animateNumber; for index := 1 to nAnimates do ResetAnimate(animateKind, index); end else nAnimates := 0; end; bandBorne := FALSE; floatPoints.out := FALSE; ExtractEventRects; LoadABackground(thisHouse.theRooms[roomAt].backPictID); DoTheMusic(kMusicSound); ArrangeTiles; DrawAllObjects; DrawHeadline; end; {=================================} procedure WriteScores; type scoreHold = record score: array[0..19] of LongInt; level: array[0..19] of Integer; name: array[0..19] of string[24]; room: array[0..19] of string[24]; end; var i, temp: Integer; textLength: LongInt; tempScore: scoreHold; houseVolName: Str255; begin with tempScore, thisHouse do {**** Hold copy of scores****} for i := 0 to 19 do begin score[i] := hiScores[i]; level[i] := hiLevel[i]; name[i] := hiName[i]; room[i] := hiRoom[i]; end; theErr := SetVol(nil, houseVolNum); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; theErr := FSOpen(housesName, houseVolNum, houseNumber); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; theErr := SetFPos(houseNumber, FSFromStart, 0); if (theErr <> NoErr) then {**** Read in virgin house ****} begin GenericAlert(theErr); Exit(WriteScores); end; textLength := SIZEOF(thisHouse); theErr := FSRead(houseNumber, textLength, @thisHouse); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; with tempScore, thisHouse do {**** modify hi scores ****} for i := 0 to 19 do begin hiScores[i] := score[i]; hiLevel[i] := level[i]; hiName[i] := name[i]; hiRoom[i] := room[i]; end; {with} theErr := SetFPos(houseNumber, FSFromStart, 0); if (theErr <> NoErr) then {**** write out new file ****} begin GenericAlert(theErr); Exit(WriteScores); end; theErr := FSWrite(houseNumber, textLength, @thisHouse); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; theErr := SetEOF(houseNumber, textLength); if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; theErr := FSClose(houseNumber); {**** close file ****} if (theErr <> NoErr) then begin GenericAlert(theErr); Exit(WriteScores); end; end; {=================================} function TypewriterFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: integer): boolean; var tempRect: Rect; begin TypewriterFilter := FALSE; if (theEvent.what = KeyDown) then begin if (BitAnd(theEvent.message, CharCodeMask) = kReturnKey) then begin itemHit := 1; TypewriterFilter := TRUE; end else begin {play typewriter keystroke} DoTheSound(kTapSound); end; end; end; {=================================} procedure GetName (theRank: Integer; theScore: LongInt); const okayItem = 1; nameItem = 2; rankItem = 3; scoreItem = 4; var wasPort: GrafPtr; leaveDlg: boolean; itemT, itemHit: Integer; tempStr: Str255; itemH: Handle; theDlgPtr: DialogPtr; tempRect: Rect; {----------------------------------} procedure RefreshIt; begin SetPort(theDlgPtr); GetDItem(theDlgPtr, okayItem, itemT, itemH, tempRect); PenSize(3, 3); InsetRect(tempRect, -4, -4); FrameRoundRect(tempRect, 16, 16); PenSize(1, 1); end; {----------------------------------} begin DoTheSound(kWhistleSound); FlushEvents(EveryEvent, 0); GetPort(wasPort); theDlgPtr := GetNewDialog(128, nil, Pointer(-1));{Bring in the dialog resource} tempRect := theDlgPtr^.portRect; {Get window size, we will now center it} tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(theDlgPtr, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(theDlgPtr); {Open a dialog box} SelectWindow(theDlgPtr); SetPort(theDlgPtr); GetDItem(theDlgPtr, rankItem, itemT, itemH, tempRect); NumToString(theRank + 1, tempStr); SetIText(itemH, tempStr); GetDItem(theDlgPtr, scoreItem, itemT, itemH, tempRect); NumToString(theScore, tempStr); SetIText(itemH, tempStr); GetDItem(theDlgPtr, nameItem, itemT, itemH, tempRect); SetIText(itemH, playerName); SelIText(theDlgPtr, nameItem, 0, 24); RefreshIt; leaveDlg := FALSE; repeat ModalDialog(@TypewriterFilter, itemHit); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); if (ItemHit = okayItem) then begin {play typewriter carriage return} DoTheSound(kCRSound); leaveDlg := TRUE; end; until leaveDlg; GetDItem(theDlgPtr, nameItem, itemT, itemH, tempRect); GetIText(itemH, tempStr); playerName := COPY(tempStr, 1, 24); DisposDialog(theDlgPtr); SetPort(GrafPtr(wasPort)); end; {=================================} procedure SortHiScores; var i: Integer; tempLong: LongInt; lastName: Str255; begin if (roomAt < 1) then begin roomsPassed := 0; lastName := 'Completed the House'; end else lastName := thisHouse.theRooms[roomAt].roomName; tempLong := suppScore + roomScore; if (housesName <> firstFileName) then begin housesName := firstFileName; if (not GetHouse) then Exit(SortHiScores); end; if (refuseHigh) then Exit(SortHiScores); with scoreList, thisHouse do begin if (tempLong <= hiScores[19]) then rank := 20 else begin changed := TRUE; hiScores[19] := tempLong; hiLevel[19] := roomsPassed; hiName[19] := ''; hiRoom[19] := lastName; rank := 19; for i := 18 downto 0 do if (tempLong > hiScores[i]) then begin hiName[i + 1] := hiName[i]; hiScores[i + 1] := hiScores[i]; hiLevel[i + 1] := hiLevel[i]; hiRoom[i + 1] := hiRoom[i]; hiName[i] := ''; hiScores[i] := tempLong; hiLevel[i] := roomsPassed; hiRoom[i] := lastName; rank := i; end; GetName(rank, tempLong); hiName[rank] := COPY(playerName, 1, 24); WriteScores; end; {else} end; {with} end; {proc} {=================================} function DoQuit; var dummyInt: Integer; alertHandle: AlertTHndl; alertRect: Rect; begin DoQuit := TRUE; if (playing) then begin UseResFile(gliderResNum); InitCursor; alertHandle := AlertTHndl(Get1Resource('ALRT', rQuitNoSaveAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(rQuitNoSaveAlertID, nil); if (dummyInt = 1) then DoQuit := FALSE; end; end; {=================================} end. \ No newline at end of file diff --git a/Glider_405/Sources/Glider Balloons b/Glider_405/Sources/Glider Balloons new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Sources/SMS.p b/Glider_405/Sources/SMS.p new file mode 100755 index 0000000..0ea68cf --- /dev/null +++ b/Glider_405/Sources/SMS.p @@ -0,0 +1 @@ +unit SMS; interface const AnyChannel = -1; SMSTime1 = 26; SMSTime2 = 30; SMSTime4 = 42; procedure SMSInit; procedure SMSExit; procedure SMSSetMode (TheMode: Integer); function SMSGetMode: Integer; procedure SMSSwitcher (TheEvent: EventRecord); procedure SMSStart (SoundID: Integer); procedure SMSStartLo (SoundID: Integer); procedure SMSStartMid (SoundID: Integer); procedure SMSStartHi (SoundID: Integer); procedure SMSStartChan (SoundID, Channel: Integer); procedure SMSStartBind (SoundID: Integer; CompletionProc: Ptr); procedure SMSStartGen (SoundID, Channel, Priority, Repetitions: Integer; CompletionProc: Ptr); procedure SMSStop; procedure SMSStopP (Priority: Integer); procedure SMSStopChan (Channel: Integer); procedure SMSStopGen (Channel, Priority: Integer); procedure SMSLoad (SoundID: Integer); procedure SMSUnload (SoundID: Integer); procedure SMSLock (SoundID: Integer); procedure SMSUnlock (SoundID: Integer); procedure SMSSoundOn; procedure SMSSoundOff; procedure SMSSetState (State: Boolean); function SMSGetState: Boolean; function SMSChannelFree (Channel: Integer): Boolean; function SMSDecompress (TheSound: Handle): Integer; procedure SMSSetTiming (OneChan, TwoChan, ThreeChan: Integer); function SMSSoundManager: Boolean; implementation procedure SMSInit; EXTERNAL; procedure SMSExit; EXTERNAL; procedure SMSSetMode; EXTERNAL; function SMSGetMode; EXTERNAL; procedure SMSSwitcher; EXTERNAL; procedure SMSStart; EXTERNAL; procedure SMSStartLo; EXTERNAL; procedure SMSStartMid; EXTERNAL; procedure SMSStartHi; EXTERNAL; procedure SMSStartChan; EXTERNAL; procedure SMSStartBind; EXTERNAL; procedure SMSStartGen; EXTERNAL; procedure SMSStop; EXTERNAL; procedure SMSStopP; EXTERNAL; procedure SMSStopChan; EXTERNAL; procedure SMSStopGen; EXTERNAL; procedure SMSLoad; EXTERNAL; procedure SMSUnload; EXTERNAL; procedure SMSLock; EXTERNAL; procedure SMSUnlock; EXTERNAL; procedure SMSSoundOn; EXTERNAL; procedure SMSSoundOff; EXTERNAL; procedure SMSSetState; EXTERNAL; function SMSGetState; EXTERNAL; function SMSChannelFree; EXTERNAL; function SMSDecompress; EXTERNAL; procedure SMSSetTiming; EXTERNAL; function SMSSoundManager: Boolean; EXTERNAL; end. \ No newline at end of file diff --git a/Glider_405/Sources/SMSCore.a.o b/Glider_405/Sources/SMSCore.a.o new file mode 100755 index 0000000000000000000000000000000000000000..1e42f60b5dd597adb113acb32c00f30509d2c89a GIT binary patch literal 3894 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 literal 0 HcmV?d00001 diff --git a/Glider_405/Sources/SetPage.Lib b/Glider_405/Sources/SetPage.Lib new file mode 100755 index 0000000..e69de29 diff --git a/Glider_405/Sources/sms.a.o b/Glider_405/Sources/sms.a.o new file mode 100755 index 0000000000000000000000000000000000000000..7137898ad0febc5327a54f5956c404ece9c6e718 GIT binary patch literal 2262 zcmb7_%TgLq5QZCrI-nw=5@U>vc*84*_l=4$!YDICF=NFYm6erEva-sBi#%7JB5#mo zULuQh|L2TSRzSvuG{f|F{=S^<7|~FiVnvFL_>S$`0e@I`c98HL-wGVBX0cUQ)+j#< zDsB8GpG_~RpE!0+9OPlc9@AE}QE@~2(spa%%XQ1;L;S#N0qC___{D3912A4oz0>q6 zHN$sqT`}0F=~Zv^_v($j>D{_D&lPuAS65wJ_v#OrcYFoZ9TCE_kISuucMmiO@Qn%V7RFV^SzI^>g!v=k#MZ=(Z;=jh9^Rw;8 zlbo-xQP`oROEEsVp$xvQW6lRhc`2i!Dga0HgbMbt1 zi6~f(6vwcRV+Gkz?I)C#NR$y!GPH_Fgu<=Ml+{R-QLSa|SxdtfEo+e|1}M|C&RwXo zBAqFmb#U^k!sT3_8qcFX3CeJdr>XEvlKUp4!V4+iLANBjtKC&;MM{E{p^fMK@J(dS z1~_Y?NH_;MsOrU9gsL&hqW3qY_vN}XXA_*a@6EXGm@U;YJR>BUEqI$sMLAdOb-wES z30>=L6^oiLOxfJ1Z0kq8;BVlPwy#$F`Gw9aW6IaNbka#{xE?e3V- z^JpKH)uW&N_XqT!)&2+Y*Gq!^4im~sfprgZ7+yLNqXZ=65Hh~ngQrW#KXR7~B| zX6Md3`{DkA$_23IDTP^cf>{&pOVM}&7G{Kr8_~GvGr81^_=p*irPE1Ph9#~yF7r;o ZD~Pt&x+HhkbUza268cQ&TcG3+{R5!4v>X5c literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Aww-22.glide b/Glider_Sound_Files/Aww-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..2dee527908aaec82ecb0e3c54c05c84ea432d77e GIT binary patch literal 17408 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 WU{-L9J)6&@^Tix~!Vz>FSo?pm9r&yO literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/BlowerOn-22.glide b/Glider_Sound_Files/BlowerOn-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..67aad354f660ac274c3eb9e6c89c4fe27db471fb GIT binary patch literal 12864 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 literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Bounce-22.glide b/Glider_Sound_Files/Bounce-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..bf962567383c8f7f780f67e99b0db6d2959bb403 GIT binary patch literal 3376 zcmaKuab)W67ss!e&CG0OvLv%fvdK)Dq?ws!X39)9nJLL^l39{jl58?*GP5MvB-vzU zNwOsABS}fJBq^CRGug~cGxz?^^ZB%XyZ8J3-t$kJ?Kz$2ocDRXpC3P3L6(Pq{ViVH z%bl%%{*NDM%HYqxrBI2@-bW5!_SzR}wM6UAm_W4!D&&JC`=`IoWT{tWTm3&n&H_e$C zrH>3z$b%4M$`E8=^Y{Ysrsm+(?Z>i}dgJRb{@Hl0m9nvb$6-0xRZ2w*)05+jVG60g zx4RPsR53svqK|X=%TlHG(CYR@lDYE3^Z!fu_3QJk4mskt9*0@0SQAXM=#;*HG_|d( zk4ziq&MixnT9fUpBokW(%cCwf6AvP^}bmnPe>NzjE0uMxAO)B3hi~v6*-~$PmPz7#p8)YJcdPrzUzx~>(POBXH&8Q9p$o^(9+>yI6XGbn&i#Q z3q)dxe2d87aCyA9k$CzpUnrF;_xI&OHW>|iFV0Sky9((FUco4Rn2HYsjRaLOHo=Cm z3RfhXJ6hw(*`+U>$QCNK$NKZj%gggq4U!}x0l0_Rphnl2;lNbL{XJbRnYDFv^$t)* z#!xRLTWZ6R&2<%sB=3s%5A~O~_eP`f_WJyIU(6=L-V3`~zataP^CsvZvF}Z7>*($q zq>hYEaHi)3E9)EEy9U$g*`@b3nn>TleahuhF@KjyV&TB`#o4LZu&dmVtO)04xa{#U z25n@BiU;Z|i!;SvTwdGQ-rGO2Iz8TCG@i=l^7(x3E|X5ivGA?e<8qvs_q8g8Y)yoe zigM6tD4?-yE|efzlWpzn84fL{_H)rgNGKTaUcqQ!xN3!LRmh(L zv4YkI2T%;6`HqfHqB6uXg<5}j;&5NzMq533Z*|1ywwZK0^3}ze$uSz0)YsG1(T+z` z??f5_8V_+BUkFQNa>ep}wOXrHD`g}!Ea>x`Th06UlxHTHbSkO0tD}vOY;!!LEFNDd zmjB+9La|gT6$^w`uicK5L%mudU0qrLv7)Ym(ol?`u1v5wyy@9_!LnGgp;T-4O~-cU z<&8fW!Q#nOI-O1>P-k($S`H0+sx7>=FrEqKD1(jyX_hmEYko_mJvg$S!}(AIM7$b6B3*I^14NVcpTIg2?zZ*9@m-m$f(nR=+Stf zBdqbUQ3k{)6HVr8g`ulXk3SsGpP%cG)p9m)NM10@VbX`l1EBd9->J0bXe0;#hsUrsfk+}#r~v01 zAD^F}AB{I)Ng<8lS+=Fi{7D9-?>k6-{AlYY4KsQ3BH514WOV|I;%QhI0OCEdF0nAE zgV!pS!I0tMAqax4oF!wxl-2(qtC# zT)Se&ZwE_53(h7yQMRSlAx?RGK`fccmnujL zFh_8bQsFKYj|8q^l+E`S8x%Q!zrN555LS~tHNU*RsnQ)D6Qql$GC&CMW?)1xP`>Ouzm#Y1c+ zV2*+81DOZm%W|b!cW`uyLmS*D2CpSV$xy(1ed%;qk4^hp&Gx2jT`UqVf_Y3&@pxP= zmp3&%!w2_TS(6g>WwAP3fZ9MX9KkRwN_e`*4VXRH+u2xOMw~SQ62&YNXSP5wzsR>H<~TSr&hb;?A&?o`X93RSeyU= literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Clock-22.glide b/Glider_Sound_Files/Clock-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..f5ce6268f2690822e9a8350c0317ab1445aed491 GIT binary patch literal 10912 zcmW++afBjm7|%I(&RV{XCEjZl-bYV+UIVe16J_p01Kde zk|9AY`1?3G{k_?Isi!jayN7O&11?c0EUixTk+LPuUW41dCku`VO$Z%{Df6o2?2 ziIY$K-gH|+xpFaXWsw*^ka8K6Ds%1`VE0)S-w-S{%Fa&!5=RSI$YFIR`~PeCi=3sB^9(>|&eCwwj7f#=^6F-gw~LSWsET;n z!u?1&l1KY5ufv#xYew(BOwy`j%8nt^svuG(2Z~L;ZN8%hp2(SN_L>RV(bfqRYmFK? zw^8F?Z#EBM$vMZ8>I?`Ub8Amgy?wqLmjb^0_@Dni6BZ#)q;VA*M3{fVHkI!{c-nTY z3%`3A#zf#{*mk_+6mIWG!_)7Ze`aY&9l{$#!piwTq3kK*S%-?lQ3PgxH=CYME_Gyk z-82LsiXxPY>xDd}ul}<6@4o0V=#em5NI?Li2%H%#jz~pD6zuF>${>})@h0J*1BmL( z<+E|G-khHN-F%&-EJD7{Un$y1?97VI=NKZ81baXJ-dFW!pN@^ue1QF)LOGBGEB#j7 zrZMOG>#H%UXYA5!>0-*n+1;WVJ1@VlgG#BXaPjrIh55_lAm>mCin9={?(ux(1Os^G^eW09b;?*{87f}WA z@yqid3Guj4et22eQFl(1KJsL_v{HStdwtVOC}=05aHXCzGCzJ|S&7*USD&59Q~l*6 zZ#w!&gVN=UN69)pmwDUMX38X2nxmERAZIz-V;azQJ!=&l(yXPsr(Q%%7u(CTtDZ}+ zf2;|XT8$hmVTePmtE+YjR!WWe!EzYYGU%#6`|`486>^Qu`>*${h)!;ZjPI^HUX4uS z#%5Pj99Dv(HNIZ=QX0M#X)Ii zU>mE8MboR5s$AH7)ryE|ToXPTHzEcu-dBkxS8cjTElyGFeVz=g3(@z-cSgltya_K^6VRAXh zs?I^ATOG{I*+1aJ#dam8lgLd`Vmfap)O;m^Hk(Di=A0_^4c24asZp3Rlb_!@0Wk*( zwPs_&qht!)<;$yn!Dlsl@ae-f;ZusVu3U3i^T?=78#Y~y3b0gYA{Ogj2omsAPOM%+ zQ-$#tKu7=7OnV@g+yy*g64Ir~OK@#-Uyf!jzW%wid<3~9DXp$Mh)m%pNpG`h`^~mA zmUIY7aus0fr`t|3+y0k?zWG`E#|lTxMl##3sdh1Jmhi@kgw}q*$?uNo^aB6^+DlCy z?>kts`faoMm3kvkrb0n78$|#z{mNw(XI-Gl;^o6l zO-GW)fhFWtZGYs4Zb<0I5HHjgi+WH5GMz%VMZ<_pVlI==X6`p2$^N|KA)ok36-^^5 zuEgC0yt|o(#5A@hnhnZG?42}Nz%x#xK5_-(Q`T-#n8swv^0qp8a<*<~T#k72;rngd zEv6o`)WL{_58jxQ0tEWpv}%0Sho6rv^C{(>I^L*+ZMB6%$ z`upo?#chIft_E*+?XAq^;lySnD<=Jz!3ghPelv>9Ro?7hGrN95E4x^)VExhlD6{Z!#5v zC5mAC+vd-8-ppmn?U}UoZ5QQ<-XMpFB~HMIKZj24-jT|ik4eGiQ8?bpcvuM8o$2=H z*TtmW^UUlWh$jO!>)2NA$}dy;UaU5%Q!JZri;Zlw+Ey#o=PNWg** zlx<<8Ic?baCoCsE8KiXJMD9bulwSl+G8?H*hb4znD0k&LgQ|~4p==q_HQXWE+m}RE zzrHV`dbu$>e!8nU>APp@T(?Wa5XcZ{eBJz5VqVyhXk1-2e4InNCe>XI!&=QwJ^mx|{h|jr(e0NwugeS**Yq3*H zKwP@Wm1_Xfk(?g#LqrQRv$l5y&f0(o2u{vre!N%rD-QR#=1eK;RnU*lHU3IH?GQ6K znrL<0%UGB+WuUuS)SY6gAliSpYlgK_$lt#Ca*a7OhFI(N<+>d*X|37b_01546$+$& z^}Nc#Qn?eIUd@USiy@Cx2d%h~MOS*O{YKWVQ9?+f(L&uK8bjtzVJVwve}`=)MlF(M znKpFPkE-@4yF6zGPpD5RA4M*_S&HcRbe=WQXr^KA(E;G%cEzn=aN+D|by4?e#d>UV zHO<;2LS3*q8&`uio4+u;e+6k}w}%_E1t{B6zS7gW1XV#Jfs*~Fr(s;ekk|{IPP^5t z51&A8wC&)mY^x&8cG3#;Mia=Q&EKwFA8THZ?5E(|@A(GLtB^+J>ir~hsjQ>Xbas=P zPcqwnczky|tXEpgKLGkS062!O_1L-Z07Dt3Kb~$br-KW?k()m_$mVS-Ukxchp6x-E zM{sRjL?=KR_Ke_3;N-jQWD1J24`2Z|?R4Shbxl~n;s7Rfz|2pS15@P%JZqV>I*7@r zXn5mdxj$mwrW|Ta z;JY%VQqru2GpnD!pV|>EkE4oVaXnczxz5V4o70IjvAfOBWmggh+WO59VdbjKbM{D1l%%{D29$V__-K=^ESgp|co1>ba@nMT;$3}y+ znQ^X7uD{-P{Yoa^j?KqW`PRF0EqHh{Z5Ie^+2Lx@@JRL#HQ{1p{j^|bn_MNTk0uY z%!>%?RAA250eP7Dd~;@T55$B~0R@Qb&&{CdoM+5Wo~|-_2G>)+|FWt&m109~bbE;+ za*@VenOyc_CaF479g})h$&w~|s~Kt+FvX6}^>qst^3{>XYTXP=7y@&l*DHBc47!wz zZ%oT&i{Vsn+6;3J=-PB=()5czeh_+F<4Q=$Vo2Pj#ViXRUBur8W`p zmo7*;dPad5dC#-u@rZ$Tsz}^}Ynxj%oFD%BR?~x2dgmYAEDCN7-1tR8&lR^lf##w% z(o8r&TCYFmLm)OmvgfG}N39ChdL^MD1my9~8HY|v7|MO zm8l4X5#GtEs{CeI+_j38>2h3hycq@(cRHfv2y8uIOKdi{MQzTu$3;2$#P@JIj3~sK zD5=JOk315l$ek_v-)R28kZjhYHpo!}H2;v{e%xX@l1USJ+b2z7G-{@O_VDojd5PJ0 z$44xq+hbyWqzh$RwM9A6 zWCxeSB&>!Bz`MVyg6%U^yxL65fO~QbI;eR&?sBFsUSBV>X3o(8145ie77(s%@961y z8aC+M&E<9HtupQ#{cbWA2afi)zt5utV)j%9gW{Xg{-p7R91_}rAW2H+hrH7f>)$+% z9DqEwDj2GHiZo{l7|gGt2-s_ho&h|#!Brwd&G=zG&7F-Kc{942?~L?6q= zT#&|^UjMuKcN~WV0(}}!7{J0Q+Yo5ovKpS;zxcg*shAJmQB~oDojed9B);09iF$1A z^!V;&U9_=I*iame0Zp;b3y*&OS(hEwt;%0K$H`Dc`I+WhG3 z?tb9rzTZ|QChLAi%VwL0KQ<&^)77EQq!wU*`be{8+udS7E!KF5>7o--(+*=1*S?N_HQlM9<+EBy{R<|Vx0?n0z#X>`%)am5)AO;LO(N0@gM>Ku& zW%H{W)+k;0&Fc-JrS371e7l2(^-6tc^z!?)pSGJE$=+gyLucDmQ)VBo8jVGT@WT8@{5{0EwIN4iWb=<=JL%ENr`eh)lr&eq{h^hB>Wuej4C?h|h z?5KnJj6-&^b0`cDqi);`szS6e9u_UUQx=>XjEWwzA)bEyzRn|%IoW%Bp5?TBxg8(Q zhNTdsaTivv&kM{Afr4>;J4i^+&XtModY&_%pFx?MuPfkYv8BQ4e4Mv&PUuRY7VBOm zg9Z8VcDG>R>>aB@jb>DP_f{oqU!s5CJ*?_i(n$)O2Yc24CQQbZ+X60^nj zOmEswYPbSZasIH(n^_Efdi}DlB66`VF?jtl&gf*uNblx;SqW%W&fI9VXh%&VxxaRE z*GuYUI$v$R9!7Osfju{xRsu>cpR73Ts6{C^_)6U_YT};IwZ2>-Wjo*6;dt>j;ZqzR z@NMO8#mD|g*_XL;IgfmYav)DNYI(PY!;&F*yBddBhcs=t)yq2sOu37=xLsfliNsl0 zTy+y_jzFJmP6s)U$sELI_b*pO&|t~5=d(uAEa9q>-Q}#{Q7awT`sKFcQi!zi`mkTb z>ch*gpjEC4z}Y_4t9SvlTQwso#=BLpOH z=7`+Zm{g7o}b2P**nmMvgrfZHI@PHz6a!85G|*n>A`5cFrT5@b9T?gBIR@4&7N z;FEq-LGtdtE)tZT?$8|_as{&#;wsb%ai^5TXmBoL5KDojL}E3ISmw-iJ1L+jDHKyK zpY+-Q(~yS2I&M&^;czjJfE7^AjPY8BNSICJec$Rv#xcvB>=wz}wlw*{Y*6qjp#1pr ziU?@g2PaBbDkKFuhY6Qg-)}QII?vy_yRA7v#?nI73g8!^5=Ngke=dEbGuY@fF&A^^ zP!y_xR0vzme$XTT?aTIPiXbr?BvcTekHsRP%ia?PXS66g=>q0BT8eN3IKbEYsH#y zxl?wK?|I-Uq}&RD9L|DW_&SVQjaGk}D7r~A;l!Fmvwo9UodUx3SJ%uF=|Y7@S_GgE z(jZpI_$*qacKhGIYr>~y30#?C1X$vfU3sj%=moSAOY3>_YaHPp9802wqya!%TwAf< zFFCY2H!=Ubta;fxJ8WM*<5N)Ied75pUaqS~i5}FY*UOaV@Idabwy}U-%u$5x zIb`QC5s@5vU^m47cdT}$yY#b`jO7wBB@NoN7lei$YH&se@nhm$$ z!$+|T!y|w)PPo?0V2HZpLLjUfgQ`=ovnTVGo0v~VI~1m8kL#R8z&FGvpBK3H{7mS< znjIpl;z?}89()SGT~#mCH?u=4x3D zLuyB=eQ`C#oDz{OfBCte*7KN(c>iIQ(2|aJcQLD2dB-eQvD*g9jz*IL4}$P%`J|)R z8C7h+0d?WiX%S)WpK0;wxNMg&*t+=idYDmjM8;&T*UBM08sC(uH40u0gP{rzmi??= zDAvd7i%G^nJy!Ue<5t!xVacMMt7Ro*QbSIxH}8fa7E=XmiC)pnJ>mMQiwh#4U~`~s zZ&Eg#Z|@6ic>;B@_m0HTTC19N$vGT#f*{hCH(vv*7XwlzPnT$3OmP>NCiAo=wXlqO z$TTIp-IPrxg1n{CdWIo9wt+N|QWpL`)s&lFHsX4j%2{7OFOzyOHOcozwHU}s(m7ZV zaiCnoq3?JI7upQiZqgo8>M1P8Q2q>|0-rKOXDr(&19jW zP;FQZ4eB9x6)b&0YCNeY;eC6lW27{lR-#rHvHbEp%IH|9G$2BvYAWR&0~!6={5MWo zY(?NP&%&$^@8~{I+ge1Rb;j zpp}2ePYl)zB5HG2mfyZiQu1SvvKqu`Ak{cKHhI3Qc$De@aXClzWPRb<{4g0FUgYZE zKM(Z?>_EHoK}Np~t}!g>l#zQ#GnB~IVivdBbA!hlTnC^nL!ywjsU&Z+v(4{09u8(} zBQOO6Ey95=QY-|lkR2x*na3Qgv!T6N>8({@xzmZDU9Yf~fEIr3xFifd9La^=%GsVB zA2d8lt}=b`=kF>jJ=|s5V=*i6Qz(a;e1F(TcpRbn^2_T*UQMToefeS>V(cC%6IXx! ztiuLtV(}9wQ5)k_=C1S_S(}`vPECLP_s~l?ZGpz}VO6qGx9O(pat%6hmOKMI?%N{7 z5g2m)Wy^H-?jzS$=(I7LoUaO3XVa3Kf4EE22U0;L@VAcjSihT=9v_S2&0g8Tdq?@e zb|pf_(|43(U3z+1i|C|EYpOo(B-9@%9|VbJJ*lMbGF+|i|2@=9LZ!QT^*E18w?6U_ zyi?D+4N7xv`s1IQRur*%@!@h9*HVuq?)q#}hNTj?e*5#e6H$v)uJQnM`CIRgwc!eA zui;jKQ}TfLD^1o%3wnhu3A=$YE(iomnrfpdOs-qRlSm;#1k0Fy5-h3{>DOXKKZO z`0&G#KGCR0_4HGrHQ#LJ46Fm1FC z8sLZoJSo>776V$b%n-y{V1sB!94MH{1e9kVcIAOOSg-K(R1ybFY+`)+#MCEo5Y6q6 z=U`9;Twp1i3tZrS)gwFJXX>-9c23J;$bz-Yt3g&TlG$r>;ESkuq~e}5vTmC@*AF-Dt%TD3Q5&jEqn1^GbV9N4gC36b-3 z<+r*1GNv}xSBs()oO_C_diyv;)Q$q#I&Pl)BCgni7^P=`?RK=S+pAfNsPsuEbkheO z!k*Y@(~va8OWyo?x|)qfZ-cIp^@y@{#1v_iOpw;%I5_y5r(v-PMD5qW+f+(m4U#^? zwxb7x+4o*PS-ySjM}#CnfX3e>-vi!2lAM11F1a0v`MT~U=>*Jkvwp>UiXcpOufKa< zvo{IsK;&&=MRUg8Cbdc*CztTGtP|?}#YT;sol!XcA|67l&Ug!m_f5wODGeU9l7H)L zIS#Z1rX@CW0+8!nQhu<@v*rsvvX~sgg~6niP)VJ|SgcL}kDRFqb)GiADlnI4OV@j?w1)a|UlFJeTbR$Jbk6?We9LMW zEMu%StcSQeyOQG7^W#M|0=gf8%5yBke!Xx zS-Smq^Gx^*5FE%AGH(tC+ny;ToC-0N2LA3#0hUQY=il&=MdZky$>q`ky)i!cXY>6c z2a9+r7mmA0>_DFxP0L=Pz*Yb9_pu2xw+^(yd_)NLd{5{r^*bqt)|Be3uID8SXaCF$ z$O9G}Y#(cg`@at{wFt^iUY>^$_Rf(cN)UOEhQ(AzW>0sc1gtfNEAwS9#@j!Y$C~pA z?&fpMrGGZBUAIbR0MmqqGtr`LT&bu>rv6eG(K@|jQ5#*9quJw?1r3cibV+18oyXf#x3Lie| zC4d+8k?+grqgLrT%b1#7k8lqpky+!NPC^5`e_6QFtvDrT{7~=Z%QR;aa@DEcx@)Fw zAIe;43yi}ckviH022fUWe#r3_8wHrV_3_+L7|jVi<4h9kT+WKNv#k?FvYhj&IcIdK zyEW@%EeeGph>u1EbwSt_DqFt4Tn(~1 zzR*Iaf1g>0-NFp*eTVGkMxyK=SjeK}tqr z>+=0cJ8ojL^ohy!w1lWtMn5*1l)VBfOXbI!)d+OFFLJjo21P`2#8x+7)1va-<%t+XzA6a|=0`qm<0Na~_--EXEkbI1vH^y@Uu454h%hvzju= zWQK5gJnv@pVmX{^w8|kJlO}feujhmZQW)a>?>~l72~*)F#*;eu`hac2=GWs&7}!4f z!QD+G1ZpKn@L?mMrZLRfDfq$w%s>t0#pg-P06xiapml=$-oq5g6iT4+vDkyf8lLi4 zbXvVLTP`P!axIbt!WWDhOzu>(-@rn!QiUYjJv`<@{E1?7IIL$qh&Nttbt+-2O6$#c z`<0Z}Zu6n-i(v|ZbdGQq&4gjC9P($1g=D~PG9qylBfpuFYb?H4!mkmD^zm{Hk2xT< z0Sruw5rdd31cMMfVpB+U&Nx;sV`0!;AsIX$u_}dPgTGiU#B2t$J6i`{vs@aDK{(QSzN{0iH4AJS;lOBuN8OmUVq#e@O^6gQt827roiCV8$ut)?lTPTwWBPto> z%+^{BJdPMmoM`K!W>Q~0|pi3D)gp`5F+A(mNmcG7mT~JPJifvfOh#>5nZoD=yO?!C3Jns@<`OO?havIiOIXlmG&y5L zr(Fud23x#XEvLLj$m-8mD#dKn>kj6C=r0Fg*cr{0O4)!>YxWfytxDWwvL!0Lc0Pz$ zERIkL%LQST8j0bx3L0_2NEBy=v0$4xr7+q=82K!9=m%ZK7eDJyPrr8h9$~4`+$d zq=R{_R&T!Et;ZdDqc>gawo73fWRBv^S_(v3XALB?DW6rVh5czPA4l{Wqc@gH_+h0; z43Q0&Q7%=%fmAl`hGYu8I}#7s)S%ae!-=rRs@H(plP_lc05gSiD0rkoX$fK#JngaQ zZOQ7ehX(DiE0n>jrKHyk&OxBUZiH3u2Fk5xouuIao>Cz(^-Ve!1i_=wM$8!_f$$QNuy3 zjKf14j~U zOS6&=fR)F}q!Vd2BFR#n$OK>$>`fO6;2$7jK@3j^?PfFViRQ7SSFhAq!T#~@dg5JvsSLM0xSZ;W3WeaXeNLd4X`hZ7m|p<;K&e-YChsZ zJh4)%Qw6hSdoWvVlrw&(E08X=yY;-+<_s6>bv)*_T0QY%rI_}DWv1|2Ips%?U?PX+ z5`OT)zGM+kha5I%Acd8{sk4}oV736J0$@$S44Mr)%?67rffmw0Ye7gTolOAFFM=KS_rXYKVoYdr>~NF?I1nQXuti$tQy z+;Ar9vuV_TLan!ld(yqx{!Ahf@wu&fqt#|Lf(Ek=1XQ5G7D~pF$w({~iN#ZyR3aXW zM#72g$kg6L#|}-64h)P>P4AsKeE8trJ^KzG7*9u>_CP${KQcZwH99mjG&%v@-m_=d zKwn?3KR-CJ|InV%bi`}YNI6szl_S-e9D#7i>o9?G9+im0V^CPSNMo{Cold*eV)w-| zL*wJ41F4W*2kLYx35O5*d-J(WHkXch3~ISZ3V@(e#3Z4*5M3BNstXzz0+}OK>$C=| z!)-SzxwzKanugXc0$Z*#fPhr0kV(W+jmc)W8ue<47_bE5sr18({3v&wQ&7ZsEgXO$m?%kjL z=l)ASef`JmAD7U(!MA6Qk3<|iL>F0VkN7l9WJ7gR7t4_u zo1PdN&)EcM1c^phheu9-b@_N!joDFL0>g7S0x&#!vHZvM(96DPhWSW|Nw0@+blw06UeE{0O8R;fUGpNcszm1>i7G?UbEQ~j_0QjpZfUZ zRBv+ZlkdMdvoCL9bi&F?3QJ)a27@b;2>5I=nWM>m^3Azm#li*aHJOoPSAM%X?zYSM zDs|+-t)IU+xy#?Z;{6g->YMBT`02`*S1zPE@K%y8cl<=3md8`^I=Z=*;lqcI96NRC z{Gqh8t-3><$PMJP6Q|A{8T5iu&=(5FTr#o7H*#=)zp|;B>l>aN?(4}6j_f{k{KQ9> zuidTI<>C-nld*tKA5)2nJ9QWNdj6tCI%AKQdv<{gpkNEjR+d8t#CtGT{}+biJ55K zBzkA@>LNI%wY;LStqsGJJ6r%CI&UO20*;eOn0zX{p}M4^t{zFIvrx4~Yqr$D>YG}c zJ1`U`gFz?2>&iY@^4j~G>#&5Dx^^ZL*<4-4?X^pXT)Ta{($n{0*)^6Tf zQMGN=8*gkt3b;H=D&e(*YEZ}li~tzwaVe>IwuIVAH+g&(YE9{;Wq*C;>Bpa(_sAm! z1<$-)#dY+KO%A91pqSKHUB0EboudHc5`)j}@5zs*01{c{w3|HH11CC5ebrdRJn(R%;qE0<26z5Lmwa|idG{AfJkcR7PGuREGQaOT*F&#wIN#gXyd z#}4MKT5nI-Vh`Em+HiVcV&=@ZSAY2Oqw%EO9PCN-_Ih=oTEHU1;bOPPKlsVDU;g#& z`9u8<2~Pw#+hoeHd)n z>Oxp!&Gypmm4$_^Laj401vM}X3s>~Yyn=$c&v0(txd$EN{{)si`L-Nfw+KoZ^Pw9B^B;X} z>C0~rj{bK4#_fB*e`m!h2CvTEpCK;(Z+@G19Z)(rI^PvI@E()O+Oe#czJSb#A;b<}w)q69-Zn7GJ9(BXM{%3y=!MK<|O!%-BFO zchhnKhiYXP;czQeG&VoILVf zKfHk};40(-0=#PDRt%3w^<AU-dqS7`dp=HYFJNTIcyZH)Yd<$X@=qO+uwM3Z3j~u-*xuebNkNU{H({| zaOpskQsMLm;yzbqJi_Z{2KphelTZXg3Z2@xp}{jb5U^za{o617jO^8uU~TKz?VobY zR)TZ)nRBC|$#2h^o3=Fz9G-z&vk&f`SP40KVePrQv$OvWZ+`ZvrNHe6e?sf`AN=#P zdw+Z~6mbt8-2dI|{Rj6ietP}-h2tNMr4N2_GHEbGherlOxEjUfD4kzDe`MFl zffEPzfBxO>)Swds$Dz6;{RejKJvsBsXy@PACr%(NQf5sJrKL$Bw z-r~A8q_aPh#w;v&q+sFSpPu*V2b*7gZ0?hP{mVOLRc}49QZ$j}Dlh$Ld+mi%J^tnA zmkY?xKfb1+nTRM{x&YcKlr84Wd*byM7A`7Z{rGw~@Q=GU)0XM)e)%G->D`siU;Z6R z2DfkgFcl1%^oQ@>Jw0=J`qZr%x_tWRiHqMuZi2w=zqt3{{=LsXhd^`oE_B_y|JD9a zKOM|pzVpXFFW-7_=fg^jx zU$4HLmw$Kn;NeLII&k*F;PA!RmLdj6n|9H4EckbMG7A<(TXko#kXKJXMo?1D18`}II(2oBYcHX%6 z=j^{6??Voq13mgYcK5H)rXKF<5b4!N7MIf#|1T**=Kj~<*$20eCEa4OKyGjnmaS;+ z!thW#X#R9svu)MZwF{sfEP}QF?U9A^=hcz6TYfpw*}%JS{W=}}-Ot}|ng3Wp)!vxU zpx*cU*AhM#-!qJ(`&med(3EwWJ@5@27rv@f=5bSZcGkT4*VW}TXTTx@Lb)Ih3*SJy z_S>N&x38tLUtSqjR6Y5;mhi-r72DUg!C~$Tdozdr_umhGoH=9#3oqj`g#;bVPuJQbc%%1NfRiHjHXMs3-M=x!!bk-Sg{)W(J~sVKma%LQ_k6tL(7BzPNx$58nr9zE#E^reULsgzS? zOU6QRKM%I@g}IO?UajS)uRQqW+p}4nh$nFkWbMq-7oT|LFK@1`#K?`ovBT%S`Q}h= z-}k2}FV20R{n4E-dO^NWq0pN7P385C#YWp_$Occ?2dYdUgT!Rf zr6w5;Ns$7i78FaWwa2mvzdz`8s%dn<*OLnS!?BQ4DR=io1Bs9k6eFrz&=?Gw%w{Rv zUb{bR5zvKzEj~24XLRh~ghe2e%5^47Vr(dr8yx5#7)eQ+Tj|tp1Xctxkt|TJ*FvD& z*+HWs;N2v0TSaX%N^Ax-o~Ylcr!s?C7ZcG~Pf%$mI?>$pve`?OpYW|0|~3i749Dh+O(R7*ch{b zN+}?x5jh&OPA%s!rS^Et3R+Ae29YRK3mJSdrKz@CYV~-HQe*GoV&7ai^3?qw&NFolF-Vb7&84z%9bh$!nQ}T6Ae=-C}ROWz73VjtbAR#n$ zv&cxM(W+u_`)@-~^XqRv?KRXddF;t&mu#l`C#LpXymj?NJ|6LC$Srj(I0~v2BQu#T zzTQl3XmB8@=6G=2E!P<$Y- z#kJwhF}Ge$MWRt%SOS&>XoNHhP3Re(IevWasFzJ5wKtNL{B8t^MB|gu5^vA}(CAu| zLMEl6F=Vb%CDS^>Q5%%(ymp<%Ww!uqTu1rZ^_5taN@NO0Qu&^+T_(3#HDV4|l|4V> zF}n<`+G?!aKQOWH@RYfuqQ0hZ2aZ5wP)IzDJ&_sMe{|1C(q=aDuuQ;U&_k%A;Immm z6)2%I<$5Kpt)il4>x#EGvMeAzElW|xwlR@aN-P*`h$w(NMh(&%nbwCFSjjf_KL>2+KR36Cc;XcU%M z#$zzV`e-IMws$0?Vbd67GFNTU%2Y5ufr zJRY}M1KPZyU_75sB>HlFaet_Pawy^pcq1{pS_2xqAwSgG8QgpF*q({8Tsq+Zb-v6% zKHZxe9ZTCmo8O@Yjb^I};87U@g*DpKJ2ZXpz)(DBQG;faC6sV!H9Dvm%tb=+o~TvE zk(lgutKMu=K*+;okda6X21}x{_|U0S%QZ%$RwH9!;Bc~#&*!ors6-=>L=qm;(bR?^ z60mJ`JK^1QF1n$u6T|1iVLP^#H#OB%lx!~CUemm@vbqbR6K;!IDj+mBw6(SFY{Lrm zCR;3@v>Ci^UnU#zd(<2jgU;a5F$`lU;`7E*=~Oc6arF-MMDqtv9UM(XzsAVFSNo5KS zktu=lfKn{Cc-%HAQ5ugyEjH+gsW@zrL~c#=M4}O&)9&*t(M{_Yzgth{venr zIz|5GAK$+)=jq4v*W|0ezjk^pR4A&UzR(riQ$?+hKl5B8t-6dR5all(cH54Ab8KQ) zn1>O?#`Yafv9V%V$F^3vmQAEcA#fUqn0d9Umj8Xp({l>uzSk%SjvTo7pW9!a8dEe> zw&1%r{cT;h++b4knKZ)AEu|e)o?6So@&Hy>TT>@ntyY7210dm{;6#x^KqVnJ|7Ce) zeHWkK*@PrexN<-&@x(M_G#ba%=~*3(I}t*!O(tS9tpN#D?T+*(HS)k<#?B|xC}@_b zY|et$A~$aVt5CT?pTlkRow;@1M&SV*JbW9BB~kapC7M1Tjiyw4hmFO{cZvZ45rLL@ zJ^Y6977Dq&OQ&hCMTJS6umr#$8nByV*rlN{! zSXprsQDg;aU?%EF<@{z_Ah-9E?=Bx1(l(cF-c*f|*z{B^N8#unObt%O=~Wxn?tlOm z?dmf(zO(qP;-)&7aA-8T@0Z{H`N_$16Bb_C{CQ9%zu=ALz#wScGwL2aHopI$sT0NK za&QfBY#ofl*s`=Eoc4vYdw#g{zn|Z_etq`$BkX4Oz(GeRoIu4^uUWgfqLV}>k=X*C zwr6CtKjjf3NeX6tD*;L5l8_A0m&guh+~z=fa4;4c7#lx%>0sPw@9ocx?-}-sxhjp$ zKrLMh<4E|X{D8}m3M=Jy7bqaLw-QA(tkeLgIL$Dm$QSpHUH|RQr87TV?v3_Jx;glg zhSpc+LNpwzhaTM)|K#lDJNN#4@a^HePm3?xxMAt5@79n=c)rG!9vYh*kC_d6KtyV2 z7An|cZaW6>4etrHRU@!`9hc-7$$E@{GI8wOlv}MeS?L?!D{dyK0DL_uInG)`FX}G z6B?pXB?>{2X*ISUQ)3yto7Z>Z++Gd5e%p$rt2frt6#c*6|NTFt*9zy)f9WNA$4l@1 zczyTm-J2JthxPTV-+uh5QnEs^{fWO+VB~Vi=-vAlqn%5a7cP6Y#E}3b5V7~AxMk9t zcWxXA2#x;Er=dc*V8No5&E+dAn-QaTp(=Lv?u{c}ok4;qdTGJjx3|2v85~O3`p$oQ z`FNks7L=lJOo32r&K$k)(V-(V!!fH|K-~J?s#-E&aAgn9q)gtVfhXjlYC7x#y#cda z>vd>Ai-y|KMUy9voISZOpPfE2BtfE34I5W%CyNxxvma0N#(fT>MB(zKr((|0{k=|q zCYv;MRJLz{eE3%I$7@Soy!uP;zpRfurN4Pb-ni(wUDwQu*BLI}yQ-+IEq?RSM_wyI zm~$2^*A2jnUY@s(2SreKJCILcmc6xVYeP$Wb0a}+RG_;wqaz>&tw;}fL5CSrT!({g zWqO_c$7OG=!uY28E?kq~M}1rWQe{wdk!|B=j>q{NfQv*l7q2RWBiq^uEV(P`6LMYo zi36i*ED+>3Vxh9rW>#Cd@4r;oP+8erx4lc7*nMhWK&&FQQ50nF^9GuMQ zNr$fI?2lhg2LNfXKV)+FRV;15Dw0I^9od(U4W2wYG|(&R5bnNsc=w4TYW2`!Tw+GjS119qgZ)oY=Q_YI-#03H9~)G%Ny5ssW{#n#v9# z2Sj@!fSqxzf|)WHgo*Z>z4_$qS5}xpHApk8f$-*~-m){Ns)9PaHbr zMZ&6U;aF+7FMr_p{sX5^j>Yu&s_n&Z%%A(>yKgTmZ*3)#tG5fXLz#3Yldv){0v@~( z4lCZW^2NuVef0ylH68FKy($R<+1^xB{y$q#aw!qPQt^1dV_V*+u9k83~w^4YKx6k)43mUi2xcY77O-swCA=M5@Ac~?6Z)cYc07~Q6^WdiQuyj3Bk z<5}d+HUz|4=(tV{0ojJ)8T(G0Jvh`iI2bk=4Qi!CX$>Yaqa*2%*X?u|L|mygA!m`222f(4!MGNf-i?Bhf%&nMA;*k_b2)nI+R3K)K3j)oR>6 ztHlPeC^W86Wj2U7Oo)6^1ad%vYpg0NBRe0;X+2I2RQu>mDmI0|q*B;Cp-e7TXw(Y8 z?2GuJ)&~cVfuugU5(KqolhI~TFv%=+Y%r*#x9n&o$xM#OKrhIZ0iZXtYicYB)i^2*}jdK-h0H*&S*ckqa2@Ua!w46ByiXtCE67;+P8m zx?QP6^Ws-IXopKU)uaZw@I%v2YPzKR#3rZ38hjYhb2%!O?#@$J@~`5eOq2$c4i9F zUTTh-{`MyO?0G{iDI{P1@(U}`WQ@Q+I_2)#0jsHL?}o!WDI$e60(QZgnqW2CwXg1Rm^|@WXXxQtt8$dNAfeOS@9$O%O_-HKR zh6Gp%B#TOwMhg^e7KhWK1)-tSKoP)UGC3R$o5SG=r82-^f%s^~rxigmQF&#Dz+m$x idqZ}R$7HjaLZ#kfhJ;sxm;iBbGFxJar1SYy;Qs(PsZZ(v literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Drip-22.glide b/Glider_Sound_Files/Drip-22.glide new file mode 100755 index 0000000..7ea3cd1 --- /dev/null +++ b/Glider_Sound_Files/Drip-22.glide @@ -0,0 +1 @@ +jjjjjjjjiirrC(Ejyl\JA==ASreZgrn\HAEQiy~ncZZcsn``j~~jQA8?Uj{lXLHJUcwy`O?AQ`pspjc^ZX\i|~pipĿspø{w~~rnswps|wpp{~j``j~n\QUigOFSi|ZJO`wg`i~pil~n^\lsUEEWy\83Wj8 FEKuY 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

B9z-Pf`EfpV>}&ZR)kY9 zggU25L4zTJ0jkWLA}XC$1f_yjkQN=EnO{_pQ^b^E79uB)%H?xed=09)My5azX*m=M zTLuFqa+=)YyxamZ9Ym8*%n|Wfl%jkf&mtNhLIQMOwhA)=Y!XA^48pdrZ>)`|81+rH zm8BS4t;P7M9)73ZZ1aYyYQqTUijd!|GPz3Y8mj;nf;G+cVY@-=tnC>Z>}jg&7@0eL z@tuk0P(}Ctb7v2B229qnmZ84-60^n-Z0_l)bt)wao7aVjNQ)PCquY!~wCa`c&xA^| z12(=$3`tB4gGg=(V(hETq>|~}Wn~^cpQrV=^mUZz`3&GbXqr?Km95liL`*V;gOMNx zg(-KImbq0z23O+@mN--bxv{jRvlHlEZE}Qb$~_t(U+$`FE;sVXG#P4xl1<~n@DuT9 zbQ&=?GrN$^W>Sd-G_lU%Fhz_mh2H24gsN(4Lw*ITMVZ)3AScJm@pQ5I*zT9mzn0(bO^+7B4(Fp(47a7p- SyJ7NSrbecLE#UF`-2Vpxu2w1l literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Extra-22.glide b/Glider_Sound_Files/Extra-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..8b2b518758ff9a9cb99083f775b9f4a1854bc38c GIT binary patch literal 16512 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 B0u}%O literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/FireBand-22.glide b/Glider_Sound_Files/FireBand-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..f6343af0924089dc5845de0784e2b414d5e27db8 GIT binary patch literal 830 zcmYk2QH0}Y0D$Ld-p;+Ob*y>0hp~2@F=mZXGpbfbRJE!iQ7bkgA`!nxL_{JY8WE9* zh>oaAR79hqQlqM?M$H*#%si}dXRT%3!?=6DhjmYT^LXFG_wv1cei#j1RhC#$Q&q|G zf=QlUM1if62+Eq1tXfv9d70S&h2b91ymYau@=&L-7KDHx$>-BDOF~^@&^`qWe==Vb z@z675UI4V9_|xT8J~pU+^BqIdD9Jlnb$vZI2n1_)Itat5PPWKG6>B$|O;q7IriWp2 zX!v#f>aZdcHQW4c$vtzZUap=Bjw7-Xv(vU)=uj zaeK8$xh{tH`kcDCzq*Va&oHnK&a*+0>Z0g+x`Ok1;yW})QaHmfGH>`)=RKz|EG0{v zqUk(NblN=*I6*iWEgYg=d)a8=Bw=|z*TWgdfBNRAFpjoko$ru@rW!g39F=L;nj~)K z_nVSc`v%-SJSU1Qj%HQLOO9s84uCq!k z2@%*s401>7fTz0ky*DQ(lIQb6Gyz!a`0QMEvsL-Al+UQqMU@5vSt1Ze&m*qElNN(0 zt`N9RnbUP5Ue8!$pa4WorV*wa!{yrWJ=YoL{_Jih_0C&he0N17jK+n)i`JWL5OR{P zrH}U^*+x#~^viYexHXT?q|tBxeoc+NgBPN*np~^U-abTq{{HP@dGh*IoNY%%=lFH) z49tt0F$uw~Q*iTj8r1gpgJH6rU-p04fs5~dTY`er>mRb45P!Lgm{w|{&_TntEKf!$ kts1EVH-V4eF>l`Dhjfi4y6sm7&wl!GXJ==3_euZfKZG8Q5C8xG literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/GetBand-22.glide b/Glider_Sound_Files/GetBand-22.glide new file mode 100755 index 0000000..b240c56 --- /dev/null +++ b/Glider_Sound_Files/GetBand-22.glide @@ -0,0 +1 @@ +ýyww|wrljlny|ng^WSJA=8338CQaul\QLNWasysg\\XWUQNSX^^agcgjnlrwwuw~~wrlic\QHCCCFJLLJHLJ?=A?$HyO)k=6YdXwGl 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 OH<;`)lcikCFZn<6l3`N- literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Guitar-22.glide b/Glider_Sound_Files/Guitar-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..48c26a0ffd6342e3733ad3cb5970786983c9ba9c GIT binary patch literal 8389 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 literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Lightning-22.glide b/Glider_Sound_Files/Lightning-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..98bd0525730fb8fa8548a211e587d5ff0067c0cd GIT binary patch literal 15066 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 JB8-pY{{fhjo00$k literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/LightsOn-22.glide b/Glider_Sound_Files/LightsOn-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..fa23a8fbfe97c120ba6752c9be38bdaaf9fb225e GIT binary patch literal 848 zcmX|AK}g$B81^u>yQf{eh$ls4Fg(aS4LyyGA;YngrATQhq2v+5<2@daknjj0;Sowg z2+|@YREkK8l%a@7rHnBtMI1$BMTTs6+Ig4mPv-XVUh;p*_x}IA{9iOpLkQ^^FeU`+ z>C6HR!8;Y{nyL|^6V53$3}#rCX~HlK&N<@-qm)rh7$KCvQmkv54%c)5CzLVJJ%E9f z!2(Ko`q%)ZIWqF^{$FpHmPqS7z%U>HDNW13%(9a-7i<91K4ko>wuJ4to+qXBeZLw6 zK^R3;CM)_D1`#S+cZiNpCUymE6kCStGb3w;YU?p zI$luQJGq$vrU1{zX*5|%HdW6U%E)7ykx7uTnP$pL zzF2-fJ+ru0HXEbK{b8&w&9AR6Z-w2_py|JR`e`%=V7(mw5fIzR7slcZkTKO5ZK-`|dolcW~z9`>)k{rGv^@6@Fi)?3FH!@<>M zubsr6;{>~%&)2s%{Z{O9?pAjWdY4~^UwWP0C5|gi7blBrE LEHHQy*0d1 literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/MusicBite b/Glider_Sound_Files/MusicBite new file mode 100755 index 0000000..ceb5ee1 --- /dev/null +++ b/Glider_Sound_Files/MusicBite @@ -0,0 +1 @@ +~~~~~~~~~{{zzz~~~|{{zzzyxuuuvxz{~~|{{{~~~~|{zxvy{~~~~~|yvvz||{{~~~~~~~~~~|{zxuuuy{~~|||~~~~~~{{~~yuuy|~~{xtruz|~~|~~{vutuuvvvvvz|~~{{{~~|{{{~~{zzz~~zxxvuuuuvvyyyxxxz{~~~{{z{~~z{~xci{Q?ftmi{p`mmmmst~|zsmd^g”ughtpfis~mnzzgD&0Wxzyuuvplpppmhdfgfosp|||{{yxz~a2 8Ws~{yxpg]^^s۽{dTLJJC0-dǤhP@:==99=BFIEBDBEZhnlW:.Phz|x{~~|vpupP0-BO^hotz{|zv||paWV^uϮ|~jL,"BnԼ{m[PKJNRWWPE<=J`x~pO'-CZly~|{zy~~urzsW>207@O[dp{~nddiyɺc?& ,ElνpfbdimldTEBFXpzaE+*:L]mx~{{{~~zxxuuvz{{{{yx{~~vpnpy~~~~|~~uopyhUJCCEFP[hv~~rd^ftúnP:3:Jfȶyvzzum^ODDObxp[E3'%*2?O[fnu~~|{{{|||~~|{z{{{{zz{{~~{z~zuuxz{{{{{~znhjsvh[NEDJT`jtzz{{~ztprzvbRJIP]oû|paRLKTctzhXI<67>FWrǶp^OECK[m~s`O=3003:BJR\gpy~~~{xvy~~{uppt{xpmos{paUOLPX`fhhgfgmxpfcfp{ʷmUB9=Ja~saPE@CPat~p`PD:7449BIR\fpv|{xtsu{|{zzz{{~~vpjijmpsvz~xmfccfhjmmptz~sh`[\dn~~pf``dn|sf\UONORZaipuz|~|zurld]ZQPPRZ^chnsx|~~~|{{~~{uoihmuyspppppty|~xuuuutrrsv~sf^\ajzvjb^`fp~xl`VOLJLPZblu|{uphb\[ZX[]cfinpuy{{{{z{|{zzz{vnhhnu|zxvurrsy~{zxpmhhhms{ug`\`huzphhms|{mbZRONPV[djsz~~ztnid`[XWW[[`fjoruuuuz|~{zvv{|tmhglr{{yuplgffmv|urmmmpu||m`[`foz~phffluth^WRPRUZ`gpv~zrlfc`\[[[[`flopppsvz~~|zvsty~||{{||smhhmu|~yrlfdfmu|vplhhlot|~mb^`dmu~ü{pjhmt~sh]VQPRV[`gov{yunic\WURRW[`cdgimpv{{zupnmpz~|~|smhiou{{rjddgoy~ysomlihmuyohffipx~|phdfjuynd[WRRRV[dmsy{~{pja[XX[]`aabchnu{|{ysnmou{~zz|~unlmptztlfdgnv~~yupmiilpz~vpoopptz~{rlilpz{pg^ZUUW\cipuz~~xphc]\]^^]]]`dmtz{zxroppuz~~{z{~tpmmotvyz|yoifhlpv{~ypjfcdhr{tppmmopu{{ohhms|ynf]XWVX[`gou{~yrldaa][ZWVW[dlpuvuronnpsvz~~{z{{vrrrrrsty|tnlllmpv|uld^^clx{upnmmmorzypljpzzof`\[ZZ]bhoy~~zupnlhd`ZTRU[choppnmmmmmopru{|yvz{vspomlmpxzuspooptz~zphfgjp{~yspmlnptz{spru|{slf^[XX[cmv~~{yuurnhb[URV[`fjmnnmmmmmnopsy|zyz~zunjijnv{upmmmpuz~pga^clv~||~~{yxvz~|vspruxz{~zsnhb^\^bhpz~~{uplgfhlpsvyyyyyxvutrrrsuz{~~~|~~~uommpu{~yuutv{{vuttx{~yofbcgoy~zzzzyxvux{{zz|~{uponmpuz~~zsnmmmpsuy{|~~~~|zyuuuuvxzzzzz{|~zsonnpruz{|~{zutspsx{{{yzz{{{vrpptvv~~{yyyyyzz|~|~~{zzxz~{yyxvyzz~~|zxxvuxyyyz|~~~zvusrsrtxvy|~~~~{zxposuuxz|~{xuusuvz~{zvuuvzz||~zuppruz{xvuuxz{~zxvvxxz{~{yxxxxyz{|~~||{{{{~~~{{zzzzyzxx{~~~~{vtsrppttuxy||zvtpppsstz~|zxuuuvxz~zurrtx|{yvuuuvz|~~~|~zyyyz{|~{z{{{~~~||||{{{~~|zzzyxutsssxy|~~~{zvurpponnpruy|~|{uuspprtv{zyxvuuy{|yttuy{|xusrpruy{~~~||~~~~~{{zyz{~~|||{{zxuutuvz{~~~|{zyvvvusrppptvz||||{yxutspppppsz|{yvtssuy|~{zzxxy{zuppruz~{zusrstx{~~{zvuvy{|~~~~~~~~|{zxuttuux{|~~~~~~~|zyxtsssux{~~~|zurppppsx{~~{yvsrptz~~zurppruz~~zusrux{~~zyz{~~{zzyy{|~|zyxxz{~~{zzxxz{~~yxxxyz{|~~~{vtppoprtuzz{~~{vtstuy{~|{zz{|~zxuuxz|~zyuttvxz{|{zyxvvvyz{~{vuuuuy|~||~|{zz{|~~{{zxvusstuy{~~{zxutttttxz{~~{xvuttuvy{~|{yvutttuz|~{zz{~{zzzz{~{{yuuvyz|~|zvvvxz{~~|||||~|zxvvuvxzz{|~~~~|{{zzzyyxyy{|~~~~|zzzzz{|~~|zvuuuuuvz~~zzzzz{~~{zzzzzzzz{{zyvvvz{|~~~{zzz{|~~|{{||~~~~~~~~~{{zzz{|~|||||~{zzzzz|~~~zzzzz{~~|xvvvxz{|~|zzyyzzz~~~|{{{{zz{~~zyvuuy{|{{{|~|{zyz{|||||{{{{{{{{{{||zyyz{~~~zzzz{~~|{zyyxxvyz{~{zxvvy{~~~~{xvuvy{~~zvrooptv{|{zyzz{|~~{{{{~|ztrrsuvxyzz{{{{|||zv{ð~yuuuuuusppmjilllpv{zvvz~|xnbRC6-.8EXm~{zzzzzzzzzz~|z{{usuzufVF>=>EO[hu~{{{{snns~»yohddglopj`UNJOTbs~zvtplhhjopttsmfb``foz~tg[OB::=CJT\dmt{~{{{~{tomos{~||~xrppvxh[QJIIIJPU[dnv~~zxy~{zz{~tdRD:79BP`p{spppuyyupjd`^afmv|umcXOFB?>BHOT[gu~~~~|~~~~{tpliosz~~umd[PJFJR\hpnnoppsx|{xupputg^XURPQT[dp|{urpnmpv{~{upsvxtpmha[WRNJKPUUX[`jt{~~zroou~~|~~|~~zx{xxzrc`hnlaPC=BPaoyzuplpvzpfbbdiuxcJ4(-Em~{Ǽrh`Z[^dhnx~zpmga[QOQPKCBHWgoh\TPPV`luy{~zxuuxz{rmp|zzidcgr~pgdhpvxpg[RQUZ]^^[VRRRU[dr~zzzzzzuvzdPFJWdottstv{pdWJBBIVdpz{ohc[PFDKWbgd\QE?>FVdmpuz{~{ppx{n[QXjtmpz{~zsppnmmpv{~~vgUUbhdV?6=FJOWh~zpmlou|~r^RR[dlpptuupmlmt~pd^][[]fr~~ybLEL[cdaZQJEBEVhvxsu{Ц~~`f{~z`WQ9BjplEfl[]oyn{ľyvurnj~{vvpifd`VJ>=:118>=NQR[`da[WUQJEILOOJEETdnusrrz{ջ{stuozynun[KRZKD]vlQ=3*,<>BENQVX[[]`adfhhmpt{|vstv{{yuuuvxz|{zupnmlmpy{pjda\[]`dgjnpppppppppppnoppsxzzzyrnifddfmrv|o`RJEFOZgy|smilou{~||~ypf]WROKJJLORVWZ[ZWVUV[ait{|{~~{zzz~~{zzz{~zsojffgint{{tmhdb```cfhlnppppomjhhhmpuyzzytpnlhgdddddipxyi\TONOR[fs~~~~~~|zvsrrsx|{pg^XUTTVXZZWVRNLKKOT[bhmruyz|~~~~~zyz~~zzzz{~{rlfccdhpvzpifdddgjmmmmjihgghhlmmoprtuvvuspld`\[^chmsvz~tdWOLOWfu~{upnmjmpz~vplhda^[ZVQNKFEEEEHJNRW\chmpmmaE2$:d»~ج^WX<Cp~uuyz|ppnh|vxxsngdcmmppv{ui`[]iz~l[\lzufgghhouvzxz{~~zpruzȻ~~~|zupmd\PHC9.+.,+'(''(,4:>EIJOPR[`cnphih]PDFPT[djo~»ƻp`VVW^htthXJEBCDEEHKJT^fuzm^\dilruvop{|~|xmfbbc\XQLLOQ[dn~~~|zvvx~~~|zssxyz|ysmmlhonoppptzuv~yvvspoopppuxzz|zusuvttuz{z|~~~~||~|vspponmggghhjmootx{{~~{{{{~|{zyvtspppuuuzzzzz|||zvsrssvzz|~~~~~~|zyxuuuuuuuuutttrrrppprrrutsppppsuuuvvtstsrutttusstrssrrrprrrrpppppmnoonnponopporttsuuuuuvyxz{xxzyzyz{{{{{{z{{~~zzzzyyzz{{{||~~~~~~~||||~~~~||||~~~~||~~~~~~~~~|{~~||||||{||{{|{{{{{{zz{{{||zzzzzzzzzxyyyyzzzzzzzzz{{{{{{{||~~~~||~~~~~~~~|||||~||||||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~||~~~~~~~~~~~~~~~||~~~~{{{{{{{{|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|||~~~~~~~~~~~~~~~~~~~~~~||||{{|||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|||||~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~|||~~~~~~||~~{zz|~~|{~~~~~~~|~~|{{z{{{|~|z~||~~~~|{{~|{{{{zz~~{{{zz{|~~{zzz~|{~~{{{zzvuzzuy{~~~зtjffimppppponmnpppuxuppuy~{vp`P?0&$,=Pg{~|||{|~||~~~~|zzyyxvuvzzz{|~|{{zyxxxuxxxvuyxy{|{{{|{{{zzy{{vutxziZJ>78:BN[dhpx|{volms~þzmcaflrtpg[LB>BI[pû~ric[WWZ^ddfd`[XW[cmv|zn`RE:747:COW`hs{{zyyz{~{zzzyxz{~~{z{|~~~{vuv{{urppt{xpjimr{vj`WPKIFHKPXdmu~~||{upnmmopu{ûtaQE=<@JXhv|ussuuvtoib[URRZdnx~sg\ULEB?@BFOU]hpy~{~~yuux{|upppu||upmmot{yj\PJEFNW^dhhhgffmpu~yof`^clxü{ocWNE?>CO[n{pg]VPOOT[dny{tmdZOE>979:@HQ[dlt|~~~{xuux{~xvxz{tpopu{~{ysojhhmu~tnha\ZWVTTUVX[`cfhlnpu{th`^`fnx~n[LB>=CO]n|ul`WQOOPU]foyzpfXPHB>::<@FP[cjpuzz|~~zusty~~zz{~~|{{zxuuuz~tmfddhpz~tjd^\\^`^][UPOOPWap|zpmigfgjnt{ǻufXPLLQW\dmsz~{pf[UPPRW^goyzpf\RJD?::>EKT[`cdgjmpvz~|{{|zz{{uonnpyytpnmljimpyzvttutplf]VOJJJOV]fmv|voifffjpyƻ{rib[WVVW[bhnt{~rf\UQPRW`hr~|ri^UOJHFFIKNPU[]`cccdfmt{~~{yvv{~xuttuz|~umfbcfnu{umd]WQLJJKPW^hpz~xpmhhinrx|~|zzz{~tld^[[[[]bfls{~rg]WRRW]gpzzof[URRTVW[[XWVUTQTZ`gpy~~|zvxz~~{vttuy~unhhhmrv{~{pg\UNHEJOV^iu|~xspmmmmprtuuutrppoptx~þzsic`]]]`cgjpvsh^VQRW^htxphda\[[ZWRPNJHHJKOQV[`gpx~~{z{{{{{{{{~xtppu{|yurppppsuxz{~xl`TKHHJQXahnuyyxvtppoonopppssutrrppopptx|zsmgb^XWW[`gsrd[VUZcmv~zsnif`^^]ZUPJD?=>ELVblsz{{{vsrrty~~{vuux{~{zz{~~{xusppstxxxxxuvy~|pf\URRTW[`dglopssrrppoooopssssrpnmjjjjlmptz~tic[VTTW\dmzý{phdcbdgmsz~zyyxyyytmf[PE@===BHOU[`fhjllllmmosx||yvuvz~~||~{{{zzzxurnlllpu~zpjd`[[[[]bfhijmmopppooooooprstuurpjhdccfjpz{m`VNHFLT`n~smhhlpx~{zz{{rh`XQKFEEDHORX\``^[[[\`flry||{{{~|{{||upjfdfhnt{~vohd`^^^`bdfhimoomjhggginprtusppmjhfca`adipxxfXOHEEKVcs~{zzyvurpppruy|~umcZRPNOPRTUWWVQONNPW^dhlpuy{{~{{zz{~zslhgghmrxtjd````cdffhlmmlgbaafiotuuuttsrplf\VRTZajrzĻzi[PKNR\hu~~~zupjhggjpz~ÞlUXZXXWWWQK\B'=96?3+=7,FpfPml=Rvphuڶ̾{E%Uzolfdfg^\c[[[[]]`bfc[Z[[VPOV[\[`hp|̱I"Cm|zpu⽜oRFEOc٬u\[gfh~ϻzK!.370':JOP\hu~{~xR0*P[`rypzrdTOQB400EpzysR?.1Rzϻuj`[cvĶc*0Jfzvtunbdmu{~yo~{{vuz~^9'8=X[OOBJVPFDDIczzXD=E[Ƕϫ`JHP[dmslmtv{z{zrnid^[^WOLPRWmop{upjcdfpyggx~{missz{gV4$=Q^j~{t{lfinrfh~°Ǿ[6&&0COfzodc`VT\hjmyzsptssolz~{~sxrjmu{{z[7+,3J[i{{mWQ^p¾dE<=E[Խ{hfmsz~оvW@9:>OWUQONQ\gpt{~~tg^[aiu~~~~tr~hN9(,EXfpv{vdO<7E[s{fWR[mɲǻv]RRRRX[XVRXdpxxxvtryuu{{srupdmnREBBDDFWghp{{hWLJVfzx`PKO^z{suмm[ZXRPV`b`[\hnpniirpc[XX`nuussuuzpcdunR<0.6>?JU\`hry~ubRLQ`mu~ƺrd`iñy[H=9:DNXgrh^dmpuvvy~zu{|{~xps~oo{hRHJRXVRTT`pzl[RWbnyu[ECLd~zyyػzf[VPQW[^gf^\dhgdfiy~ujb`bgnu|vt{pr~udQB:82,+4ETmmXKIQ]iv«p[RWmƾȺlXPLHEEJOZbfnv~yz{z||~vicfr~mah~p`VPKC>CO^szh[WZ`gp~dOEPf~~utzɻsjda`\]`^ZZdpyuppu~~rnmorpopzux~~~pnzr[H:40,-6BP`oxzuof\WZ`ixm``p¾xbPD@CLUZ[\dt~yrprzuszzpnouymp~|pjf\PFIP\m{xpmmnonlouz~hWQ[jxujjvɽm^[[`hlhfmtphdfmt{vuuvx{uou~tdXPNB,%=Wlvyuniffda`cjurpu||rvp`ROOU^fggnuz{{~{{z~{y~|pjlr~zz~znZB99EWm~~umbXRV`o{pnnppnp~~mdfsĺunnprpf[[[[`hruupnmpz~zz|~uptupxxh`[TB0(,6H[mvzxuohd^XW[bm{zuuv{~y{zngb^``[W^hptzzxz~yrryrs~~rnr~{y~x\D9=J\pxld^ZTPPVbx{z{ytvxmimvzpf^WV[cghiimprpmmpyzxvy|srz~~{zz~~zsh[JEFP[gpvxvtpoic[ZZ[]fs~tpt~ú{zuib[UOLTbpz{{ztprty|yxrhmv`QOU]dipu{zj[OJJLR[mvtvy||mddm~ĸ~uoh\RQZdimmmmnnmp{zvz{pp{{xx{zx{r`OEBCIRW[^diosph[NB=@Nby~xstxzzpic[UZbfjpv||{yyxuplhjpzvr{|z~~j`VW^gmpprxzysj`PD=:EWh|{zz|xrt{xh[[^cfhmsxyutuvvy{{~~||{{{z{~zust{|rmf]ZZ[`ccfjmnmjd[RLKLPZdp{|tpsrru{sb[`fo{zsmfddfjoprrrv~~|zy|~{urppprrpppu{zm`WTV[dmu{~~~~~{vvvzxy{{{{|~~|{{zz{~ztnjhgfhms{|z{~zrt{~ztlc[[[dp~~rhdcba`dddhmmlmpstvz{~ztpnv{pifgiou|zropuz{zurpppppx{uppty{~{{{~~~{{{~~{yuutssux{zuuuvz|~sjhjpx{|~~{zvrptxyvrprtz~~~~~~~zpjgip{{upjhiorsssrssuvy{|{~|{~~~{zuppppu{~~z{~{xusrpmmnptz{z{~|~{vnddp||{{~ztsvvuspdW[hy{yz~~~|vtu{xpmpuuz{pv~xrxy~|roohXJDJV`flnhdjx|sha[`lu{{zzzysnid`^fu|~{z|tnmot{~{yutspptsrpps~yi]am{{zyyy{{mjs{zphfis~zppuzz{{|{tpnpsvx{|rljpxzumlo{zspruurppry{|pmmmlif]XRHCK[cfflmhip{~{xsrponsrf^cp{~z~l[Wfx~|zxupmnppuzzpnlfagp{vv~tonoszzndiv|vrnlup`\lxlddjpz{uusppprvgXdyzomnnnljigaWRXdmu{|y||zxtppppppompxsaV[n{vtz{fV[lz|zuttx{~xuvz|{ytmddp~pip{||~smov~x{~vrruvyuppxypv~zp`RXft~|vrpmmpt{~lfn{~|{xpihmoooldc]VR[jyz~~{uspoopoonmhis~{rpzpgm{{zyz|~tg`^fpy~~ysppppty{uou~zoghpy~zux~~|zxvy{voouzzupj`^gpxzzurrtv{|||~~torusnhffgghimrpd^dmyzyz~~srxz{zxusplffflpru~~yppuz~yttuy{zzyvojmpuz~~|uppx~~pffnv{{|~~~|~~uoljo{zx~~yuvy|zslhhlnsuod^bfimpvzzzz~~|xrprspf]]cipuyvuuupsz|zzrnt|~ztplijpuz{{{~|uru{~~zspu~|{zupmlmpv|{t{~xuz~zpg]`hmruz|{xsppohisvu{zpnppifdipmh`[`iruz~zvx|~{~uoosurmihlpz~ypilu{|~~~~~~~uhadilprpoopx|{ummtxsz{z{{z{ymhjouz|~{z|~ztpi`Z`jponmmpuzz{{z~~{{vxzzuspppldabhooi`Z`r{|{|{vpnopppruvtsx~zpa[bnu~~{{~ytttpmpuvz|tposz{rt~~{{{|zrnpx{|xpnpu||{~zyvutttttpi`PJUdmrpppv~~~~{z~~rhdglpppppptvxxrjo{|z{~~zzzurppppppop{{upnopmipztpprvzxvvy|~zz{y{~zyy|{xtpgcm{~xpmnppptz~~|~rr{zpppsz~~zrmhgfdc`ZZfs{~y{{{~zpmppnfcabhpyumnrtuz|{{ulffjnt|~{zyyyzzz{{{{{yz~|usstspppv|~~~~{{vuuxxuohc`bdfimmnu~{yvyxurprtutogbacfmrx{||{~zroptyvojhggjpv|{urpprtxxxz|~{vrpppsuzz{xuuy~{vsrtuxxxvuvyzzvpppuz|yxvvz~zsommljhfbacgmry~~~~vpmmnpppnmljopsuxz{~{yvy{|zutpmgghinprux{{yxuuxz{~~~|~{zxxz|yspppsz~{zz~~zunlllmmmljlpsx{{usty{zyxvuuuupmgddgjoprsuz~|{upjdabfiosvz~{zuuuvvyz{~ypmiimptuy{~{zzyyz~~||~~{zvtsuuttuupppu~~|~~|{~zzzzzurh^VRV[dmt{~~|||~~|xpmihjpuz{{{zzz{~|uld`^bhnv~~|{{~||{|~~|{{zzzzzzxuuuv{~{zxppooor||xpjhfhu{xvxxxtrpljpy~||~~~||zyuuzzussz~{xuv||yvvyzzzzzzz{~{yyzzzyy|~{{{z{~~{{{zpmmnoruuvz~~|~~|{{zzurpnoruxzyy{~~ypoptumn{~uv~u`[{~zzglujuxtsv~xp{zv|{yvx{{xtpoiiigffhfddbdcbc[TW[]^``dfaffdhfgmttu|||~||~~{{zz~{~zvstuzzz~|ztpihgfgmnnpppnppmmljmiijjldgfdhgddddffffjfchhjjfhfdfhfdjpmntuspxyursyy{{~~~{|{{{{z{|{uyzxy{yuvvxxyyzxxzxuuzxuyvyvtssrrsrprrpsttuuuuuttuusrtsssrttxxyvy~yzzz{|~~~~~|~~|~~~~~~~~~~~{{{zxyzxxz{zzzxvvzzzz||{~~|~~~~~~~{|~|~~~~~~~~~~|{zzzz{{zzzz|||||~~|~~~|~{z{{{{|{{~~|~~~~z|{zzyxxxxxyyyzzxzzyvvyvvz{zvyzzxuvvuxzzyz{z|~~~~~~|~~~~~~~~~|{{{{~~|||~~~~~~~||{{zzzzzz{zzz{|||~~~~||{{{{{{{{zyyxvyz{|~||~~zzz{|~|{zz|~|{z{|{{{zyz~~~{{zzz{~~zyz|~{{~|{z~~|~~|{zyz||{|~~|||~~|{{~~~~~~~~zz{|~~~~~~~~~||~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~|||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~||~~~{{{{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{|~~~~~~~~~~~|||{{~~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~||~~~||~~~~~~~~~~~~|~~~~~~~~~~~~||~~~~~~~~~||~~~|{~~~|~||{{~~~|~|{~~~{{{{~~|{||{~~~|~~~~~~~~~~~~~~|~~{{|~~~{|~|~{{|~~~~~~~~~|~~|~~|{|~~|~~~~~~~~~~~~~~~~~~~||~~~~~~||~~~~~~~~~~~~~~~~~|~~~|||~~||~~~~~~~~~~~~||~~~~~~~||~~|{|~|{~~||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|{{{{~~|~~~~||~~~~~~~~~~~~~~~~~~~~~~{{|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|||~~~~{{{{{|~~~~~~~~~~||~~~~~~~~~~~~~~~~~~|{{|~~~|{z{{~~{~~~~~|zzz{||~~|~~|~~|||~~~~~~|{~~|~~|||{{{~~|~~{z{~~~||zupmmlllmpttprҮsb[`dimnnmmhcbffdhrsolmu|uiW=$*Jf{{{z{{||~~~~{z{{z~dC,""'0EP[gpppmjimrztg\WW[drûm[LC<99:CN[oznaVLEDEJR^mx~ul`VJB<8669=CJR[djosvz|zz~uppruz~zl^VRPQRRUVX[[]`adhnu~rd[X\fp~~m\NB<=BN[jzuh\RLKNT`lv|sh`WNEB=::BHP[gpx~{pd[TQQXaipv{~~|{zvpjd[UPPOPPQRRRWZ]bglnptuvy{~~|{{uojhms|~yvvxxsj`PC:8=EQbr~yrnlihlnpsvy{{{{ʼtdWPOPRX[`bfhmpu{þzof^[[]clu{vpid^WQNJFEFJORUWWWWZ[bir{~{{~|{{zsommpx~pdVJD@BEOWdnx~yurpruuuuspliiilpzĺujd^\\[ZXWWWZ]djtujdcdhpv{zsmd[WURTUUUROJFEIOXdmsutppnorz~|{{~~slhhmvym`VNHEFNWblv~|{{{~~~~zvpjfa^^ahpzûzpmd\XURPPPRW\fr~~xrnmllmpu|~ytponmifa[TNJHHKRZ]`ba`]]`dipv{~~||~~ztrru|vppptzyj`VPOPU[bjsxz{{{{{{~~zrib\ZZ`dmxxoh`WPJEEJR\hxxnhgipzzsjaWROOOQRRRQPPRRUX[]adhjorx{~~~~ummmr|~|{{~þth^ZXX[`dhjmmnnopruzvmd^[Z[]bhox|obXOIHJOT[ahp{yyz|zpmhb`[WRQPOOPPPPPPPTW[`dhlppsuuuxz~~{yy{xsrrv{~{zzz~üypjhhhhhhgfdccfjpv~zpg`[WWZ]chr|xnf^WPKEEHOZgv~{{{~~yrnhc`[XWURRPONNOPTW[]`cdfhjnpruuuuz~xppopx~xrppt{zurppsx{zxtmgb][[\adhpv~xmd]ZWX[^dhoty~~o`RJEDIOWfp{{{~~zuspmgca`^\[WTPOONORW^cfffba][[^dnyzvuuzzusppsv{~zvrprx~zpha\[Z[]bis~slfffimmjgddfipx~vi`TNKLPW`ipu{~~{{~vrpppssplc[RONNOPQUZ`cc`[RONLQ[fs~zsppsuz~zsppptx|~zuppptzĻvmjhggilnry|{zuplhd`][[`gpztg]WTRW\bhmpsuxyzyxtttx{{xssvz~~xpmhlpv~~zusppsuxzxupmmoryzzzz|{rjdcdmu~~vnfb``fmu~~yuuvz{|zxvy~~~|{{zz~~~||~~~||~vru{uldcht~upsz~uh][duzx~{y{vpory~~|xvz{sppzyx{zmhhp{{urpu|~zvuzznffhntuuyvh\[f{жbfz~pnбzVJJdujbzcg^@WD$RƾnQ`su{|rprlhda[WTR[[apdL.$@JP\flh[R`mvp[ROf{gXdǣ{fft]E?>Wglz{mlms{ushmplof[]brpdhpsuzzuprtnpruWB92BFK]mnjh]czuf\ROObƺzpzٻ~z{uuvyzW:&%>RWbu{yz~||tztmpusrythfipspp|~gZU[]`lz{mhlimĻx^OXp~oPDDENQJKVX`mvvttx~|zphhp|uu~|~xpuspu{{yv\LIIJQmzz~jWPJFX~¬p\^xȰzjjyjD'"'6EOZWRft{|vuz~{sjmrv~zpsvh[[dr|g[U\p[EBNmnO>:8:CJEEQ^oxvrmlhfdffovfOBBHXdmljox~{{n`[duɵ{aR[u~plmspaROOONPUVPVhtyzuz~xpintsmhm{~gWV[hpuscWWf|hRLRiu]KD@9346:K`ozumhmsxzzy|z{fRHEINOOT^mxzh[\lǫo]\jpb`g~th[RKFC@EUj{~~zuty{uu{{ribdp{~zst{vcX[`gjijry{g[[h{{cWWdz{ug[RJC=32=K[hiinzypp|uVE@DJPV]hs{vhfn|ʱuc]btuhai~pf]TKE?BOdu~~{{ytt{zrpv{|yogb`jzuuxfaaa```flroa\cimpsx~nfdlz{pu|uj`R@-+9K[flpv~~{uv|yz~y|yv{|dTOPU[]chnytosz²~fTTaoy{rz{odTECO^ltux|~{zx{ppv{vpou~ppvòmb``^[X[\ivaTRUZ[[fzp`[fr{zz{m`O:-0:N\hnu{~{xsp{|y{umpzxrt{zjcab^WRQUavphhjmmmpphhhhp{|~r[FCJWahimpuvutu|vjdfmxzzzupmhhfdhsxhcbadddlzmfhjoy|~zm[E40:IW^bhptsprz~xzzor|mbcoysnd[RKK[rupnmgcdo~{pmjimpsssyudZVTRRWamuytprz{xl`[`hu~uh`XQOUcs~zrmhffip{njpz{{~|vuttu{~||{ytpppv{{~ztppx~~z{~~~ztpuz{|~pc[[]doy~uopu{{ohhmty{{zuuz|sljp{{tmfbdmuz{~~z~|zyzvmgfffgmt{zrruvuuuvz{{zpmot{|zz|~~~~|{yz~~zyvuuv{|yssxxsopu{~{yxy{{~|zz~zxsnmjioz~{zzvx|~vrpmc\\dmx~~rnnsy|{y{zvtttuv{|xux~~rjhjpsuz~yy{|{{~{utuvz~zxtsxzxropvz{{z{{~~|{yyz{{vx{~{{z{{{{{~~xpmmppmiimu{{{~~~ztuz~~zuolntz{{{z{||~~|~{uvzzvuuutrsuuogcbdinrzzssy||zurrux{~~~ztu{~ztppty{{{{{~~|zvz|~~{{zytsy~zusppuzzuppsz~~{xy|{usru|~~|{zzvuuz|z{~~yx{xrnhjprpmljprppptx{~~xux||ytrmlpz~|zy{~{vsry|~~~zsppv~~ztprx{~v{xsmlopmgcfmx~~smhjpyzvpnpu|{{~~|{zy{~{yxy{{uph`^][[^fcanvlffhhmsz~~zz~|z{paZVWZbgfdiu{vyzmfhpzyhdcbhsy~~yvy~rpyta[^\X[g|~tmnutfVTdzxg\[[`filtxja\dpyzuof`UQW`fmpolnr{p^Wc{{umaXUROP[flifflpph`[`dinnnjigaZRE9C[x|yromjou|~{uuzxxz|xd]gpu~{umfc``dmuyurppuzz{ug^[[cluvmh`]^^[ZWVVX`gnu{~~~|{{thb`]\ZWWZ[^fjppppt~~{|yppry~zod^\[[XWW[dp|yusuxz{zvuuspomhhhmpxzxtpmhdcccbadmxunjjjnpppnmmljjlljihhf`[ZXZ`gmt{~uppopoot~~zri\Z[ahmoryypjihlprppmfa`afmu~~zz{||ypifipy~ztnhdbcdffdc[Z[`jz~upnmot{|{zyxxvuuspnjc[X\i|zpgb][XXWWWWXXQJJP]u~zxvvy{vhWRUbuymd\[]`fillhfbaaacddhmpprrojhgfhlpppls{{~{zxvussstvz{|~~|vuyzpopvzyxusrrrrsttuuutsrpppprrrtuupjc[[[`flpolhhnx|{{zzyxvuojfddhmt{~~zuuuy{~~~~~~~||{{zyxuuuttty{{|~~|zxppopvypjffddffhhjmmnnops{{vnfa`]]`bdffffda^]]]]^`adhlpu{~~yurrrrsuz{~|{yvusppppppoonmmmmmpsuvz{~~zuplfdcb`adhmrx|~{zzyyxtppommljjjlosvz|~~~||{{{|~~~|||~zpmgdbaabdgjpuxz{{~{yyyyz~~zvtrppnmmljhgffdccba``]\[[[[[[]^`bglotx{~|{yvutttvz{{|~~~~|{{zzzzzzzzzyxvuuxyzzz|||~~~~~~~~~~~~~~~~~{{{{{{|||{{zzyvuutppponmmmmmmnpruxz{{||{{zzvuuuvyz|~{vrpoprux{~zuporx{~~~{{zxvyz||{zzxutsuxxtppv{zvuuxxvtrrv{~~{yvuyz{{zsnmljhhhjmpz{zy{~{z~zuolimppru{~{{~|{zzxyzzvsuxzxt~{uxxpx[hyuj`orffopfgxzhj{zu{|uu{{z{{ndhpysmjjgjihjggffhd````\[ZVZVX][cb`adfgijnprptuutrnpppsupzɶpaWQOOLFEEEBBEEDEEKIEFIPW\[WZ[WW[agd`ZWQB7*+4>O^mv~{zxuzzyxxx{z{vrsrpuxz|{vslcb^]`hy~ri\OE:40,07=DNOQU^fjpu{~{rhb]^`^ciu~hVLIJR\gnoppmfXJ:0+,08BQdyzrmjiihmpomifccc\ZZ\dlpy|zsld^WQONKLP[dhpz~{{{||vrpmpprvz|~{ytmf`\ZWW\bhrz{~zyuohc[OE?>>>?ENT\fpvxzzupopmnt{~|zvsppmhdbadluzri`ZQJD?=:989>IWfuzvupppmhfcccdfhlou~~xspjfb^[\^^^`chouz~|zyyz|~xsppppv{~zyvuuuspnjhfgimszzpf`^[XX[[ZXX[[[\``chloppprsv{|yphfdfhntz~tfZOE=:99:>EPXamvxof[WRRRTW[^bgmry|~|xsoica`][XTPOOPUZ^bfimoptx~~~~xvvuuz{pida``bfhnu{~~xpjf\XVVVZ[\\[[XVTRQRUX]flr{~xpjgffhlopv~zm`QE<748=ELR[`florx|zphc][ZXWUTW]fmtxyzzyvtppomjhfda`^[WRRQOPU[`floppsvy{{yxyz{|xsoldbaaafjpz|{zzxvuuurohfa][VQKIIJJORX]birz|yurppopruvvvy{ynf^[ZXVRPONKKLORW[bipzü~uohda``````aadiorv{{{zvsnigd`^][ZXWWWWWVRPOOORX`irz~|{{~|vpmjiilmmnptv{{{||~~xpf]VPKHFHJORW[aflpuz~{yurppprsvyz{~zvuux{vnidb`^\[WROJFEHJOWamv{smga``dgmpuyzzzyxuutuuuuusrpmgc[UPOOPQRTWXXXXZ[]bfhpv|{{{~~xuppptuxyzzzzzxvuxzz{~xpjd^XROKIIJORX`gmpu{{zzyusrppptxz{|~|{zvsppppppppppty~ypia[UPLJIIIHIKOV^gp~zvsmhdddfjpxzz{|{zxusppmmjihfb^ZTPNLKKOQVZ[^````abdhouz~~{zyvtrpppppopruy{~|slc]ZVUUUWX[[\]^adhjmmmmmmnnpruvyz|~ztplhghjmopvz~~{xtph`XQKFEEJOV^fmuz~~~~~|zxutssux{~|xtoljhffdc`][[XVRPPONPPRW[]``cdgjosz{xtomliijpuzxrmhca```adfhhhfda````adginty|~|{xtrponmmlgggghlpuzvnf^XPHB=::=EOWbmv~{zuttuy{{|~~~~~~{{zytpmjfca`][ZXWRQPPOOPPPQTX[]bdhlpy|~zvponmmnpsv{~xuutsrpolhfc^\[[[[[\``acddfhnpuy~|ytpjgcbbddfhimmmopruvzuj`XQOKJIIJJLPU[ahpzzupppsvyz{~~{vromligffc`[WRPPOLJJLPUZ]`dfhhiijlmosy{yxxz{||||{uohaZQNJLOQW\bfjmmmpxzyzzusrppmgc][Z[^cgmu{~~yttuy~xi`ZWWWXWTRRRQRV^iu{zz{|~urttttuurojf`[[\\^``][ZWUQONLKNQRTWZ]`\ZZ[ahmt~~{yurnhfdcfhou|z{~{z{|{truusprpuzyzzytppomhd`ahhmoljhddfddc^\`fdcdfiox~~vphf`][[ZXUOOOPRQUX]iu{{z{|{uppmfc^[[WXWQQTTPIIHDBEFHNW^dlvͻ~{{{~~|uplfgiighntumffmpnmihp{xpf\UPQX^iy~~~|urpppuz{{xplihhf``djppplhdb`]XTRU[adhpx|maWWapuj`P?.%!!*6CNT[dls{zsprzǻvgRB944:?DINPNH?6,'%'0=Odzý~vpmmmprtuurpolgc`adgmptzzsnlhb^]\`finru{|{zzuuux|~yplfcacfjppppohb\WW[ahpvyyz~{vphd`XROH?81-,,,04:CP[gouz|yuusrpsu~ǻ{zutpmg`WOHB930.0268:>FP]ht~zvuttttrpmifa^^adir|zsnlmlhgfdccdffgjou{{yvvz~~{zzyz{~~zvrnhaaadipx{|~~~~{z{~~~~~~rfXNEBBBEJNOOLJFEEEJR\dhlou{{rmhgimt|~umbWJ?60+(+.29?FP[fr{zpic\ZX[\afjpu|~{yuplfb^[Z[]chorsrpppsy~|zutttv{zupnmpuyzxssrppptv{{snlllpv~{umd[RKEEEHLPU[[[[VRRQPPRV\fp~{{{{{zzz||pcWNB80,,.4=EKT[bfjnrv{uohc`][`cfgggjpz~{yuolhfa]ZWWZ]bfjpuuuuusrrrsuz|zxuuxz|~~~~~~|{~~yrppruz~~|zyupnnnoprtuz{uspmhb][VRQOONLLKJIIJPX^cfinrz{yyz~xmc[WVUROJEB@@DELT]djpsvy{yphb^]`djpruxyzz~{ridcccdfhhgfd`[[[]agmpuzzyutsssuy|ypnmmnpu~~~{uoidbbbdhmpy|zrmd[RJE@>BEINRW]adgijlnpruy{~~|zxvuttuz{tpnot~ûth^WQOONLJHEB>?BDFOVcmx{phb``gov~{upja[[\`cfhhhhgfa^\\^dipty||zxvuvy{|vpmihfffffhnpuz~{ph`XQLHD@@CFNR[bhmruurmigddghmrx{~~{{zyxxvuxyzyuux{ƾ~pf[RLIFFEDEEHJKOQW\djou~~{vuuxz~{xpmhda```^]^```^]]]`dgmpuz~~~|{{~~~~ztpnnpprpppruuuvxz{zphc^[WWVVVVVWWX[^chnprpohhhhhmopv{|zupmhffglpuzû{siaWOE@<449?FPX`fmpvz{~zyz{|~~~~|{{zxupmhd`][WVVX\afimnnopsuy{|~zxusrrstuxxxupponnnoppuz~xpigdca`^^^``````cfimpsuvz|~~{zvrpnlhgghhlnoooptx~þzndZPLJE@=:9:>DJR\gox~~~~~|~~~|{zvspnjhfcb`\\\[\`aacfhmnpsuxz{zzzzzxuuvz~~{zxuppnljhhgggimpx|~{ysmf`[UOKJJJLOPUZ`fimpsuvyyvusppmihd`]\\^afloszü~pf[ROJHEB??@CHNU\dmv~~~{zyxvtpppppppppmjihgfdcdgjmpsuvxxvrnhda`cgmpx~zupid`[XZ]cipz~zspmhb[WPJEEEJNQW[bhnptuuuutrpppmjgddb``bdgjoruz~iUHB<:6249ER[[[gz{uoopgbs~ry|us|dTTcy~{fIIJFZmomo{|yyy{vzoxtuzumlbPPV\m{smpmsuhNBHPRF9:O?21(47@QX[dimofaaXP[dh`Wfffj`]vsu ~ndvjoo[QRf|{{{z{mlf`fhjc`bfpphcQ8=HNpzmf``\PEHRWcntyxz~vľmbZW`tvz~d`g\^ag||u~~uadpzodcffld[TBKghfcZfommilrumzxy~uzvpzvdUV\ggfip~zxyumpiZR[^[`dpzrooiaW^mzzzphnzsph[\dhvh[cpyvsmuxpc[PFKUao|uptv{xpjoy~xpvzmfpz|~vnjhhopu{yvpps{zomsyspupZ92DXlt~|tpmllpvvz{~~m]fpxvmc\[ds{|~tsp^Rcpv|~f]bmryzx{~{vxrhp{zi\\^`i~|{y{|yxvsf[dpmpspx|~yndhtz{gJ=OWOIJOXdmz~yy{~zy~~ujhpvxx{{~vphb[\flhfipx~{porzzpf[[bfffr~{{{{{ui[Waf`[W[al|{rhfhp{zmhuvtpffopu~~ttz~{bQR\`fnyumlr{{uv|pjmr{{p`RE:>HLOWdls|{zyvuuvts|smnzzuofb``douutxz{{{yuyzzzvy{|{{v`KEKWhz{znhhmrz~tpomfXLKOVbmv~ysrx{{~xxusvyz||zz{zplifhs{~xpdVU]ly{rppu{z~{urs{zspu~vnd``^[QFIPW]dipz~xuzyppjfgou~xhfhhhmt{zz~{suzuty~znb[[clvvhbcdflt~{tnjhc[Z[VKJ[lrrofbfp|{zzzv{~zz~~zuz~zpu~ylfdhovz{xrv|znaWRV^m{{{y~xppsu{zh^ZZ]dmrhWJN]o~zpc[\dinpoppmd[Z`m{{tu~vnddhuzvvzyxz~~{xtpnf`fnppuzzi\VUW`luvm[OWfnpppsz{xv|yzzxsru{sjip|shfjs{o``fhmmnnlilov|ursyx~{yz{oc[[]`````]]dimuzvnddd`[WRNNTcrpbdo{{zy|~{{zy~|urrv~zj`bo{xlcafossslWHDKTU]rypmp{sfgnmjdWR[o~~~{{zzyvpg^\`a^fu{uroihpzopz{xhfhls{uuurld^^clpmc`iz{zmhp{~~p\JENVVRPVcjtummpx{{vfXQR`tvtz~zvz~~vt|{~{uocN?=J[juzvutjfdfhouzlXWaa`hyzplfcdfhihinprzzpmpu{{z~xtsz~vnhmx~tjhlnommpuphdgr{{usy~zpjlppiaWJEO^p{yppu{|tooptpllnpppmbam|~xvzuohbZRR`p~tg`afmsuphbdjmpz~zuuzyrlms{~xxyvrnhfhov{~~~zzvi][ft~|~~~~utx~{xvuuuxz{{zsh`fu{yy{|{{~phipyzcX`o{|uppuxyz|{zxutvyupf[\nz{|pd``grx{||pg[Zbny~z{ug[WWX[[XPLOWfs{~~vpnpv{u]JJUcoxufdouv{~~pfcjynQHP]i{ztsszmhjopty~zuv{|{||xux{{ung`]bfghntx{~~|{{{{z{|yvz|{vrpppsyzzz{~~~~|{||{|~~~~ymccgnx~|~{vuuy{~~zyxxrhffgmrx|{zz{~~~{~~zz{|~~~|{vutsu{~~{ypjmpy|zyz|~~{zz{|zy{~zupppomgdfinpsvz~{{zyvtsuz~zrtuttv{~~|~|z|~{zz|{unmnrx|zsprruy|~zvutpmmmifgpvzzurru{|||{{~~~~{{~{z|ztrruy{~~{{~{uojimpz~~~~zxzz{zrnmmptzzsifip{~{vpmptvyyyzzupmmpy{z{~zurrv||{{{{{|~{zzxrpuzzz{~{smljmpv{ztlhntyyyz{~|{{|{{zz{~~yuv{|xsrv{~~upptuvvxvuuux|~{z{~~|~|~{upnnppppppoptuv|{|~ursrpmlhfgls{uptz~~~~~||~zz{~{sorz~ztpptyzzyrhccgjmr~{vvz~~vruxvtpllp|~~~~~||{xsoppppu~{zyvtu{{yz~~zttux||{{zyupppsyzuppx~{uu{~vlcdhmihhmrv{~zvvz|~~zpjhjs|~z{~~|{~z{~~~|zund``hpy|~{|xsrrsuy{~|rmmpppx{yusrsuuutuxyz~{xxz|~~~zzz~~{vuz~~yuuxyyxvz{ytru{~~z{~{xuvzytohddhpz~{yy{~zyxzzyuuxyyxtpry~||~~zvsplims{yrppsxzzvspsuvz~|{{~|yvy{~{||{zvutuy|~~~{snou|~|zz{|{{{{{|~~~|yrpt~~|~~|utuz~zpnsz|zyz{{||~~{{z{{zvpnpz~~~{upppu{~~~yrmmsz~~|~zrmmmmnmlgfhnu{~zyxy|~vlfgnuz~yptz{{~~vrpv~~rgflpy{zz{{uuvyz{~|{|~~~~|{{{~~zvtpprstuy{{~~~~~~~~|~~|{~~~|zyyyy{|~~~~~~~~~~~zupruy~~{{{|~~{{{{xtssty{~~|~~~~~~~|{{{z|~{xuvz|~~|~~~~~~~|||~|{zyyyvsrtuxyz{~~~~~|{{z{~{zzzzz{~~|~~~~|zvvxz~{zzzz{|~~{{zzxvvutsuz|~~{zz{~~~~~~~~~~{zz{{~~~~zuuuvz~||~~|zxvxz{~~xsruz~~{xxz{{|{{|{zxvvz~~|~|{zz~~~~~~~~~~~|{yz{|||~{yuuuvz|~|zuuy{||||~~~~~|~~{{{~{z{|~zxzz{{{{{{{{~~|~~~{yxxyyyyyxxyz{{~~zzzyxuusstv{~~zz{~~~~~~~|~|yxz~{zyy{|~~|ytrsuuv{|{{~~{z{{{{xuuz~~{zxyyxx{~||{{{{{~{{z{{~~~~|{zyyz|{zyz|~{{~~ztpruuuttv{||{|~{vttv{~~~~~~|{urprvz~~~~~{zzz{{~~yvyzzz|~|{zzz{zzz{{|~~|{~~~~~~~{{~~{{{{|{{{~|{zz{~~|~|{{{{{zvsrrv{~~|~~{{{||{{{{||{zz{~~~~|{zyuux{~{yyyz{~~{zz{{{~~~~|{|~~~~|{zzz{|~~{xvx{~~~~~~~~~~~~~{yy{~~{z|~{xx{~~||~~~~~~~~~~~|{yx{~~~{zyz|~~{xvxz~{xuuvvxvuttuz{~{{{|~zusuy{~zyz~~~~zzz|~xstxz~~|~|{{{|~~~~~~~~~~zyxyzzz{|~~~~~~~|||~~~{zz{~~~~~~~~~~~{{zz{|~~~~~~~|{{{|~~~~~~||{{zzzz{{|~~~~~~~~~~~~~|{{|~|||||~~~~~~~|{{{{z{~~~~|||~~~~|~~~~~|{{{|~~~~{{{|~~~{zz{~{{{|~~~~~~~~|{|~~|~~~~|||~~~~|{{{|~|{{|~~~~~~~~~~~~~~{{|~~~~~~~~~~~{{{{|||||{{|~~~||||{{{zz{~~|~~~~~||~~~|~~~|zzz{{{~~~~~~~~|{{{~~|{{|||~~~~~~~~~~~~~~|{{|~~~~|~~~~~{zz{{{{{{|~~~|{z{|~zyyz{~~~|~~~~{{||||~~~|||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{zzz|~~~~~~~~~~~~~~|~~{{{{{~~||~~~~|~~~~~~~~~~~~~~{{~~|~~~~|{{~~~|{~~||~~~~{{~~~|{{{{{{{zz{|~~~~{zz{|~~|~~~|~~zzz{~~~~~~~~|{{|~~~~~~~~|~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/Glider_Sound_Files/Pop-22.glide b/Glider_Sound_Files/Pop-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..a695d35a682b714891fedb045650f8875de89c6f GIT binary patch literal 814 zcmWIdu~Fk>zyLGi>N|gdC7%dmdH#{|PT7dBZ7RQKcuzBV+|i@1siopCE>i1+pSgUG@L}n@P4v3bYHh zeMd6j*QuF#er75XLL&0Ueg!l4-v0-e{BU*G+=i^EKp!vvxV)CRTh70MOMSh%WlE{P zz6iuzNsFk4B`4m&Wr2)$C+1g2*{X^0atq1ox~8_TJcE$_dTqzd@^Bj!ekP!HekH5G zoc2Wr?;*vg26|_uRuy)(-gZp=ES~jh~Xn%*xp( zBE7t+clOF%$If5AeDTEIjmu{DHC5)s`P-Z5YG@eSxCO`M)O62Yxn=i3AlSQO^`dF* z<(W}_u0Z`}W)}7y;mHLx-P7i;+_G!`kz>b>9Ne)MY(c1pjlPzOqN0+PiF06TY5Vjg zoA#f&eCy7gYiEz_SUIz|CMU+v(M(@kLqkJL8|cKqgo1{?=?hkF+_G)Qj&18#ESTQg zP@EbS=;dr{Z)@x5>gE#|m5`oQP+VT!(A3h>(oj=fUX+!SnVJ|E6%i2;6%!X1mzz>08#@4#YII0d6~(n2{94jKoAj=n3$TGQ&is2+S%FL*Vi`z0B(Dx A`v3p{ literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Push-22.glide b/Glider_Sound_Files/Push-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..26a0dfbeb19aaadb75e3c828840d5eb36e27cdc8 GIT binary patch literal 1152 zcmb;_%Zd&Sa50qOVgLbFdE5Ag`P+}4JhZwu!%iF|#H1G5vf;|hxA*o>PBLT#iAcIv zE83e znN^Y2%Hm?mRuLuri&ib4*^(RPVrAjrpHkU1ZQkrj&4uy)&bD^$p{XSe?LA#BRe7l~ Z5n+*WDY<1ejcpC1U^E0qLtxm2001>gEHnTB literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Shredder-22.glide b/Glider_Sound_Files/Shredder-22.glide new file mode 100755 index 0000000..00c1240 --- /dev/null +++ b/Glider_Sound_Files/Shredder-22.glide @@ -0,0 +1 @@ +ưxv{a`faTN[lqkaW\ly~|l_[Z\XOIIRbiaRJTjpoqog^ckhcdinqtong\ONg|μ~~yйȼȰvfWV\ciqria]aipr{|srmjs|iZTYO@504>N[_`dmnh^T^rxy|{wm^TiuroyshuɾŲ}{~}yyriaWZadf_UNPSNIIT]`b`YVTSWZZVQW_dkub[h|ia^^fyysv~yɰnXZlynVIVn}ynp{wv{rhc^TG@A:6249?CKG906FTcvƽ¹{wx|{sollncULLNNNNPW_bipqfYQLN\i_TLJF@>>CVn{||̼ĦwpXOUehSCLiiH442"%Jkl_Ylɼ}r`I24Pgpmju{͹|||uvx~ysqz~|ui_^^]]TJKU]TGB:"DZ][XXZM82>Ys~winw{~wxwxyjeileULLPRLACKUXZ_gjeW;.4K\WKB>>C@5'%9Qd|rvԻػ|{urz{nXKXx~~lO34K\b[T[\TE0"%.8<8>JPC(#*6BTo~~{nao~zrqz~r_TYcgS<5=PN8.1>?3)(8ZkZFBNb[MNixbWaf^K6;LWTLIO\fns¿Ļ»uog_RIKSWO>5GZecW_tpQLYcRCCVj_>*(1>?3.4KR@59Nee[T[n}{rqx~sbky~~sYF9,$%>NLA8;:1&!,AR[\TYa^P80Hg|~~^KTjy{st{|ϾɽŢxqiV>(%2>C?>AHT]P8.6Rciha[XVME@JRPLLSbkjegwywzw}|wqhux_B35IYXXZ]]J) 6AEQ\WMJQ\]]^^gs{~{rrx~ywtz||~~ullpkV80C[o{ɨ~qZ]knQ,042BcnQCNegXOUlw}į̹|||r[F?>?EIKR\i_PLPWcoqkc`YQNNNNLLS`mllnqz|ywzô²zgWJ906DKE@:5259A?EQ\bfpzwv}rmw~r[JRiyp\Vj˳ֻy|xrx{i_^`fzl\_tme`YQUZZXTSUX_b`^WKHMSPNS\feb[V_gpxy|~{|ù°xhp~pqvmV[juz|yyubU[fnne``]QA603=LYTWezuklqrz}sqkc]_gqrke]VVcrƲŹԽ{|~ι|lQNYennsrojebgle]enqopmXKO^ieUJHMW\ZZ]i||~{p^V_iqo^OR^fa^vxvfLA:?Qeljgjsyy \ No newline at end of file diff --git a/Glider_Sound_Files/TeaKettle b/Glider_Sound_Files/TeaKettle new file mode 100755 index 0000000000000000000000000000000000000000..173ae5f25e9931e266225a773edb950a08eacb1d GIT binary patch literal 11348 zcmX9@cRW@9|3B`%_TGDCR5FsSqU`Ll_f`~%gp48y*@P6zs)Wq?NJ1jAD5dFL`J#!A!$-DYffQ zPo9euJBM6Y@Ba4hr~2H?{Q9|bhX+HCWa+8d)gE{K`~6Itm6Gn1&zEg2VS5l#%Vdwbo#HE)kozv-th#A~Rl2#o%ungq@#>S^}pm zUrg-b{}vcBVc87x##TmhwODW@^j8Y{hu?b%V-R|yw{zS7-dV9Bm{YM61j6iFQ$`G< zN%cB@z1fo;LAX4=?Hz8^UZFt9RkCJKbS6z4LFlaNchLQI9|01aWc(D0Zq>VRk#bm+ zFA?|qBab5plT*|7!Q^uV1VOlih9SIoX;{gnX$L)Mzs7(d45p>Cn}1SeND$=Mo%Z#$ zCMPQRt3-JF{GS{(as**_`Mi#wD>7ih(kNwZ9v*Cd_Lbw4zV-DGJ#4gQB*D_@<&G|V zxh04rp^yw8IN0e86{Db(dN6^aXoC$iLU}HI9z|zU<*^8(N#*?R!hhCW)U<*g)zfR^ zxoR|IRHtKy5BI+N3XqUslwNG2%Vn1-5E9A9@X*3z5gdljyk-ME_+(9or9S(78AS(z z1rUVN{4pYY zzuEDp%H%j4rO4Hy=HeS-)Ho_W(~PFpS8f6r4EvQg3x}(fmaJF?wX_iex}2xY#GsI{ z0C9{wIx8e<^ycr*V$*#MAxASyS&6Q^=tgNT+d|lcai4~ zbAV3Ai{r@HJv-p{fgl0ceDo}e?pK-6Bb;unM3gw4AV6|+V=y(Jlgr=G|voW1_5o&!RdJZM_T!$c8J-+_?`^8HbhcKA^w}EaH zsbLYUV(t!#4*9W?kc&Np#aC0MNJ#~5^%Ky;&o)e0Mx+0rJ$~IjM#f@Ty$2im&zPO< zT*?Y0YbaEl;Z*QZ+NKiEG4or!#}n|gX$oYdrym2x_dZ!Lke&(|glG!SLkuTV=XVF9 zMc|6zYTNGoYgH&Iz0;Q+bU6bUg5pxi2D({pOofoBRlsYeqa`TFB;p}1e4Z>8!RWl* zLT8f%;c3yhITY=1r-L58HG-nU4^LnbQk56~HaqSLkda`{WGth^MoY*Ar%x{t?Y_xD zNgn>-G6dMbxG%Gw^f{sMT4Og3$7cj<);Y=~9+X~&=UcJv5BrBSqs?w9M4 zBP5EM0Lm^`xXIwyN+c|0$lwrW$0N{myK^E;rget^mDie#bczWJ`$S@+11GhRd)pcT z9gC8nVA05&BcQ}GND;ep3jv;Sp++z=>5Bl0ARcH3e`tr53`u~;<&V&-9k$d6PP+tu zlr}LO!s!c1pUYGvN2m>J2uj|M3`-w z;WZQftniwoB|y|8F`#0fKLqrk(wG*Z(|fl?Ku5!+=mg!Gpf7~wBrXXRk{IrLz9d!`)!YdHA3N4_?Q>jZR z@tZaDHs8G|l=wFqz{p_Vyp68rLbD*JGgeT1y(LhNVDR9<>VHSwz<#}pK>Ym>!eVd) z_%A+zrX$mOwTAwQ;DHs-JO{!W3K7LHS+ziuk4K6lSf#8D^zd)AIEGv`XA|hG+=!W0 zF%jyzT4l;f%Indxk1jn|20GFzUPQO6Etn8`(+~UTVb5(LESLR%Kup77q6n2-+#htI z;kFzVLhsm$ZuX^WFd_o34eRJko(=;-rI7q*d$7P<03nlyK3lG~=RzpXJopKE<9`ex zIp$b3zxeSg#K)|iJ+jaeEDrJU-)xv{iBP0NxJ*mO_t8#oK?;7`DrlKsVN%pwW@WSc zXn&X#4TnkDCJ`OGCxjtWPKN^hjRMM(c=Q)Sc`gs|acSKp?0+<&LdY(@SVA{TbYW?M zP{4Da7c;!isp$|M3FRe0D0NG=(3N~OED43~J7}0+w>Y7*s`1dlRl0PH=b}fpP(rO8 zCk3zL7s%5{tUNWj)V)D;Zzx@zm4wp{2xRN43kyOi9X*5|4&3EKaP-!2b2a~n7i6-Q z(arbPj0m}ADWG&Y`7|lDVj>XH_6tP-u~#o#6>DP=8jB_4E|5A?VMKyO0T`stQL9oZ8#_*ffR&+qH zG4PfyKYj!&lL|yL5etv7yEUzE^#%aQxD0Z-$9tk=DRJ!9pMe6uIf4oT$nfrn>~-p6{i6O#A@ z-bZt!mW20)&>R}2fZjnr@G*)R0GHoD7YL8vPdqvp09s3CSbYFVlpq1Nu7Wmcab!Zs zH1Z&-UN2TG`H8zffsXGSLl8C}0Qd9}!_eEep!hE?v^WgarSffbF<+CBlGzq468hPc z0wKNda+A1Tu1AUB#KCJ3I=#4XWHLw6GZS+PgOz;(OYgq9%*~;myM2J)s6;gaqX28awc(-j~XYPf8u)u`}{oBNY zdRGySbK%`!us^wQV>oR}7toCluKbh&&hJ+VGe@qLUgg<8utUyVI96NerM=c`oCu30 zn8vO57PJVPQ`0WG^45SFb0VOdfX-*hL5@6H4$!&6OQZ9%@CO}7 zxV@`dvW`vuf0vB-l(eJ(4QVSM@Lha=;dho>qB-`NCI(qQU=QuTw$?FyT zUY!FQ!l046gdVou;6^Cq6UX;9tBgnyQpwnXt?h4K+z6>m!US>cqZ0^$*xk;pxz`4u z7-GR48?&#D>L3$4ygy&4Lxr%pc0rZ;z4^!ly#b+w3SBaU!3i7*;RASMGW}{WeRVdB z2(Q=C|K1xyW4ePoJZ!e2K(OisEBmuK7oek#$ITv0WS+wy7^T#|=tAB_48pAcY8CyP zp-Mp}=Jx}S?v&demvH~IOFSyIsQg{9t%Uxd z(A4=vXn6kH5YXRvaj<_@AGUWo@0=h-81;(gHwWU*(^5)@gSc)K>C;onK7^I$(-km? zmY%EAGn`EXhB~M+qxuHA#K zfMW<&G`M$XrNNPl1k35su=uyaiV5iC#@FSEA_E!>$uY?3VY4G}k$fs(^@}SDf>X*` zLf2kF4^!$_LA=fOj0n3Up!=}aj0T}GtN;mkZAgo-JADPTRbK%cVo|w6oXORoMwsmC z_V(Mn*}k8HZ+z0RqjB#>5w&%Szowf;IEjzT#Z4AE4E8VBq78M9qv} z*t#5ud8gQrmE}Sb^xs^L77eN3jqm#hqiN@;v7-I}p6!>)qzL_`qWPWCG$nEpa-CNT zdn3ufTv*lIHFUM)3IJ3lWtMpO!4TSn`|cot&}a+yctgj5qVEYEO`5RuLYgd)^=)us z+XXNb@Obwfq8qPu87YtZ|0EC>vS9zbH`?%oRsR+cl5#`gCA7FkG$XvPh1?X6ZgNs4GEj{*3bZ%T_AW=;?f zH!2-PxGttn5%(sZ>hdwlM*P^{9E_2rK)5|y_Rv2mia40`8@AA?^s`um!?tdfFd7M) zW_SFue%OEei0mXEbqzcRW`K6P-8R$U4O)Y{P_&J%6<=Y-3fu%Nql5RP*`)&^ICSj6 z8Af5}Ish8TG(xA5vwQ?OL4@+c%jJXpFOG}|RyN_^0sfleN_z%g-=ams#@A@p^naL>FEg&>eC0KDzzZkOm>wEhnPe9X`TXTD>ypiiuztp+z6U zyfYUkN`f$6J5t{_`m~5p2>7g>azlDD5nmwi<>wG5k5>mColBR+fG<7bj!Xp%iBK@? zdLkO+hc~z%MLTc6$iU^-ySv|YG|!RQHW3cL-vB;ga%$e){c#(%%Iwm(M;MDb3FQoc zDSajt1V$(ne9%F$0TZq4BVY#r2|~hR_ut}bqZ_P8X;i+l(;os^rMCwYwV19zf^c4i zR$k0fB_m+P5+n9nB< zY%RRH!bHPoQ?r8Z78^1#iMxMXLN`jx`B*ixKy8-`^jT@;AdG|W{sJT*K3xZEl_od@ z%VPhwr}dE{C5}$^@vn{fQVR}JK9^4fbRQ18sE>Ix;E7Xd=O_`ZN@Dk5nZpsE$%fZA zJO*_^I6a}f6G>;OserW)Q2c*RLTrkW{ab(^OKukNn@y`g9m+U_{8x2B!LiDV@T zM8Nyo265quGC3mY|9ufZm!*QGR1Ek!Px$*>o0(lBx_#yFN4Nwz$NB4po!=79Qy?to zZoTcO4V9xOVYMoqUGGWI5MVg-0J!r{vN}JD`m<&9us=qbgU7sV6W!{*FU`PV_I4Rv zZ-qlCCZpmt!eXV16r0HP#y$L>$MQ57p_}c*y&w01K6qSfW~PeGnGwuU#t4npFy%=` z_U}z*Yd{bNWm|-e*M@*9>rdM#zFdz6Ip))eN4N5InZdUGucgn^Flb~!p85hr$eA>= zruQ~0tyr;4CZ#L*iN}&82(3xU{7T)C+R&O6k95Z$aV}3l=jKGF3I)RH+5!c8qsKrc z69a4X2Z_?qoXuQ=vn4M9D$b+n5C7hZi~Pi$fkViv5eKhn$u5z&1&3Wc)=fYhe;z7x ziun!_iTEZ5PKx7x-3Pmi#TI-VstLmfn|0TC5ZsA?)~T;YR+dC1``<>3zYv1uy3w_} z*X6@c%dL|?eYoA~%F85VQT}&t^{p8VI#NcX!ikyo z`|?Z-=Tc@+!tY3FT2_PnMdHFsEeeEDH*adT+zb?rQa^ucx=0VMgzx`8Tq`xEL8uMh zuHwgIrNN)Md?TWN;#Bxf-)aYu7{0G0pd1D#E$anZtgM; z!Hl*wtJ@vEoN(n-Gc}Z{3YihT+cNk$K$;X0yxFq3(+R@}Rz78P|6jH$DGBz%%N64A z!&6uc_mR-erNJPh^bGWCH0&gn*63&`Y4hNs;X5LO-8x4BW|hQo^q?nLf{{TwW^{kG z#E6xQ*|KtzI2tcOLC)n`Hv_&%fSO6}?z_6uJ7;MTW~+CrJ3}#YROHf+hIcmGLnLrG z@jLYcb-rLRF!BjQYrT|@ zLR9!U^X$-kSJHJ(svmI^+ImflPc3m2T0K^cU(5|MzglW7#HIRZkcf^($+HRD zyqVnkS7^#bBkI|>y5ILehKfNc2^jfjfG7o<#rJ!E)pkck$=^ozi!OpSbojW7{(c~d!$<>v5!(F4=>@KS19>bnrl;V!(RqMQ z#Y%x99Vr}mXG&Jf|G@3k+Ax!Fx;E_Xb>HTOv)F*1z4_A1{dchZQiqO4 z$m{FO%%`iol=RAJb11&motr_>?%luD-%00L7>;|_jSf81=cHtmi|m^Im8`)+Ep@kN zZ?`{OhMnh9R{vCYwgDFfrAq4X^n14>akZaySws z5e@7^cbjgWWE6A<$GZFZrh=4J;o9DO$2|=pQLV)8zWPV{f-EAIMZKM`>_w=lFJyxG z_;O8{`E+16B&gg)M$x+!k};F6cS`+!_a_~~CT!o@by%07*ID6uU-PT<`A zUcy07gghg==99st{&Y<+$#x(1(CrUb&xl=t`3?R1+(=l&^3}}l%9lH5*re~Y9pL{J zSPFBi#{4GkeG8GMVbOari!Q!4WW>@Nk!{GuBpV7| zeB#;VQ*u|UfH(T0v`!l&LC>yMd&tVTl)|a)@03fzXFTgRVHR+NoZb0;aM=G?m6`QY z#w5D*&XxzqZC$oToOo%(Mt#g1AUyZdkeTv?e=q*9@4)?)cpyl+Y6l)=f5U zYRk zLZ@VVZzNHLg;qIb6~#}d=$}^htest&Z@8l=XHf(r-|RDEVNokMFF$O$Ax0};Te^WR zzSLu)61o0yak1{E1P!h7!*3H`!z9T_InDx9`>J_+M+mc81Qp zlul&FHoElIQC#dw)~~JgkDezOPdU9BnrjYKpyyV(_i3av#ZZ7v%KgpYK%ONRLM0#7 zvo-U|jF(F#@bma;SNK^$`D-A@^b z3OMjDn_K_t3#xtU{*RrxN*57&5r^W*#c#JoNDw;xr=1Cl;_|{aG1`Wb}?JJze#h<06J(oBJhj2Hgxn)Ct;`e{VUlc#7 zmOOH>{UciE^jY7A)xG%&7x7~kVn@)u_5cYs7R7sC`acCKvQsgsCUta|+>qntznnX_ zIa+9QiuIUt_3BPQlY|gQ;|FRu+}Sq0N7fE@<$OYU!jQ`2j06(gfGP*aMbb*obWI!L` zus2AWhWS$AK8k*@WJQ?Fp^^iUa`fC+$_QX{jaX<-27)@zX6lKY_5jXVerqMjs`voD z2ldD5oKy^i!?cx56g~s$)7PIng{N_7{lYD9!ptWl+%_Zc$Kkwl2qmOmZ z=*Rc3Zv1^|DJ^j+d0=j`$Xb9&$hmr9t>yM{4DNJ9-`-lSn-CSJ>Fe2zR$qRY!z?Nn z7T&vnbc*`c{;IwXx0vMMy1V-3iV(L< z!1vXafkzhwM64<{w#Q2x#CR{p{>HC<4^!ac(tS3!KUMB7&2`4F{+rT~XL?|SD%Nnw6MOfI*Km0M@_sZ!s6N75P zkGZypv&>`yPVblglscWDKzN-i|9p=*PlZsOOBh(~O*9nZ*GU}(7ZIs`T=x2>J>q!c zc?L4EKzL=H3lBoC`D_VYd1cPWtn}a)f!K3jkwehB3Or+-r>v-EJWMkSPqjFCj!Y@q z<|oM}6#(PwSll`0|9KNaiwiT3Ui!|v4-aI(3z8|ue5?vlq6AkT-8)g`2BqP&dpF&m zs!sR+bN0_rNgNrk$LwqKEBAu!peIw^38LnW0d3+Cw}Wp!Q+m( zf#=pz$7Ee{TDywePIC)tMK(|Mq!@_`>BRPIE!Fud3Y@ZgHMusFVIasO?_ECBmt!v@ zZjdmD5*FV3>FNi4hObafA=*k-PY2g$Ki)dczC*l5 zuuJSX5^nR{A3uuh_^_B`&iRdnuE(e_l*&U2S>81dxWY6dhiEy|h1v_&+5NAG{e|*(dDwr(M61-nVghF!0pbz$L49 zdATE2Tll1L!q?%hY1^I~e+-eQ z!g5;X|Ln`Y!UEp|@3&2Lr|NOh2-@WT_?~)+o{U;Lq-DB2PLrEO`bOoSfqX{^9x0E? z>G}2;J#l&W*F#e+;Ytj2GIu@>H9x$-!^VF$;7vu6or;94d3x{Yk4%d*QhJYjH@1c{ z&85#c6i#lA6*!zZej%)NeYH94yr860>C)kJfz9bt21#AR-{W#=fKA9Me|X~a zT_sK~&G?>$-`UnDx#e$t7#}RO7olOg82fFo+*1@oB4Gb^xb40I6^7$--tcItqaZy4 z*ZJ!~*DuQo30#cq!ygW1*ql=~kNME}F2+G!K|7#!Z0zToFt=-ot&6Km-xFMHgWsqF+W`Fsd(btt%{M64|mm1NSbB-n(Il@ z;bs(b&hP0hbdlr~(og9aYfn8oM~iG*nQI7CVCU7iSKC(?rozS~;`H{2}@e0xA(riF3rn#HlU`jEz??@SJEM?^?Q+*ikOUD z-pKm&J0Fen_Bo@3twuj(Q8~AQuFfp;OfUPD&mV4dB-&_OC3S8cj22wi(etmK!*8{O>qsa% zW_+qkw>!gs(&S0|Ky8@%F>V>RoVxM|BZ(6i{onsv8_uy;kiH!E?QehKHN_M1SKsuH zHAL!3oH0-BS(>cAt)^gbziwi(;i2&vC71l+#i2qsqOQ6Y)rOR zlrxEK8t*T(JI25$q~jMActwJPOVT#=Q(NVIV|fLOxW<9{2iijXvhFV$Yh$lS@QND5 ze*9YGt05_8ncDKBKGxurm~P~kndM*EE*jci#lQc4xu-}+%Bp%NE6qcegYl$eVgLBo zG<$V}zz;K9Q`LTIa{3YVlN0~>$}qCX`@F6%ys5;&Ebf%`vBY1InTk^*>Qj4(kFwx# z{g~G2fg)E~VTEg@qm!S4&j}tkO75B+dE=@ep%q#;G4?4!Px|b&*TWO__tZsCnPv2^ z&wdKgk~NC_y0rf5skN-^mB`AL57EY=oPwHRwSD!`2B$}xL_XpWo)vy>~Tp{-8r|Md|&+B+MW555#ax%d1__0InnWoQ&dg=_>baX z^DEw2&A$gfL|j%et2c;heR7iX*Hi$UmLOz~-25foCnkz4)3PwSMBv`tD~ z!?UX@r^GY^N?U4TER`hBy5+WYmWCNCD4NDWPAY>gtD8KipIIJy8(?PS_43!!TxYtA z{^j8RrdFpLlW)3*6!*{1v}d?zYC0#@e*Z7VPjD4otM+}eBSuAIOwvfhC^y=e_O$A z6Fs}w`mu?Q9516QH*;DCdfo(>Xk8Ae=;`|}-bGjMYG&K$kE+ni=XGynf9r31>8U2C z>YQ3xnd+i^O7c=@SySabeb~NvOnFU;gS@bavU_Ifb6+iSQF)ukRsTKnQa>%Jkd*%_yLxv!~{;VwDIS+oEw^FHC&&3YV0>6Nw}@9p;y+IAMN?K^i{RpQ)(LDgqkYLX?dhnyi0VxD0kK}vgC7BoTJ8h zU9arVjjuvYFKXIG*R<7VdT1%Cxu!R?RYqA{P&JRJ>Fum|U~}oRPtMoAuP<-vsp)$^ zt8aQ6VWoM={b_UG_tFSkBg^2z=5JN8)@tfD(UspC^Y2_%({fF$sw)gMR8}$!e%t!3 zrX{HB(7QH};i9_gPto1Wh= zP}BEJ|Jd+4?23}y1(*23ocq@2WzSu{lU11NrK_Z9bSJN&r6T^im0iH|hOWjJ0hUHq z!Fi3X?^8XD^=v|ND&Ho08mVjB+|A5;a>qhj)6_4$v?R^TSVPY(uKaUN#w`m2v)j3! z8p~qcE*m>VzNvek9b#u->X}qlTax5!ZDJFc^Rf0#w7Z$;B6PvNkfgk@D_CajdJJrk+b|L1B`&v4*x~NWp*A*}+a$4*nUHA1gA0-Ry5f zzpZbmN)K?dyB_tj>`g|fyQQ5^;;YiU!~hpt_j@_z6?xHKHa6EE<(Ixn4RkiQx%s%@ zT~S()lZB&ST<*&!0hXF-nkF~G9|b$=s;X*P`$b3HwlmT-bO=h#efr?4sj->+{frlB z!7dh8tZpW~$V~`xu`qKEPRo5BALwf1;PoK=S?U8HXNRjniPFL6@HA*Ey#)UcXzoOlKdk7d5ph@`^|f) z**QsJ-mb1*p~+d9aec%Xl2*b=^BSKI3WHqq}~$?nEX(O;3opee+h(!_nfA7v%3B6dwIJE;>B$&Yh6(==g-_2O&Xs??uMM#YBb%1_XsZjE#F76&e&6 R6dWEC_c$i%UT{$G{{fkH7E%BJ literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Tick-22.glide b/Glider_Sound_Files/Tick-22.glide new file mode 100755 index 0000000..b084201 --- /dev/null +++ b/Glider_Sound_Files/Tick-22.glide @@ -0,0 +1 @@ +~}dmikniqrxs}qjiijyvpmiilxus{s|~supmsx}rjkq|s~}tysmnrvvy}}~~ru{{|~||}v|}x{||}xt}}{}y}yv}~}}~y{ \ No newline at end of file diff --git a/Glider_Sound_Files/ToastDrop-22.glide b/Glider_Sound_Files/ToastDrop-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..adf66d8f15b698105a7d9cf9770ba5cbd898a84c GIT binary patch literal 2544 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 F{U5$y3YGu> literal 0 HcmV?d00001 diff --git a/Glider_Sound_Files/Zap-22.glide b/Glider_Sound_Files/Zap-22.glide new file mode 100755 index 0000000000000000000000000000000000000000..3f5420e27fd3d2cfa91dd6cd4bdfcf8914c4802a GIT binary patch literal 3936 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 Kfee9xLf}6FOE)h7 literal 0 HcmV?d00001 diff --git a/Houses/Combo House 3 b/Houses/Combo House 3 new file mode 100755 index 0000000000000000000000000000000000000000..790f8f1f1cfd50139e5d2e5a52b8bd4794297ff7 GIT binary patch literal 13830 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 gf~}GMH#jtym#l$ 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 HwAOzE(7Q2o literal 0 HcmV?d00001 diff --git a/Houses/Combo House Read Me.txt b/Houses/Combo House Read Me.txt new file mode 100755 index 0000000..86c8dca --- /dev/null +++ b/Houses/Combo House Read Me.txt @@ -0,0 +1 @@ +What is Combo House? This is the original house that came with Glider 4.0 ("The House" & "The House 2") combined with "Mad House" & "Mad House 2" (renamed "Combo House" through "Combo House 4"). As you may remember, the last room in the original house presented you with an open window and a way out of the house. That has been changed in "Combo House" and that room now takes you to the beginning of "Mad House". Why on earth would someone want to do this? Well, because this hybrid house has over 120 rooms! By flying right out of the original house and into the new house, your "score potential" is quite large indeed! But to lessen some of the confusion, the houses were renamed "Combo House". Score big! \ No newline at end of file diff --git a/Houses/Glass House b/Houses/Glass House new file mode 100755 index 0000000000000000000000000000000000000000..3d93f03bb4d983f072c33ba9cc17c981dc9327e9 GIT binary patch literal 13830 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 literal 0 HcmV?d00001 diff --git a/Houses/Glass House 2 b/Houses/Glass House 2 new file mode 100755 index 0000000000000000000000000000000000000000..3b1fb61c56e1674837d044efae4635be11644326 GIT binary patch literal 13830 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 literal 0 HcmV?d00001 diff --git a/Houses/Glass House ReadMe.txt b/Houses/Glass House ReadMe.txt new file mode 100755 index 0000000..d5bc784 --- /dev/null +++ b/Houses/Glass House ReadMe.txt @@ -0,0 +1 @@ +Glass House has (for no particular reason) a window in each of its 62 rooms. In addition, there are a number of unusual features to this house including the Giant Loop-The-Loop, the Split-Level Rooms, The Ring of Fire, and the insidious Cage Rooms. I enjoy designing houses that are fun (not impossible) to play, with a fair amount of surprises, puzzling situations, and visually interesting layouts, and without an overdose of death traps, massive air raids, and clutters of obstacles. Try out my other house designs on AOL: Five Great Houses. All of these scenerios are even more with my Glider 4.06 custom art file: FunArt, also available on AOL. WardHarten \ No newline at end of file diff --git a/Houses/Hands-off House b/Houses/Hands-off House new file mode 100755 index 0000000000000000000000000000000000000000..472edf8da3d5c64cb70906b59f491a9b532cd7a8 GIT binary patch literal 13830 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 z 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 literal 0 HcmV?d00001 diff --git a/Houses/House Full of Stuff 2 b/Houses/House Full of Stuff 2 new file mode 100755 index 0000000000000000000000000000000000000000..1c32bc5e2a820804a059524b5adb9272a1848bcd GIT binary patch literal 13830 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 O7y~f|VhsG(4E!4wHSNCu literal 0 HcmV?d00001 diff --git a/Houses/House Full of Stuff Next Door b/Houses/House Full of Stuff Next Door new file mode 100755 index 0000000000000000000000000000000000000000..816abfbda1c0d1023a25f239a098a1b2f2359b13 GIT binary patch literal 13830 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 literal 0 HcmV?d00001 diff --git a/Houses/House Full of Stuff Next Door 2 b/Houses/House Full of Stuff Next Door 2 new file mode 100755 index 0000000000000000000000000000000000000000..c74b65a401c9a09f1db889427ea0e3e7d8b1b1ca GIT binary patch literal 13830 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 literal 0 HcmV?d00001 diff --git a/Houses/Lumpy's Home b/Houses/Lumpy's Home new file mode 100755 index 0000000000000000000000000000000000000000..91e7e7bc1e6acd140aa64122f90446855bb920b1 GIT binary patch literal 13830 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 MW@^m+2N}u#0>+=sBLDyZ literal 0 HcmV?d00001 diff --git a/Houses/Lumpy's Home Read Me.txt b/Houses/Lumpy's Home Read Me.txt new file mode 100755 index 0000000..0802015 --- /dev/null +++ b/Houses/Lumpy's Home Read Me.txt @@ -0,0 +1 @@ +Dear Glider 4.0 Fans, Hello, my name is Tony Korlath and I designed Lumpy's Home. This was my first experience with using the Editor program and it worked quite nicely. Lumpy's Home took me about 3 hours to design. The fun part about designing your own home is that you can make it as hard or as easy as you would like. There is a least one hidden room, and I hope that you can find it. Good Luck and Happy Gliding, Tony Korlath \ No newline at end of file diff --git a/Houses/Mad House b/Houses/Mad House new file mode 100755 index 0000000000000000000000000000000000000000..06063abc40ebad35250e206762f95bb5f8670261 GIT binary patch literal 13830 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 b(0`#K(GAhtD?HMxDxG29c&ggju>b!7On?G4 literal 0 HcmV?d00001 diff --git a/Houses/Mad House 2 b/Houses/Mad House 2 new file mode 100755 index 0000000000000000000000000000000000000000..cb9c177d4e3c381a3d67f5d42c007faf50d7f1ad GIT binary patch literal 13830 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 CwJ>}D literal 0 HcmV?d00001 diff --git a/Houses/Mad House Read Me.txt b/Houses/Mad House Read Me.txt new file mode 100755 index 0000000..ba68168 --- /dev/null +++ b/Houses/Mad House Read Me.txt @@ -0,0 +1 @@ +Welcome to the Mad House! This is a very difficult house to get through. I don't want to spoil it too much with a lot of hints, but I will reveal that the house is something of a maze. There are many, many rooms where you have several ways you can go. Some directions lead to certain entrapment and no return. Other directions lead to the way out. There are many ways to get through the house but an equal number of ways you can go in which you most certainly will not get through. A final hint: there are a lot of tough rooms where timing is VERY critical. This house is for the people who thought the original house (The House) was too easy. Good luck! john calhoun- \ No newline at end of file diff --git a/Houses/Rising Sun Read Me.txt b/Houses/Rising Sun Read Me.txt new file mode 100755 index 0000000..b530854 --- /dev/null +++ b/Houses/Rising Sun Read Me.txt @@ -0,0 +1 @@ +9/2/92 Hello! This is the README File to accompany "House of the Rising Sun." I created this house over the course of about one month, after finally completing "The House" that came with Glider 4.0. I figured I would give creating my own house a shot, and never realized that it would be so fun thinking up ways to make a plane crash. I'm an Apple Educational Systems Engineer for a dealership in Pennsylvania, and seeing as there aren't many schools needing Macs fixed or labs installed over the summer, I had more free time than I should have. Playing Glider helped me while away the hours. I uploaded the house to America Online and, to ensure that my work was not wasted, offered $10.00 to the first person to send me a screen shot of the completed house. I also offered $20.00 to anyone who could beat my high score. (It was 1.6 million, but then again, I knew where everything was). About 3 weeks later, I was $30.00 poorer. The same day I realized I would have to part with the other $20.00, John Calhoun E-Mailed me and said that he was interested in my house being in a collection of houses to be sold commercially. I was amazed. This was such an honor. I fixed some things here, moved some things there, and thought up some more funky names for the rooms. I took great pleasure in naming the rooms such that they would either help you get through the room, make you laugh, or just go, "Huh?" I am pleased to present House of the Rising Sun. 120 Rooms, More clocks than Pink Floyd's "Dark Side of the Moon," More balloons than a Republican National Convention, Millions of points, and, hopefully, hours of gliding pleasure. Thank you and have a nice day. Steve Sullivan Comments, suggestions, etc. may be sent to: AOL:ACME Steve AppleLink: CWED.LANG2 Internet: CWED.LANG2@applelink.apple.com \ No newline at end of file diff --git a/Houses/The House b/Houses/The House new file mode 100755 index 0000000000000000000000000000000000000000..ffb4b7dbb48289a7c7ba044f9a2d473feb5120cb GIT binary patch literal 13830 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

VRN>Kr8k($}c*xR6D1uahg13X@eAjzyx8 zaH7_|&&hiwJx$IJv#U%(?yDg85F#;YVx6K2`Q3Z&SO5|TlXJX=V@xB3u)z@H$>kS0;eGX4oYz_%D{#e9AU^L4g{Az3;$=*X1> z!7QAVH+e0q9u@W4ZgO(Q@5cf%UI9^YmWL2>Ik47S5dBLNa?mlN zAaObB0MY_D-#))<7o@Ml~QzZ>#4SaB`)SopWqST$8rd^Cr0=C-2Wm=IU3^0xyw8PDr`m zb`@)@#>&E|(+N4IU()%sjz_B5Vy$OF4&#k$-TWALF`{Sv{mA%j+)S_Wo2okxzIZe8 zk!{FRC8Ozrbze;XMBcHlA}iTi1>J>wPXB){Yw%6fp<*?QpHuw<)e-VTqoV^Ed{YVpY4{$6ta6epfa zTlLuKyg7uN;OMvKpl#shjpxL7j=}dn9lmoE>`>%|kk`_2SiiDPM9CFgh<{fg>JV$K zfgGV@kuPZL)o1uMShb4hPz9cb++943_Bbzse14D2--6uik}rb1-pB#e)(cRflD$Hz T?IozT?@xcBDM|-FcXIy)V*x>9 literal 0 HcmV?d00001 diff --git a/Houses/The House 2 b/Houses/The House 2 new file mode 100755 index 0000000000000000000000000000000000000000..60ecad61916503094440e168550b5e52f3e48eda GIT binary patch literal 13830 zcmeI13vg7`8OQ(M?&h747uHa*-XJe4j}k2%DmBCn5^xCe5Y+lw;F_!?dv|s>gka0G z>9#t3j8=+O92{OPR^=g#9c$@0t!TSa+KgyHI@VaV(=r`wMGJ#d?f;y6c9&hoFib}S z<2{+&&HtWr&z|$U-}%1poCt9KS8u7?gh47L5yx^O_Jj!&S{LRH!K(p2Jq$`|2QkO# zq#+dN+JRRCe0mrZHpLRwq{+D^aE7X6LA!0WI9+l3qaLhTWOpoaI&CZASl5R5jScnb zrUC3l5qw$-{0N``LZ$Ag&r;Ok5{$wPI0E5~VwsNHWghOwIP=WEQHT?)S0#u`@f51@ z4zARimk-MMQ}IE?xv7g=!_lY{u^LV#S447(mdi;KBOsTgnylbYn1RCg;qy$>c=gLQ~^nS(U9_ShEwo8>@xMk(S<#@ zhkTXq46?7s@GI<;iKgDq`onl!KCgAZvRRo-a<}XLdimCVATgOG5195BV7;s*%|k{9 zFkW86^O;v!g{XA#nKeayZi|nXboF&ntJ}8P94lpo+Ct&TgbcX?k}Kf&-QwfS3kfZ2 zb>lD@Tjg?THFOopaU^+@A*u9HlDODt!RxXdhch!j4=-@0ugeM976dx~% zGwr|jy68BoE9bY~u<|2CKbJ0k{!y3~`g1%cOBu;MZs;nK^W}29YuYJtkCNmeLvG-i z_velLtS490lt_e^gc>Jj>1E07%aC&;gzNF#<>3R#;cFy!Vb$oH{V z9!~Qf&}Pm#ay2vKR-!$uF18g?6dTjz3bBtXRQ>qPr%#1YQ+zs>PN7YOGo&`k80?lQ zxHhRk=yS>5fS#F#kUU1L7EbbQd0)e!=;K)2AZ z$q262XBmZ6QRMCs74n#@$$jf9d*u_S;0gf^kWe zv)<2@F0^AkR&yw}te)UKUzkYI3bT#uGc*d zvQ5@5qP@m6w zzd?+d@O_$05*FDV$3!Wn9j;)0r^wt$GT+tTuA?N0EX`554btqTslW_M>0a{@ zgu4&RX2L2f*-dgcqg=C6r2HgxnI_@-z0K4w8J#=RVBXA`_vetvCzY=Uom_dVldzgP zLo36Pwp1>;3TDD;58>Kafr<=Vt-hSy*HHSk<}4{3C#kV`LzDDz=hedf|2nObd@{wo zSs%%&(#O4ADO%(z`bAg!u^NBlzGAf2DmIVCE6f;Mj8<=EKKuWc`Mvrj zd)mA3jO@_u`?wN%nTh{Gwv)fASK~Q=QBuTlS5m7t;p2E4%=k-C$G19CmdGUC!)eHs z1)a`lhn=vk+4j{PjuW#ki}$4Tw!f6*XlE>LZsOXU+o`%La-Si&t1~vR5{qR9b2wGh z%v+_B@o=uu!|>o`v1-+iaFUs@(|vT56$y_Y?gKS zv%ISHHb(S1Y{N+WMbC61Pai%f2kB=|;C!~YH_v8Hx7yqD+Ovy+ZLX@>=~~=jTeIv? z)QK(asn5pNl8>-CJ#bzWxmJ=}WoEA4p_@gx=W_w>K{iRVxPDS)!Xu;+zn6P-2a4>) zSdW#aUPXxQ*nvNC9j{`GURda1^!^T4@Lo)%RyI>Y8=gW^)wG$hj3gKFJ$*Yppn+$4 zIud7EU$dy)v6e-g?s!U_g4&U#jp;S2{8DaFu{B#%Y%OPm*b4VNO_8gk4Ye4Ox$i8Q zH?m-!KIbAtRnUpF#X^a$j!+`(MB=IJzBQmTVV^;zEXS|hMW(3OYLi?cYVT%ysIXZm~bPRjx88o%uHWiIXjwX~jd~rKyHV zr|kHZ%?(5@fUUTOp6eT$l-`%h7fA9peJ6;a_z@iX@NepUtvU;7;_3L?@{S>!YeV^~ z_pG55s+F+0>5PvxF6mEi^M_|=)F zdqyW_)#!=xq9Vc;+Smc(#~AzMXUvyg!EIcbLDWb&hRY?GDqGl^tCu?AD${^t+%kvDxJCZYMrFse3ITq{Rg9~xlemp#!7+7bg6kpJyxzbNl&AW z8lC%QIHdpAZ>B+bpB@2^fJeY1;1Tc$cmzBG9s!SlN5CWC5%36j1Uv#B0gr%3;9Mc_ EKPO!?CIA2c literal 0 HcmV?d00001 diff --git a/Houses/Usher House b/Houses/Usher House new file mode 100755 index 0000000000000000000000000000000000000000..80420ed6069e81b58e4d3dcb4906b5e7df0e1a45 GIT binary patch literal 13830 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 literal 0 HcmV?d00001 diff --git a/Houses/Usher House Read Me.txt b/Houses/Usher House Read Me.txt new file mode 100755 index 0000000..0c7b002 --- /dev/null +++ b/Houses/Usher House Read Me.txt @@ -0,0 +1 @@ +Usher House - Im one of the many starving 14 year olds who got up to his ears in debt to purchase Glider... It was well worth it. Ive been using Macs for seven years, six years of which were with an Original Macintosh, with a few upgrades (Do you remember those 128k machines?). Currently Im using a Mac IIsi. This house was written one lonely evening when Id gotten bored with houses that were NICE to the people in them. It originally had no gliders, batteries, rubber bands, or bonuses of any kind. I didnt just smother people with a dozen shredders in every room, but I came pretty darn close to it. It was, of course, nearly impossible to complete. I toned down the horror a little bit, and added some food in strategic places, which usually takes off more than it gives. When you try to complete the house, remember to use the time-honored practice of getting through fast, then going back for the goodies. Its now a 30 room house, with a good 100,000 points if you complete it. Have fun! Any and all comments are welcome. You can reach me as Phexem on America Online, or through Snail Mail at: Brian Eaton 1204 Milan Ave. S. Pasadena, CA 91030 [ This is one of the most difficult houses I've ever come across. Be warned. Also, some of the rooms are very busy - on a slow Mac it may feel sluggish. - john] \ No newline at end of file diff --git a/RoomEditor_103/Editor.project b/RoomEditor_103/Editor.project new file mode 100755 index 0000000..e69de29 diff --git a/RoomEditor_103/Editor.rsrc b/RoomEditor_103/Editor.rsrc new file mode 100755 index 0000000..e69de29 diff --git a/RoomEditor_103/Room Editor Version History.txt b/RoomEditor_103/Room Editor Version History.txt new file mode 100755 index 0000000..03f0df9 --- /dev/null +++ b/RoomEditor_103/Room Editor Version History.txt @@ -0,0 +1 @@ +Room Editor Version History 1.00 Original release. 1.01 I don;t remember what I added to this upgrade. 1.02 Handle the mix-up when checking 'deep' resource in art files. Updated Casady & Greene, Inc. address in About Room Editor 1.0 dialog box. Got rid of that Glider 1.0 panel that would come up in About Room Editor 1.0 box. 1.03 Renamed art files to "B&W Art" and "Color Art". Upgraded to "About 2.1" library. Added a color animated cursor (just like Glider 4.05). Opening art files is 'smarter' (i.e. will first check for appropriate default file names - if in color mode, the Editor looks for "Color Art"). Fixed the 'glide ratio' bug where the glider flew farther in the Room Editor with respect to Glider itself. The "House Info" dialog box now supports locking of a house (you can't unlock it though). The grease is now "operational" - you can slide along it. \ No newline at end of file diff --git a/RoomEditor_103/Sources/About.lib (2.1) b/RoomEditor_103/Sources/About.lib (2.1) new file mode 100755 index 0000000000000000000000000000000000000000..3070c63fa9e66ece63067e2ba40e274f533e35a7 GIT binary patch literal 6944 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 O!xlU)V7_8g>3;$E^{<=& literal 0 HcmV?d00001 diff --git a/RoomEditor_103/Sources/About… 2.1 Intf.p b/RoomEditor_103/Sources/About… 2.1 Intf.p new file mode 100755 index 0000000..1b4e3a8 --- /dev/null +++ b/RoomEditor_103/Sources/About… 2.1 Intf.p @@ -0,0 +1 @@ +unit About; { version 2.1 last update: 1/1/92 } {} {} { About is copyrighted, and I reserve all rights to it; both source and} { compiled versions. Please do not distribute this source without my} { permission, or remove this notice. Thanks.} {} { Jon Wind (About)} { 2374 Hillwood Drive} { Maplewood, MN 55119} {} { 2.1 Changes } { Updated demo to work properly with System 7.0 and added popup menu for window types } { Improved overall stability of About unit, especially in tight memory situations } { Added support for movableDBoxProc window type } { Added support for plainDBox window type to be drawn with only scrollable text } {} { 2.0 Changes } { Created Modal and Modeless versions } { Added optional support for display of styled text } { Added support for copying styled text } { Added ability to specify how window will be centered instead of just center or not center } { Improved error checking in low memory conditions } { Shift-command-c will now also copy text } { Method of obtaining main window rect should now work for DAs, cdevs, etc } { Window dragging now gets bounds from GrayRgn } { Window centering routines now shift the window as neccessary to keep it entirely onscreen } { Option clicking in the window displays the version instead of option clicking anywhere } { OK button is now horizontally centered if MainIcon = NoIcon & Length(WinMsg) = 0; set WinMsg to an invisible character to not center it } { OK button is disabled and default roundrect is drawn in gray if the (modeless) About window is not in front } { Added support for close box instead of OK button for noGrowDocProc or rDocProc windows } { Scrolling text area is extended downward if MainIcon = NoIcon & Length(WinMsg) = 0 } { Control and window auxRecs are now used for frame and background colors } {} {$R-} interface const AboutVersion = 'About 2.1'; AboutNoIcon = -1; AboutNoCenter = -1; AboutTopCenter = 0; AboutMainCenter = 1; AboutMsg = 0; AboutTEXT = 1; movableDBoxProc = 5; type AboutFontRec = record Font, Size: Integer; Face: Style; Color: Integer; end; AboutRec = record FontInfo: array[AboutMsg..AboutTEXT] of AboutFontRec; TEXTCopy, KeyEquivs, CloseBox, Styled: Boolean; CenterMode, MainIcon, ClickIcon: Integer; ClickMsg: Str255; end; { Note: font color(s) must be blackColor, whiteColor, redColor, greenColor, blueColor, cyanColor, magentaColor, or yellowColor } { Note: if MainIcon = AboutNoIcon then no icon will be drawn } { Note: if ClickIcon = AboutNoIcon then no icon will be drawn when original icon is clicked on } { Note: if CenterMode = AboutNoCenter the window will use the supplied coordinates and will not be centered } { Note: if CenterMode = AboutTopCenter the window will be centered on the front window or the main monitor if there is no front window } { Note: if CenterMode = AboutMainCenter the window will be centered on the main monitor } { Note: if Length(ClickMsg) = 0 then no message will be drawn when original icon is clicked on } { Note: CloseBox will be ignored for dBoxProc, altDBoxProc, and movableDBoxProc windows } { Modal procedure: } { this routine does everything, returning to calling proc only after the window is dismissed... } procedure BuildAbout (WinRect: Rect; WinProc, TEXTid: Integer; WinTitle, WinMsg: Str255; WinMisc: AboutRec); { Modeless procedures: } { returns true if the specified window is an About window; otherwise returns false } function IsAboutWindow (theWindow: WindowPtr): Boolean; { open About window and return pointer to it - returns NIL if window is not created } { Note: you should keep track of this pointer only if you wish to keep specific track of it } function OpenAbout (WinRect: Rect; WinProc, TEXTid: Integer; WinTitle, WinMsg: Str255; WinMisc: AboutRec): WindowPtr; { handle event relating to About window, ie updateEvt, activateEvt, mouseDown, keyDown, etc } { Note: this proc should be called after every event for each About window for everything to work correctly } { Note: this proc calls the CloseAbout proc if the OK button or close box is selected } { Note: you can filter events passed to it to simulate a modal dialog } procedure HandleAbout (var theWindow: WindowPtr; var theEvent: EventRecord); { close the specified About window, kill data structures associated with it, and set theWindow to NIL } { Note: this proc is called by the HandleAbout proc when an About window is dismissed by selecting its OK button } { Note: this proc should be called when the program needs to remove an About window } procedure CloseAbout (var theWindow: WindowPtr); implementation procedure BuildAbout; external; function IsAboutWindow; external; function OpenAbout; external; procedure HandleAbout; external; procedure CloseAbout; external; end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-Drawing.p b/RoomEditor_103/Sources/E-Drawing.p new file mode 100755 index 0000000..f08152a --- /dev/null +++ b/RoomEditor_103/Sources/E-Drawing.p @@ -0,0 +1 @@ +unit Drawing; interface uses Palettes, Globals, Utilities; procedure DrawRoomNum; procedure PlotSICN (theRect: Rect; theSICN: SICNHand); procedure LoadABackground (whichID: Integer); procedure DrawAllObjects; implementation {=================================} procedure DrawRoomNum; var tempStr: Str255; begin NumToString(roomAt, tempStr); tempStr := CONCAT(thisRoom.roomName, ' [', tempStr, ']'); SetWTitle(mainWndo, tempStr); end; {=================================} procedure PlotSICN; var state: SignedByte; srcBits: BitMap; begin state := HGetState(Handle(theSICN)); HLock(Handle(theSICN)); {$PUSH} srcBits.baseAddr := Ptr(@theSICN^^); {$POP} srcBits.rowBytes := 2; SetRect(srcBits.bounds, 0, 0, 16, 16); CopyBits(srcBits, GrafPtr(toolWndo)^.portBits, srcBits.bounds, theRect, srcCopy, nil); HSetState(Handle(theSICN), state); end; {=================================} procedure ArrangeTiles; var i, panel: Integer; begin for i := 0 to 7 do begin panel := thisRoom.tileOrder[i]; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, BitMapPtr(virginCPtr^.portPixMap^)^, tileRects[panel], tileRects[i], srcCopy, nil) else CopyBits(offLoadMap, offVirginMap, tileRects[panel], tileRects[i], srcCopy, nil); end; end; {=================================} procedure LoadABackground; var refNumber: Integer; tempByte: SignedByte; thePict: PicHandle; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin CloseResFile(refNumber); UseResFile(editorResNum); GenericAlert(kErrGraphicsNotFound); Exit(LoadABackground); end; thePict := GetPicture(whichID); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin case whichID of {try to substitute} 205: thePict := GetPicture(201); 206: thePict := GetPicture(204); 207: thePict := GetPicture(200); 208: thePict := GetPicture(203); 209: thePict := GetPicture(200); otherwise begin GenericAlert(kErrGraphicLoad); Exit(LoadABackground); end; end; if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); Exit(LoadABackground); end; GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); CloseResFile(refNumber); UseResFile(editorResNum); if (toolWndo <> nil) then SetPort(toolWndo); ArrangeTiles; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, nil); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, GrafPtr(mainWndo)^.visRgn) end else begin CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, nil); CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); end; end; {=================================} procedure FillNFrame (theColor: RGBColor; theRect: Rect); begin RGBForeColor(theColor); PaintRect(theRect); RGBForeColor(rgbBlack); FrameRect(theRect); end; {=================================} procedure GrayNFrame (theRect: Rect); begin FillRect(theRect, gray); FrameRect(theRect); end; {=================================} procedure HiLiteARect (theColor: RGBColor; theRect: Rect); begin RGBForeColor(theColor); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); LineTo(theRect.right - 2, theRect.bottom - 2); RGBForeColor(rgbBlack); end; {=================================} procedure GrayLiteARect (theRect: Rect); begin PenPat(white); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); LineTo(theRect.right - 2, theRect.bottom - 2); PenNormal; MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 2, theRect.bottom - 2); end; {=================================} procedure LoLiteARect (theRect: Rect); begin RGBForeColor(rgbLtBrown); MoveTo(theRect.left - 1, theRect.top); LineTo(theRect.left - 1, theRect.bottom); LineTo(theRect.right - 1, theRect.bottom); RGBForeColor(rgbDkGray); MoveTo(theRect.left, theRect.top - 1); LineTo(theRect.right, theRect.top - 1); LineTo(theRect.right, theRect.bottom); RGBForeColor(rgbBlack); end; {=================================} procedure GrayLoARect (theRect: Rect); begin PenPat(white); MoveTo(theRect.left - 1, theRect.top); LineTo(theRect.left - 1, theRect.bottom); LineTo(theRect.right - 1, theRect.bottom); PenNormal; MoveTo(theRect.left, theRect.top - 1); LineTo(theRect.right, theRect.top - 1); LineTo(theRect.right, theRect.bottom); end; {=================================} procedure DrawTable (whichItem: Integer); var kind: Integer; theRect, tempRect: Rect; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; if (inColor) then {***** Draw table top} begin FillNFrame(rgbBrown, theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); HiLiteARect(rgbLtBrown, theRect); end else begin GrayNFrame(theRect); GrayLiteARect(theRect); end; PenNormal; {***** Draw table shadow} SetRect(tempRect, theRect.left, floorVert - 0, theRect.right, floorVert + 20); OffsetRect(tempRect, (theRect.top - floorVert) div 5, 0); if (inColor) then begin PenMode(patCopy + transparent); PenPat(gray); PaintOval(tempRect); end else begin PenMode(patOr); PenPat(gray); PaintOval(tempRect); end; PenNormal; if (inColor) then {***** Draw table support} begin RGBForeColor(rgbBlack); PenSize(5, 1); MoveTo(((theRect.left + theRect.right) div 2) - 2, theRect.bottom); LineTo(((theRect.left + theRect.right) div 2) - 2, floorVert - 7); RGBForeColor(rgbWhite); PenSize(1, 1); MoveTo(((theRect.left + theRect.right) div 2) + 1, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 1, floorVert - 7); RGBForeColor(rgbLtBrown); MoveTo(((theRect.left + theRect.right) div 2) + 0, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 0, floorVert - 7); RGBForeColor(rgbBlack); end else begin PenSize(5, 1); MoveTo(((theRect.left + theRect.right) div 2) - 2, theRect.bottom); LineTo(((theRect.left + theRect.right) div 2) - 2, floorVert - 7); PenPat(white); PenSize(1, 1); MoveTo(((theRect.left + theRect.right) div 2) + 1, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 1, floorVert - 7); PenPat(gray); MoveTo(((theRect.left + theRect.right) div 2) + 0, theRect.bottom + (theRect.right - theRect.left) div 8); LineTo(((theRect.left + theRect.right) div 2) + 0, floorVert - 7); end; PenNormal; tempRect := srcRect[kind];{***** Draw table base} OffsetRect(tempRect, -tempRect.left, -tempRect.top); OffsetRect(tempRect, ((theRect.left + theRect.right) div 2) - 31, floorVert - 7); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kind], srcRect[kind], tempRect); end; {=================================} procedure DrawShelf (whichItem: Integer); var kind: Integer; theRect, tempRect: Rect; tempRgn: RgnHandle; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; if (inColor) then {***** Draw shelf top} begin RGBForeColor(rgbLtBrown); PaintRect(theRect); FrameRect(theRect); MoveTo(theRect.left + 1, theRect.bottom - 2); LineTo(theRect.right - 1, theRect.bottom - 2); RGBForeColor(rgbWhite); MoveTo(theRect.left + 1, theRect.top + 1); LineTo(theRect.right - 2, theRect.top + 1); end else begin GrayNFrame(theRect); GrayLiteARect(theRect); end; PenNormal; tempRgn := NewRgn; {***** Draw shelf shadow} MoveTo(theRect.right, theRect.bottom - 1); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom + 14); Line(0, -5); Line(15, -15); Line(0, 5); LineTo(theRect.right, theRect.bottom - 1); CloseRgn(tempRgn); PenPat(gray); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(tempRgn); end else begin PenMode(patOr); PaintRgn(tempRgn); end; DisposeRgn(tempRgn); PenNormal; tempRect := srcRect[kind]; {***** Draw shelf bracket 1} OffsetRect(tempRect, -tempRect.left, -tempRect.top); {0 it out} OffsetRect(tempRect, theRect.left + 15, theRect.bottom - 2); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kind], srcRect[kind], tempRect); tempRect := srcRect[kind]; {***** Draw shelf bracket 2} OffsetRect(tempRect, -tempRect.left, -tempRect.top); {0 it out} OffsetRect(tempRect, theRect.right - 25, theRect.bottom - 2); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kind], srcRect[kind], tempRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kind], srcRect[kind], tempRect); end; {=================================} procedure DrawMirror (whichItem: Integer); var theRect: Rect; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do theRect := boundRect; if (inColor) then begin FillNFrame(rgbBrown, theRect); HiLiteARect(rgbLtBrown, theRect); end else begin GrayNFrame(theRect); GrayLiteARect(theRect); end; InsetRect(theRect, 3, 3); FillRect(theRect, white); FrameRect(theRect); PenNormal; end; {=================================} procedure DrawCabinet (whichItem: Integer); var panels, width, index, offIt: Integer; theRect, tempR: Rect; shadoRgn: RgnHandle; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do theRect := boundRect; tempR := theRect; if (theRect.bottom > 280) then {*** If the cabnet is a counter} begin tempR.bottom := tempR.bottom - 5; {*** Paint bulk of counter} if (inColor) then FillNFrame(rgbBrown, tempR) else GrayNFrame(tempR); tempR := theRect; {*** Paint foot-kick on bottom} InsetRect(tempR, 2, 0); tempR.top := tempR.bottom - 5; if (inColor) then FillNFrame(rgbDkGray, tempR) else begin FillRect(tempR, dkGray); FrameRect(tempR); end; {*** Paint counter-top} SetRect(tempR, theRect.left - 2, theRect.top, theRect.right + 2, theRect.top + 7); if (inColor) then FillNFrame(rgbLtBrown, tempR) else begin FillRect(tempR, ltGray); FrameRect(tempR); end; MoveTo(tempR.left + 2, tempR.bottom); LineTo(tempR.right - 3, tempR.bottom); shadoRgn := NewRgn; {*** Paint counter shadow} MoveTo(theRect.left, theRect.top + 5); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom - 10); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top + 5); CloseRgn(shadoRgn); HLock(Handle(shadoRgn)); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(shadoRgn); end else begin PenMode(patOr); PenPat(gray); PaintRgn(shadoRgn); end; HUnlock(Handle(shadoRgn)); DisposeRgn(shadoRgn); PenNormal; offIt := 5; end else {*** It's a cabinet} begin if (inColor) then {*** Paint bulk of cabinet} FillNFrame(rgbBrown, theRect) else GrayNFrame(theRect); shadoRgn := NewRgn; {*** Paint the shadow} MoveTo(theRect.left, theRect.top); OpenRgn; Line(-15, 15); LineTo(theRect.left - 15, theRect.bottom + 15); LineTo(theRect.right - 15, theRect.bottom + 15); Line(15, -15); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top); CloseRgn(shadoRgn); HLock(Handle(shadoRgn)); if (inColor) then begin PenMode(srcCopy + transparent); PenPat(gray); PaintRgn(shadoRgn); end else begin PenMode(patOr); PenPat(gray); PaintRgn(shadoRgn); end; HUnlock(Handle(shadoRgn)); DisposeRgn(shadoRgn); PenNormal; offIt := 0; end; panels := (theRect.right - theRect.left) div 48; if (panels = 0) then begin tempR := theRect; InsetRect(tempR, 5, 5 + offIt); FrameRect(tempR); if (inColor) then begin RGBForeColor(rgbLtBrown); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); RGBForeColor(rgbBlack); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end else begin PenPat(white); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); PenPat(black); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end; end else begin width := ((theRect.right - theRect.left) - (panels + 1) * 5) div panels; SetRect(tempR, theRect.left + 5, theRect.top + 5 + offIt, theRect.left + 5 + width, theRect.bottom - 5 - offIt); for index := 1 to panels do begin if (inColor) then begin RGBForeColor(rgbLtBrown); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); RGBForeColor(rgbBlack); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end else begin FrameRect(tempR); PenPat(white); MoveTo(tempR.left + 3, tempR.top + 3); LineTo(tempR.left + 3, tempR.bottom - 4); LineTo(tempR.right - 4, tempR.bottom - 4); PenPat(black); LineTo(tempR.right - 4, tempR.top + 3); LineTo(tempR.left + 3, tempR.top + 3); end; OffsetRect(tempR, width + 5, 0); end; end; PenNormal; end; {=================================} procedure DrawARect (whichItem: Integer; popAmount: Boolean); var tempStr: Str255; theRect: Rect; number: Integer; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do begin number := amount; theRect := boundRect; end; PenPat(gray); FrameRect(theRect); PenNormal; if (popAmount) then begin PenMode(srcOr); MoveTo(theRect.left + 2, theRect.bottom - 2); NumToString(number, tempStr); DrawString(tempStr); PenNormal; end; end; {=================================} procedure DrawWindow (whichItem: Integer); var theRect, tempRect: Rect; kind: Integer; tempRgn: RgnHandle; windowOpen: Boolean; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; with thisRoom.theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; windowOpen := isOn; end; tempRgn := NewRgn; {***** Draw window shadow} MoveTo(theRect.left, theRect.top); OpenRgn; Line(-10, 10); Line(0, 5); Line(5, 5); LineTo(theRect.left - 5, theRect.bottom - 10); Line(-5, 5); Line(0, 5); Line(5, 5); LineTo(theRect.right - 5, theRect.bottom + 5); LineTo(theRect.right, theRect.bottom); LineTo(theRect.left, theRect.bottom); LineTo(theRect.left, theRect.top); CloseRgn(tempRgn); PenPat(gray); if (inColor) then begin RGBForeColor(rgbBlack); PenMode(patCopy + transparent); PenPat(gray); PaintRgn(tempRgn); end else begin PenMode(patOr); PaintRgn(tempRgn); end; DisposeRgn(tempRgn); PenNormal; if (inColor) then begin FillNFrame(rgbBrown, theRect); {***** Draw window frame and sill} HiLiteARect(rgbLtBrown, theRect); SetRect(tempRect, theRect.left - 4, theRect.top, theRect.right + 4, theRect.top + 6); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); SetRect(tempRect, theRect.left - 2, theRect.top + 6, theRect.right + 2, theRect.top + 10); FillNFrame(rgbBrown, tempRect); SetRect(tempRect, theRect.left - 4, theRect.bottom - 6, theRect.right + 4, theRect.bottom); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); SetRect(tempRect, theRect.left - 2, theRect.bottom - 10, theRect.right + 2, theRect.bottom - 5); FillNFrame(rgbBrown, tempRect); HiLiteARect(rgbLtBrown, tempRect); tempRect := theRect; InsetRect(tempRect, 8, 16); FillNFrame(rgbBrown, tempRect); LoLiteARect(tempRect); tempRect := theRect; {***** Draw the top window pane} InsetRect(tempRect, 8, 16); tempRect.bottom := ((theRect.bottom + theRect.top) div 2) + 2; FillNFrame(rgbBrown, tempRect); InsetRect(tempRect, 6, 6); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); FillNFrame(rgbBlack, tempRect); LoLiteARect(tempRect); tempRect := theRect; {Fill bottom black} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) + 2; FillRect(tempRect, black); tempRect := theRect; {***** Draw the bottom window pane} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) - 2; if (windowOpen) then OffsetRect(tempRect, 0, 26 - ((theRect.bottom - theRect.top) div 2)); FillNFrame(rgbBrown, tempRect); InsetRect(tempRect, 6, 6); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); LoLiteARect(tempRect); InsetRect(tempRect, 2, 2); FillNFrame(rgbBlack, tempRect); LoLiteARect(tempRect); RGBForeColor(rgbBlack); end else begin GrayNFrame(theRect); {***** Draw window frame and sill} GrayLiteARect(theRect); SetRect(tempRect, theRect.left - 4, theRect.top, theRect.right + 4, theRect.top + 6); GrayNFrame(tempRect); GrayLiteARect(tempRect); SetRect(tempRect, theRect.left - 2, theRect.top + 6, theRect.right + 2, theRect.top + 10); GrayNFrame(tempRect); SetRect(tempRect, theRect.left - 4, theRect.bottom - 6, theRect.right + 4, theRect.bottom); GrayNFrame(tempRect); GrayLiteARect(tempRect); SetRect(tempRect, theRect.left - 2, theRect.bottom - 10, theRect.right + 2, theRect.bottom - 5); GrayNFrame(tempRect); GrayLiteARect(tempRect); tempRect := theRect; InsetRect(tempRect, 8, 16); GrayNFrame(tempRect); GrayLoARect(tempRect); tempRect := theRect; {***** Draw the top window pane} InsetRect(tempRect, 8, 16); tempRect.bottom := ((theRect.bottom + theRect.top) div 2) + 2; GrayNFrame(tempRect); InsetRect(tempRect, 6, 6); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); FillRect(tempRect, black); GrayLoARect(tempRect); tempRect := theRect; {Fill bottom black} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) + 2; FillRect(tempRect, black); tempRect := theRect; {***** Draw the bottom window pane} InsetRect(tempRect, 8, 16); tempRect.top := ((theRect.bottom + theRect.top) div 2) - 2; if (windowOpen) then OffsetRect(tempRect, 0, 26 - ((theRect.bottom - theRect.top) div 2)); GrayNFrame(tempRect); InsetRect(tempRect, 6, 6); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); GrayLoARect(tempRect); InsetRect(tempRect, 2, 2); FillRect(tempRect, black); GrayLoARect(tempRect); end; end; {=================================} procedure DrawStair (whichItem: Integer); var refNumber, kind: Integer; tempByte: SignedByte; theRect: Rect; thePict: PicHandle; begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); with thisRoom.theObjects[whichItem] do begin kind := objectIs; theRect := boundRect; end; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin CloseResFile(refNumber); UseResFile(editorResNum); GenericAlert(kErrGraphicsNotFound); Exit(DrawStair); end; if (kind = upStar) then thePict := GetPicture(198) else thePict := GetPicture(199); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, theRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); CloseResFile(refNumber); UseResFile(editorResNum); end; {=================================} procedure DrawAllObjects; var wasPort: GrafPtr; index, nObjects, holdSelect: Integer; theSrc, destRect: Rect; begin GetPort(wasPort); nObjects := thisRoom.numberOObjects; if (nObjects = 0) then begin if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offVirginMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); Exit(DrawAllObjects); end; if (lightsOut) then begin if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); PenNormal; PaintRect(wholeArea); for index := 1 to thisRoom.numberOObjects do with thisRoom.theObjects[index] do if (objectIs = litSwt) then begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offLoadMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); Exit(DrawAllObjects); end; holdSelect := oneActive; if (holdSelect <> 0) then Deselect; if (inColor) then CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, wholeArea, wholeArea, srcCopy, wholeRgn) else CopyBits(offVirginMap, offLoadMap, wholeArea, wholeArea, srcCopy, wholeRgn); for index := 1 to thisRoom.numberOObjects do with thisRoom.theObjects[index] do case objectIs of table: DrawTable(index); shelf: DrawShelf(index); cabNet: DrawCabinet(index); books: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; extRct, bnsRct: DrawArect(index, TRUE); obsRct: DrawArect(index, FALSE); flrVnt..candle: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; lftFan, ritFan: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; grease: begin if (isOn) then theSrc := srcRect[objectIs] {grease is up} else theSrc := srcRect[59]; {grease has fallen} destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; clock, paper, battry, rbrBnd: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; litSwt..guitar: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; toastr..teaKtl: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; drip: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; window: DrawWindow(index); mirror: DrawMirror(index); paintg: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyBits(BitMapPtr(objectCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, destRect, srcCopy, nil) else CopyBits(offPlayerMap, offLoadMap, theSrc, destRect, srcCopy, nil); end; basket, macTsh: begin theSrc := srcRect[objectIs]; destRect := boundRect; if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, theSrc, theSrc, destRect) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, theSrc, theSrc, destRect); end; upStar, dnStar: DrawStair(index); otherwise Cycle; end; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offLoadMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); if (holdSelect <> 0) then begin oneActive := holdSelect; Select; end; if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-FileInNOut.p b/RoomEditor_103/Sources/E-FileInNOut.p new file mode 100755 index 0000000..963a42f --- /dev/null +++ b/RoomEditor_103/Sources/E-FileInNOut.p @@ -0,0 +1 @@ +unit FileInNOut; interface uses Palettes, Globals, Utilities; function OpenFile (fileName: Str255; vNum: Integer): Boolean; function DoOpen: Boolean; function WriteFile (theFile, volNum: Integer): Boolean; function DoSaveAs: Boolean; function DoSave: Boolean; function DoClose: Boolean; function SaveNoClose: Integer; function SaveFirst: Integer; procedure SavePrefs; implementation {=================================} function IOCheck (theErr: OSErr): Integer; var dummyInt: Integer; line1, line2: Str255; alertHandle: AlertTHndl; alertRect: Rect; begin UseResFile(editorResNum); if (theErr <> NoErr) then begin InitCursor; case theErr of DskFulErr: GetIndString(line1, fileStrIDs, 1); FNFErr: GetIndString(line1, fileStrIDs, 2); WPrErr: GetIndString(line1, fileStrIDs, 3); FLckdErr: GetIndString(line1, fileStrIDs, 4); VLckdErr: GetIndString(line1, fileStrIDs, 5); FBsyErr, OpWrErr: GetIndString(line1, fileStrIDs, 6); EOFErr: GetIndString(line1, fileStrIDs, 7); otherwise GetIndString(line1, fileStrIDs, 10); end; NumToString(theErr, line2); line2 := CONCAT('Error code = ', line2); ParamText(line1, line2, '', ''); alertHandle := AlertTHndl(Get1Resource('ALRT', fileAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(fileAlertID, nil); end; IOCheck := theErr; end; {=================================} function OpenFile; var textLength: LongInt; resultCode: OSErr; dummy: Boolean; begin SpinBall; OpenFile := FALSE; resultCode := FSOpen(fileName, vNum, fileNumber); if (IOCheck(resultCode) <> 0) then Exit(OpenFile); SpinBall; resultCode := SetFPos(fileNumber, FSFromStart, 0); if (IOCheck(resultCode) <> 0) then begin fileIsOpen := TRUE; dummy := DoClose; Exit(OpenFile); end; SpinBall; textLength := SIZEOF(houseRec); resultCode := FSRead(fileNumber, textLength, @thisHouse); if (IOCheck(resultCode) <> 0) then begin fileIsOpen := TRUE; dummy := DoClose; Exit(OpenFile); end; SpinBall; if (thisHouse.timeStamp <= 0) then begin GenericAlert(24); fileIsOpen := TRUE; volumeNumber := vNum; dummy := DoClose; Exit(OpenFile); end; SpinBall; fileIsOpen := TRUE; OpenFile := TRUE; lockIt := FALSE; volumeNumber := vNum; end; {=================================} function SimpleFileFilter (p: ParmBlkPtr): BOOLEAN; begin SimpleFileFilter := TRUE; {Don't show it -- default} with p^.ioFlFndrInfo do if (fdType = 'GLhs') then SimpleFileFilter := FALSE; {Show it} end; {=====================================} function DoOpen; var dlgOrigin: Point; theTypeList: SFTypeList; theReply: SFReply; begin DoOpen := FALSE; SetPt(dlgOrigin, dlgLeft + rightOffset, dlgTop + downOffset); theTypeList[0] := 'GLhs'; SFPGetFile(dlgOrigin, '', @SimpleFileFilter, -1, theTypeList, nil, theReply, custGetID, nil); with theReply do begin if (good) then begin housesName := fName; DoOpen := (OpenFile(fName, vRefNum)); InitCursor; end else begin DoOpen := FALSE; Exit(DoOpen); end; end; end; {=====================================} function WriteFile; var index, temp: Integer; fileLength: LongInt; resultCode: OSErr; begin SpinBall; WriteFile := FALSE; fileLength := SIZEOF(houseRec); SpinBall; resultCode := SetFPos(theFile, FSFromStart, 0); if (IOCheck(resultCode) <> 0) then begin Exit(WriteFile); end; SpinBall; resultCode := FSWrite(theFile, fileLength, @thisHouse); if (IOCheck(resultCode) <> 0) then begin Exit(WriteFile); end; SpinBall; resultCode := SetEOF(theFile, fileLength); if (IOCheck(resultCode) <> 0) then begin Exit(WriteFile); end; SpinBall; resultCode := FlushVol(nil, volNum); if (IOCheck(resultCode) <> 0) then begin Exit(WriteFile); end; SpinBall; changed := FALSE; WriteFile := TRUE; end; {=====================================} function DoSaveAs; var dlgOrigin: Point; theReply: SFReply; resultCode: OSErr; theInfo: FInfo; begin DoSaveAs := FALSE; if (fileIsOpen) then begin if (not DoClose) then Exit(DoSaveAs); end; SetPt(dlgOrigin, dlgLeft + rightOffset + 20, dlgTop + downOffset); SFPutFile(dlgOrigin, 'Name for house:', '', nil, theReply); with theReply do begin if (not good) then Exit(DoSaveAs); volumeNumber := vRefNum; resultCode := GetFInfo(fName, vRefNum, theInfo); case resultCode of NoErr: if (theInfo.fdType <> 'GLhs') then begin GenericAlert(kErrFileExists); Exit(DoSaveAs); end; FNFErr: begin resultCode := Create(fname, vRefNum, 'GLed', 'GLhs'); if (IOCheck(resultCode) <> 0) then Exit(DoSaveAs); end; otherwise begin GenericAlert(resultCode); Exit(DoSaveAs); end; end; {end - case} {SetCursor- watch} housesName := fName; if (thisHouse.firstFile = '') then thisHouse.firstFile := housesName; GetDateTime(thisHouse.timeStamp); if (not lockIt) then thisHouse.timeStamp := -thisHouse.timeStamp; SpinBall; resultCode := FSOpen(fName, vRefNum, fileNumber); if (IOCheck(resultCode) <> 0) then Exit(DoSaveAs); if (not WriteFile(fileNumber, vRefNum)) then begin InitCursor; Exit(DoSaveAs); end; InitCursor; end; {end - with} fileIsOpen := TRUE; EnableItem(GetMenu(mFile), iSave); DoSaveAs := TRUE; end; {=====================================} function DoSave; var resultCode: OSErr; begin DoSave := FALSE; if ((housesName = 'untitled') and (not fileIsOpen)) then begin if (not DoSaveAs) then Exit(DoSave); end else begin GetDateTime(thisHouse.timeStamp); if (not lockIt) then thisHouse.timeStamp := -thisHouse.timeStamp; if (not WriteFile(fileNumber, volumeNumber)) then begin InitCursor; Exit(DoSave); end; InitCursor; end; DoSave := TRUE; end; {=================================} function DoClose; var resultCode: OSErr; begin DoClose := FALSE; if (fileIsOpen) then begin resultCode := FSClose(fileNumber); if (IOCheck(resultCode) <> 0) then Exit(DoClose); resultCode := FlushVol(nil, volumeNumber); if (IOCheck(resultCode) <> 0) then Exit(DoClose); EnableItem(GetMenu(mFile), 1); EnableItem(GetMenu(mFile), 2); DisableItem(GetMenu(mFile), 4); DisableItem(GetMenu(mFile), 5); DisableItem(GetMenu(mFile), 6); DisableItem(GetMenu(mFile), 7); end; fileIsOpen := FALSE; housesName := 'untitled'; DoClose := TRUE; end; {=====================================} function SaveNoClose; const saveBut = 1; closeBut = 2; cancelBut = 6; var leaveDlg: Boolean; theDlgPtr: DialogPtr; wasPort: GrafPtr; tempRect: Rect; cntlType, index, itemHit, tempInt, rightOff, downOff: Integer; dlgItem: Handle; {-------------------------} procedure Redraw; var index: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, saveBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(saveNoCloseID, nil, Pointer(-1)); with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); Redraw; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); if (itemHit = saveBut) or (itemHit = closeBut) or (itemHit = cancelBut) then begin SaveNoClose := itemHit; leaveDlg := TRUE; end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=====================================} function SaveFirst; const saveBut = 1; quitBut = 2; cancelBut = 6; var leaveDlg: Boolean; theDlgPtr: DialogPtr; wasPort: GrafPtr; tempRect: Rect; cntlType, index, itemHit, tempInt, rightOff, downOff: Integer; dlgItem: Handle; {-------------------------} procedure Redraw; var index: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, saveBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(saveNoQuitID, nil, Pointer(-1)); with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); Redraw; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); if (itemHit = saveBut) or (itemHit = quitBut) or (itemHit = cancelBut) then begin SaveFirst := itemHit; leaveDlg := TRUE; end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=================================} procedure SavePrefs; type prefType = record resName: string[32]; controlIs: Integer; leftIs, rightIs, energyIs, bandIs: Integer; buttonIs, restoreIs: Boolean; leftNameIs, rightNameIs, energyNameIs, bandNameIs: string[12]; isKeyBoard: Integer; end; prefPtr = ^prefType; prefHand = ^prefPtr; var theirPrefs: prefHand; theErr: OSErr; volName: Str255; begin UseResFile(editorResNum); theirPrefs := prefHand(NewHandle(SIZEOF(prefType))); if (theirPrefs <> nil) then HLock(Handle(theirPrefs)) else begin GenericAlert(kErrSavingPrefs); Exit(SavePrefs); end; Handle(theirPrefs) := GetResource('Gprf', 128); if ((ResError = noErr) and (theirPrefs <> nil)) then with theirPrefs^^ do begin resName := resourceName; controlIs := controlMethod; leftIs := leftKey; rightIs := rightKey; energyIs := energyKey; bandIs := bandKey; buttonIs := buttonFires; restoreIs := restoreColor; leftNameIs := leftName; rightNameIs := rightName; energyNameIs := energyName; bandNameIs := bandName; isKeyBoard := herKeyBoard; end else begin GenericAlert(kErrSavingPrefs); Exit(SavePrefs); end; ChangedResource(Handle(theirPrefs)); WriteResource(Handle(theirPrefs)); if (ResError <> noErr) then begin if ((ResError = FLckdErr) or (ResError = VLckdErr) or (ResError = WPrErr)) then GenericAlert(kErrSavingPrefs) else GenericAlert(ResError); end; HUnlock(Handle(theirPrefs)); ReleaseResource(Handle(theirPrefs)); end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-FlyGlider.p b/RoomEditor_103/Sources/E-FlyGlider.p new file mode 100755 index 0000000..531123f --- /dev/null +++ b/RoomEditor_103/Sources/E-FlyGlider.p @@ -0,0 +1 @@ +unit FlyGlider; interface uses Palettes, Globals, Utilities, Drawing, ObjectStuff; procedure ResetGlider; procedure ExtractEventRects; procedure ReadyRoom; procedure FlyGlider; var nObjects: Integer; timeIs: LongInt; testRoom: roomData; {=================================} implementation {=================================} procedure CenterMouse; const MBState = $172; MTemp = $828; RawMouse = $82C; Mouse = $830; CrsrNew = $8CE; CrsrCouple = $8CF; Couple = $FF; Uncouple = $00; var center: Point; lowGlob: Integer; lowMem: Ptr; pointPtr: ^Point; begin SetPt(center, 256, 171); lowMem := Pointer(rawMouse); pointPtr := @lowMem^; pointPtr^ := center; lowMem := Pointer(MTemp); pointPtr := @lowMem^; pointPtr^ := center; lowMem := Pointer(CrsrNew); lowMem^ := $FFFF; end; {=================================} procedure ReadyGlider; var mousePt: Point; dummyLong, timeToStop: LongInt; tempRect: Rect; begin with theGlider do begin bands := 0; forVel := 4; energy := 0; mode := fadingIn; phase := 0; isForward := TRUE; isRight := TRUE; if (isRight) then SetRect(destRect, 0, 40, 48, 60) else SetRect(destRect, 464, 40, 512, 60); oldRect := destRect; wholeRect := destRect; srcNum := 0; mass := currMass; end; lifeNormal := FALSE; PenNormal; PenMode(patXOr); FrameRect(theGlider.destRect); repeat until not Button; repeat with theGlider do begin FrameRect(oldRect); GetMouse(mousePt); SetRect(destRect, -24, -10, 24, 10); OffsetRect(destRect, mousePt.h, mousePt.v); FrameRect(destRect); oldRect := destRect; end; until Button; FrameRect(theGlider.oldRect); tempRect := theGlider.oldRect; InsetRect(tempRect, -1, -1); FrameRect(tempRect); with theGlider do begin oldRect := destRect; wholeRect := destRect; shadoDest := destRect; shadoDest.top := floorVert; shadoDest.bottom := floorVert + 11; oldShado := shadoDest; wholeShado := shadoDest; touchRect := destRect; InsetRect(touchRect, 10, 5); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, glideRct[srcNum], glideRct[srcNum], destRect) else CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect) end; timeToStop := TickCount + 120; repeat SpinBall; Delay(2, dummyLong); until (TickCount > timeToStop); FrameRect(tempRect); end; {=================================} procedure ExtractEventRects; var index, tempInt, tempNum: Integer; tempRect: Rect; {-------------------------} procedure SetUpGrease; begin nCycleObs := nCycleObs + 1; with testRoom.theObjects[index] do begin if (isOn) then begin eventRect[index] := boundRect; with cycleObjects[nCycleObs] do begin kindIs := grease; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := 0; {phase=not spilled} accel := grease; {graphic # to display} velocity := wholeRect.right;{current length of spill} position := amount; {full length of spill} end; end else begin eventRect[index].left := boundRect.right; eventRect[index].bottom := boundRect.bottom; eventRect[index].right := amount; eventRect[index].top := boundRect.bottom - 4; with cycleObjects[nCycleObs] do begin kindIs := grease; tiedTo := index; wholeRect := boundRect; oldRect := wholeRect; reset := 999; {phase=spilled} accel := 59; {graphic # to display} velocity := amount; {current length of spill} position := amount; {length of spill} end; end; end; end; {-------------------------} procedure FrameOutlet; begin nCycleObs := nCycleObs + 1; eventRect[index] := testRoom.theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := outlet; tiedTo := index; eventKind[tiedTo, 1] := 0; accel := 25; wholeRect := testRoom.theObjects[index].boundRect; oldRect := wholeRect; reset := testRoom.theObjects[index].amount; position := TickCount; end; end; {-------------------------} procedure FrameCandle; begin nCycleObs := nCycleObs + 1; with testRoom.theObjects[index] do begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 12, amount, tempInt + 4, boundRect.top); end; with cycleObjects[nCycleObs] do begin wholeRect := testRoom.theObjects[index].boundRect; wholeRect.bottom := wholeRect.top; wholeRect.top := wholeRect.bottom - 12; wholeRect.left := wholeRect.left + 5; wholeRect.right := wholeRect.left + 16; oldRect := wholeRect; kindIs := candle; position := DoRandom(3) + 48; end; end; {-------------------------} procedure FrameDrip; var objectType: Integer; begin nCycleObs := nCycleObs + 1; eventRect[index] := testRoom.theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := drip; tiedTo := index; holdRect := testRoom.theObjects[index].boundRect; wholeRect := holdRect; oldRect := wholeRect; reset := testRoom.theObjects[index].amount * 32; accel := 12; position := holdRect.bottom * 32; velocity := 0; phase := 53; with testRoom.theObjects[index] do if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[objectIs], srcRect[objectIs], boundRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[objectIs], srcRect[objectIs], boundRect); end; end; {-------------------------} procedure ReadyToast; begin nCycleObs := nCycleObs + 1; with testRoom.theObjects[index] do begin tempInt := boundRect.left + 3; tempNum := boundRect.bottom - 3; SetRect(eventRect[index], 0, 0, 32, 31); OffsetRect(eventRect[index], tempInt, tempNum); SetRect(tempRect, tempInt, amount, tempInt + 32, boundRect.top); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[objectIs], srcRect[objectIs], boundRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[objectIs], srcRect[objectIs], boundRect); end; toastRgn := NewRgn; RectRgn(toastRgn, tempRect); hasToast := TRUE; with cycleObjects[nCycleObs] do begin phase := 60; kindIs := toastr; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := tempNum * 32; accel := 8; position := reset; tempInt := (testRoom.theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure FrameBall; begin nCycleObs := nCycleObs + 1; eventRect[index] := testRoom.theObjects[index].boundRect; with cycleObjects[nCycleObs] do begin kindIs := ball; tiedTo := index; wholeRect := testRoom.theObjects[index].boundRect; oldRect := wholeRect; reset := testRoom.theObjects[index].boundRect.bottom * 32; accel := 8; position := reset; tempInt := (testRoom.theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure ReadyFish; begin nCycleObs := nCycleObs + 1; with testRoom.theObjects[index] do begin tempInt := boundRect.left + 8; tempNum := boundRect.top + 24; SetRect(eventRect[index], 0, 0, 16, 16); {fish rectangle} OffsetRect(eventRect[index], tempInt, tempNum); if (inColor) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(virginCPtr^.portPixMap^)^, srcRect[objectIs], srcRect[objectIs], boundRect) else CopyMask(offPlayerMap, offMaskMap, offVirginMap, srcRect[objectIs], srcRect[objectIs], boundRect); end; with cycleObjects[nCycleObs] do begin phase := 69; {# of fish rect} kindIs := fshBwl; tiedTo := index; wholeRect := eventRect[index]; oldRect := wholeRect; reset := tempNum * 32; accel := 8; position := reset; tempInt := (testRoom.theObjects[index].amount + 32) * 32; velocity := 0; repeat velocity := velocity + accel; tempInt := tempInt + velocity; until (tempInt > reset); velocity := -velocity; end; end; {-------------------------} procedure ReadyTea; begin nCycleObs := nCycleObs + 1; with testRoom.theObjects[index] do begin tempInt := boundRect.left; tempNum := boundRect.top; SetRect(eventRect[index], tempInt - 128, tempNum - 128, tempInt, tempNum); if (eventRect[index].top < ceilingVert) then eventRect[index].top := ceilingVert; if (eventRect[index].left < 0) then eventRect[index].left := 0; end; with cycleObjects[nCycleObs] do begin phase := 0; kindIs := teaKtl; tiedTo := index; SetRect(wholeRect, 0, 0, 0, 0); oldRect := wholeRect; position := testRoom.theObjects[index].amount; reset := position + DoRandom(120); end; end; {-------------------------} procedure FrameWindow; begin nObjects := nObjects - 1; end; {-------------------------} procedure FrameMirror; begin nObjects := nObjects - 1; with testRoom.theObjects[index] do tempRect := boundRect; InsetRect(tempRect, 5, 5); end; {-------------------------} begin windowOpen := FALSE; if (testRoom.conditionCode = 2) then lightsOut := TRUE else lightsOut := FALSE; if (testRoom.conditionCode = 1) then airOut := TRUE else airOut := FALSE; nCycleObs := 0; nObjects := testRoom.numberOObjects; tempNum := nObjects; for index := 1 to tempNum do with testRoom.theObjects[index] do begin case objectIs of table..obsRct: eventRect[index] := boundRect; flrVnt: begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, amount, tempInt + 8, floorVert); end; celVnt: begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, ceilingVert, tempInt + 8, amount); end; celDct: if (isOn) then begin tempInt := (boundRect.right + boundRect.left) div 2; SetRect(eventRect[index], tempInt - 8, ceilingVert, tempInt + 8, amount); end else begin eventRect[index] := boundRect; eventRect[index].bottom := eventRect[index].top + 8; end; candle: FrameCandle; lftFan: SetRect(eventRect[index], amount, boundRect.top + 10, boundRect.left, boundRect.top + 30); ritFan: SetRect(eventRect[index], boundRect.right, boundRect.top + 10, amount, boundRect.top + 30); clock, paper: eventRect[index] := boundRect; grease: SetUpGrease; bnsRct..rbrBnd: eventRect[index] := boundRect; litSwt, thermo, pwrSwt: eventRect[index] := boundRect; shredr: begin eventRect[index] := boundRect; eventRect[index].top := eventRect[index].top - 4; eventRect[index].bottom := eventRect[index].bottom - 12; end; outlet: FrameOutlet; guitar: with boundRect do SetRect(eventRect[index], left + 36, top + 24, left + 38, bottom - 56); ball: FrameBall; drip: FrameDrip; toastr: ReadyToast; fshBwl: ReadyFish; teaKtl: ReadyTea; window: FrameWindow; paintg: nObjects := nObjects - 1; mirror: FrameMirror; basket, macTsh: eventRect[index] := boundRect; upStar: with boundRect do SetRect(eventRect[index], left + 32, top, right - 32, top + 8); dnStar: with boundRect do SetRect(eventRect[index], left + 32, bottom - 8, right - 32, bottom); otherwise eventRect[index] := nullRect; end; {case} eventKind[index, 1] := 0; case objectIs of table, shelf, books, cabnet, obsRct, drip, toastr, ball, fshBwl, basket, macTsh: eventKind[index, 0] := crashIt; extRct: eventKind[index, 0] := moveIt; flrVnt: eventKind[index, 0] := liftIt; celVnt: eventKind[index, 0] := dropIt; celDct: if (isOn) then eventKind[index, 0] := dropIt else begin eventKind[index, 0] := moveIt; eventKind[index, 1] := extra; end; candle: begin eventKind[index, 0] := burnIt; eventKind[index, 1] := boundRect.bottom - 48; end; lftFan: if (isOn) then eventKind[index, 0] := turnItLeft else eventKind[index, 0] := ignoreIt; ritFan: if (isOn) then eventKind[index, 0] := turnItRight else eventKind[index, 0] := ignoreIt; clock: begin eventKind[index, 0] := awardIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; paper: begin eventKind[index, 0] := extraIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; grease: if (isOn) then eventKind[index, 0] := spillIt else eventKind[index, 0] := slideIt; bnsRct: begin eventKind[index, 0] := trickIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; battry: begin eventKind[index, 0] := energizeIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; rbrBnd: begin eventKind[index, 0] := bandIt; eventKind[index, 1] := amount; if (amount < 1) then eventRect[index] := nullRect; end; litSwt: eventKind[index, 0] := lightIt; outlet: eventKind[index, 0] := zapIt; thermo: eventKind[index, 0] := airOnIt; shredr: if (isOn) then eventKind[index, 0] := shredIt else eventKind[index, 0] := ignoreIt; pwrSwt: begin eventKind[index, 0] := toggleIt; eventKind[index, 1] := amount; {object# linked to} end; guitar: begin eventKind[index, 0] := playIt; eventKind[index, 1] := 0; end; upStar: begin eventKind[index, 0] := ascendIt; eventKind[index, 1] := amount; {room # linked to} end; dnStar: begin eventKind[index, 0] := descendIt; eventKind[index, 1] := amount; {room # linked to} end; otherwise eventKind[index, 0] := ignoreIt; end; {case} end; end; {=================================} procedure ReadyRoom; var index: Integer; begin with testRoom do begin rightIsOpen := rightOpen; leftIsOpen := leftOpen; end; ExtractEventRects; end; {=================================} function RectLap (rect1, rect2: Rect): Boolean; var dumRect: Rect; begin RectLap := FALSE; if (rect1.right < rect2.left) then Exit(RectLap); if (rect2.right < rect2.left) then Exit(RectLap); if (rect1.bottom < rect2.top) then Exit(RectLap); if (rect2.bottom < rect2.top) then Exit(RectLap); RectLap := SectRect(rect1, rect2, dumRect); end; {=================================} procedure Collision (whatKind, who: Integer); var tempInt: Integer; tempRect, srcR: Rect; begin case (whatKind) of ignoreIt: ; crashIt: begin SysBeep(1); lifeNormal := FALSE; with theGlider do begin mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; liftIt: if (not airOut) then liftAmount := -7; moveIt: begin SysBeep(1); lifeNormal := FALSE; with theGlider do begin mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; end; dropIt: if (not airOut) then liftAmount := 7; turnItLeft: begin shiftAmount := -7; if (lifeNormal) then with theGlider do if (isRight) then begin lifeNormal := FALSE; theGlider.mode := turnRt2Lf; end; end; turnItRight: begin shiftAmount := 7; if (lifeNormal) then with theGlider do if (not isRight) then begin lifeNormal := FALSE; theGlider.mode := turnLf2Rt; end; end; burnIt: begin liftAmount := -7; if ((lifeNormal) and (theGlider.destRect.bottom > eventKind[who, 1])) then with theGlider do begin SysBeep(1); lifeNormal := FALSE; if (isRight) then phase := 1; mode := burning; destRect.top := destRect.bottom - 36; end; end; awardIt: if (eventKind[who, 1] <> 0) then begin SysBeep(1); eventKind[who, 1] := 0; end; extraIt: if (eventKind[who, 1] <> 0) then begin SysBeep(1); eventKind[who, 1] := 0; end; spillIt: {grease upright} begin eventRect[who].left := eventRect[who].right; eventRect[who].right := eventRect[who].right; eventRect[who].top := eventRect[who].bottom - 5; eventKind[who, 0] := ignoreIt; {signal to the cycleOb loop that a spill has occurred} thisHouse.theRooms[roomAt].theObjects[who].isOn := FALSE; end; slideIt: {grease spilt} begin with theGlider do begin tempInt := eventRect[who].top - touchRect.bottom + 1; destRect.top := destRect.top + tempInt; destRect.bottom := destRect.bottom + tempInt; touchRect.top := touchRect.top + tempInt; touchRect.bottom := touchRect.bottom + tempInt; end; sliding := TRUE; end; bandIt: if (eventKind[who, 1] <> 0) then begin SysBeep(1); eventKind[who, 1] := 0; end; energizeIt: if (eventKind[who, 1] <> 0) then begin SysBeep(1); theGlider.energy := theGlider.energy + eventKind[who, 1]; eventKind[who, 1] := 0; end; trickIt: if (eventKind[who, 1] <> 0) then begin SysBeep(1); eventKind[who, 1] := 0; end; lightIt: if (lightsOut) then begin SysBeep(1); testRoom.conditionCode := 0; lightsOut := FALSE; end; airOnIt: if (airOut) then begin SysBeep(1); airOut := FALSE; end; zapIt: begin if (eventKind[who, 1] <> 0) then begin lifeNormal := FALSE; with theGlider do begin mode := fadingOut; destRect.top := destRect.bottom - 20; if (isForward) then srcNum := 0 else srcNum := 2; end; {end - with theGlider} end; {end - if (eventKind} end; {end - zapIt} toggleIt: if (eventKind[who, 2] < TickCount) then begin SysBeep(1); tempInt := eventKind[who, 1]; with thisHouse.theRooms[roomAt].theObjects[tempInt] do begin isOn := not isOn; case objectIs of lftFan: if (eventKind[tempInt, 0] = ignoreIt) then begin SysBeep(1); eventKind[tempInt, 0] := turnItLeft; end else eventKind[tempInt, 0] := ignoreIt; ritFan: if (eventKind[tempInt, 0] = ignoreIt) then begin SysBeep(1); eventKind[tempInt, 0] := turnItRight; end else eventKind[tempInt, 0] := ignoreIt; shredr: if (eventKind[tempInt, 0] = ignoreIt) then eventKind[tempInt, 0] := shredIt else eventKind[tempInt, 0] := ignoreIt; otherwise end; {case} end; {with} eventKind[who, 2] := TickCount + 90; end; playIt: if (eventKind[who, 1] < TickCount) then begin SysBeep(1); eventKind[who, 1] := TickCount + 120; end; ascendIt: begin lifeNormal := FALSE; theGlider.mode := ascending; playing := FALSE; end; descendIt: begin lifeNormal := FALSE; theGlider.mode := descending; playing := FALSE; end; shredIt: begin lifeNormal := FALSE; with theGlider do begin mode := shredding; destRect.top := eventRect[who].bottom; destRect.bottom := destRect.top; destRect.left := eventRect[who].left + 12; destRect.right := destRect.left + 48; shadoDest.left := destRect.left; shadoDest.right := destRect.right; phase := 0; end; end; steamIt: begin liftAmount := -7; shiftAmount := -7; end; otherwise end; {case} end; {=================================} procedure SearchRects; var index, outside: Integer; hotRect, tempRect: Rect; {----------------} procedure BiteIt; begin with theGlider do begin SysBeep(1); lifeNormal := FALSE; mode := fadingOut; if (isForward) then srcNum := 0 else srcNum := 2; end; end; {----------------} procedure GetItLegal; begin {do a bump sound here} with theGlider do begin with destRect do begin left := left + outside; right := right + outside; end; with shadoDest do begin left := left + outside; right := right + outside; end; with touchRect do begin left := left + outside; right := right + outside; end; end; end; {----------------} begin with theGlider do begin hotRect := touchRect; {get 'hot rect'} if (rightIsOpen) then {check right edge} begin if (destRect.left > 500) then begin playing := FALSE; Exit(SearchRects); end end else if (destRect.right > 512) then begin outside := 512 - destRect.right; GetItLegal; end; if (leftIsOpen) then {check left edge} begin if (destRect.right < 12) then begin playing := FALSE; Exit(SearchRects); end; end else if (destRect.left < 0) then begin outside := -destRect.left; GetItLegal; end; if (destRect.bottom > floorLimit) then {check floor} BiteIt; end; {---with theGlider do---} shiftAmount := 0; for index := 1 to nObjects do if (RectLap(eventRect[index], hotRect)) then Collision(eventKind[index, 0], index); end; {=================================} procedure GetInput; var pull: Integer; thePt: Point; dest: Rect; {--------------------} procedure PushIt (howFast: Integer); begin with theGlider do forVel := howFast; end; {--------------------} procedure FireBand; begin end; {--------------------} begin with theGlider do begin case controlMethod of holdKey: begin GetKeys(theKeys); if (theKeys[leftKey]) then if (isRight) then begin isForward := FALSE; srcNum := 1; forVel := -maxThrust; end else begin isForward := TRUE; srcNum := 2; forVel := -maxThrust; end else if (theKeys[rightKey]) then if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := maxThrust; end else begin isForward := FALSE; srcNum := 3; forVel := maxThrust; end else {no key of import down} begin if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := 0; end else begin isForward := TRUE; srcNum := 2; forVel := 0; end; end; if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; if (theKeys[energyKey]) then begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then PushIt(16) else PushIt(-16); end; end; dropKey: begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then forVel := maxThrust else forVel := -maxThrust; GetKeys(theKeys); if (theKeys[leftKey]) then if (isRight) then begin isForward := FALSE; srcNum := 1; forVel := -maxThrust; end else begin isForward := TRUE; srcNum := 2; forVel := -maxThrust; end else if (theKeys[rightKey]) then if (isRight) then begin isForward := TRUE; srcNum := 0; forVel := maxThrust; end else begin isForward := FALSE; srcNum := 3; forVel := maxThrust; end; if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; if (theKeys[energyKey]) then begin if (((isRight) and (isForward)) or ((not isRight) and (not isForward))) then PushIt(16) else PushIt(-16); end; end; {end - dropKey} absMouse: begin GetKeys(theKeys); if ((theKeys[bandKey]) and (not bandBorne)) then FireBand; GetMouse(thePt); pull := (thePt.h - 256 + rightOffset) div 32; if (pull > maxThrust) then pull := maxThrust else if (pull < -maxThrust) then pull := -maxThrust; forVel := pull; if (isRight) then if (forVel < 0) then begin isForward := FALSE; srcNum := 1; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := TRUE; srcNum := 0; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin if (forVel < 0) then begin isForward := TRUE; srcNum := 2; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := FALSE; srcNum := 3; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end; end; end; {end - absMouse} relMouse: begin GetKeys(theKeys); if (theKeys[bandKey] and (not bandBorne)) then {fire rubber bands} FireBand; GetMouse(thePt); forVel := (thePt.h - 256 + rightOffset) div mouseSlop; if (forVel > maxThrust) then forVel := maxThrust else if (forVel < -maxThrust) then forVel := -maxThrust; CenterMouse; if (isRight) then if (forVel < 0) then begin isForward := FALSE; srcNum := 1; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := TRUE; srcNum := 0; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin if (forVel < 0) then begin isForward := TRUE; srcNum := 2; if (theKeys[energyKey]) then PushIt(-16); if (button) then begin if (not buttonFires) then PushIt(-16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end else begin isForward := FALSE; srcNum := 3; if (theKeys[energyKey]) then PushIt(16); if (button) then begin if (not buttonFires) then PushIt(16) else if ((not bandBorne) and (buttonFires)) then FireBand; end; end; end; end; {end - relMouse} otherwise ; end; {case} end; {with theGlider} end; {=================================} procedure MoveGlider; begin with theGlider do begin liftAmount := liftAmount + 1; {add gravity} if (sliding) then begin liftAmount := 0; {zero out lift} sliding := FALSE; end else begin {vertical offset of glider} destRect.top := destRect.top + liftAmount; destRect.bottom := destRect.bottom + liftAmount; touchRect.top := touchRect.top + liftAmount; touchRect.bottom := touchRect.bottom + liftAmount; end; forVel := forVel + shiftAmount; {horizontal offset of glider} destRect.left := destRect.left + forVel; destRect.right := destRect.right + forVel; touchRect.left := destRect.left + 10; {touch rect is inset from dest} touchRect.right := destRect.right - 10; shadoDest.left := destRect.left; {shadow has same l. & r. as dest} shadoDest.right := destRect.right; end; end; {=================================} procedure IncInt (var i: integer); inline $205F, {MOVEA.W (A7)+, A0 } $5250; {ADDQ.W #$1, (A0) } {=================================} procedure IncLong (var l: longint); inline $205F, {MOVEA.L (A7)+, A0 } $5290; {ADDQ.L #$1, (A0) } {=================================} procedure MoveCycleObs; var index, diff: Integer; begin for index := 1 to nCycleObs do with cycleObjects[index] do case kindIs of candle: begin IncLong(position); if (position > 50) then position := 48; end; grease: begin if (eventKind[tiedTo, 0] = ignoreIt) then begin SysBeep(1); eventKind[tiedTo, 0] := slideIt; reset := 1; end; if ((reset <> 0) and (reset <> 999)) then begin reset := reset + 1; if (reset > 4) then begin velocity := velocity + 1; eventRect[tiedTo].right := eventRect[tiedTo].right + 1; if (velocity > position) then reset := 999; end else begin if (reset < 3) then accel := 58 else accel := 59; end; end; end; outlet: begin if (accel = 25) then begin if (TickCount > (position + reset)) then begin accel := binaryFlip + 51; position := TickCount; eventKind[tiedTo, 1] := 1; end; end else begin if (TickCount > (position + 60)) then begin accel := 25; position := TickCount; eventKind[tiedTo, 1] := 0; end else accel := binaryFlip + 51; end; end; drip: begin if (phase < 57) then begin if (binaryFlip <> 0) then begin IncInt(phase); if (phase = 57) then position := position + 160; end; end else begin velocity := velocity + accel; position := position + velocity; if (position > reset) then begin velocity := 0; position := holdRect.bottom * 32; if (inColor) then begin CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); end else begin CopyBits(offVirginMap, offLoadMap, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); CopyBits(offVirginMap, mainWndo^.portBits, eventRect[tiedTo], eventRect[tiedTo], srcCopy, wholeRgn); end; eventRect[tiedTo] := holdRect; phase := 53; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := (position div 32) - bottom; bottom := bottom + diff; top := top + diff; end; wholeRect.bottom := wholeRect.bottom + diff end; {else } end; {drip} toastr: if (phase <> 0) then begin if (binaryFlip = 0) then begin phase := phase + 1; if (phase > 65) then phase := 60; end; velocity := velocity + accel; position := position + velocity; if (position > reset) then begin velocity := -velocity; position := reset; reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra; phase := 0; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := (position div 32) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end else begin if (TickCount > reset) then begin reset := position; phase := 60; end; end; {toastr} ball: begin velocity := velocity + accel; position := position + velocity; if (position > reset) then begin velocity := -velocity; position := reset; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := (position div 32) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end; {ball} fshBwl: if (phase <> 0) then begin if ((velocity > -16) and (velocity < 16)) then phase := 69 else begin if (velocity < 0) then phase := 66 else phase := 68; end; velocity := velocity + accel; position := position + velocity; if (position > reset) then begin velocity := -velocity; position := reset; reset := TickCount + thisHouse.theRooms[roomAt].theObjects[tiedTo].extra; phase := 0; end; wholeRect := eventRect[tiedTo]; with eventRect[tiedTo] do begin diff := (position div 32) - bottom; bottom := bottom + diff; top := top + diff; end; if (diff > 0) then wholeRect.bottom := wholeRect.bottom + diff else wholeRect.top := wholeRect.top + diff; end else begin if (TickCount > reset) then begin reset := position; phase := 66; end; end; {fish bowl} teaKtl: begin if (TickCount > reset) then begin eventKind[tiedTo, 0] := steamIt; if (phase = 0) then ; phase := phase + 1; if (phase > 10) then begin phase := 0; eventKind[tiedTo, 0] := ignoreIt; reset := TickCount + position; end; end; end; otherwise end; {case / with / index} end; {=================================} procedure DoSpecial; begin with theGlider do case mode of fadingIn: begin IncInt(phase); if (phase > 16) then begin if (isForward) then srcNum := 0 else srcNum := 3; lifeNormal := TRUE; phase := 0; mode := normal; end end; fadingOut: begin IncInt(phase); if (isRight) then srcNum := 0 else srcNum := 2; if (phase > 16) then playing := FALSE; end; turnRt2Lf: begin IncInt(phase); if (phase > 11) then begin lifeNormal := TRUE; phase := 0; mode := normal; shiftAmount := 0; isRight := FALSE; end; SearchRects; destRect.left := destRect.left + shiftAmount; destRect.right := destRect.right + shiftAmount; touchRect.left := touchRect.left + shiftAmount; touchRect.right := touchRect.right + shiftAmount; shadoDest.left := shadoDest.left + shiftAmount; shadoDest.right := shadoDest.right + shiftAmount; end; turnLf2Rt: begin IncInt(phase); if (phase > 11) then begin lifeNormal := TRUE; phase := 0; mode := normal; shiftAmount := 0; isRight := TRUE; end; SearchRects; destRect.left := destRect.left + shiftAmount; destRect.right := destRect.right + shiftAmount; touchRect.left := touchRect.left + shiftAmount; touchRect.right := touchRect.right + shiftAmount; shadoDest.left := shadoDest.left + shiftAmount; shadoDest.right := shadoDest.right + shiftAmount; end; burning: begin phase := 1 - phase; if (isRight) then begin srcNum := 24 + phase; forVel := 1; end else begin srcNum := 26 + phase; forVel := -1; end; SearchRects; MoveGlider; end; ascending: begin destRect.left := destRect.left - 2; destRect.right := destRect.left + 48; destRect.top := destRect.top - 6; destRect.bottom := destRect.top + 20; shadoDest.left := destRect.left; shadoDest.right := destRect.right; touchRect := destRect; InsetRect(touchRect, 10, 5); if (destRect.top < 150) then begin lifeNormal := TRUE; phase := 0; mode := normal; end; end; descending: begin destRect.left := destRect.left + 2; destRect.right := destRect.left + 48; destRect.top := destRect.top + 6; destRect.bottom := destRect.top + 20; shadoDest.left := destRect.left; shadoDest.right := destRect.right; touchRect := destRect; InsetRect(touchRect, 10, 5); if (destRect.top > 150) then begin lifeNormal := TRUE; phase := 0; mode := normal; end; end; shredding: begin if (phase = 0) then begin destRect.bottom := destRect.bottom + 1; if (destRect.bottom >= destRect.top + 36) then phase := 1; end else begin destRect.top := destRect.top + 8; destRect.bottom := destRect.bottom + 8; if (destRect.top > 342) then begin phase := 0; playing := FALSE; end; end; end; {end - shred} otherwise ; end; end; {=================================} procedure DrawScene; var index, tempInt: Integer; tempRect, tempSmRect: Rect; begin if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do CopyBits(offVirginMap, offLoadMap, wholeRect, wholeRect, srcCopy, wholeRgn); {-----pop masks on-----} if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[position], srcRect[position], wholeRect); outlet: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[accel], srcRect[accel], wholeRect); ball: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(offLoadPort); HLock(Handle(toastRgn)); SetClip(toastRgn); CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]); ClipRect(wholeArea); HUnlock(Handle(toastRgn)); SetPort(mainWndo); end; fshBwl: if (phase <> 0) then CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(offPlayerMap, offMaskMap, offLoadMap, srcRect[69], srcRect[69], eventRect[tiedTo]); otherwise ; end; {case} oldRect := wholeRect; end; {-----pop to visible screen-----} if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do CopyBits(offLoadMap, mainWndo^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); with theGlider do begin if (isRight) then CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[0], shadoRct[0], shadoDest) else CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, shadoRct[1], shadoRct[1], shadoDest); if (lifeNormal) then CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(offPlayerMap, offMaskMap, mainWndo^.portBits, glideRct[srcNum], glideRct[srcNum], destRect); otherwise ; end; {case} end; end; {=================================} procedure DrawCScene; var index, tempInt: Integer; tempRect, tempSmRect: Rect; begin if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do CopyBits(BitMapPtr(virginCPtr^.portPixMap^)^, BitMapPtr(loadCPtr^.portPixMap^)^, oldRect, oldRect, srcCopy, wholeRgn); {-----pop masks on-----} if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin case kindIs of candle: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[position], srcRect[position], wholeRect); outlet, grease: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[accel], srcRect[accel], wholeRect); ball: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[kindIs], srcRect[kindIs], eventRect[tiedTo]); drip: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]); toastr: if (phase <> 0) then begin SetPort(GrafPtr(loadCPtr)); HLock(Handle(toastRgn)); SetClip(toastRgn); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]); HUnlock(Handle(toastRgn)); ClipRect(wholeArea); SetPort(GrafPtr(mainWndo)); end; fshBwl: begin if (phase <> 0) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[phase], srcRect[phase], eventRect[tiedTo]) else CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, BitMapPtr(loadCPtr^.portPixMap^)^, srcRect[69], srcRect[69], eventRect[tiedTo]); end; otherwise end; {case} oldRect := wholeRect; end; {-----pop to visible screen-----} if (nCycleObs > 0) then for index := 1 to nCycleObs do with cycleObjects[index] do begin if (kindIs <> grease) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn) else begin CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeRect, wholeRect, srcCopy, wholeRgn); SetPort(GrafPtr(mainWndo)); PenNormal; PenSize(2, 2); MoveTo(wholeRect.right, wholeRect.bottom - 2); LineTo(velocity, wholeRect.bottom - 2); end; end; with theGlider do begin if (lifeNormal) then CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, glideRct[srcNum], glideRct[srcNum], destRect) else case mode of fadingIn, fadingOut: begin tempInt := nextPhase[mode, phase]; if (not isRight) then tempInt := tempInt + 7; CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, glideRct[srcNum], glideRct[tempInt], destRect); end; turnLf2Rt, turnRt2Lf: begin tempInt := nextPhase[mode, phase]; CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, glideRct[tempInt], glideRct[tempInt], destRect); end; burning, ascending, descending: CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, glideRct[srcNum], glideRct[srcNum], destRect); shredding: begin SetRect(tempRect, 265, 208 - (destRect.bottom - destRect.top), 313, 208); CopyMask(BitMapPtr(objectCPtr^.portPixMap^)^, offMaskMap, GrafPtr(mainWndo)^.portBits, tempRect, tempRect, destRect); end; otherwise ; end; {case} end; end; {=================================} procedure FlyGlider; var i: Integer; profileTime: LongInt; tempRect: Rect; begin AutoHideShow(TRUE); thisHouse.theRooms[roomAt] := thisRoom; testRoom := thisRoom; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, wholeArea, wholeArea, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offLoadMap, mainWndo^.portBits, wholeArea, wholeArea, srcCopy, mainWndo^.visRgn); SetPort(GrafPtr(mainWndo)); PenNormal; TextFont(0); TextSize(12); TextMode(patOr); ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + (2 * rightOffset), 0); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 342, 512 + (2 * rightOffset), 342 + downOffset); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 0, 0, 342); FillRect(tempRect, black); SetRect(tempRect, 512, 0, 512 + rightOffset, 342); FillRect(tempRect, black); ClipRect(wholeArea); playing := TRUE; pausing := FALSE; hasToast := FALSE; sliding := FALSE; ReadyRoom; ReadyGlider; HideCursor; while ((playing) and (not pausing)) do begin timeIs := TickCount; liftAmount := 2; binaryFlip := BitXOr(binaryFlip, 1); if (lifeNormal) then begin SearchRects; GetInput; MoveGlider; end else DoSpecial; if (playing) then begin if (nCycleObs > 0) then MoveCycleObs; SetPort(GrafPtr(mainWndo)); if (inColor) then DrawCScene else DrawScene; end; if (theKeys[kTabKeyMap]) then {pausing} begin repeat GetKeys(theKeys); until (not theKeys[kTabKeyMap]); repeat GetKeys(theKeys); until (theKeys[kTabKeyMap]); repeat GetKeys(theKeys); until (not theKeys[kTabKeyMap]); end; if (theKeys[kCommandKeyMap]) then {aborted} begin playing := FALSE; end; repeat until (TickCount >= (timeIs + 2)); end; if (hasToast) then begin hasToast := FALSE; DisposeRgn(toastRgn); end; lightsOut := FALSE; airOut := FALSE; LoadABackground(thisRoom.backPictID); DrawAllObjects; SetPort(GrafPtr(mainWndo)); PenNormal; TextFont(0); TextSize(12); TextMode(patOr); ClipRect(fullArea); SetRect(tempRect, -rightOffset, -downOffset, 512 + (2 * rightOffset), 0); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 342, 512 + (2 * rightOffset), 342 + downOffset); FillRect(tempRect, black); SetRect(tempRect, -rightOffset, 0, 0, 342); FillRect(tempRect, black); SetRect(tempRect, 512, 0, 512 + rightOffset, 342); FillRect(tempRect, black); ClipRect(wholeArea); FlushEvents(everyEvent, 0); InitCursor; AutoHideShow(FALSE); end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-GameBody.p b/RoomEditor_103/Sources/E-GameBody.p new file mode 100755 index 0000000..ab2a954 --- /dev/null +++ b/RoomEditor_103/Sources/E-GameBody.p @@ -0,0 +1 @@ +program RoomEditor; {===========================================================} { } { R O O M E D I T O R 1.02 } { For Glider 4.0 } { } { All code 1991 john calhoun } { } { Published and 1991 Casady & Greene, Inc. } { } {===========================================================} {$I-} uses Palettes, About, Globals, Utilities, Drawing, HouseStuff, RoomStuff, ObjectStuff, FileInNOut, Initialize, TheMenus, FlyGlider; var downIsDubl: Longint; eventHappened: Boolean; {=================================} procedure UpDateMain; var tempRect: Rect; begin DrawRoomNum; end; {=================================} procedure DoMainWindow; var thePt: Point; {--------------------} procedure DoASimpleClik; var which: Integer; hitARect: Boolean; begin if (StillDown) then begin if (PtInRect(thePt, handleRect)) then begin DragHandle; Exit(DoASimpleClik); end; hitARect := FALSE; for which := 1 to thisRoom.numberOObjects do if (PtInRect(thePt, thisRoom.theObjects[which].boundRect)) then begin Deselect; oneActive := which; hitARect := TRUE; Leave; end; if (hitARect) then begin DragObject(oneActive); DrawAllObjects; UpdateMenuItems(editToObject); end else begin Deselect; UpdateMenuItems(editToRoom); end; end else begin hitARect := FALSE; for which := 1 to thisRoom.numberOObjects do if (PtInRect(thePt, thisRoom.theObjects[which].boundRect)) then begin Deselect; oneActive := which; hitARect := TRUE; Leave; end; if (hitARect) then begin DrawAllObjects; UpdateMenuItems(editToObject); end else begin Deselect; UpdateMenuItems(editToRoom); end; end; end; {--------------------} procedure DoADublClik; var which: Integer; cancelIt, hitARect: Boolean; begin if (PtInRect(thePt, thisRoom.theObjects[oneActive].boundRect)) then begin DoObjectInfo; UpdateMenuItems(editToObject); end else begin hitARect := FALSE; for which := 1 to thisRoom.numberOObjects do if (PtInRect(thePt, thisRoom.theObjects[which].boundRect)) then begin Deselect; oneActive := which; hitARect := TRUE; Leave; end; if (hitARect) then begin DrawAllObjects; end else begin if (editRoom) then begin UpdateMenuItems(editToRoom); cancelIt := TRUE; DoRoomCondInfo(cancelIt); end else begin Deselect; UpdateMenuItems(editToRoom); end; end; end; end; {--------------------} begin SetPort(GrafPtr(mainWndo)); thePt := theEvent.where; GlobalToLocal(thePt); if (theEvent.what = mouseDown) then begin if (theEvent.when <= downIsDubl) then DoADublClik else DoASimpleClik; end else if (theEvent.what = mouseUp) then downIsDubl := theEvent.when + GetDblTime; if (toolWndo <> nil) then SetPort(GrafPtr(toolWndo)); end; {=================================} procedure DoDrag (whichWindow: WindowPtr); var wasRect, tempRect: Rect; begin Deselect; wasRect := whichWindow^.portRect; tempRect := screenbits.bounds; tempRect.top := tempRect.top + 20; DragWindow(whichWindow, theEvent.where, tempRect); if (whichWindow = toolWndo) then ShowWindow(whichWindow); if (toolWndo <> nil) then SelectWindow(toolWndo); end; {=================================} procedure DoGoAway (WhichWindow: WindowPtr); var wasRect, tempRect: Rect; begin if (theEvent.what <> MouseUp) then Exit(DoGoAway); if TrackGoAway(whichWindow, theEvent.where) then begin Deselect; case (GetWRefCon(whichWindow)) of 1: CloseTools; otherwise ; end; end; end; {=================================} procedure DoInContent (whichWindow: WindowPtr); begin if ((whichWindow <> FrontWindow) and (whichWindow <> mainWndo)) then SelectWindow(toolWndo) else case (GetWRefCon(whichWindow)) of 0: DoMainWindow; 1: DoTools; otherwise end;{case} end; {=================================} procedure DoUpdate; var whichWindow: WindowPtr; begin whichWindow := WindowPtr(theEvent.message); SetPort(whichWindow); BeginUpdate(whichWindow); case (GetWRefCon(whichWindow)) of 0: UpDateMain; 1: UpdateTools; otherwise begin end; end; EndUpdate(whichWindow); DrawAllObjects; DrawRoomNum; UpdateTools; if (toolWndo <> nil) then SetPort(toolWndo); end; {=================================} procedure DoStartUp; var cancelIt: Boolean; theMessage, numDocs, thisDoc, ignore: Integer; docInfo: AppFile; begin CountAppFiles(theMessage, numDocs); if (theMessage = AppPrint) then begin GenericAlert(kErrNothingToPrint); ExitToShell; end; if (numDocs = 0) then begin DoOpenHouse; Exit(DoStartUp); end; GetAppFiles(1, docInfo); with docInfo do begin if fType = 'GLhs' then begin if (not OpenFile(fName, vRefNum)) then begin InitCursor; DoNewHouse; Exit(DoStartUp); end; InitCursor; housesName := fName; changed := FALSE; roomScrapDirty := FALSE; objectScrapDirty := FALSE; roomAt := 1; thisRoom := thisHouse.theRooms[roomAt]; EnableItem(GetMenu(mFile), iSave); EnableItem(GetMenu(mFile), iSaveAs); oneActive := 0; handleRect := nullRect; LoadABackground(thisRoom.backPictID); UpdateMenuItems(fileExists); UpdateMenuItems(editToRoom); DrawAllObjects; DrawRoomNum; OpenTools; end else begin DoNewHouse; end; ClrAppFiles(1); end; end; {=================================} procedure DoMouseDown; var whichWindow: WindowPtr; mResult: longint; theMenu, theItem, code: integer; begin code := FindWindow(theEvent.where, whichWindow); case (code) of inMenuBar: begin mResult := MenuSelect(theEvent.Where); theMenu := HiWord(mResult); theItem := LoWord(mResult); HandleMenu(theMenu, theItem); end; inGoAway: DoGoAway(whichWindow); inContent: DoInContent(whichWindow); inDrag: DoDrag(whichWindow); inSysWindow: SystemClick(theEvent, whichWindow); otherwise ; end; end; {=================================} procedure DoKeyDown; var mResult: longint; chCode, theMenu, theItem, wasActive: integer; begin with theEvent do begin chCode := BitAnd(message, CharCodeMask); if (Odd(modifiers div CmdKey)) then begin mResult := MenuKey(CHR(chCode)); theMenu := HiWord(mResult); theItem := LoWord(mResult); if (theMenu <> 0) then HandleMenu(theMenu, theItem); end else case chCode of kTabKey: if (thisRoom.numberOObjects > 0) then begin wasActive := oneActive; Deselect; oneActive := wasActive + 1; if (oneActive > thisRoom.numberOObjects) then oneActive := 1; UpdateMenuItems(editToObject); DrawAllObjects; end; kLeftArrow: DoPrevRoom; kRightArrow: DoNextRoom; kDeleteKey: DoClear; otherwise end; end; end; {=================================} procedure DoDiskEvent; var cornerPt: Point; theErr: OSErr; begin if (HiWrd(theEvent.message) <> noErr) then begin SetPt(cornerPt, 85 + rightOffset, 50 + downOffset); theErr := DIBadMount(cornerPt, theEvent.message); end; end; {=================================} procedure DoOSEvent; begin case BSR(theEvent.message, 24) of {high byte of message} 1: begin if (BAnd(theEvent.message, 1) <> 0) then begin inBackground := FALSE; {it was a resume event} if (not SameScreenDepth) then GenericAlert(23); end else begin inBackground := TRUE; {it was a suspend event} end; end; {suspendResumeMessage} otherwise ; end; {CASE} end; {osEvt} {=================================} procedure CloseUpShop; const Color = 1; GDTypeFlag = 1; var theDevice: GDHandle; theErr: OSErr; {-----------} function SetDepth (gd: GDHandle; newDepth, whichFlags, newFlags: Integer): Integer; inline $203C, $000A, $0013, $AAA2; {-----------} begin CloseTools; if (inColor) then begin DisposePalette(mainPalette); if (mainWndo <> nil) then DisposeWindow(GrafPtr(mainWndo)); CloseCPort(objectCPtr); DisposPtr(objectCBits); CloseCPort(virginCPtr); DisposPtr(virginCBits); CloseCPort(loadCPtr); DisposPtr(loadCBits); end else begin if (mainWndo <> nil) then DisposeWindow(mainWndo); ClosePort(offVirginPort); DisposPtr(Ptr(offVirginPort)); ClosePort(offPlayerPort); DisposPtr(Ptr(offPlayerPort)); ClosePort(offLoadPort); DisposPtr(Ptr(offLoadPort)); ClosePort(offMaskPort); DisposPtr(Ptr(offMaskPort)); end; SavePrefs; if ((not cantColor) and (restoreColor) and (not cantSwitch)) then begin theDevice := GetMainDevice; HLock(Handle(theDevice)); if (theDevice^^.gdPMap^^.pixelSize <> wasDepth) then theErr := SetDepth(theDevice, wasDepth, GDTypeFlag, Color); HUnlock(Handle(theDevice)); end; end; {=================================} begin InitVariables; UnloadSeg(@InitVariables); DoStartUp; downIsDubl := TickCount; repeat if (hasWNE) then eventHappened := WaitNextEvent(everyEvent, theEvent, sleep, nil) else begin SystemTask; eventHappened := GetNextEvent(everyEvent, theEvent); end; if (eventHappened) then case (theEvent.what) of NullEvent: ; MouseDown, MouseUp: DoMouseDown; KeyDown, AutoKey: DoKeyDown; UpDateEvt: DoUpdate; DiskEvt: {call DIBadMount in response to a diskEvt} DoDiskEvent; App4Evt: DoOSEvent; otherwise ; end; {case} if ((marqueeTime) and (not inBackground)) then DoMarquee; until doneFlag; {End of the event loop} CloseUpShop; end. {End of the program} \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-Globals.p b/RoomEditor_103/Sources/E-Globals.p new file mode 100755 index 0000000..47d00f2 --- /dev/null +++ b/RoomEditor_103/Sources/E-Globals.p @@ -0,0 +1 @@ +unit Globals; interface uses Palettes; const dlgTop = 50; dlgLeft = 85; kDeleteKey = $08; kTabKey = $09; kLeftArrow = $1C; kRightArrow = $1D; kTabKeyMap = $30; kCommandKeyMap = $37; mApple = 128; {Menu resource ID} iNothing = 0; iAboutEdit = 1; mFile = 129; {Menu resource ID} iNew = 1; iOpen = 2; iClose = 4; iSave = 5; iSaveAs = 6; iQuit = 8; mEdit = 130; {Menu resource ID} iCut = 1; iCopy = 2; iPaste = 3; iClear = 4; mSpecial = 131; {Menu resource ID} iTryGlider = 1; iControls = 2; iRestoreDeep = 3; iGoToRoom = 5; iPrevRoom = 6; iNextRoom = 7; iNewRoom = 9; mWindows = 132; {Menu resource ID} iTools = 1; iAutoHideTools = 2; iHouse = 4; iRoomBack = 5; iRoomCond = 6; iObject = 7; iHelp = 9; mControls = 133;{Menu resource ID} iHoldKey = 1; iDropKey = 2; iAbsMouse = 3; iRelMouse = 4; iConfigure = 6; editToObject = 1; editToRoom = 2; fileExists = 3; fileIsNew = 4; noFileOpen = 5; alertStrIDs = 128; fileStrIDs = 129; mainWndoID = 129; fileAlertID = 129; alertID = 128; saveNoQuitID = 132; saveNoCloseID = 133; houseInfoID = 134; depthAlertID = 136; rCustomKeysID = 137; lockAlertID = 138; custGetID = 256; objectPictID = 128; maskPictID = 129; sleep = 4; ceilingVert = 24; stairVert = 54; floorVert = 325; stackSize = 40960; floorLimit = floorVert + 5; maxThrust = 5; holdKey = 1; dropKey = 2; absMouse = 3; relMouse = 4; mouseSlop = 10; defaultLeftKey = $2B; defaultRightKey = $2F; defaultEnergyKey = $24; defaultBandKey = $31; defaultLeftName = ', key'; defaultRightName = '. key'; defaultEnergyName = 'return'; defaultBandName = 'space'; kErrUnaccounted = 1; {error codes} kErrMacPlusNeeded = 2; {these correspond with STR#} kErr2Or16Colors = 4; {resources for the TEXT part} kErrNotEnoughMem = 5; {of the message} kErrUnknownAtInit = 6; kErrMemLow = 7; {unused} kErrGraphicsNotFound = 8; kErrGraphicLoad = 9; kErrTooManyRooms = 10; kErrTooManyObjects = 11; kErrLoadingRes = 12; kErrFileExists = 13; kErrNothingToPrint = 14; {15 unused} kErrWrongHouseVers = 17; kErrExitSansGraphics = 20; kErrSavingPrefs = 25; {furniture} nulObj = 0; table = 1; shelf = 2; books = 3; cabnet = 4; extRct = 5; obsRct = 6; {blowers} flrVnt = 8; celVnt = 9; celDct = 10; candle = 11; lftFan = 12; ritFan = 13; {table objects} clock = 16; paper = 17; grease = 18; bnsRct = 19; battry = 20; rbrBnd = 21; {wall objects} litSwt = 24; outlet = 25; thermo = 26; shredr = 27; pwrSwt = 28; guitar = 29; {animate objects} drip = 32; toastr = 33; ball = 34; fshBwl = 35; teaKtl = 36; window = 37; {jewelry} paintg = 40; mirror = 41; basket = 42; macTsh = 43; upStar = 44; dnStar = 45; {------------------------------------} normal = 0; {mode} fadingIn = 1; fadingOut = 2; turnRt2Lf = 3; turnLf2Rt = 4; burning = 5; ascending = 6; descending = 7; shredding = 8; ignoreIt = 0; {null or unknown objects} crashIt = 1; {tables, shelves, cabinets, etc...} liftIt = 2; {floor vents} dropIt = 3; {ceiling blower, some ducts} moveIt = 4; {exit rects/suction ceiling ducts} burnIt = 5; {candle if too close} turnItLeft = 6; {left fan} turnItRight = 7; {right fan} awardIt = 8; {clocks} extraIt = 9; {folded pieces of paper} slideIt = 10; {grease fallen} trickIt = 11; {bonus rect} energizeIt = 12; {battery} bandIt = 13; {rubber bands} playIt = 14; {guitar} lightIt = 15; {light switch} zapIt = 16; {wall outlet} airOnIt = 17; {thermostats} shredIt = 18; {shredder} toggleIt = 19; {power switch} weightIt = 20; spillIt = 21; {grease standing up} ascendIt = 22; {up stair case} descendIt = 23; {down stair case} steamIt = 24; acurID = 128; kCursCount = 12; type SICN = array[0..15] of Integer; SICNPtr = ^SICN; SICNHand = ^SICNPtr; objectData = record objectIs: Integer; boundRect: Rect; amount: Integer; extra: Integer; isOn: Boolean; end; roomData = record roomName: string[24]; numberOObjects: Integer; backPictID: Integer; tileOrder: array[0..7] of Integer; leftOpen, rightOpen: Boolean; animateKind: Integer; animateNumber: Integer; animateDelay: LongInt; conditionCode: Integer; theObjects: array[1..16] of objectData; end; houseRec = record version: Integer; numberORooms: Integer; timeStamp: LongInt; hiScores: array[0..19] of LongInt; hiLevel: array[0..19] of Integer; hiName: array[0..19] of string[24]; hiRoom: array[0..19] of string[24]; pictFile: string[32]; nextFile: string[32]; firstFile: string[32]; theRooms: array[1..40] of roomData; end; gliderRec = record destRect, oldRect, wholeRect: Rect; shadoDest, oldShado, wholeShado: Rect; touchRect: Rect; mode, phase: Integer; isRight, isForward: Boolean; srcNum: Integer; forVel: Integer; mass: Integer; bands, energy: Integer; end; cycleRec = record holdRect, wholeRect, oldRect: Rect; tiedTo, kindIs, phase: Integer; reset, position: LongInt; accel, velocity: Integer; end; acur = record whichBall: LongInt; ball: array[1..kCursCount] of CursHandle; end; acurPtr = ^acur; acurHand = ^acurPtr; BitMapPtr = ^BitMap; var theEvent: EventRecord; mainWndo, toolWndo: WindowPtr; mainPalette: PaletteHandle; screenArea, wholeArea, fullArea, nullRect: Rect; wholeRgn: RgnHandle; {---b&w---} offMaskMap, offVirginMap, offLoadMap, offPlayerMap: BitMap; offMaskPort, offVirginPort, offLoadPort, offPlayerPort: GrafPtr; offMaskBits, offVirginBits, offLoadBits, offPlayerBits: Ptr; {---color---} virginCPort, loadCPort, objectCPort: CGrafPort; virginCPtr, loadCPtr, objectCPtr: CGrafPtr; virginCBits, loadCBits, objectCBits: Ptr; rgbBlack, rgbWhite, rgbLtBlue, rgbRed, rgbDkGray: RGBColor; rgbYellow, rgbViolet, rgbBrown, rgbLtBrown: RGBColor; holdCorner: Point; marqueePat: array[0..4] of Pattern; theKeys: KeyMap; ballC: array[1..kCursCount] of CCrsrHandle; marqueeIndex, roomAt, setOTools, oneActive: Integer; rightOffset, downOffset, wasDepth, herKeyboard: Integer; fileNumber, volumeNumber, editorResNum: Integer; leftArrow, rightArrow, deleteKey, controlMethod: Integer; leftKey, rightKey, energyKey, bandKey, iGlidersHelp: Integer; leftName, rightName, energyName, bandName: string[12]; housesName, resourceName: string[32]; startPt, endPt: Point; handleRect: Rect; thisHouse: houseRec; thisRoom, scrapRoom: roomData; scrapObject, selectObject: objectData; currentBall: Integer; ballList: acurHand; {flying the glider} nCycleObs: Integer; cycleObjects: array[1..16] of cycleRec; theGlider: GliderRec; lifeNormal: Boolean; currMass, liftAmount, nMortals, shiftAmount: Integer; glideRct: array[0..27] of Rect; shadoRct: array[0..1] of Rect; nextPhase: array[1..4, 0..16] of Integer; binaryFlip: Integer; toastRgn: RgnHandle; eventRect: array[0..16] of Rect; eventKind: array[0..16, 0..2] of LongInt; {end} tileRects: array[0..7] of Rect; iconRect: array[0..5] of Rect; selectRect: array[0..5] of Rect; srcRect: array[0..69] of Rect; toolIcnID: array[0..47] of Integer; lightsOut, airOut, leftIsOpen, rightIsOpen: Boolean; hasToast, windowOpen: Boolean; editRoom, marqueeTime, soundPlaying, fileIsOpen, cantColor, sliding: Boolean; soundOn, playing, pausing, inhibitSound, doneFlag, restoreColor: Boolean; roomScrapDirty, objectScrapDirty, changed, inColor, cantSwitch: Boolean; autoHide, inBackground, hasWNE, buttonFires, bandBorne, hasSys7: Boolean; useColorCursor, lockIt: Boolean; implementation end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-HouseStuff.p b/RoomEditor_103/Sources/E-HouseStuff.p new file mode 100755 index 0000000..cd7c739 --- /dev/null +++ b/RoomEditor_103/Sources/E-HouseStuff.p @@ -0,0 +1 @@ +unit HouseStuff; interface uses Palettes, Globals, Utilities; function DeleteRoom: Boolean; function InsertRoom: Boolean; procedure DoHouseInfo; procedure ErrorCheckHouse; implementation {=================================} function DeleteRoom; var i: Integer; begin DeleteRoom := FALSE; {assume error} if (roomAt < thisHouse.numberORooms) then {if not on last room} for i := roomAt to thisHouse.numberORooms do thisHouse.theRooms[i] := thisHouse.theRooms[i + 1]; {shift rooms left} thisHouse.numberORooms := thisHouse.numberORooms - 1; {subtract 1 from #} if (roomAt > 1) then roomAt := roomAt - 1 {preceding room is activated} else begin roomAt := 1; if (thisHouse.numberORooms <= 1) then {if only one room} begin thisHouse.numberORooms := 1; {we'll call up the dlg} Exit(DeleteRoom); {for creating a room} end; end; DeleteRoom := TRUE; end; {=================================} function InsertRoom; var i: Integer; begin InsertRoom := FALSE; if (thisHouse.numberORooms >= 40) then {trying to add 41 rooms} begin GenericAlert(kErrTooManyRooms); Exit(InsertRoom); end; thisHouse.theRooms[roomAt] := thisRoom; {insert room to date} if (roomAt < thisHouse.numberORooms) then {shift only if in middle} for i := thisHouse.numberORooms downto roomAt + 1 do thisHouse.theRooms[i + 1] := thisHouse.theRooms[i]; {shift rooms right} roomAt := roomAt + 1; {kick roomAt over to right} thisHouse.theRooms[roomAt] := scrapRoom; {copy scrap into house} thisRoom := thisHouse.theRooms[roomAt]; {get copy for active room} thisHouse.numberORooms := thisHouse.numberORooms + 1; {one more room} InsertRoom := TRUE; end; {=================================} procedure DoFlushScores; var i: Integer; begin for i := 0 to 19 do begin thisHouse.hiScores[i] := 0; thisHouse.hiLevel[i] := 0; thisHouse.hiName[i] := 'no one...'; thisHouse.hiRoom[i] := 'no room...'; end; end; {=================================} procedure DoHouseInfo; const okayBut = 1; nameStat = 2; numOfStat = 3; versStat = 4; backStat = 5; firstEdit = 6; nextEdit = 7; flushBut = 8; lockBut = 17; cancelBut = 18; var leaveDlg, willLockIt: Boolean; theDlgPtr: DialogPtr; wasPort: GrafPtr; tempRect: Rect; cntlType, index, itemHit, tempInt, rightOff, downOff: Integer; dlgItem: Handle; cntlHand, tempCntlHand: controlhandle; tempStr, tempStr2: Str255; {-------------------------} procedure Redraw; var width: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, okayBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; with theDlgPtr^.portRect do width := right - left; MoveTo(4, 38); Line(width - 8, 0); MoveTo(4, 40); Line(width - 8, 0); GetKeys(theKeys); if (theKeys[$37]) then begin MoveTo(5, 37); NumToString(thisHouse.timeStamp, tempStr); DrawString(tempStr); end; end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(houseInfoID, nil, Pointer(-1)); with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); GetDItem(theDlgPtr, nameStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, housesName); with thisHouse do begin NumToString(numberORooms, tempStr); {pop in number of rooms} GetDItem(theDlgPtr, numOfStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, tempStr); tempInt := version div 256; {compute version number} NumToString(tempInt, tempStr); tempInt := version mod 256; NumToString(tempInt, tempStr2); tempStr := CONCAT(tempStr, '.', tempStr2); {and pop it in} GetDItem(theDlgPtr, versStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, tempStr); GetDItem(theDlgPtr, backStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, pictFile); {pop in background file} GetDItem(theDlgPtr, firstEdit, cntlType, dlgItem, tempRect); SetIText(dlgItem, firstFile); {pop in first house file} GetDItem(theDlgPtr, nextEdit, cntlType, dlgItem, tempRect); SetIText(dlgItem, nextFile); {pop in next house file} end; willLockIt := lockIt; Redraw; leaveDlg := FALSE; SelIText(theDlgPtr, nextEdit, 0, 32); repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); if (itemHit = okayBut) then begin leaveDlg := TRUE; GetDItem(theDlgPtr, firstEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, tempStr); {Get text entered for first file} thisHouse.firstFile := COPY(tempStr, 1, 32); GetDItem(theDlgPtr, nextEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, tempStr); {Get text entered for next file} thisHouse.nextFile := COPY(tempStr, 1, 32); lockIt := willLockIt; changed := TRUE; end; if (itemHit = cancelBut) then begin leaveDlg := TRUE; end; if (itemHit = lockBut) then begin if (Alert(lockAlertID, nil) = 1) then willLockIt := TRUE; end; if (itemHit = flushBut) then DoFlushScores; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=================================} procedure ErrorCheckHouse; const roomUnnamed = 1; tooManyObs = 2; badPictID = 3; badAnimKind = 4; badAnimNum = 5; badAnimDelay = 6; badRoomCond = 7; type problem = record howMany: Integer; whichOnes: array[1..40] of Boolean; end; problemTally = array[roomUnnamed..badRoomCond] of problem; var i, i2, obs: Integer; progR: Rect; theProblems: problemTally; begin SetPort(GrafPtr(mainWndo)); PenNormal; TextFont(0); TextSize(12); PenSize(2, 2); SetRect(progR, 156, 100, 356, 130); {check house record} EraseRect(progR); FrameRect(progR); MoveTo(progR.left + 20, progR.bottom - 10); DrawString('Checking House'); with thisHouse do begin SpinBall; if (version > $01FF) then begin GenericAlert(kErrWrongHouseVers); EraseRect(progR); FrameRect(progR); MoveTo(progR.left + 20, progR.bottom - 10); DrawString('Checking House'); end; SpinBall; if ((numberORooms < 1) or (numberORooms > 40)) then begin GenericAlert(18); EraseRect(progR); FrameRect(progR); MoveTo(progR.left + 20, progR.bottom - 10); DrawString('Checking House'); end; {check room records} EraseRect(progR); FrameRect(progR); MoveTo(progR.left + 20, progR.bottom - 10); DrawString('Checking Rooms'); for i := roomUnnamed to badRoomCond do with theProblems[i] do begin howMany := 0; for i2 := 1 to 40 do whichOnes[i2] := FALSE; end; for i := 1 to numberORooms do with theRooms[i] do begin SpinBall; if (roomName = '') then with theProblems[roomUnnamed] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if ((numberOObjects < 0) or (numberOObjects > 16)) then with theProblems[tooManyObs] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if ((backPictID < 200) or (backPictID > 209)) then with theProblems[badPictID] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if ((animateKind < 0) or (animateKind > 3)) then with theProblems[badAnimKind] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if ((animateNumber < 0) or (animateNumber > 16)) then with theProblems[badAnimNum] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if (animateDelay < 0) then with theProblems[badAnimDelay] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; SpinBall; if ((conditionCode < 0) or (conditionCode > 2)) then with theProblems[badRoomCond] do begin howMany := howMany + 1; whichOnes[i] := TRUE; end; end; InitCursor; for i := roomUnnamed to badRoomCond do if (theProblems[i].howMany <> 0) then begin GenericAlert(19); Leave; end; end; if (inColor) then CopyBits(BitMapPtr(loadCPtr^.portPixMap^)^, GrafPtr(mainWndo)^.portBits, progR, progR, srcCopy, GrafPtr(mainWndo)^.visRgn) else CopyBits(offLoadMap, mainWndo^.portBits, progR, progR, srcCopy, mainWndo^.visRgn); if (toolWndo <> nil) then SetPort(GrafPtr(toolWndo)); end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-Initialize.p b/RoomEditor_103/Sources/E-Initialize.p new file mode 100755 index 0000000..3feabe9 --- /dev/null +++ b/RoomEditor_103/Sources/E-Initialize.p @@ -0,0 +1 @@ +unit Initialize; interface uses Balloons, Palettes, Globals, Utilities, RoomStuff; procedure InitVariables; {=================================} implementation {=================================} procedure InitVariables; var index, theDepth: Integer; sizeOfOff, offRowBytes: LongInt; tempByte: SignedByte; rawPointer: Ptr; thePict: PicHandle; tempRect: Rect; ignore: Boolean; {---------------------} procedure CheckOurEnvirons; const WNETrapNum = $60; unimplTrapNum = $9F; Color = 1; Monochrome = 0; GDTypeFlag = 1; var sheSaid: Integer; err: OSErr; thisWorld: SysEnvRec; theDevice: GDHandle; {-----------} function DepthAlert: Integer; var dummyInt: Integer; alertHandle: AlertTHndl; alertRect: Rect; begin UseResFile(editorResNum); InitCursor; alertHandle := AlertTHndl(Get1Resource('ALRT', depthAlertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(depthAlertID, nil); DepthAlert := dummyInt; end; {-----------} function SetDepth (gd: GDHandle; newDepth, whichFlags, newFlags: Integer): Integer; inline $203C, $000A, $0013, $AAA2; {-----------} begin rightOffset := (ScreenBits.bounds.right - 512) div 2; downOffset := (ScreenBits.bounds.bottom - 342) div 2; err := SysEnvirons(1, thisWorld); {Check on the set up of the Mac game is on } with thisWorld do begin if (machineType < 1) then {If less than a Mac 512KE (=1) then quit now!} begin GenericAlert(kErrMacPlusNeeded); ExitToShell; end; if (systemVersion < $0602) then begin inhibitSound := TRUE; GenericAlert(3); end else inhibitSound := FALSE; cantColor := not hasColorQD; inColor := hasColorQD; cantSwitch := (systemVersion < $0605); hasSys7 := (systemVersion >= $0700); if (inColor) then begin theDevice := GetMainDevice; HLock(Handle(theDevice)); with theDevice^^.gdPMap^^ do begin wasDepth := pixelSize; if ((pixelSize <> 4) and (pixelSize <> 1)) then if (cantSwitch) then begin GenericAlert(kErr2Or16Colors); ExitToShell; end else begin sheSaid := DepthAlert; case sheSaid of 1: err := SetDepth(theDevice, 4, GDTypeFlag, Color); 2: begin err := SetDepth(theDevice, 1, GDTypeFlag, Color); inColor := FALSE; end; otherwise ExitToShell; end; end; if (pixelSize = 1) then inColor := FALSE; end; HUnlock(Handle(theDevice)); end; herKeyboard := keyBoardType; case keyBoardType of {determine keycodes} envMacPlusKbd: begin leftArrow := $46; rightArrow := $42; deleteKey := $33; end; envAExtendKbd, envStandADBKbd: begin leftArrow := $7B; rightArrow := $7C; deleteKey := $33; end; otherwise begin leftArrow := $2B; rightArrow := $2F; deleteKey := $0; end; end; {case} end; {end - with} hasWNE := (NGetTrapAddress(WNETrapNum, ToolTrap) <> NGetTrapAddress(unimplTrapNum, toolTrap)); end; {---------------------} procedure LoadCursors; var count: Integer; tempByte: SignedByte; begin useColorCursor := inColor; UseResFile(editorResNum); ballList := acurHand(GetResource('acur', acurID)); if (ballList = nil) then begin GenericAlert(kErrLoadingRes); Exit(LoadCursors); end; tempByte := HGetState(Handle(ballList)); HLock(Handle(ballList)); with ballList^^ do begin for count := 1 to kCursCount do begin if (useColorCursor) then begin ballC[count] := GetCCursor(HiWord(LongInt(ball[count]))); if (ballC[count] = nil) then useColorCursor := FALSE; end; ball[count] := GetCursor(HiWord(LongInt(ball[count]))); if (ball[count] = nil) then begin GenericAlert(kErrLoadingRes); whichBall := -1; Exit(LoadCursors); end; end; whichBall := 0; end; HSetState(Handle(ballList), tempByte); end; {---------------------} procedure SetUpColors; begin SpinBall; rgbBlack.red := 0; rgbBlack.green := 0; rgbBlack.blue := 0; rgbWhite.red := -1; rgbWhite.green := -1; rgbWhite.blue := -1; rgbYellow.red := -1; rgbYellow.green := -1; rgbYellow.blue := 0; rgbViolet.red := -1; rgbViolet.green := 0; rgbViolet.blue := -1; rgbRed.red := -1; rgbRed.green := 0; rgbRed.blue := 0; rgbLtBlue.red := 0; rgbLtBlue.green := -1; rgbLtBlue.blue := -1; rgbBrown.red := 22016; rgbBrown.green := 11421; rgbBrown.blue := 1316; rgbLtBrown.red := -28457; rgbLtBrown.green := 29024; rgbLtBrown.blue := 14900; rgbDkGray.red := 16384; rgbDkGray.green := 16384; rgbDkGray.blue := 16384; end; {---------------------} procedure SetUpMainWndo; begin SpinBall; SetRect(screenArea, 0, 0, 512, 322); SetRect(wholeArea, 0, 0, 512, 342); SetRect(nullRect, -500, -500, -499, -499); SetRect(fullArea, -rightOffset, -downOffset, 512 + rightOffset, 342 + downOffset); wholeRgn := NewRgn; RectRgn(wholeRgn, wholeArea); SpinBall; {Init main window} mainWndo := nil; if (inColor) then mainWndo := GetNewCWindow(mainWndoID, nil, WindowPtr(-1)) else mainWndo := GetNewWindow(mainWndoID, nil, WindowPtr(-1)); if (mainWndo = nil) then GenericAlert(kErrLoadingRes); SetPort(GrafPtr(mainWndo)); MoveWindow(GrafPtr(mainWndo), rightOffset, downOffset, FALSE); ShowWindow(GrafPtr(mainWndo)); SetWRefCon(mainWndo, 0); ClipRect(wholeArea); if (inColor) then begin mainPalette := GetNewPalette(mainWndoID); SetPalette(mainWndo, mainPalette, TRUE); end; end; {---------------------} procedure SetUpMenus; var tempMenu: MenuHandle; theErr: OSErr; begin SpinBall; ClearMenuBar; tempMenu := GetMenu(mApple); if (tempMenu <> nil) then begin AddResMenu(tempMenu, 'DRVR'); InsertMenu(tempMenu, 0); end else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; SpinBall; tempMenu := GetMenu(mFile); if (tempMenu <> nil) then InsertMenu(tempMenu, 0) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; SpinBall; tempMenu := GetMenu(mEdit); if (tempMenu <> nil) then InsertMenu(tempMenu, 0) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; SpinBall; tempMenu := GetMenu(mSpecial); if (tempMenu <> nil) then InsertMenu(tempMenu, 0) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; SpinBall; tempMenu := GetMenu(mControls); if (tempMenu <> nil) then InsertMenu(tempMenu, -1) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; SpinBall; tempMenu := GetMenu(mWindows); if (tempMenu <> nil) then InsertMenu(tempMenu, 0) else begin GenericAlert(kErrUnknownAtInit); ExitToShell; end; if (hasSys7) then {add a Help menu item} begin theErr := HMGetHelpMenuHandle(tempMenu); if (theErr = noErr) then if (tempMenu <> nil) then begin AppendMenu(tempMenu, 'Room Editor Help'); iGlidersHelp := CountMItems(tempMenu); end else begin tempMenu := GetMenu(mWindows); AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end else begin tempMenu := GetMenu(mWindows); AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end; end else begin AppendMenu(tempMenu, '(-'); AppendMenu(tempMenu, 'Help'); end; SpinBall; DrawMenuBar; end; {---------------------} function NewBitMap (var theBitMap: BitMap; theRect: Rect): Ptr; begin with theBitMap, theRect do begin rowBytes := ((right - left + 15) div 16) * 2; baseAddr := NewPtr(rowBytes * (bottom - top)); bounds := theRect; if (MemError <> noErr) then begin GenericAlert(kErrNotEnoughMem); NewBitMap := nil; ExitToShell; end else NewBitMap := baseAddr; end; end; {---------------------} procedure SetUpBitMaps; begin SpinBall; {Init b&w Bitmaps} {Init offscreen virgin map} offVirginPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offVirginPort); offVirginBits := NewBitMap(offVirginMap, wholeArea); SetPortBits(offVirginMap); ClipRect(wholeArea); EraseRect(offVirginMap.bounds); SpinBall; {Init offscreen load map} offLoadPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offLoadPort); offLoadBits := NewBitMap(offLoadMap, wholeArea); SetPortBits(offLoadMap); ClipRect(wholeArea); EraseRect(offLoadMap.bounds); SpinBall; {Init offscreen object map} offPlayerPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offPlayerPort); offPlayerBits := NewBitMap(offPlayerMap, wholeArea); SetPortBits(offPlayerMap); ClipRect(wholeArea); EraseRect(offPlayerMap.bounds); end; {---------------------} procedure SetUpPixMaps; begin SetPort(GrafPtr(mainWndo)); RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); SpinBall; virginCPtr := @virginCPort; OpenCPort(virginCPtr); theDepth := 4; offRowBytes := ((((theDepth * (wholeArea.right - wholeArea.left)) + 15)) div 16) * 2; sizeOfOff := LONGINT(wholeArea.bottom - wholeArea.top) * offRowBytes; virginCBits := NewPtr(sizeOfOff); if (virginCPtr = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with virginCPtr^.portPixMap^^ do begin baseAddr := virginCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); SpinBall; loadCPtr := @loadCPort; OpenCPort(loadCPtr); loadCBits := NewPtr(sizeOfOff); if (loadCBits = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with loadCPtr^.portPixMap^^ do begin baseAddr := loadCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); SpinBall; objectCPtr := @objectCPort; OpenCPort(objectCPtr); objectCBits := NewPtr(sizeOfOff); if (objectCBits = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; with objectCPtr^.portPixMap^^ do begin baseAddr := objectCBits; rowBytes := offRowBytes + $8000; bounds := wholeArea; end; RGBForeColor(rgbBlack); RGBBackColor(rgbWhite); EraseRect(thePort^.portRect); ClipRect(wholeArea); end; {---------------------} procedure SetUpOffMask; begin SpinBall; {Init offscreen mask map} offMaskPort := GrafPtr(NewPtr(SizeOf(GrafPort))); OpenPort(offMaskPort); offMaskBits := NewBitMap(offMaskMap, wholeArea); SetPortBits(offMaskMap); ClipRect(wholeArea); EraseRect(offMaskMap.bounds); end; {---------------------} function DoOpenResFile: Boolean; var dlgOrigin: Point; theTypeList: SFTypeList; theReply: SFReply; begin SpinBall; DoOpenResFile := FALSE; SetPt(dlgOrigin, dlgLeft + rightOffset, dlgTop + downOffset); theTypeList[0] := 'GLbk'; SFGetFile(dlgOrigin, '', nil, 1, theTypeList, nil, theReply); with theReply do begin if (good) then begin resourceName := fName; DoOpenResFile := TRUE; end; end; end; {-----------------} procedure GetPrefs; type prefType = record resName: string[32]; controlIs: Integer; leftIs, rightIs, energyIs, bandIs: Integer; buttonIs, restoreIs: Boolean; leftNameIs, rightNameIs, energyNameIs, bandNameIs: string[12]; isKeyBoard: Integer; end; prefPtr = ^prefType; prefHand = ^prefPtr; pictDeepPt = ^Integer; pictDeepHn = ^pictDeepPt; var theirPrefs: prefHand; pictDeep: pictDeepHn; refNumber, tempVol: Integer; satisfactory: Boolean; {-----------------} procedure DefaultControls; begin leftKey := defaultLeftKey; rightKey := defaultRightKey; energyKey := defaultEnergyKey; bandKey := defaultBandKey; buttonFires := FALSE; leftName := defaultLeftName; rightName := defaultRightName; energyName := defaultEnergyName; bandName := defaultBandName; end; {-----------------} procedure Default; begin if (inColor) then resourceName := 'Art 16' else resourceName := 'Art 2'; controlMethod := absMouse; restoreColor := TRUE; DefaultControls; end; {-----------------} begin SpinBall; UseResFile(editorResNum); theirPrefs := prefHand(NewHandle(SIZEOF(prefType))); if (theirPrefs = nil) then begin Default; Exit(GetPrefs); end; Handle(theirPrefs) := GetResource('Gprf', 128); if ((ResError = noErr) and (theirPrefs <> nil)) then begin HLock(Handle(theirPrefs)); with theirPrefs^^ do begin resourceName := resName; controlMethod := controlIs; leftKey := leftIs; rightKey := rightIs; energyKey := energyIs; bandKey := bandIs; buttonFires := buttonIs; restoreColor := restoreIs; leftName := leftNameIs; rightName := rightNameIs; energyName := energyNameIs; bandName := bandNameIs; if (isKeyBoard <> herKeyBoard) then DefaultControls; end; HUnlock(Handle(theirPrefs)); ReleaseResource(Handle(theirPrefs)); end else begin Default; end; SpinBall; if ((controlMethod < holdKey) or (controlMethod > relMouse)) then controlMethod := absMouse; CheckItem(GetMenu(mControls), controlMethod, TRUE); if (restoreColor) then SetItem(GetMenu(mSpecial), iRestoreDeep, 'Depth Restore is On') else SetItem(GetMenu(mSpecial), iRestoreDeep, 'Depth Restore is Off'); if ((cantColor) or (cantSwitch)) then DisableItem(GetMenu(mSpecial), iRestoreDeep); refNumber := OpenResFile(resourceName); {test to see if res legit} if (refNumber = -1) then begin if (ResError = resFNotFound) then {Hmmm. Maybe color depth has changed} begin if (inColor) then resourceName := 'Color Art' {Try the default color name} else resourceName := 'B&W Art'; {Or default B&W file name} refNumber := OpenResFile(resourceName); {test to see if res legit yet} if (refNumber = -1) then begin UseResFile(editorResNum); {back to Editor res file} GenericAlert(kErrGraphicsNotFound); {bitch about all this} if (not DoOpenResFile) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end else begin UseResFile(editorResNum); {back to Editor res file} GenericAlert(kErrGraphicsNotFound); {bitch about all this} if (not DoOpenResFile) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end; satisfactory := FALSE; repeat UseResFile(refNumber); pictDeep := pictDeepHn(NewHandle(SIZEOF(Integer))); if (pictDeep = nil) then begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; Handle(pictDeep) := GetResource('deep', 128); if ((ResError = noErr) and (pictDeep <> nil)) then begin HLock(Handle(pictDeep)); if (inColor) then begin if (pictDeep^^ <> $0004) then begin if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; CloseResFile(refNumber); if (resourceName <> 'Color Art') then begin resourceName := 'Color Art'; refNumber := OpenResFile(resourceName); end else begin GenericAlert(21); if (not DoOpenResFile) then begin GenericAlert(kErrExitSansGraphics); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end else satisfactory := TRUE; end else {were in b&w mode} begin if (pictDeep^^ <> $0001) then begin if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; CloseResFile(refNumber); if (resourceName <> 'B&W Art') then begin resourceName := 'B&W Art'; refNumber := OpenResFile(resourceName); end else begin GenericAlert(22); if (not DoOpenResFile) then begin GenericAlert(20); ExitToShell; end; refNumber := OpenResFile(resourceName); end; end else satisfactory := TRUE; end; end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; if (pictDeep <> nil) then begin HUnlock(Handle(pictDeep)); ReleaseResource(Handle(pictDeep)); pictDeep := nil; end; until satisfactory; CloseResFile(refNumber); UseResFile(editorResNum); end; {---------------------} procedure LoadPICTs; var refNumber: Integer; wasPort: GrafPtr; begin SpinBall; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin UseResFile(editorResNum); GenericAlert(kErrGraphicsNotFound); if (not DoOpenResFile) then ExitToShell; refNumber := OpenResFile(resourceName); if (refNumber = -1) then begin GenericAlert(kErrGraphicsNotFound); ExitToShell; end; end; UseResFile(refNumber); SpinBall; GetPort(wasPort); if (inColor) then {load the objects up} SetPort(GrafPtr(objectCPtr)) else SetPort(offPlayerPort); thePict := GetPicture(objectPictID); if (thePict^ <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); SpinBall; SetPort(offMaskPort); thePict := GetPicture(maskPictID); {load the mask up} if (thePict^ <> nil) then begin tempByte := HGetState(Handle(thePict)); MoveHHi(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, wholeArea); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrNotEnoughMem); ExitToShell; end; ReleaseResource(Handle(thePict)); SpinBall; SetPort(wasPort); CloseResFile(refNumber); UseResFile(editorResNum); end; {---------------------} begin editorResNum := CurResFile; SetApplLimit(Ptr(LongInt(GetApplLimit) - StackSize)); MaxApplZone; for index := 1 to 10 do MoreMasters; InitGraf(@thePort); InitFonts; InitWindows; InitMenus; TEInit; InitDialogs(nil); InitCursor; for index := 1 to 3 do ignore := EventAvail(EveryEvent, theEvent); inBackground := FALSE; SetCursor(GetCursor(WatchCursor)^^); CheckOurEnvirons; LoadCursors; SpinBall; if (inColor) then SetUpColors; SpinBall; SetUpMenus; SpinBall; SetUpMainWndo; SpinBall; if (inColor) then SetUpPixMaps else SetUpBitMaps; SpinBall; SetUpOffMask; SpinBall; GetPrefs; SpinBall; LoadPICTs; SpinBall; doneFlag := FALSE; soundOn := not inhibitSound; playing := FALSE; pausing := FALSE; roomScrapDirty := FALSE; objectScrapDirty := FALSE; fileIsOpen := FALSE; autoHide := FALSE; lightsOut := FALSE; bandBorne := TRUE; lockIt := FALSE; binaryFlip := 1; GetDateTime(RandSeed); FlushRoom(thisRoom); setOTools := 0; toolWndo := nil; housesName := 'untitled'; marqueeTime := FALSE; marqueeIndex := 0; for index := 0 to 4 do begin SpinBall; GetIndPattern(marqueePat[index], 128, index + 1); end; for index := 0 to 7 do SetRect(tileRects[index], index * 64, 0, (index + 1) * 64, 342); SetRect(iconRect[0], 5, 55, 37, 87); SetRect(iconRect[1], 41, 55, 73, 87); SetRect(iconRect[2], 5, 90, 37, 122); SetRect(iconRect[3], 41, 90, 73, 122); SetRect(iconRect[4], 5, 125, 37, 157); SetRect(iconRect[5], 41, 125, 73, 157); SpinBall; SetRect(selectRect[0], 8, 6, 24, 22); SetRect(selectRect[1], 31, 6, 47, 22); SetRect(selectRect[2], 54, 6, 70, 22); SetRect(selectRect[3], 8, 28, 24, 44); SetRect(selectRect[4], 31, 28, 47, 44); SetRect(selectRect[5], 54, 28, 70, 44); SetRect(shadoRct[0], 256, 0, 304, 11); SetRect(shadoRct[1], 256, 12, 304, 23); SpinBall; SetRect(glideRct[0], 0, 0, 48, 20); {right forward} SetRect(glideRct[1], 0, 21, 48, 41); {right tipped} SetRect(glideRct[2], 0, 42, 48, 62); {left forward} SetRect(glideRct[3], 0, 63, 48, 83); {left tipped} SetRect(glideRct[4], 208, 0, 256, 20); {turn endpoint} SetRect(glideRct[5], 208, 21, 256, 41); { " } SetRect(glideRct[6], 208, 42, 256, 62); { " } SetRect(glideRct[7], 208, 63, 256, 83); { " } SetRect(glideRct[8], 208, 84, 256, 104); { " } SetRect(glideRct[9], 208, 105, 256, 125);{turn endpoint} SetRect(glideRct[10], 414, 53, 462, 73); {glider fading masks right} SetRect(glideRct[11], 414, 74, 462, 94); SetRect(glideRct[12], 414, 95, 462, 115); SetRect(glideRct[13], 414, 116, 462, 136); SetRect(glideRct[14], 414, 137, 462, 157); SetRect(glideRct[15], 414, 158, 462, 178); SetRect(glideRct[16], 414, 179, 462, 199); SetRect(glideRct[17], 463, 53, 511, 73); {glider fading masks left} SetRect(glideRct[18], 463, 74, 511, 94); SetRect(glideRct[19], 463, 95, 511, 115); SetRect(glideRct[20], 463, 116, 511, 136); SetRect(glideRct[21], 463, 137, 511, 157); SetRect(glideRct[22], 463, 158, 511, 178); SetRect(glideRct[23], 463, 179, 511, 199); SetRect(glideRct[24], 265, 24, 313, 60); {burning} SetRect(glideRct[25], 265, 61, 313, 97); SetRect(glideRct[26], 265, 98, 313, 134); SetRect(glideRct[27], 265, 135, 313, 171); SpinBall; nextPhase[1, 0] := 10; nextPhase[1, 1] := 11; nextPhase[1, 2] := 10; nextPhase[1, 3] := 11; nextPhase[1, 4] := 12; nextPhase[1, 5] := 11; nextPhase[1, 6] := 12; nextPhase[1, 7] := 13; nextPhase[1, 8] := 12; nextPhase[1, 9] := 13; nextPhase[1, 10] := 14; nextPhase[1, 11] := 13; nextPhase[1, 12] := 14; nextPhase[1, 13] := 15; nextPhase[1, 14] := 14; nextPhase[1, 15] := 15; nextPhase[1, 16] := 16; nextPhase[2, 0] := 16; nextPhase[2, 1] := 15; nextPhase[2, 2] := 16; nextPhase[2, 3] := 15; nextPhase[2, 4] := 14; nextPhase[2, 5] := 15; nextPhase[2, 6] := 14; nextPhase[2, 7] := 13; nextPhase[2, 8] := 14; nextPhase[2, 9] := 13; nextPhase[2, 10] := 12; nextPhase[2, 11] := 13; nextPhase[2, 12] := 12; nextPhase[2, 13] := 11; nextPhase[2, 14] := 12; nextPhase[2, 15] := 11; nextPhase[2, 16] := 10; nextPhase[3, 0] := 4; nextPhase[3, 1] := 4; nextPhase[3, 2] := 5; nextPhase[3, 3] := 5; nextPhase[3, 4] := 6; nextPhase[3, 5] := 6; nextPhase[3, 6] := 7; nextPhase[3, 7] := 7; nextPhase[3, 8] := 8; nextPhase[3, 9] := 8; nextPhase[3, 10] := 9; nextPhase[3, 11] := 9; nextPhase[4, 0] := 9; nextPhase[4, 1] := 9; nextPhase[4, 2] := 8; nextPhase[4, 3] := 8; nextPhase[4, 4] := 7; nextPhase[4, 5] := 7; nextPhase[4, 6] := 6; nextPhase[4, 7] := 6; nextPhase[4, 8] := 5; nextPhase[4, 9] := 5; nextPhase[4, 10] := 4; nextPhase[4, 11] := 4; SpinBall; SetRect(srcRect[celVnt], 0, 84, 48, 96); SetRect(srcRect[celDct], 0, 97, 48, 110); SetRect(srcRect[flrVnt], 0, 111, 48, 124); SetRect(srcRect[paper], 0, 125, 48, 146); SetRect(srcRect[toastr], 0, 147, 38, 174); SetRect(srcRect[60], 304, 84, 336, 115); {toast 1} SetRect(srcRect[61], 304, 116, 336, 147); {toast 2} SetRect(srcRect[62], 304, 148, 336, 179); {toast 3} SetRect(srcRect[63], 304, 180, 336, 211); {toast 4} SetRect(srcRect[64], 304, 212, 336, 243); {toast 5} SetRect(srcRect[65], 304, 244, 336, 275); {toast 6} SetRect(srcRect[teaKtl], 0, 175, 41, 205); SetRect(srcRect[lftFan], 0, 206, 35, 261); SetRect(srcRect[ritFan], 0, 262, 35, 316); SetRect(srcRect[table], 48, 23, 112, 45); SetRect(srcRect[shredr], 48, 46, 112, 70); SetRect(srcRect[books], 48, 71, 112, 126); SetRect(srcRect[clock], 112, 0, 144, 29); SetRect(srcRect[candle], 112, 30, 144, 51); SetRect(srcRect[rbrBnd], 112, 52, 144, 75); SetRect(srcRect[ball], 112, 76, 144, 108); SetRect(srcRect[fshBwl], 112, 109, 144, 138); SetRect(srcRect[66], 144, 109, 160, 125); {fish 1} SetRect(srcRect[67], 144, 126, 160, 142); {fish 2} SetRect(srcRect[68], 144, 143, 160, 159); {fish 3} SetRect(srcRect[69], 144, 160, 160, 176); {fish 4} SetRect(srcRect[grease], 112, 139, 144, 168); SetRect(srcRect[58], 112, 169, 144, 198); {grease falling 1} SetRect(srcRect[59], 112, 199, 144, 228); {grease fallen} SetRect(srcRect[litSwt], 142, 0, 160, 26); SetRect(srcRect[thermo], 144, 27, 162, 54); SetRect(srcRect[outlet], 160, 264, 192, 289); SetRect(srcRect[51], 160, 290, 192, 315); {outlet sparking 1} SetRect(srcRect[52], 160, 316, 192, 341); {outlet sparking 2} SetRect(srcRect[pwrSwt], 144, 82, 162, 108); SetRect(srcRect[guitar], 48, 127, 112, 297); SetRect(srcRect[drip], 192, 42, 208, 55); SetRect(srcRect[shelf], 192, 71, 208, 100); SetRect(srcRect[basket], 448, 270, 511, 341); SetRect(srcRect[paintg], 408, 53, 510, 146); SetRect(srcRect[battry], 144, 55, 160, 81); SetRect(srcRect[macTsh], 256, 209, 301, 267); SetRect(srcRect[upStar], 0, 0, 161, 254); SetRect(srcRect[dnStar], 0, 0, 161, 254); SetRect(srcRect[48], 144, 189, 160, 201); {candle flame} SetRect(srcRect[49], 144, 202, 160, 214); {candle flame} SetRect(srcRect[50], 144, 215, 160, 227); {candle flame} SetRect(srcRect[53], 192, 0, 208, 13); {drip} SetRect(srcRect[54], 192, 14, 208, 27); {drip} SetRect(srcRect[55], 192, 28, 208, 41); {drip} SetRect(srcRect[56], 192, 42, 208, 55); {drip} SetRect(srcRect[57], 192, 56, 208, 70); {drip} SpinBall; toolIcnID[0] := 400; toolIcnID[1] := 401; toolIcnID[2] := 402; toolIcnID[3] := 403; toolIcnID[4] := 404; toolIcnID[5] := 405; toolIcnID[6] := 406; toolIcnID[8] := 408; toolIcnID[9] := 409; toolIcnID[10] := 410; toolIcnID[11] := 411; toolIcnID[12] := 412; toolIcnID[13] := 413; toolIcnID[16] := 416; toolIcnID[17] := 417; toolIcnID[18] := 418; toolIcnID[19] := 419; toolIcnID[20] := 420; toolIcnID[21] := 421; toolIcnID[24] := 424; toolIcnID[25] := 425; toolIcnID[26] := 426; toolIcnID[27] := 427; toolIcnID[28] := 428; toolIcnID[29] := 429; toolIcnID[32] := 432; toolIcnID[33] := 433; toolIcnID[34] := 434; toolIcnID[35] := 435; toolIcnID[36] := 436; toolIcnID[37] := 437; toolIcnID[40] := 440; toolIcnID[41] := 441; toolIcnID[42] := 442; toolIcnID[43] := 443; toolIcnID[44] := 444; toolIcnID[45] := 445; InitCursor; end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-ObjectStuff.p b/RoomEditor_103/Sources/E-ObjectStuff.p new file mode 100755 index 0000000..b501e84 --- /dev/null +++ b/RoomEditor_103/Sources/E-ObjectStuff.p @@ -0,0 +1 @@ +unit ObjectStuff; interface uses Palettes, Globals, Utilities, Drawing, RoomStuff; procedure AutoHideShow (hiding: Boolean); procedure SetUpFields; procedure DragObject (which: Integer); procedure DragHandle; procedure DragOffPalette (whatKind: Integer); procedure CloseTools; procedure UpdateTools; procedure OpenTools; procedure DoTools; procedure BumpAPixel (hori, vert: Integer); procedure DoObjectInfo; function InsertObject: Boolean; implementation const objectInfoID = 131; {=================================} procedure AutoHideShow (hiding: Boolean); begin if (hiding) then begin if (toolWndo <> nil) then begin SetPort(GrafPtr(toolWndo)); SetPt(holdCorner, toolWndo^.portRect.left, toolWndo^.portRect.top); LocalToGlobal(holdCorner); DisposeWindow(GrafPtr(toolWndo)); toolWndo := nil; SetPort(GrafPtr(mainWndo)); end else SetPt(holdCorner, -1000, 0); end else {not hiding - showing} begin if (holdCorner.h <> -1000) then begin if (inColor) then toolWndo := GetNewCWindow(128, nil, WindowPtr(-1)) else toolWndo := GetNewWindow(128, nil, WindowPtr(-1)); if (toolWndo = nil) then begin GenericAlert(kErrLoadingRes); ExitToShell; end; SetPort(GrafPtr(toolWndo)); MoveWindow(toolWndo, holdCorner.h, holdCorner.v, FALSE); ShowWindow(toolWndo); SetWRefCon(toolWndo, 1); UpdateTools; end; end; end; {=================================} procedure SetUpFields; var tempBool: Boolean; tempAmount, tempExtra, what: Integer; begin what := thisRoom.theObjects[oneActive].objectIs; case (what) of flrVnt, ball, toastr, fshBwl: tempAmount := ceilingVert + 20; extRct, upStar, dnStar: tempAmount := roomAt; celVnt, celDct, drip: tempAmount := floorVert - 20; candle: begin tempAmount := thisRoom.theObjects[oneActive].boundRect.top - 100; if (tempAmount < ceilingVert + 50) then tempAmount := ceilingVert + 50; end; lftFan: begin tempAmount := thisRoom.theObjects[oneActive].boundRect.left - 100; if (tempAmount < 0) then tempAmount := 0; end; ritFan, grease: begin tempAmount := thisRoom.theObjects[oneActive].boundRect.right + 100; if (tempAmount > 512) then tempAmount := 512; end; clock, paper, bnsRct: tempAmount := 1000; rbrBnd: tempAmount := 10; battry: tempAmount := 40; outlet, teaKtl: tempAmount := 120; pwrSwt: tempAmount := 0; otherwise tempAmount := 0; end; case (what) of celDct, lftFan, ritFan, grease, shredr: tempBool := TRUE; otherwise tempBool := FALSE; end; case (what) of celDct: tempExtra := roomAt; drip, toastr, fshBwl: tempExtra := 120; otherwise tempExtra := 0; end; with thisRoom.theObjects[oneActive] do begin objectIs := what; amount := tempAmount; extra := tempExtra; isOn := tempBool; end; end; {=================================} procedure DragObject; var floorLockOn, ceilingLockOn, stairLockOn: Boolean; isPt, wasPt, refPt: Point; theSrc, oldRect, destRect: Rect; what, errorIs: Integer; begin SetPort(GrafPtr(mainWndo)); what := thisRoom.theObjects[which].objectIs; destRect := thisRoom.theObjects[which].boundRect; oldRect := destRect; theSrc := srcRect[what]; floorLockOn := FALSE; ceilingLockOn := FALSE; stairLockOn := FALSE; if (what = flrVnt) then floorLockOn := TRUE; if ((what = celDct) or (what = celVnt)) then ceilingLockOn := TRUE; if ((what = upStar) or (what = dnStar)) then stairLockOn := TRUE; isPt := theEvent.where; wasPt := isPt; PenPat(gray); PenMode(patXOr); FrameRect(destRect); while (WaitMouseUp) do begin GetMouse(isPt); LocalToGlobal(isPt); if ((isPt.h <> wasPt.h) or (isPt.v <> wasPt.v)) then begin FrameRect(destRect); if ((floorLockOn) or (ceilingLockOn) or (stairLockOn)) then OffsetRect(destRect, isPt.h - wasPt.h, 0) else OffsetRect(destRect, isPt.h - wasPt.h, isPt.v - wasPt.v); FrameRect(destRect); oldRect := destRect; end; wasPt := isPt; end; FrameRect(destRect); PenNormal; if (toolWndo <> nil) then SetPort(toolWndo); changed := TRUE; thisRoom.theObjects[which].boundRect := destRect; if (ErrorCheckObject(thisRoom.theObjects[which], errorIs)) then SysBeep(1); {*** temp beep for error} end; {=================================} procedure DragHandle; const horiLock = 0; vertLock = 1; noLock = 2; var min, max, restrict, saveActive: Integer; savePos, savePos2, min2, max2, kind: Integer; stretchFrame: Rect; wasPt, isPt: Point; square: Boolean; begin saveActive := oneActive; Deselect; changed := TRUE; SetPort(GrafPtr(mainWndo)); with thisRoom.theObjects[saveActive] do begin case (objectIs) of {Pop the handle out} table, shelf: begin min := boundRect.left + 64; max := 512; restrict := horiLock; square := FALSE; end; flrVnt, candle, toastr, ball, fshBwl: begin min := ceilingVert + 20; max := boundRect.top - 20; restrict := vertLock; square := FALSE; end; celVnt, celDct, drip: begin min := boundRect.bottom + 20; max := floorVert; restrict := vertLock; square := FALSE; end; lftFan: begin min := 0; max := boundRect.left - 20; restrict := horiLock; square := FALSE; end; ritFan, grease: begin min := boundRect.right + 20; max := 512; restrict := horiLock; square := FALSE; end; otherwise begin min := boundRect.left + 32; max := 512; min2 := boundRect.top + 32; max2 := 342; stretchFrame := boundRect; square := TRUE; end; end; {End of case} end; {End of with} PenPat(gray); PenMode(PatXOr); if (square) then FrameRect(stretchFrame) else begin MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); end; PaintRect(handleRect); GetMouse(wasPt); isPt := wasPt; while WaitMouseUp do begin GetMouse(isPt); if (square) then begin if ((isPt.h <> wasPt.h) or (isPt.v <> wasPt.v)) then begin FrameRect(stretchFrame); PaintRect(handleRect); savePos := endPt.h; savePos2 := endPt.v; endPt := isPt; if (endPt.h > max) then endPt.h := max; if (endPt.h < min) then endPt.h := min; if (endPt.v > max2) then endPt.v := max2; if (endPt.v < min2) then endPt.v := min2; OffsetRect(handleRect, endPt.h - savePos, endPt.v - savePos2); stretchFrame.right := endPt.h; stretchFrame.bottom := endPt.v; FrameRect(stretchFrame); PaintRect(handleRect); end; end else begin if ((restrict = horiLock) and (isPt.h <> wasPt.h)) then begin MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); savePos := endPt.h; endPt.h := isPt.h; if (endPt.h > max) then endPt.h := max; if (endPt.h < min) then endPt.h := min; OffsetRect(handleRect, endPt.h - savePos, 0); MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); end; if ((restrict = vertLock) and (isPt.v <> wasPt.v)) then begin MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); savePos := endPt.v; endPt.v := isPt.v; if (endPt.v > max) then endPt.v := max; if (endPt.v < min) then endPt.v := min; OffsetRect(handleRect, 0, endPt.v - savePos); MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); end; end; wasPt := isPt; end; if (square) then FrameRect(stretchFrame) else begin MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); end; PaintRect(handleRect); PenNormal; if (toolWndo <> nil) then SetPort(toolWndo); with thisRoom.theObjects[saveActive] do case (objectIs) of table, shelf: boundRect.right := wasPt.h; cabnet, extRct, obsRct, bnsRct, window, mirror: begin boundRect := stretchFrame; end; otherwise if (restrict = horiLock) then amount := endPt.h else amount := endPt.v; end; kind := thisRoom.theObjects[saveActive].objectIs; oneActive := saveActive; changed := TRUE; case kind of {some objects require a complete redrawing} table, shelf, cabnet, extRct, obsRct, bnsRct, window, mirror: DrawAllObjects; otherwise {others are unaffected by a handle-drag} Select; end; end; {=================================} procedure DragOffPalette; var thePt: Point; i: Integer; finalRect: Rect; wasPort: GrafPtr; begin GetPort(wasPort); SetPort(GrafPtr(mainWndo)); with thisRoom do begin if (numberOObjects < 16) then numberOObjects := numberOObjects + 1 else begin SetPort(wasPort); GenericAlert(kErrTooManyObjects); Exit(DragOffPalette); end; if (whatKind = toastr) or (whatKind = window) or (whatKind = mirror) then for i := 1 to numberOObjects - 1 do with theObjects[i] do if (objectIs = whatKind) then begin numberOObjects := numberOObjects - 1; SetPort(wasPort); GenericAlert(16); Exit(DragOffPalette); end; if (autoHide) then AutoHideShow(TRUE); oneActive := thisRoom.numberOObjects; thisRoom.theObjects[oneActive].objectIs := whatKind; end; {with thisRoom do} thePt := theEvent.where; GlobalToLocal(thePt); case whatKind of table: SetRect(finalRect, thePt.h - 50, thePt.v - 5, thePt.h + 50, thePt.v + 4); shelf: SetRect(finalRect, thePt.h - 50, thePt.v - 4, thePt.h + 50, thePt.v + 3); cabnet: SetRect(finalRect, thePt.h - 50, thePt.v - 30, thePt.h + 50, thePt.v + 30); extRct, obsRct, bnsRct: SetRect(finalRect, thePt.h - 32, thePt.v - 16, thePt.h + 32, thePt.v + 16); mirror: SetRect(finalRect, thePt.h - 32, thePt.v - 64, thePt.h + 32, thePt.v + 64); flrVnt: begin finalRect := srcRect[whatKind]; OffsetRect(finalRect, -finalRect.left, -finalRect.top); OffsetRect(finalRect, thePt.h, floorVert); OffsetRect(finalRect, -(finalRect.right - finalRect.left) div 2, 0); end; celVnt, celDct: begin finalRect := srcRect[whatKind]; OffsetRect(finalRect, -finalRect.left, -finalRect.top); OffsetRect(finalRect, thePt.h, ceilingVert); OffsetRect(finalRect, -(finalRect.right - finalRect.left) div 2, 0); end; window: SetRect(finalRect, thePt.h - 50, thePt.v - 60, thePt.h + 50, thePt.v + 60); upStar, dnStar: begin finalRect := srcRect[whatKind]; OffsetRect(finalRect, -finalRect.left, -finalRect.top); OffsetRect(finalRect, thePt.h, stairVert); OffsetRect(finalRect, -(finalRect.right - finalRect.left) div 2, 0); end; otherwise begin finalRect := srcRect[whatKind]; OffsetRect(finalRect, -finalRect.left, -finalRect.top); {Set to 0,0} OffsetRect(finalRect, thePt.h, thePt.v); {Offset to cursor} OffsetRect(finalRect, (finalRect.left - finalRect.right) div 2, (finalRect.top - finalRect.bottom) div 2); end; end; thisRoom.theObjects[oneActive].boundRect := finalRect; SetUpFields; DragObject(oneActive); SortObjects; DrawAllObjects; if (autoHide) then AutoHideShow(FALSE); UpdateMenuItems(editToObject); SetPort(wasPort); end; {=================================} procedure CloseTools; begin if (toolWndo <> nil) then begin DisposeWindow(GrafPtr(toolWndo)); toolWndo := nil; end; end; {=================================} procedure UpdateTools; var index, tempInt: Integer; tempRect: Rect; icnHand: Handle; cicnHand: CIconHandle; theSICN: SICNHand; wasPort: GrafPtr; begin if (toolWndo = nil) then Exit(UpdateTools); GetPort(wasPort); SetPort(GrafPtr(toolWndo)); PenNormal; ForeColor(cyanColor); MoveTo(5, 50); LineTo(70, 50); ForeColor(blackCOlor); if (inColor) then begin for index := 0 to 5 do begin SpinBall; cicnHand := GetCIcon(133 + index); if (cicnHand <> nil) then PlotCIcon(selectRect[index], cicnHand) else GenericAlert(kErrLoadingRes); DisposCIcon(cicnHand); end; end else begin for index := 0 to 5 do begin SpinBall; theSICN := SICNHand(GetResource('SICN', 256 + index)); if (theSICN <> nil) then PlotSICN(selectRect[index], theSICN); end; end; tempRect := selectRect[setOTools]; InsetRect(tempRect, -3, -3); PenSize(2, 2); PenPat(black); ForeColor(redColor); FrameRect(tempRect); ForeColor(blackColor); PenNormal; for index := 0 to 5 do begin SpinBall; if (setOTools = 0) then tempInt := index + 1 else tempInt := index; if (inColor) then begin cicnHand := GetCIcon(toolIcnId[tempInt + (8 * setOTools)]); if (cicnHand <> nil) then PlotCIcon(iconRect[index], cicnHand) else GenericAlert(kErrLoadingRes); DisposCIcon(cicnHand); end else begin icnHand := GetIcon(toolIcnId[tempInt + (8 * setOTools)]); if (icnHand <> nil) then PlotIcon(iconRect[index], icnHand) else GenericAlert(kErrLoadingRes); end; end; SetPort(wasPort); InitCursor; end; {=================================} procedure OpenTools; begin if (toolWndo = nil) then begin if (inColor) then toolWndo := GetNewCWindow(128, nil, WindowPtr(-1)) else toolWndo := GetNewWindow(128, nil, WindowPtr(-1)); if (toolWndo = nil) then begin GenericAlert(kErrLoadingRes); ExitToShell; end; SetPort(GrafPtr(toolWndo)); MoveWindow(toolWndo, screenBits.bounds.right - 99, 40, FALSE); ShowWindow(toolWndo); SetWRefCon(toolWndo, 1); UpdateTools; end else SelectWindow(toolWndo); end; {=================================} procedure DoTools; var index, what: Integer; tempRect: Rect; thePt: Point; begin if (toolWndo = nil) then Exit(DoTools); if (theEvent.what = MouseDown) then begin thePt := theEvent.where; GlobalToLocal(thePt); for index := 0 to 5 do if (PtInRect(thePt, iconRect[index])) then begin Deselect; changed := TRUE; what := index + (setOTools * 8); if (setOTools = 0) then what := what + 1; if (toolIcnID[what] <> 400) then DragOffPalette(what) else what := 0; end; for index := 0 to 5 do if (PtInRect(thePt, selectRect[index])) then if (setOTools <> index) then begin tempRect := selectRect[setOTools]; InsetRect(tempRect, -3, -3); PenSize(2, 2); if (inColor) then begin RGBForeColor(rgbWhite); FrameRect(tempRect); RGBForeColor(rgbBlack); end else begin FrameRect(tempRect); PenMode(patXOr); FrameRect(tempRect); PenNormal; end; setOTools := index; UpdateTools; end; end; end; {=================================} procedure BumpAPixel; var holdObject, what: Integer; destRect, theSrc: Rect; begin holdObject := oneActive; Deselect; oneActive := holdObject; destRect := thisRoom.theObjects[oneActive].boundRect; what := thisRoom.theObjects[oneActive].objectIs; if (((what = flrVnt) or (what = celVnt) or (what = celDct)) and (vert <> 0)) then vert := 0; OffsetRect(destRect, hori, vert); {error check that bounds have been respected HERE} theSrc := srcRect[what]; DrawAllObjects; with thisRoom.theObjects[oneActive] do begin boundRect := destRect; case objectIs of candle, toastr..fshBwl: begin amount := amount + vert; if (amount < (ceilingVert + 20)) then amount := ceilingVert + 20; end; lftFan: begin amount := amount + hori; if (amount < 0) then amount := 0; end; ritFan, grease: begin amount := amount + hori; if (amount > 512) then amount := 512; end; otherwise ; end; {case} end; {with} Select; end; {=================================} procedure DoObjectInfo; const inactive = 255; active = 0; okayBut = 1; cancelBut = 2; leftEdit = 3; topEdit = 4; widthEdit = 5; heightEdit = 6; delayEdit = 7; onRadio = 8; offRadio = 9; leftStat = 12; topStat = 13; widthStat = 14; heightStat = 15; delayStat = 16; numStat = 18; var wasPort: GrafPtr; leaveDlg: Boolean; theDlgPtr: DialogPtr; tempRect, wasRect: Rect; cntlType, itemHit, tempInt, rightOff, downOff, i, whichSelect: Integer; tempLong: LongInt; dlgItem: Handle; strTemp: Str255; tempObject: objectData; {-------------------------} function ReadNumber (item: Integer): Integer; begin GetDItem(theDlgPtr, item, cntlType, dlgItem, tempRect); GetIText(dlgItem, strTemp); StringToNum(strTemp, tempLong); ReadNumber := LoWord(tempLong); end; {-------------------------} procedure WriteNumber (item, value: Integer; select: Boolean); begin GetDItem(theDlgPtr, item, cntlType, dlgItem, tempRect); NumToString(value, strTemp); SetIText(dlgItem, strTemp); if (select) then SelIText(theDlgPtr, item, 0, 4); end; {-------------------------} procedure Redraw; var width: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, okayBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; with theDlgPtr^.portRect do width := right - left; MoveTo(4, 38); Line(width - 8, 0); MoveTo(4, 40); Line(width - 8, 0); end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(objectInfoID, nil, Pointer(-1)); with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); tempObject := thisRoom.theObjects[oneActive]; with tempObject do begin {pop object number as static field} WriteNumber(numStat, oneActive, FALSE); {pop left coordinate into edit text field} WriteNumber(leftEdit, boundRect.left, FALSE); {pop top coordinate into edit text field} WriteNumber(topEdit, boundRect.top, FALSE); whichSelect := leftEdit; case objectIs of table, shelf: begin WriteNumber(widthEdit, boundRect.right - boundRect.left, FALSE); HideDItem(theDlgPtr, heightEdit); HideDItem(theDlgPtr, heightStat); whichSelect := widthEdit; end; cabNet, extRct, obsRct, bnsRct, window, mirror: begin WriteNumber(widthEdit, boundRect.right - boundRect.left, FALSE); WriteNumber(heightEdit, boundRect.bottom - boundRect.top, FALSE); whichSelect := widthEdit; end; flrVnt, celVnt, upStar, dnStar: begin HideDItem(theDlgPtr, topEdit); HideDItem(theDlgPtr, topStat); HideDItem(theDlgPtr, widthEdit); HideDItem(theDlgPtr, widthStat); HideDItem(theDlgPtr, heightEdit); HideDItem(theDlgPtr, heightStat); end; celDct: begin HideDItem(theDlgPtr, topEdit); HideDItem(theDlgPtr, topStat); WriteNumber(widthEdit, extra, FALSE); GetDItem(theDlgPtr, widthStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Rm # link'); HideDItem(theDlgPtr, heightEdit); HideDItem(theDlgPtr, heightStat); whichSelect := widthEdit; end; drip, toastr, fshBwl: begin WriteNumber(widthEdit, extra, FALSE); GetDItem(theDlgPtr, widthStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Delay (1/60th secs)'); HideDItem(theDlgPtr, heightEdit); HideDItem(theDlgPtr, heightStat); whichSelect := widthEdit; end; otherwise begin HideDItem(theDlgPtr, widthEdit); HideDItem(theDlgPtr, widthStat); HideDItem(theDlgPtr, heightEdit); HideDItem(theDlgPtr, heightStat); end; end; {case objectIs} case objectIs of extRct, upStar, dnStar: begin WriteNumber(delayEdit, amount, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Room # connected to:'); whichSelect := delayEdit; end; flrVnt..ritFan: begin case objectIs of flrVnt, candle: WriteNumber(delayEdit, boundRect.top - amount, FALSE); celVnt, celDct: WriteNumber(delayEdit, amount - boundRect.bottom, FALSE); lftFan: WriteNumber(delayEdit, boundRect.left - amount, FALSE); ritFan: WriteNumber(delayEdit, amount - boundRect.right, FALSE); end; GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Length of air column:'); if (objectIs <> celDct) then whichSelect := delayEdit; end; drip, toastr, ball, fshBwl: begin case objectIs of toastr, ball, fshBwl: WriteNumber(delayEdit, boundRect.top - amount, FALSE); drip: WriteNumber(delayEdit, amount - boundRect.bottom, FALSE); end; GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Length of travel:'); whichSelect := delayEdit; end; outlet, teaKtl: begin WriteNumber(delayEdit, amount, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Delay (1/60):'); whichSelect := delayEdit; end; clock, paper, bnsRct: begin WriteNumber(delayEdit, amount, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Points awarded:'); whichSelect := delayEdit; end; rbrBnd, battry: begin WriteNumber(delayEdit, amount, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Quantity:'); whichSelect := delayEdit; end; pwrSwt: begin WriteNumber(delayEdit, amount, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Object # linked to:'); whichSelect := delayEdit; end; grease: begin WriteNumber(delayEdit, amount - boundRect.right, FALSE); GetDItem(theDlgPtr, delayStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, 'Length of spill:'); whichSelect := delayEdit; end; otherwise begin HideDItem(theDlgPtr, delayEdit); HideDItem(theDlgPtr, delayStat); end; end; {case objectIs} case objectIs of lftFan, ritFan, shredr, celDct, grease, window: begin if (isOn) then GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect) else GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); if (objectIs = celDct) then begin GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Blower'); GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Suction'); end; if (objectIs = grease) then begin GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Up'); GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Spilled'); end; if (objectIs = window) then begin GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Window Open'); GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCTitle(ControlHandle(dlgItem), 'Window Closed'); end; end; otherwise begin HideDItem(theDlgPtr, onRadio); HideDItem(theDlgPtr, offRadio); end; end; {case objectIs} end; {end - with tempRoom do} {select the left coordinate text edit field} SelIText(theDlgPtr, whichSelect, 0, 254); Redraw; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); if (itemHit = okayBut) then begin leaveDlg := TRUE; with tempObject do begin tempInt := ReadNumber(leftEdit); {error check left coord} if (tempInt < 0) then begin SysBeep(1); WriteNumber(leftEdit, 0, TRUE); leaveDlg := FALSE; end else if ((tempInt + (boundRect.right - boundRect.left)) > 512) then begin SysBeep(1); WriteNumber(leftEdit, 512 - (boundRect.right - boundRect.left), TRUE); leaveDlg := FALSE; end else begin tempInt := tempInt - boundRect.left; boundRect.left := boundRect.left + tempInt; boundRect.right := boundRect.right + tempInt; end; case objectIs of table..obsRct, candle..macTsh: begin tempInt := ReadNumber(topEdit); {error check top coord} if (tempInt < ceilingVert) then begin SysBeep(1); WriteNumber(topEdit, ceilingVert, TRUE); leaveDlg := FALSE; end else if ((tempInt + (boundRect.bottom - boundRect.top)) > floorVert) then begin SysBeep(1); WriteNumber(topEdit, floorVert - (boundRect.bottom - boundRect.top), TRUE); leaveDlg := FALSE; end else begin tempInt := tempInt - boundRect.top; boundRect.top := boundRect.top + tempInt; boundRect.bottom := boundRect.bottom + tempInt; end; end; otherwise end; case objectIs of table, shelf, cabNet, extRct, obsRct, bnsRct, window, mirror: begin tempInt := ReadNumber(widthEdit); {error check width} if (tempInt + boundRect.left > 512) or (tempInt < 0) then begin SysBeep(1); if (tempInt < 0) then WriteNumber(widthEdit, 16, TRUE) else WriteNumber(widthEdit, 512 - boundRect.left, TRUE); leaveDlg := FALSE; end else boundRect.right := boundRect.left + tempInt; end; otherwise end; case objectIs of cabNet, extRct, obsRct, bnsRct, window, mirror: begin tempInt := ReadNumber(heightEdit); {error check height} if (boundRect.top + tempInt > floorVert) or (tempInt < 0) then begin SysBeep(1); if (tempInt < 0) then WriteNumber(heightEdit, 16, TRUE) else WriteNumber(heightEdit, floorVert - boundRect.top, TRUE); leaveDlg := FALSE; end else boundRect.bottom := boundRect.top + tempInt; end; otherwise end; case objectIs of extRct, upStar, dnStar: begin tempInt := ReadNumber(delayEdit); {error check 'amount'} if ((tempInt < 1) or (tempInt > 80)) then begin SysBeep(1); WriteNumber(delayEdit, roomAt, TRUE); leaveDlg := FALSE; end else amount := tempInt; end; flrVnt, candle, toastr, ball, fshBwl: begin tempInt := ReadNumber(delayEdit); if (boundRect.top - tempInt < ceilingVert) then begin SysBeep(1); WriteNumber(delayEdit, boundRect.top - ceilingVert, TRUE); leaveDlg := FALSE; end else amount := boundRect.top - tempInt; end; celVnt, celDct, drip: begin tempInt := ReadNumber(delayEdit); if (boundRect.bottom + tempInt > floorVert) then begin SysBeep(1); WriteNumber(delayEdit, floorVert - boundRect.bottom, TRUE); leaveDlg := FALSE; end else amount := boundRect.bottom + tempInt; end; lftFan: begin tempInt := ReadNumber(delayEdit); if (boundRect.left - tempInt < 0) then begin SysBeep(1); WriteNumber(delayEdit, boundRect.left, TRUE); leaveDlg := FALSE; end else amount := boundRect.left - tempInt; end; ritFan, grease: begin tempInt := ReadNumber(delayEdit); if (boundRect.right + tempInt > 512) then begin SysBeep(1); WriteNumber(delayEdit, 512 - boundRect.right, TRUE); leaveDlg := FALSE; end else amount := boundRect.right + tempInt; end; clock, paper, bnsRct, battry, rbrBnd, outlet, teaKtl: begin tempInt := ReadNumber(delayEdit); if (tempInt < 0) then begin SysBeep(1); WriteNumber(delayEdit, -1 * tempInt, TRUE); leaveDlg := FALSE; end else amount := tempInt; end; pwrSwt: begin tempInt := ReadNumber(delayEdit); if (tempInt < 0) or (tempInt > 16) then begin SysBeep(1); WriteNumber(delayEdit, 0, TRUE); leaveDlg := FALSE; end else amount := tempInt; end; otherwise end; case objectIs of celDct: begin tempInt := ReadNumber(widthEdit); {error check other} if ((tempInt < 1) or (tempInt > 80)) then begin SysBeep(1); WriteNumber(widthEdit, roomAt, TRUE); leaveDlg := FALSE; end else extra := tempInt; end; drip, toastr, fshBwl: begin tempInt := ReadNumber(widthEdit); {error check other} if (tempInt < 0) then begin SysBeep(1); WriteNumber(widthEdit, -1 * tempInt, TRUE); leaveDlg := FALSE; end else extra := tempInt; end; otherwise end; end; {end - with tempObject} if (leaveDlg) then begin thisRoom.theObjects[oneActive] := tempObject; changed := TRUE; end; end; if (itemHit = cancelBut) then leaveDlg := TRUE; if (itemHit = onRadio) then begin tempObject.isOn := TRUE; GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 0); end; if (itemHit = offRadio) then begin tempObject.isOn := FALSE; GetDItem(theDlgPtr, onRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 0); GetDItem(theDlgPtr, offRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); DrawAllObjects; end; {=================================} function InsertObject; begin InsertObject := FALSE; if (thisRoom.numberOObjects >= 16) then begin GenericAlert(kErrTooManyObjects); Exit(InsertObject); end; Deselect; with thisRoom do begin numberOObjects := numberOObjects + 1; theObjects[numberOObjects] := scrapObject; end; oneActive := thisRoom.numberOObjects; Select; InsertObject := TRUE; end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-RoomStuff.p b/RoomEditor_103/Sources/E-RoomStuff.p new file mode 100755 index 0000000..3b1e0b4 --- /dev/null +++ b/RoomEditor_103/Sources/E-RoomStuff.p @@ -0,0 +1 @@ +unit RoomStuff; interface uses Palettes, Globals, Utilities, Drawing; procedure SortObjects; function InsertNewRoom: Boolean; procedure FlushRoom (var whichRoom: roomData); procedure DoGotoDial; function roomFltr (theDlg: DialogPtr; var theEvnt: EventRecord; var itemHit: integer): boolean; procedure DoRoomBackInfo (var shouldOpen: Boolean); procedure DoRoomCondInfo (var shouldOpen: Boolean); implementation const roomCondID = 129; roomBackID = 130; var tempTile: array[0..7] of Integer; backNumber: Integer; {=================================} procedure SortObjects; var holdActive, i, count, itemType: Integer; holdRoom: RoomData; begin FlushRoom(holdRoom); count := 0; holdActive := oneActive; for i := 1 to 16 do begin itemType := thisRoom.theObjects[i].objectIs; if ((itemType <> paintg) and (itemType <> mirror) and (itemType <> window) and (itemType <> 0)) then begin count := count + 1; if (oneActive = i) then holdActive := count; holdRoom.theObjects[count] := thisRoom.theObjects[i]; thisRoom.theObjects[i].objectIs := 0; end; end; for i := 1 to 16 do begin itemType := thisRoom.theObjects[i].objectIs; if (itemType <> 0) then begin count := count + 1; if (oneActive = i) then holdActive := count; holdRoom.theObjects[count] := thisRoom.theObjects[i]; end; end; for i := 1 to thisRoom.numberOObjects do thisRoom.theObjects[i] := holdRoom.theObjects[i]; with thisRoom do if (count <> numberOObjects) then {*** Check for agreement} begin count := 0; {*** Run a second check} for i := 1 to 16 do if (theObjects[i].objectIs <> 0) then count := count + 1; numberOObjects := count; {*** We'll go with this #} if (numberOObjects < 16) then for i := numberOObjects + 1 to 16 do begin theObjects[i].objectIs := 0; {*** Zero-out excess fields} theObjects[i].boundRect := nullRect; theObjects[i].amount := 0; theObjects[i].extra := 0; theObjects[i].isOn := FALSE; end; end; oneActive := holdActive; {*** Restore active object} end; {=================================} function InsertNewRoom; var i: Integer; begin InsertNewRoom := FALSE; if (thisHouse.numberORooms >= 40) then {trying to add 41 rooms} begin GenericAlert(kErrTooManyRooms); Exit(InsertNewRoom); end; thisHouse.theRooms[roomAt] := thisRoom; {insert room to date} if (roomAt < thisHouse.numberORooms) then {shift only if in middle} for i := thisHouse.numberORooms downto roomAt + 1 do thisHouse.theRooms[i + 1] := thisHouse.theRooms[i]; {shift rooms right} roomAt := roomAt + 1; {kick active over to right} FlushRoom(thisRoom); {flush new room copy} thisHouse.theRooms[roomAt] := thisRoom; {copy active into house} thisHouse.numberORooms := thisHouse.numberORooms + 1; {one more room} InsertNewRoom := TRUE; end; {=================================} procedure FlushRoom; var index: Integer; defaultName: Str255; begin NumToString(roomAt, defaultName); defaultName := CONCAT('Room # ', defaultName); with whichRoom do begin roomName := defaultName; numberOObjects := 0; backPictID := 200; for index := 0 to 7 do tileOrder[index] := 0; animateKind := 0; animateNumber := 0; animateDelay := 0; conditionCode := 0; for index := 1 to 16 do begin theObjects[index].objectIs := 0; theObjects[index].boundRect := nullRect; theObjects[index].amount := 0; theObjects[index].extra := 0; theObjects[index].isOn := FALSE; end; end; end; {=================================} procedure DoGotoDial; const okayBut = 1; cancelBut = 2; gotoEdit = 3; numOfStat = 4; currStat = 5; var leaveDlg: Boolean; tempLong: LongInt; theDlgPtr: DialogPtr; tempRect: Rect; cntlType, index, itemHit, tempInt, rightOff, downOff: Integer; dlgItem: Handle; cntlHand, tempCntlHand: controlhandle; strTemp: Str255; {-------------------------} procedure Redraw; var index: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, okayBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; end; {-------------------------} begin theDlgPtr := GetNewDialog(261, nil, Pointer(-1)); with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); with thisHouse do begin NumToString(numberORooms, strTemp); GetDItem(theDlgPtr, numOfStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, strTemp); end; NumToString(roomAt, strTemp); GetDItem(theDlgPtr, currStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, strTemp); NumToString(roomAt, strTemp); GetDItem(theDlgPtr, gotoEdit, cntlType, dlgItem, tempRect); SetIText(dlgItem, strTemp); SelIText(theDlgPtr, gotoEdit, 0, 3); Redraw; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); if (itemHit = okayBut) then begin GetDItem(theDlgPtr, gotoEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, strTemp); {Get the text entered} StringToNum(strTemp, tempLong); if ((LoWord(tempLong) > 0) and (LoWord(tempLong) < thisHouse.numberORooms + 1)) then begin leaveDlg := TRUE; roomAt := LoWord(tempLong); end else begin SysBeep(1); NumToString(roomAt, strTemp); GetDItem(theDlgPtr, gotoEdit, cntlType, dlgItem, tempRect); SetIText(dlgItem, strTemp); SelIText(theDlgPtr, gotoEdit, 0, 3); end; end; if (itemHit = cancelBut) then begin leaveDlg := TRUE; end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(mainWndo); end; {=================================} function roomFltr; var cntlType, index, whichTile, itemDropped: Integer; wasPt, newPt: Point; dlgItem: Handle; thePict: PicHandle; tempRect, sameRect, dest, tempRect2: Rect; tempByte: SignedByte; {----------------} procedure ClickedInLeftBox; var index2: Integer; begin whichTile := (wasPt.h - 17) div 8; SetRect(tempRect, 0, 0, 8, 49); {a tile rect} OffsetRect(tempRect, 17 + (whichTile * 8), 83); GetMouse(wasPt); newPt := wasPt; PenPat(gray); PenMode(patXOr); FrameRect(tempRect); while (WaitMouseUp) do begin GetMouse(newPt); if (newPt.h <> wasPt.h) then begin FrameRect(tempRect); OffsetRect(tempRect, newPt.h - wasPt.h, 0); FrameRect(tempRect); wasPt := newPt; end; {end - if (a)} end; {end - while} FrameRect(tempRect); PenNormal; SetRect(dest, 111, 83, 175, 132); if (PtInRect(newPt, dest)) then begin itemDropped := (newPt.h - 111) div 8; if ((itemDropped > -1) and (itemDropped < 8)) then tempTile[itemDropped] := whichTile else SysBeep(1); end; for index2 := 0 to 7 do begin SetRect(tempRect, 0, 0, 8, 49); OffsetRect(tempRect, 111 + (index2 * 8), 83); thePict := GetPicture(300 + tempTile[index2] + (backNumber * 8)); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); end; {end - for} end; {end - if PtInRect} {----------------} begin roomFltr := FALSE; {assume no events} if ((theEvnt.what = KeyDown) and (BitAnd(theEvnt.message, CharCodeMask) = $0D)) then begin {'carriage' return hit} itemHit := 1; roomFltr := TRUE; end; if (theEvnt.what = MouseDown) then begin GetMouse(wasPt); SetRect(tempRect, 17, 83, 81, 132); if (PtInRect(wasPt, tempRect)) then {tempRect => left tile rect} ClickedInLeftBox; end; {end - if mouseDown} SetRect(tempRect2, 17, 78, 81, 81); {erase any old markers} EraseRect(tempRect2); SetRect(tempRect2, 17, 134, 81, 137); EraseRect(tempRect2); GetMouse(wasPt); SetRect(tempRect, 17, 83, 81, 132); if (PtInRect(wasPt, tempRect)) then {tempRect => left tile rect} begin whichTile := (wasPt.h - 17) div 8; SetRect(tempRect, 0, 0, 8, 49); {a tile rect} OffsetRect(tempRect, 17 + (whichTile * 8), 83); tempRect2 := tempRect; {draw top marker over tile} tempRect2.top := tempRect2.top - 5; tempRect2.bottom := tempRect2.top + 3; ForeColor(redColor); PaintRect(tempRect2); ForeColor(blackColor); tempRect2 := tempRect; {draw bottom marker under tile} tempRect2.bottom := tempRect2.bottom + 5; tempRect2.top := tempRect2.bottom - 3; ForeColor(redColor); PaintRect(tempRect2); ForeColor(blackColor); end; end; {=================================} procedure DoRoomBackInfo; const okayBut = 1; cancelBut = 2; backIcon1 = 3; backIcon10 = 12; backStat = 13; tileStat = 14; var wasPort: GrafPtr; leaveDlg: Boolean; theDlgPtr: DialogPtr; tempRect, wasRect: Rect; cntlType, i, i2, itemHit, tempInt, rightOff, downOff: Integer; dlgItem: Handle; strTemp: Str255; backName: array[0..9] of string[18]; thePict: PicHandle; tempRoom: roomData; {-------------------------} procedure Redraw; var i, width: Integer; tempByte: SignedByte; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, okayBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} GetDItem(theDlgPtr, backNumber + backIcon1, cntlType, dlgItem, tempRect); PenSize(2, 2); InsetRect(tempRect, -2, -2); ForeColor(redColor); FrameRect(tempRect); ForeColor(blackColor); wasRect := tempRect; PenNormal; with theDlgPtr^.portRect do width := right - left; MoveTo(4, 38); Line(width - 8, 0); MoveTo(4, 40); Line(width - 8, 0); for i := 0 to 7 do begin SetRect(tempRect, 0, 0, 8, 49); OffsetRect(tempRect, 111 + (i * 8), 83); thePict := GetPicture(300 + tempTile[i] + (backNumber * 8)); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); end; for i := 0 to 7 do begin SetRect(tempRect, 0, 0, 8, 49); OffsetRect(tempRect, 17 + (i * 8), 83); thePict := GetPicture(300 + i + (backNumber * 8)); if (thePict <> nil) then begin tempByte := HGetState(Handle(thePict)); HLock(Handle(thePict)); DrawPicture(thePict, tempRect); HSetState(Handle(thePict), tempByte); end else begin GenericAlert(kErrGraphicLoad); end; ReleaseResource(Handle(thePict)); end; ForeColor(redColor); SetRect(tempRect, 15, 81, 83, 134); FrameRect(tempRect); ForeColor(blueColor); SetRect(tempRect, 109, 81, 177, 134); FrameRect(tempRect); ForeColor(blackColor); end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(roomBackID, nil, Pointer(-1)); if (theDlgPtr = nil) then begin GenericAlert(kErrLoadingRes); Exit(DoRoomBackInfo); end; with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); backName[0] := 'Plain Room'; backName[1] := 'Paneled Room'; backName[2] := 'Basement'; backName[3] := 'Japanese Room'; backName[4] := 'Childs Room'; backName[5] := 'Unfinished Room'; backName[6] := 'Hip Wallpaper'; backName[7] := 'Entertainment'; backName[8] := 'Bathroom'; backName[9] := 'Kitchen'; tempRoom := thisRoom; with tempRoom do begin backNumber := backPictID - 200; for i := 0 to 7 do tempTile[i] := tileOrder[i]; GetDItem(theDlgPtr, backStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, backName[backNumber]); end; if (not shouldOpen) then HideDItem(theDlgPtr, cancelBut); Redraw; leaveDlg := FALSE; shouldOpen := FALSE; repeat ModalDialog(@roomFltr, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); for i := backIcon1 to backIcon10 do if (itemHit = i) then begin PenSize(2, 2); PenPat(white); FrameRect(wasRect); GetDItem(theDlgPtr, i, cntlType, dlgItem, tempRect); InsetRect(tempRect, -2, -2); PenPat(black); ForeColor(redColor); FrameRect(tempRect); ForeColor(blackColor); wasRect := tempRect; PenNormal; backNumber := i - backIcon1; GetDItem(theDlgPtr, backStat, cntlType, dlgItem, tempRect); SetIText(dlgItem, backName[backNumber]); tempRoom.backPictID := backNumber + 200; for i2 := 0 to 7 do case backNumber of 0..3, 5: tempTile[i2] := 0; otherwise tempTile[i2] := i2 end; Redraw; end; if (itemHit = okayBut) then begin leaveDlg := TRUE; changed := TRUE; with tempRoom do begin for i := 0 to 7 do begin tileOrder[i] := tempTile[i]; end; case backPictId of 200..203, 205: begin if (tileOrder[0] = 6) then {don't allow backward walls} tileOrder[0] := 0; if (tileOrder[7] = 7) then tileOrder[7] := 0; if (tileOrder[0] = 7) then {check left open} leftOpen := FALSE else leftOpen := TRUE; if (tileOrder[7] = 6) then {check right open} rightOpen := FALSE else rightOpen := TRUE; for i := 1 to 6 do {don't allow walls in the middle} if ((tileOrder[i] = 6) or (tileOrder[i] = 7)) then begin SysBeep(1); tileOrder[i] := 0; end; end; otherwise begin leftOpen := TRUE; rightOpen := TRUE; end; end; {end - case} if (roomAt = 1) then leftOpen := FALSE; end; {end - with} if (leaveDlg) then begin thisRoom := tempRoom; end; end; if (itemHit = cancelBut) then begin if (thisHouse.numberORooms < 1) then shouldOpen := TRUE; leaveDlg := TRUE; end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=================================} {=================================} procedure DoRoomCondInfo; const inactive = 255; active = 0; okayBut = 1; cancelBut = 2; normalRadio = 3; lightsRadio = 5; nothingRadio = 6; dartsRadio = 9; numOfEdit = 10; delayEdit = 11; nameEdit = 12; objectsStat = 13; roomNumStat = 14; var leaveDlg: Boolean; theDlgPtr: DialogPtr; tempRect, wasRect: Rect; cntlType, itemHit, tempInt, rightOff, downOff, i: Integer; tempLong: LongInt; dlgItem: Handle; strTemp: Str255; wasPort: GrafPtr; tempRoom: roomData; {-------------------------} procedure Redraw; var width: Integer; begin SetPort(theDlgPtr); {Point to our dialog window} GetDItem(theDlgPtr, okayBut, cntlType, dlgItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; with theDlgPtr^.portRect do width := right - left; MoveTo(4, 38); Line(width - 8, 0); MoveTo(4, 40); Line(width - 8, 0); end; {-------------------------} begin GetPort(wasPort); theDlgPtr := GetNewDialog(roomCondID, nil, Pointer(-1)); if (theDlgPtr = nil) then begin GenericAlert(kErrLoadingRes); Exit(DoRoomCondInfo); end; with theDlgPtr^.portBits do begin rightOff := rightOffset - bounds.left; downOff := downOffset - bounds.top; end; MoveWindow(theDlgPtr, rightOff, downOff, FALSE); ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); tempRoom := thisRoom; with tempRoom do begin {pop name of room into edit text field} GetDItem(theDlgPtr, nameEdit, cntlType, dlgItem, tempRect); strTemp := roomName; SetIText(dlgItem, strTemp); {pop the room number as static text} GetDItem(theDlgPtr, roomNumStat, cntlType, dlgItem, tempRect); NumToString(roomAt, strTemp); SetIText(dlgItem, strTemp); {pop up number of animates into edit text field} GetDItem(theDlgPtr, numOfEdit, cntlType, dlgItem, tempRect); NumToString(animateNumber, strTemp); SetIText(dlgItem, strTemp); {pop up delay - convert to seconds} GetDItem(theDlgPtr, delayEdit, cntlType, dlgItem, tempRect); NumToString(animateDelay, strTemp); SetIText(dlgItem, strTemp); {pop up number of objects as static text} GetDItem(theDlgPtr, objectsStat, cntlType, dlgItem, tempRect); NumToString(numberOObjects, strTemp); SetIText(dlgItem, strTemp); {select radio button representing animate kind} if (animateNumber > 0) then begin tempInt := 9 - animateKind; GetDItem(theDlgPtr, tempInt, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); end else begin GetDItem(theDlgPtr, nothingRadio, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); end; {select radio button representing condition of room} GetDItem(theDlgPtr, conditionCode + 3, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); {decide whether or not to gray out cancel button} if (not shouldOpen) then begin GetDItem(theDlgPtr, cancelBut, cntlType, dlgItem, tempRect); HiliteControl(ControlHandle(dlgItem), inactive); end; end; {end - with tempRoom do} {select the name of the room} SelIText(theDlgPtr, nameEdit, 0, 24); Redraw; leaveDlg := FALSE; shouldOpen := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, cntlType, dlgItem, tempRect); for i := normalRadio to lightsRadio do if (itemHit = i) then begin for tempInt := normalRadio to lightsRadio do begin GetDItem(theDlgPtr, tempInt, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 0); end; GetDItem(theDlgPtr, i, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); tempRoom.conditionCode := i - normalRadio; end; for i := nothingRadio to dartsRadio do if (itemHit = i) then begin for tempInt := nothingRadio to dartsRadio do begin GetDItem(theDlgPtr, tempInt, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 0); end; GetDItem(theDlgPtr, i, cntlType, dlgItem, tempRect); SetCtlValue(ControlHandle(dlgItem), 1); if (itemHit = nothingRadio) then begin tempRoom.animateNumber := 0; GetDItem(theDlgPtr, numOfEdit, cntlType, dlgItem, tempRect); NumToString(tempRoom.animateNumber, strTemp); SetIText(dlgItem, strTemp); end else begin tempRoom.animateKind := 9 - i; end; end; if (itemHit = okayBut) then begin leaveDlg := TRUE; with tempRoom do begin GetDItem(theDlgPtr, numOfEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, strTemp); {Get the text entered} StringToNum(strTemp, tempLong); tempRoom.animateNumber := LoWord(tempLong); if (tempRoom.animateNumber < 0) then begin SysBeep(1); leaveDlg := FALSE; tempInt := -tempRoom.animateNumber; if (tempInt > 16) then tempInt := 16; NumToString(tempInt, strTemp); SetIText(dlgItem, strTemp); end; if (tempRoom.animateNumber > 16) then begin SysBeep(1); leaveDlg := FALSE; NumToString(16, strTemp); SetIText(dlgItem, strTemp); end; GetDItem(theDlgPtr, delayEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, strTemp); {Get the text entered} StringToNum(strTemp, tempLong); tempRoom.animateDelay := LoWord(tempLong); if (tempRoom.animateDelay < 0) then begin SysBeep(1); leaveDlg := FALSE; tempInt := -tempRoom.animateDelay; if (tempInt > 16) then tempInt := 16; NumToString(tempInt, strTemp); SetIText(dlgItem, strTemp); end; GetDItem(theDlgPtr, nameEdit, cntlType, dlgItem, tempRect); GetIText(dlgItem, strTemp); {Get the text entered} if (LENGTH(strTemp) > 24) then strTemp := COPY(strTemp, 1, 24); tempRoom.roomName := strTemp; end; {end - with tempRoom} if (leaveDlg) then begin changed := TRUE; thisRoom := tempRoom; DrawRoomNum; end; end; if (itemHit = cancelBut) then begin if (thisHouse.numberORooms < 1) then shouldOpen := TRUE; leaveDlg := TRUE; end; until leaveDlg; DisposDialog(theDlgPtr); if (toolWndo <> nil) then SetPort(toolWndo) else SetPort(wasPort); end; {=================================} end. \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-TheMenus.p b/RoomEditor_103/Sources/E-TheMenus.p new file mode 100755 index 0000000..8bdd7ea --- /dev/null +++ b/RoomEditor_103/Sources/E-TheMenus.p @@ -0,0 +1 @@ +unit TheMenus; interface uses Balloons, Palettes, About, Globals, Utilities, Drawing, HouseStuff, RoomStuff, ObjectStuff, FileInNOut, FlyGlider; procedure DoNewHouse; procedure DoOpenHouse; procedure DoPrevRoom; procedure DoNextRoom; procedure DoNewRoom; function DoSaveHouse: Boolean; function DoSaveHouseAs: Boolean; procedure DoClear; procedure HandleMenu (theMenu, theItem: integer); {=================================} implementation {=================================} procedure DoTest; begin end; {=================================} procedure DoOpenHouse; var canceled: Boolean; begin if (not DoOpen) then begin DoNewHouse; Exit(DoOpenHouse); end; ErrorCheckHouse; changed := FALSE; roomAt := 1; thisRoom := thisHouse.theRooms[roomAt]; EnableItem(GetMenu(mFile), iSave); EnableItem(GetMenu(mFile), iSaveAs); oneActive := 0; handleRect := nullRect; LoadABackground(thisRoom.backPictID); UpdateMenuItems(fileExists); UpdateMenuItems(editToRoom); DrawAllObjects; DrawRoomNum; OpenTools; end; {=================================} procedure DoNewHouse; var cancelIt: Boolean; index: Integer; begin roomAt := 1; FlushRoom(thisRoom); with thisHouse do begin version := $0100; numberORooms := 0; for index := 0 to 19 do begin hiScores[index] := 0; hiLevel[index] := 0; hiName[index] := 'no one...'; hiRoom[index] := 'no room...'; end; pictFile := resourceName; nextFile := ''; firstFile := ''; theRooms[roomAt] := thisRoom; end; changed := FALSE; oneActive := 0; handleRect := nullRect; thisHouse.numberORooms := 1; cancelIt := FALSE; DoRoomBackInfo(cancelIt); LoadABackground(thisRoom.backPictID); UpdateMenuItems(fileIsNew); UpdateMenuItems(editToRoom); OpenTools; end; {=================================} procedure DoMenuClose; const saveBut = 1; cancelBut = 6; var buttonClicked: Integer; dummyBool: Boolean; begin Deselect; if (changed) then begin buttonClicked := SaveNoClose; if (buttonClicked = saveBut) then begin thisHouse.theRooms[roomAt] := thisRoom; if (fileIsOpen) then begin if (not DoSaveHouse) then begin dummyBool := DoClose; Exit(DoMenuClose); end; dummyBool := DoClose; end else begin if (not DoSaveHouseAs) then Exit(DoMenuClose); end; end else if (buttonClicked = cancelBut) then begin Exit(DoMenuClose); end else dummyBool := DoClose; end else dummyBool := DoClose; FlushRoom(thisRoom); roomAt := 0; changed := FALSE; SetPort(GrafPtr(mainWndo)); EraseRect(wholeArea); if (inColor) then SetPort(GrafPtr(loadCPtr)) else SetPort(offLoadPort); EraseRect(wholeArea); if (inColor) then SetPort(GrafPtr(virginCPtr)) else SetPort(offVirginPort); EraseRect(wholeArea); CloseTools; UpdateMenuItems(noFileOpen); end; {=================================} procedure DoGoToRoom; var wasRoom: Integer; begin thisHouse.theRooms[roomAt] := thisRoom; wasRoom := roomAt; DoGotoDial; if (wasRoom <> roomAt) then begin thisRoom := thisHouse.theRooms[roomAt]; Deselect; LoadABackground(thisRoom.backPictID); DrawAllObjects; DrawRoomNum; UpdateMenuItems(editToRoom); end; end; {=================================} procedure DoPrevRoom; begin thisHouse.theRooms[roomAt] := thisRoom; roomAt := roomAt - 1; if (roomAt < 1) then roomAt := thisHouse.numberORooms; thisRoom := thisHouse.theRooms[roomAt]; Deselect; LoadABackground(thisRoom.backPictID); DrawAllObjects; DrawRoomNum; UpdateMenuItems(editToRoom); end; {=================================} procedure DoNextRoom; begin thisHouse.theRooms[roomAt] := thisRoom; roomAt := roomAt + 1; if (roomAt > thisHouse.numberORooms) then roomAt := 1; thisRoom := thisHouse.theRooms[roomAt]; Deselect; LoadABackground(thisRoom.backPictID); DrawAllObjects; DrawRoomNum; UpdateMenuItems(editToRoom); end; {=================================} procedure DoNewRoom; var cancelIt: Boolean; begin thisHouse.theRooms[roomAt] := thisRoom; if (not InsertNewRoom) then begin Exit(DoNewRoom); end; cancelIt := TRUE; changed := TRUE; DoRoomBackInfo(cancelIt); LoadABackground(thisRoom.backPictID); DrawRoomNum; oneActive := 0; UpdateMenuItems(editToRoom); end; {=================================} function DoSaveHouse; var dummyBool: Boolean; begin thisHouse.theRooms[roomAt] := thisRoom; ErrorCheckHouse; dummyBool := DoSave; DoSaveHouse := dummyBool; end; {=================================} function DoSaveHouseAs; var dummyBool: Boolean; begin thisHouse.theRooms[roomAt] := thisRoom; ErrorCheckHouse; dummyBool := DoSaveAs; DoSaveHouseAs := dummyBool; end; {=================================} procedure DoQuit; const saveBut = 1; quitBut = 2; cancelBut = 6; var buttonClicked: Integer; dummyBool: Boolean; begin if (changed) then begin buttonClicked := SaveFirst; if (buttonClicked = saveBut) then begin if (fileIsOpen) then begin if DoSaveHouse then begin doneFlag := TRUE; dummyBool := DoClose; end else begin Exit(DoQuit); end; end else {else - file is NOT open} begin if DoSaveHouseAs then begin doneFlag := TRUE; dummyBool := DoClose; end else Exit(DoQuit); end; end else if (buttonClicked = quitBut) then begin if (fileIsOpen) then dummyBool := DoClose; doneFlag := TRUE; end else if (buttonClicked = cancelBut) then Exit(DoQuit); end {end - if changed} else {else - no changes} begin if (fileIsOpen) then dummyBool := DoClose; doneFlag := TRUE; end; end; {=================================} procedure DoHelp; var aboutStuff: AboutRec; tempR: Rect; wasPort: GrafPtr; begin GetPort(wasPort); SetPort(GrafPtr(mainWndo)); with aboutStuff do begin FontInfo[AboutMsg].Font := 0; FontInfo[AboutMsg].Size := 0; FontInfo[AboutMsg].Face := []; FontInfo[AboutMsg].Color := RedColor; FontInfo[AboutTEXT].Font := 1; FontInfo[AboutTEXT].Size := 9; FontInfo[AboutTEXT].Face := []; FontInfo[AboutTEXT].Color := BlueColor; TEXTCopy := TRUE; KeyEquivs := TRUE; CloseBox := FALSE; Styled := TRUE; CenterMode := AboutMainCenter; MainIcon := 128; ClickIcon := 129; ClickMsg := 'by john calhoun 1991 Casady & Greene, Inc.'; end; SetRect(tempR, 12, 30, 500, 332); OffsetRect(tempR, rightOffset, downOffset); BuildAbout(tempR, DBoxProc, 128, 'Editor Help', 'Room Editor 1.0 - General Help', aboutStuff); SetPort(wasPort); end; {=================================} procedure DoCut; var cancelIt: Boolean; begin if (editRoom) then {no object selected} begin {so, cut whole room} if (not DeleteRoom) then begin scrapRoom := thisRoom; {store room just cut} FlushRoom(thisRoom); {flush it} cancelIt := FALSE; {force user to create a room} DoRoomBackInfo(cancelIt); end else begin roomScrapDirty := TRUE; objectScrapDirty := FALSE; SetItem(GetMenu(mEdit), iPaste, 'Paste Room'); EnableItem(GetMenu(mEdit), iPaste); scrapRoom := thisRoom; thisRoom := thisHouse.theRooms[roomAt]; end; LoadABackground(thisRoom.backPictID); {load the new room in} oneActive := 0; {insure no active object} handleRect := nullRect; DrawAllObjects; DrawRoomNum; changed := TRUE; end else begin objectScrapDirty := TRUE; roomScrapDirty := FALSE; SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); EnableItem(GetMenu(mEdit), iPaste); scrapObject := thisRoom.theObjects[oneActive]; thisRoom.theObjects[oneActive].objectIs := 0; Deselect; {Sort will set correct # of objects} SortObjects; {0-ing out the type will kill it in the sort routine} DrawAllObjects; changed := TRUE; end; end; {=================================} procedure DoCopy; begin if (editRoom) then begin scrapRoom := thisRoom; roomScrapDirty := TRUE; objectScrapDirty := FALSE; SetItem(GetMenu(mEdit), iPaste, 'Paste Room'); EnableItem(GetMenu(mEdit), iPaste); end else begin scrapObject := thisRoom.theObjects[oneActive]; objectScrapDirty := TRUE; roomScrapDirty := FALSE; SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); EnableItem(GetMenu(mEdit), iPaste); end; end; {=================================} procedure DoPaste; begin if (roomScrapDirty) then begin if (not InsertRoom) then Exit(DoPaste); LoadABackground(thisRoom.backPictID); {draw the pasted room in} oneActive := 0; {insure no active object} handleRect := nullRect; DrawAllObjects; DrawRoomNum; changed := TRUE; end else begin if (InsertObject) then begin SortObjects; DrawAllObjects; changed := TRUE; end else Exit(DoPaste); end; end; {=================================} procedure DoClear; var cancelIt: Boolean; begin if (editRoom) then begin if (not DeleteRoom) then begin FlushRoom(thisRoom); {flush it} cancelIt := FALSE; {force user to create a room} DoRoomBackInfo(cancelIt); end else begin thisRoom := thisHouse.theRooms[roomAt]; end; LoadABackground(thisRoom.backPictID); {load the new room in} oneActive := 0; {insure no active object} handleRect := nullRect; DrawAllObjects; DrawRoomNum; changed := TRUE; end else begin thisRoom.theObjects[oneActive].objectIs := 0; Deselect; SortObjects; DrawAllObjects; changed := TRUE; end; end; {=================================} procedure HandleMenu; {Handle menu selections realtime} var DNA, holdActive, i: integer; DAName: Str255; SavePort: GrafPtr; boolHolder, cancelIt: boolean; begin case theMenu of mApple: case theItem of iNothing: ; iAboutEdit: DoAbout; otherwise begin GetPort(SavePort); GetItem(GetMenu(mApple), theItem, DAName); DNA := OpenDeskAcc(DAName); SetPort(SavePort); end; end; mFile: case theItem of {Handle all commands in this menu list} iNew: DoNewHouse; iOpen: DoOpenHouse; iClose: DoMenuClose; iSave: cancelIt := DoSaveHouse; iSaveAs: cancelIt := DoSaveHouseAs; iQuit: DoQuit; otherwise end; mEdit: case theItem of {Handle all commands in this menu list} iCut: DoCut; iCopy: DoCopy; iPaste: DoPaste; iClear: DoClear; otherwise ; end; mSpecial: case theItem of {Handle all commands in this menu list} iTryGlider: FlyGlider; iControls: ; iRestoreDeep: begin restoreColor := not restoreColor; if (restoreColor) then SetItem(GetMenu(mSpecial), iRestoreDeep, 'Depth Restore is On') else SetItem(GetMenu(mSpecial), iRestoreDeep, 'Depth Restore is Off'); end; iGoToRoom: DoGoToRoom; iNextRoom: DoNextRoom; iPrevRoom: DoPrevRoom; iNewRoom: DoNewRoom; otherwise ; end; mWindows: case theItem of {Handle all commands in this menu list} iTools: OpenTools; iAutoHideTools: begin autoHide := not autoHide; if (autoHide) then SetItem(GetMenu(mWindows), iAutoHideTools, 'Auto-Hide Tools is On') else SetItem(GetMenu(mWindows), iAutoHideTools, 'Auto-Hide Tools is Off'); end; iHouse: DoHouseInfo; iRoomBack: begin cancelIt := TRUE; DoRoomBackInfo(cancelIt); LoadABackground(thisRoom.backPictID); DrawAllObjects; end; iRoomCond: begin cancelIt := TRUE; DoRoomCondInfo(cancelIt); DrawAllObjects; end; iObject: DoObjectInfo; iHelp: DoHelp; otherwise end; mControls: case theItem of iHoldKey..iRelMouse: begin for i := iHoldkey to iRelMouse do CheckItem(GetMenu(mControls), i, FALSE); CheckItem(GetMenu(mControls), theItem, TRUE); controlMethod := theItem; end; iConfigure: DoCustomizeKeys; otherwise end; kHMHelpMenuID: if (theItem = iGlidersHelp) then DoHelp; otherwise end; HiliteMenu(0); end; {=================================} end. {End of unit} \ No newline at end of file diff --git a/RoomEditor_103/Sources/E-Utilities.p b/RoomEditor_103/Sources/E-Utilities.p new file mode 100755 index 0000000..d47f6d9 --- /dev/null +++ b/RoomEditor_103/Sources/E-Utilities.p @@ -0,0 +1 @@ +unit Utilities; interface uses Palettes, Globals; procedure SpinBall; function SameScreenDepth: Boolean; function DoRandom (range: Integer): Integer; procedure UpdateMenuItems (whatMode: Integer); procedure Select; procedure Deselect; procedure DoMarquee; procedure GenericAlert (whatGives: Integer); function ErrorCheckObject (var wasObject: objectData; var errorType: Integer): Boolean; procedure DoCustomizeKeys; function idleFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: integer): boolean; procedure DoAbout; {=================================} implementation {=================================} var screenNum: Integer; timeWas: LongInt; {=================================} procedure SpinBall; var tempByte: SignedByte; begin if (ballList = nil) then Exit(SpinBall); tempByte := HGetState(Handle(ballList)); HLock(Handle(ballList)); with ballList^^ do begin if (whichBall = -1) then Exit(SpinBall); if (whichBall >= kCursCount) then whichBall := 1 else whichBall := whichBall + 1; if (useColorCursor) then SetCCursor(ballC[whichBall]) else SetCursor(ball[whichBall]^^); end; HSetState(Handle(ballList), tempByte); end; {=================================} function SameScreenDepth; var err: OSErr; thisWorld: SysEnvRec; theDevice: GDHandle; begin SameScreenDepth := TRUE; err := SysEnvirons(1, thisWorld); with thisWorld do begin if (hasColorQD) then begin theDevice := GetMainDevice; HLock(Handle(theDevice)); if ((inColor) and (theDevice^^.gdPMap^^.pixelSize <> 4)) then SameScreenDepth := FALSE else if ((not inColor) and (theDevice^^.gdPMap^^.pixelSize <> 1)) then SameScreenDepth := FALSE; HUnlock(Handle(theDevice)); end; {end - hasColorQD} end; {with thisWorld} end; {=================================} function DoRandom; var rawResult: LongInt; begin rawResult := ABS(Random); DoRandom := (rawResult * range) div 32768; end; {=================================} procedure UpdateMenuItems; begin case whatMode of editToObject: begin SetItem(GetMenu(mEdit), iCut, 'Cut Object'); SetItem(GetMenu(mEdit), iCopy, 'Copy Object'); SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); DisableItem(GetMenu(mEdit), iPaste); SetItem(GetMenu(mEdit), iClear, 'Clear Object'); editRoom := FALSE; if (objectScrapDirty) then EnableItem(GetMenu(mEdit), iPaste) else if (roomScrapDirty) then begin SetItem(GetMenu(mEdit), iPaste, 'Paste Room'); EnableItem(GetMenu(mEdit), iPaste); end; end; editToRoom: begin SetItem(GetMenu(mEdit), iCut, 'Cut Room'); SetItem(GetMenu(mEdit), iCopy, 'Copy Room'); SetItem(GetMenu(mEdit), iPaste, 'Paste Room'); DisableItem(GetMenu(mEdit), iPaste); SetItem(GetMenu(mEdit), iClear, 'Clear Room'); editRoom := TRUE; if (roomScrapDirty) then EnableItem(GetMenu(mEdit), iPaste) else if (objectScrapDirty) then begin SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); EnableItem(GetMenu(mEdit), iPaste); end; end; fileExists: begin DisableItem(GetMenu(mFile), iNew); DisableItem(GetMenu(mFile), iOpen); EnableItem(GetMenu(mFile), iClose); EnableItem(GetMenu(mFile), iSave); EnableItem(GetMenu(mFile), iSaveAs); EnableItem(GetMenu(mEdit), iCut); EnableItem(GetMenu(mEdit), iCopy); EnableItem(GetMenu(mEdit), iClear); if (roomScrapDirty) then EnableItem(GetMenu(mEdit), iPaste) else if (objectScrapDirty) then begin SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); EnableItem(GetMenu(mEdit), iPaste); end; EnableItem(GetMenu(mSpecial), iTryGlider); EnableItem(GetMenu(mSpecial), iGoToRoom); EnableItem(GetMenu(mSpecial), iPrevRoom); EnableItem(GetMenu(mSpecial), iNextRoom); EnableItem(GetMenu(mSpecial), iNewRoom); EnableItem(GetMenu(mWindows), iTools); EnableItem(GetMenu(mWindows), iHouse); EnableItem(GetMenu(mWindows), iRoomBack); EnableItem(GetMenu(mWindows), iRoomCond); DisableItem(GetMenu(mWindows), iObject); end; fileIsNew: begin DisableItem(GetMenu(mFile), iNew); DisableItem(GetMenu(mFile), iOpen); EnableItem(GetMenu(mFile), iClose); DisableItem(GetMenu(mFile), iSave); EnableItem(GetMenu(mFile), iSaveAs); EnableItem(GetMenu(mEdit), iCut); EnableItem(GetMenu(mEdit), iCopy); EnableItem(GetMenu(mEdit), iClear); if (roomScrapDirty) then EnableItem(GetMenu(mEdit), iPaste) else if (objectScrapDirty) then begin SetItem(GetMenu(mEdit), iPaste, 'Paste Object'); EnableItem(GetMenu(mEdit), iPaste); end; EnableItem(GetMenu(mSpecial), iTryGlider); EnableItem(GetMenu(mSpecial), iGoToRoom); EnableItem(GetMenu(mSpecial), iPrevRoom); EnableItem(GetMenu(mSpecial), iNextRoom); EnableItem(GetMenu(mSpecial), iNewRoom); EnableItem(GetMenu(mWindows), iTools); EnableItem(GetMenu(mWindows), iHouse); EnableItem(GetMenu(mWindows), iRoomBack); EnableItem(GetMenu(mWindows), iRoomCond); DisableItem(GetMenu(mWindows), iObject); end; noFileOpen: begin EnableItem(GetMenu(mFile), iNew); EnableItem(GetMenu(mFile), iOpen); DisableItem(GetMenu(mFile), iClose); DisableItem(GetMenu(mFile), iSave); DisableItem(GetMenu(mFile), iSaveAs); DisableItem(GetMenu(mEdit), iCut); DisableItem(GetMenu(mEdit), iCopy); DisableItem(GetMenu(mEdit), iPaste); DisableItem(GetMenu(mEdit), iClear); DisableItem(GetMenu(mSpecial), iTryGlider); DisableItem(GetMenu(mSpecial), iGoToRoom); DisableItem(GetMenu(mSpecial), iPrevRoom); DisableItem(GetMenu(mSpecial), iNextRoom); DisableItem(GetMenu(mSpecial), iNewRoom); DisableItem(GetMenu(mWindows), iTools); DisableItem(GetMenu(mWindows), iHouse); DisableItem(GetMenu(mWindows), iRoomBack); DisableItem(GetMenu(mWindows), iRoomCond); DisableItem(GetMenu(mWindows), iObject); end; otherwise ; end; end; {=================================} procedure Select; begin if (oneActive = 0) then begin DisableItem(GetMenu(mWindows), iObject); Exit(Select); end; EnableItem(GetMenu(mWindows), iObject); SetPort(GrafPtr(mainWndo)); ClipRect(wholeArea); PenNormal; PenMode(patXOr); PenPat(marqueePat[4]); {Initial set-up pattern for marquee} FrameRect(thisRoom.theObjects[oneActive].boundRect); marqueeIndex := 0; {Start marquee pats at pat 1} marqueeTime := TRUE; with thisRoom.theObjects[oneActive] do begin case (objectIs) of {Pop the handle out} table, shelf: begin SetPt(startPt, boundRect.right, (boundRect.top + boundRect.bottom) div 2); SetPt(endPt, boundRect.right + 4, (boundRect.top + boundRect.bottom) div 2); end; cabnet, extRct, obsRct, bnsRct, window, mirror: begin SetPt(startPt, boundRect.right, boundRect.bottom); SetPt(endPt, boundRect.right + 4, boundRect.bottom + 4); end; flrVnt, candle, ball, fshBwl, toastr: begin SetPt(startPt, (boundRect.left + boundRect.right) div 2, boundRect.top - 1); SetPt(endPt, (boundRect.left + boundRect.right) div 2, amount); end; celVnt, celDct, drip: begin SetPt(startPt, (boundRect.left + boundRect.right) div 2, boundRect.bottom + 1); SetPt(endPt, (boundRect.left + boundRect.right) div 2, amount); end; lftFan: begin SetPt(startPt, boundRect.left - 1, (boundRect.top + boundRect.bottom) div 2); SetPt(endPt, amount, (boundRect.top + boundRect.bottom) div 2); end; ritFan, grease: begin SetPt(startPt, boundRect.right + 1, (boundRect.top + boundRect.bottom) div 2); SetPt(endPt, amount, (boundRect.top + boundRect.bottom) div 2); end; otherwise begin SetPt(startPt, -500, -500); SetPt(endPt, -499, -499); end; end; {End of case} end; {End of with} SetRect(handleRect, endPt.h - 3, endPt.v - 3, endPt.h + 3, endPt.v + 3); MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); PenNormal; if (toolWndo <> nil) then SetPort(toolWndo); end; {=================================} procedure Deselect; begin DisableItem(GetMenu(mWindows), iObject); if (oneActive = 0) then begin Exit(Deselect); end; repeat DoMarquee; until (marqueeIndex = 0); SetPort(GrafPtr(mainWndo)); PenMode(patXOr); PenPat(marqueePat[4]); FrameRect(thisRoom.theObjects[oneActive].boundRect); MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); PenNormal; oneActive := 0; handleRect := nullRect; if (toolWndo <> nil) then SetPort(toolWndo); marqueeTime := FALSE; end; {=================================} procedure DoMarquee; var dummyLong: LongInt; begin Delay(2, dummyLong); SetPort(GrafPtr(mainWndo)); PenNormal; PenMode(patXOr); PenPat(marqueePat[marqueeIndex]); FrameRect(thisRoom.theObjects[oneActive].boundRect); MoveTo(startPt.h, startPt.v); LineTo(endPt.h, endPt.v); PaintRect(handleRect); marqueeIndex := marqueeIndex + 1; if (marqueeIndex > 3) then marqueeIndex := 0; if (toolWndo <> nil) then SetPort(toolWndo); end; {=================================} procedure GenericAlert; var dummyInt: Integer; line1, line2: Str255; alertHandle: AlertTHndl; alertRect: Rect; begin UseResFile(editorResNum); InitCursor; if (whatGives > 0) then begin GetIndString(line1, alertStrIDs, whatGives); line2 := ''; end else begin GetIndString(line1, alertStrIDs, 1); NumToString(whatGives, line2); line2 := CONCAT('Error = ', line2); end; ParamText(line1, line2, '', ''); alertHandle := AlertTHndl(Get1Resource('ALRT', alertID)); if (alertHandle <> nil) then begin HNoPurge(Handle(alertHandle)); alertRect := alertHandle^^.boundsRect; OffsetRect(alertRect, -alertRect.left, -alertRect.top); dummyInt := (screenBits.bounds.right - alertRect.right) div 2; OffsetRect(alertRect, dummyInt, 0); dummyInt := (screenBits.bounds.bottom - alertRect.bottom) div 3; OffsetRect(alertRect, 0, dummyInt); alertHandle^^.boundsRect := alertRect; HPurge(Handle(alertHandle)); end; dummyInt := Alert(alertID, nil); end; {=================================} function ErrorCheckObject; const noError = 0; kindError = 1; boundError = 2; amountError = 3; extraError = 4; isOnError = 5; var inError: Boolean; {-----------------} procedure ShiftOrSet (var valueIs, otherValue: Integer; valueShould, objectType: Integer; upDown: Boolean); begin case objectType of {these objects are just set} table, shelf: if (upDown) then otherValue := otherValue + (valueShould - valueIs); cabnet, extRct, obsRct, bnsRct, window, mirror: ; otherwise {other objects are offset} otherValue := otherValue + (valueShould - valueIs); end; valueIs := valueShould; end; {-----------------} begin inError := FALSE; errorType := noError; with wasObject do begin case objectIs of nulObj..obsRct, flrVnt..ritFan, clock..rbrBnd: ; litSwt..guitar, drip..window, paintg..dnStar: ; otherwise begin objectIs := 0; inError := TRUE; errorType := kindError; end; end; {case - objectIs} with boundRect do begin if (left < 0) then begin ShiftOrSet(left, right, 0, objectIs, FALSE); inError := TRUE; errorType := boundError; end; if (left > (512 - 16)) then begin ShiftOrSet(left, right, 512 - 16, objectIs, FALSE); inError := TRUE; errorType := boundError; end; if (right > 512) then begin ShiftOrSet(right, left, 512, objectIs, FALSE); inError := TRUE; errorType := boundError; end; if (right < 16) then begin ShiftOrSet(right, left, 16, objectIs, FALSE); inError := TRUE; errorType := boundError; end; if (top < 0) then begin ShiftOrSet(top, bottom, 0, objectIs, TRUE); inError := TRUE; errorType := boundError; end; if (top > (342 - 16)) then begin ShiftOrSet(top, bottom, 342 - 16, objectIs, TRUE); inError := TRUE; errorType := boundError; end; if (bottom > 342) then begin ShiftOrSet(bottom, top, 342, objectIs, TRUE); inError := TRUE; errorType := boundError; end; if (bottom < 16) then begin ShiftOrSet(bottom, top, 16, objectIs, TRUE); inError := TRUE; errorType := boundError; end; end; {end - with boundRect} case objectIs of extRct, upStar, dnStar: if ((amount < 1) or (amount > 80)) then {room link must be 1..80} begin amount := roomAt; inError := TRUE; errorType := amountError; end; pwrSwt: if ((amount < 0) or (amount > 16)) then {object link must be 0..16} begin amount := 0; inError := TRUE; errorType := amountError; end; flrVnt, candle, toastr, ball, fshBwl: {air etc. column not too high} if ((amount < ceilingVert + 10) or (amount > boundRect.top)) then begin amount := ceilingVert + 10; inError := TRUE; errorType := amountError; end; celVnt, celDct, drip: {air etc. column not too low} if ((amount < boundRect.bottom) or (amount > floorVert)) then begin amount := floorVert; inError := TRUE; errorType := amountError; end; lftFan: {air column not too left} if ((amount < 0) or (amount > boundRect.left)) then begin amount := 0; inError := TRUE; errorType := amountError; end; ritFan, grease: {air etc. column not too right} if ((amount < boundRect.right) or (amount > 512)) then begin amount := 512; inError := TRUE; errorType := amountError; end; clock, paper, bnsRct: {points not too high or neg.} if ((amount < 0) or (amount > 10000)) then begin amount := 1000; inError := TRUE; errorType := amountError; end; battry, rbrBnd: {things not too high or neg.} if ((amount < 0) or (amount > 100)) then begin amount := 20; inError := TRUE; errorType := amountError; end; outlet, teaKtl: {delay not too high or neg.} if ((amount < 0) or (amount > 600)) then begin amount := 30; inError := TRUE; errorType := amountError; end; otherwise end; {case - objectIs} case objectIs of celDct: {room must be 1..80} if ((extra < 1) or (extra > 80)) then begin extra := roomAt; inError := TRUE; errorType := extraError; end; drip, fshBwl: if ((extra < 0) or (extra > 600)) then begin extra := 30; inError := TRUE; errorType := extraError; end; end; {case - objectIs} end; {end - with wasObject} ErrorCheckObject := inError; end; {=================================} procedure DoCustomizeKeys; const okayItem = 1; cancelItem = 2; leftIcon = 3; rightIcon = 4; energyIcon = 5; bandIcon = 6; leftStat = 7; rightStat = 8; energyStat = 9; bandStat = 10; modeStat = 11; energyRadio = 12; bandRadio = 13; type string12 = string[12]; var wasPort: GrafPtr; itemT, itemHit, i, rawKey, rawChar: Integer; newLeftKey, newRightKey, newEnergyKey, newBandKey: Integer; theState, tempLong: LongInt; tempStr: Str255; itemH, keyHandle: Handle; theDlgPtr: DialogPtr; tempRect: Rect; newLeftName, newRightName, newEnergyName, newBandName: string[12]; leaveDlg, newButtonFires: Boolean; {------------------} procedure RefreshIt; begin SetPort(theDlgPtr); GetDItem(theDlgPtr, okayItem, itemT, itemH, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenNormal; end; {------------------} function ShowKeyName (rawKeyCode, rawCharCode: Integer): string12; begin if ((rawCharCode >= $21) and (rawCharCode <= $7A)) then begin if ((rawKeyCode >= $41) and (rawKeyCode <= $5C)) then tempStr := CONCAT(CHR(rawCharCode), ' keypad') else tempStr := CONCAT(CHR(rawCharCode), ' key'); end else case rawCharCode of $01: tempStr := 'home'; $03: tempStr := 'enter'; $04: tempStr := 'end'; $05: tempStr := 'help'; $08: tempStr := 'delete'; $09: tempStr := 'tab'; $0B: tempStr := 'page up'; $0C: tempStr := 'page down'; $0D: tempStr := 'return'; $10: case rawKeyCode of $60: tempStr := 'F5 key'; $61: tempStr := 'F6 key'; $62: tempStr := 'F7 key'; $63: tempStr := 'F3 key'; $64: tempStr := 'F8 key'; $65: tempStr := 'F9 key'; $67: tempStr := 'F11 key'; $69: tempStr := 'F13 key'; $6B: tempStr := 'F14 key'; $6D: tempStr := 'F10 key'; $6F: tempStr := 'F12 key'; $71: tempStr := 'F15 key'; $76: tempStr := 'F4 key'; $78: tempStr := 'F2 key'; $7A: tempStr := 'F1 key'; otherwise NumToString(rawKeyCode, tempStr); end; $1A: tempStr := 'clear'; $1B: if (rawKeyCode = $47) then tempStr := 'clear' else tempStr := 'escape'; $1C: tempStr := 'left arrow'; $1D: tempStr := 'right arrow'; $1E: tempStr := 'up arrow'; $1F: tempStr := 'down arrow'; $20: tempStr := 'space'; $7F: tempStr := 'del key'; otherwise tempStr := 'unknown'; end; ShowKeyName := tempStr; end; {------------------} begin FlushEvents(EveryEvent, 0); GetPort(wasPort); UseResFile(editorResNum); theDlgPtr := GetNewDialog(rCustomKeysID, nil, Pointer(-1)); tempRect := theDlgPtr^.portRect; tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(theDlgPtr, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(theDlgPtr); SelectWindow(theDlgPtr); SetPort(theDlgPtr); newLeftKey := leftKey; newRightKey := rightKey; newEnergyKey := energyKey; newBandKey := bandKey; newButtonFires := buttonFires; newLeftName := leftName; newRightName := rightName; newEnergyName := energyName; newBandName := bandName; GetDItem(theDlgPtr, leftStat, itemT, itemH, tempRect); SetIText(itemH, newLeftName); GetDItem(theDlgPtr, rightStat, itemT, itemH, tempRect); SetIText(itemH, newRightName); GetDItem(theDlgPtr, energyStat, itemT, itemH, tempRect); SetIText(itemH, newEnergyName); GetDItem(theDlgPtr, bandStat, itemT, itemH, tempRect); SetIText(itemH, newBandName); if (newButtonFires) then GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect) else GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); RefreshIt; leaveDlg := FALSE; repeat ModalDialog(nil, itemHit); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); if ((itemHit >= leftIcon) and (itemHit <= bandIcon)) then begin GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); InvertRect(tempRect); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'The next key you strike will control this function.'); InvertRect(tempRect); repeat until not Button; FlushEvents(everyEvent, 0); repeat until GetNextEvent(keyDownMask, theEvent); rawKey := LoWord(BitAnd(KeyCodeMask, theEvent.message) div $FF); rawChar := LoWord(BitAnd(CharCodeMask, theEvent.message)); FlushEvents(everyEvent, 0); InvertRect(tempRect); GetDItem(theDlgPtr, itemHit, itemT, itemH, tempRect); InvertRect(tempRect); tempStr := ShowKeyName(rawKey, rawChar); GetDItem(theDlgPtr, itemHit + 4, itemT, itemH, tempRect); SetIText(itemH, tempStr); if (tempStr = 'tab') then begin SysBeep(3); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'The TAB key is reserved for pausing Glider.'); Delay(180, tempLong); case itemHit of leftIcon: tempStr := newLeftName; rightIcon: tempStr := newRightName; energyIcon: tempStr := newEnergyName; otherwise tempStr := newBandName; end; GetDItem(theDlgPtr, itemHit + 4, itemT, itemH, tempRect); SetIText(itemH, tempStr); end else case itemHit of leftIcon: begin newLeftKey := rawKey; newLeftName := COPY(tempStr, 1, 12); end; rightIcon: begin newRightKey := rawKey; newRightName := COPY(tempStr, 1, 12); end; energyIcon: begin newEnergyKey := rawKey; newEnergyName := COPY(tempStr, 1, 12); end; otherwise begin newBandKey := rawKey; newBandName := COPY(tempStr, 1, 12); end; end; GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); end; if (itemHit = energyRadio) then begin newButtonFires := FALSE; GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); end; if (itemHit = bandRadio) then begin newButtonFires := TRUE; GetDItem(theDlgPtr, bandRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 1); GetDItem(theDlgPtr, energyRadio, itemT, itemH, tempRect); SetCtlValue(ControlHandle(itemH), 0); end; if (itemHit = okayItem) then begin leaveDlg := TRUE; if ((newLeftKey = newRightKey) or (newLeftKey = newEnergyKey) or (newLeftKey = newBandKey)) then begin SysBeep(3); newLeftKey := leftKey; newLeftName := leftName; GetDItem(theDlgPtr, leftStat, itemT, itemH, tempRect); SetIText(itemH, newLeftName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Left Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if ((newRightKey = newEnergyKey) or (newRightKey = newBandKey)) then begin SysBeep(3); newRightKey := rightKey; newRightName := rightName; GetDItem(theDlgPtr, rightStat, itemT, itemH, tempRect); SetIText(itemH, newRightName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Right Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if (newEnergyKey = newBandKey) then begin SysBeep(3); newEnergyKey := energyKey; newEnergyName := energyName; GetDItem(theDlgPtr, energyStat, itemT, itemH, tempRect); SetIText(itemH, newEnergyName); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Your Energize Key has been assigned to another function.'); Delay(180, tempLong); GetDItem(theDlgPtr, modeStat, itemT, itemH, tempRect); SetIText(itemH, 'Click on an icon to change its controlling key.'); leaveDlg := FALSE; end; if (leaveDlg) then begin leftKey := newLeftKey; rightKey := newRightKey; energyKey := newEnergyKey; bandKey := newBandKey; buttonFires := newButtonFires; leftName := newLeftName; rightName := newRightName; energyName := newEnergyName; bandName := newBandName; end; end; if (ItemHit = cancelItem) then leaveDlg := TRUE; until leaveDlg; SetPort(GrafPtr(wasPort)); DisposDialog(theDlgPtr); end; {=================================} function idleFilter; var iconNum, iType: Integer; timeIs: LongInt; tempRect: Rect; iHand, icnHand: Handle; cicnHand: CIconHandle; begin idleFilter := FALSE; if ((theEvent.what = KeyDown) and (BitAnd(theEvent.message, CharCodeMask) = 13)) then begin itemHit := 1; idleFilter := TRUE; end; timeIs := TickCount; if (timeIs > timeWas + 90) then begin timeWas := TickCount; screenNum := screenNum + 1; if (screenNum > 3) then screenNum := 0; for iconNum := 2 to 10 do begin Delay(2, timeIs); GetDItem(theDialog, iconNum, iType, iHand, tempRect); if (inColor) then begin cicnHand := GetCIcon(1226 + iconNum + (screenNum * 9)); if (cicnHand <> nil) then begin PlotCIcon(tempRect, cicnHand); DisposCIcon(cicnHand); end; end else begin icnHand := GetIcon(1226 + iconNum + (screenNum * 9)); if (icnHand <> nil) then PlotIcon(tempRect, icnHand); end; end; {end - for iconnum} end; {end - if (timeIs } end; {=================================} procedure DoAbout; const okayButton = 1; var savePort: GrafPtr; ExitDialog: boolean; excessSpace, DType, Index, itemHit, temp: Integer; iTemp: LongInt; DItem: Handle; ThisEditText: TEHandle; CItem, CTempItem: controlhandle; GetSelection: DialogPtr; TheDialogPtr: DialogPeek; tempRect: Rect; {----------------------------------} procedure Refresh_Dialog; {Refresh the dialogs non-controls} var rTempRect: Rect; {Temp rectangle used for drawing} begin SetPort(GetSelection); {Point to our dialog window} GetDItem(GetSelection, okayButton, DType, DItem, tempRect);{Get the item handle} PenSize(3, 3); {Change pen to draw thick default outline} InsetRect(tempRect, -4, -4); {Draw outside the button by 1 pixel} FrameRoundRect(tempRect, 16, 16); {Draw the outline} PenSize(1, 1); {Restore the pen size to the default value} end; {----------------------------------} begin {Start of dialog handler} GetPort(savePort); {Get the previous grafport} GetSelection := GetNewDialog(228, nil, Pointer(-1));{Bring in the dialog resource} tempRect := GetSelection^.portRect; {Get window size, we will now center it} tempRect.Top := ((screenBits.Bounds.Bottom - screenBits.Bounds.Top) - (tempRect.Bottom - tempRect.Top)) div 2; tempRect.Left := ((screenBits.Bounds.Right - screenBits.Bounds.Left) - (tempRect.Right - tempRect.Left)) div 2; MoveWindow(GetSelection, tempRect.Left, tempRect.Top, TRUE);{Now move the window to the proper position} ShowWindow(GetSelection); {Open a dialog box} SelectWindow(GetSelection); {Lets see it} SetPort(GetSelection); {Prepare to add conditional text} Refresh_Dialog; {Draw any Lists, lines, or rectangles} timeWas := TickCount; {Initialize the tick counter} screenNum := 0; {Initialize the set of icons displaying} ExitDialog := FALSE; {Do not exit dialog handle loop yet} repeat {Start of dialog handle loop} ModalDialog(@idleFilter, itemHit);{Wait until an item is hit} GetDItem(GetSelection, itemHit, DType, DItem, tempRect); {Get item information} CItem := Pointer(DItem); {Get the control handle} if (ItemHit = okayButton) then {Handle the Button being pressed} begin exitDialog := TRUE; {Exit the dialog when this selection is made} end; {End for this item selected} until exitDialog; {Handle dialog items until exit selected} SetPort(GrafPtr(savePort)); {Restore the previous grafport} DisposDialog(GetSelection); {Flush the dialog out of memory} end; {End of procedure} {=================================} end. \ No newline at end of file