Glider4/RoomEditor_103/Sources/E-HouseStuff.p
John Calhoun e178486ce8 Initial check-in
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.
2016-01-26 20:30:26 -08:00

1 line
8.9 KiB
OpenEdge ABL
Executable File
Raw Blame History

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.