mirror of
https://github.com/softdorothy/Glider4.git
synced 2024-06-09 19:29:33 +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
21 KiB
OpenEdge ABL
Executable File
1 line
21 KiB
OpenEdge ABL
Executable File
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] := 'Child<6C>s 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. |