mirror of
https://github.com/softdorothy/Glider4.git
synced 2024-06-08 13:29:32 +00:00
e178486ce8
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.
1 line
8.9 KiB
OpenEdge ABL
Executable File
1 line
8.9 KiB
OpenEdge ABL
Executable File
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<73>');
|
||
|
||
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<73>');
|
||
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<73>');
|
||
end;
|
||
|
||
{check room records}
|
||
EraseRect(progR);
|
||
FrameRect(progR);
|
||
MoveTo(progR.left + 20, progR.bottom - 10);
|
||
DrawString('Checking Rooms<6D>');
|
||
|
||
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. |