635 lines
9.8 KiB
Plaintext
635 lines
9.8 KiB
Plaintext
[logics for room 40 -- rmElevators
|
|
[ "Leisure Suit Larry in the Land of the Lounge Lizards"
|
|
[ by Al Lowe
|
|
|
|
%include "rm40.msg"
|
|
%include "gamedefs.h"
|
|
|
|
|
|
|
|
[ Vertical elevator maze. One floor has the honeymoon suite entrance,
|
|
|
|
|
|
#define L_HALL_DOOR 0
|
|
#define HONEYMOON_FLOOR 4
|
|
|
|
%define nearTHEDoor lf0
|
|
%define doorDone lf2
|
|
%define elevatorMoving lf4
|
|
%define inElevator lf5
|
|
%define goingDown lf6
|
|
|
|
%define currentFloor lv0
|
|
|
|
%object aElevator 1
|
|
%object aDoors 2
|
|
%object aFloor 3
|
|
%object aDoor 4
|
|
%object aNumber 6
|
|
|
|
|
|
|
|
if (initLog)
|
|
{
|
|
SetHorizon( 1);
|
|
|
|
LoadPic( currentRoom);
|
|
DrawPic( currentRoom);
|
|
DiscardPic( currentRoom);
|
|
|
|
LoadView( vElevator);
|
|
LoadView( vElevatorNumbers);
|
|
LoadView( vHoneymoonHallwayDoor);
|
|
LoadView( vEgoPushingElevator);
|
|
LoadView( vEgo);
|
|
|
|
IgnoreObjs( ego);
|
|
|
|
|
|
AnimateObj( aDoor);
|
|
IgnoreBlocks( aDoor);
|
|
IgnoreObjs( aDoor);
|
|
SetView( aDoor, vHoneymoonHallwayDoor);
|
|
SetCel( aDoor, 0);
|
|
SetPriority( aDoor, 10);
|
|
Position( aDoor, 6, 134);
|
|
work = DOOR_CYCLE_TIME;
|
|
CycleTime( aDoor, work);
|
|
|
|
AnimateObj( aNumber);
|
|
IgnoreBlocks( aNumber);
|
|
IgnoreObjs( aNumber);
|
|
SetView( aNumber, vElevatorNumbers);
|
|
SetPriority( aNumber, 5);
|
|
Position( aNumber, 73, 100);
|
|
StopCycling( aNumber);
|
|
|
|
AnimateObj( aDoors);
|
|
IgnoreBlocks( aDoors);
|
|
IgnoreObjs( aDoors);
|
|
SetView( aDoors, vElevator);
|
|
SetLoop( aDoors, L_DOORS);
|
|
FixLoop( aDoors);
|
|
SetPriority( aDoors, 4);
|
|
Position( aDoors, 73, 120);
|
|
work = DOOR_CYCLE_TIME;
|
|
CycleTime( aDoors, work);
|
|
|
|
AnimateObj( aFloor);
|
|
IgnoreBlocks( aFloor);
|
|
IgnoreObjs( aFloor);
|
|
SetView( aFloor, vElevator);
|
|
SetLoop( aFloor, L_FLOOR);
|
|
FixLoop( aFloor);
|
|
Position( aFloor, 73, 128);
|
|
SetPriority( aFloor, 5);
|
|
|
|
AnimateObj( aElevator);
|
|
IgnoreBlocks( aElevator);
|
|
IgnoreObjs( aElevator);
|
|
SetView( aElevator, vElevator);
|
|
SetPriority( aElevator, 12);
|
|
FixLoop( aElevator);
|
|
StepSize( aElevator, two);
|
|
if (currentStatus == IN_ELEVATOR)
|
|
{
|
|
if (previousRoom == rmSecurityDesk)
|
|
{
|
|
Set( goingDown);
|
|
currentFloor = 7;
|
|
Position( aElevator, 73, 36);
|
|
}
|
|
else
|
|
{
|
|
currentFloor = 2;
|
|
Position( aElevator, 73, 167);
|
|
}
|
|
|
|
Set( elevatorMoving);
|
|
currentStatus = IN_ELEVATOR;
|
|
|
|
SetLoop( aElevator, L_WITH_EGO);
|
|
LastCel( aElevator, work);
|
|
SetCelV( aElevator, work);
|
|
StopCycling( aElevator);
|
|
|
|
if (destinationFloor > currentFloor)
|
|
{
|
|
MoveObj( aElevator, 73, 36, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
if (destinationFloor < currentFloor)
|
|
{
|
|
MoveObj( aElevator, 73, 167, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
MoveObj( aElevator, 73, 128, 2, scriptDone);
|
|
script = 100;
|
|
}
|
|
}
|
|
|
|
Draw( aElevator);
|
|
Draw( aDoors);
|
|
StopUpdate( aDoors);
|
|
|
|
SetCelV( aNumber, currentFloor);
|
|
Draw( aNumber);
|
|
|
|
SetView( ego, vEgo);
|
|
SetLoop( ego, FACING_FRONT);
|
|
SetPriority( ego, 12);
|
|
egoX = 76;
|
|
egoY = 126;
|
|
PositionV( ego, egoX, egoY);
|
|
[ Don't Draw ego!
|
|
}
|
|
else [ NOT in elevator.
|
|
{
|
|
Draw( aFloor);
|
|
StopUpdate( aFloor);
|
|
|
|
SetLoop( aElevator, L_EMPTY);
|
|
SetCel( aElevator, 0);
|
|
Position( aElevator, 73, 128);
|
|
Draw( aElevator);
|
|
StopUpdate( aElevator);
|
|
|
|
currentFloor = HONEYMOON_FLOOR;
|
|
|
|
Draw( aDoor);
|
|
StopUpdate( aDoor);
|
|
|
|
SetLoop( ego, FACING_RIGHT);
|
|
egoX = 9;
|
|
egoY = 132;
|
|
PositionV( ego, egoX, egoY);
|
|
Draw( ego);
|
|
StartMotion( ego);
|
|
}
|
|
|
|
|
|
ShowPic( );
|
|
|
|
if (previousRoom == rmHoneymoonSuite)
|
|
{
|
|
Print( 18);
|
|
}
|
|
|
|
Return( );
|
|
|
|
} [ end initLOG
|
|
|
|
|
|
|
|
Reset( inElevator);
|
|
if (Posn( ego, 73, 119, 83, 127))
|
|
{
|
|
Set( inElevator);
|
|
}
|
|
|
|
if (inElevator)
|
|
{
|
|
SetPriority( ego, 11);
|
|
}
|
|
else
|
|
{
|
|
ReleasePriority( ego);
|
|
}
|
|
|
|
|
|
Reset( nearTHEDoor);
|
|
if (currentFloor == HONEYMOON_FLOOR &&
|
|
Posn( ego, 6, 126, 15, 135))
|
|
{
|
|
Set( nearTHEDoor);
|
|
}
|
|
|
|
|
|
|
|
[*****
|
|
:handleInput
|
|
[*****
|
|
|
|
if (!haveInput) {goto noInput;}
|
|
|
|
if (elevatorMoving && !haveMatch)
|
|
{
|
|
if ((Said( listen) ||
|
|
Said( listen, elevator) ||
|
|
Said( listen, music) ||
|
|
Said( sing, music) ||
|
|
Said( sing) ||
|
|
Said( sing, along)))
|
|
{
|
|
Print( 7);
|
|
}
|
|
else
|
|
{
|
|
Set( haveMatch);
|
|
Print( 5);
|
|
}
|
|
}
|
|
|
|
|
|
if ((Said( look) ||
|
|
Said( look, room) ||
|
|
Said( look, floor) ||
|
|
Said( look, hotel)))
|
|
{
|
|
Print( 1);
|
|
|
|
if (currentFloor == HONEYMOON_FLOOR)
|
|
{
|
|
Print( 2);
|
|
}
|
|
|
|
if (inElevator)
|
|
{
|
|
Print( 20);
|
|
}
|
|
}
|
|
|
|
if (Said( look, elevator))
|
|
{
|
|
if (inElevator)
|
|
{
|
|
Print( 20);
|
|
}
|
|
else
|
|
{
|
|
Print( 22);
|
|
}
|
|
}
|
|
|
|
|
|
if (Said( look, plants))
|
|
{
|
|
Print( 16);
|
|
}
|
|
|
|
if (Said( look, door))
|
|
{
|
|
if (nearTHEDoor)
|
|
{
|
|
Print( 11);
|
|
}
|
|
else
|
|
{
|
|
Print( 12);
|
|
}
|
|
}
|
|
|
|
if (Said( anyword, heart, rol))
|
|
{
|
|
if (nearTHEDoor)
|
|
{
|
|
Print( 23);
|
|
}
|
|
else
|
|
{
|
|
Print( 24);
|
|
}
|
|
}
|
|
|
|
if ((Said( knock) ||
|
|
Said( knock, on, door) ||
|
|
Said( knock, door)))
|
|
{
|
|
if (!nearTHEDoor)
|
|
{
|
|
Print( 32);
|
|
Random( 34, 50, message);
|
|
PrintV( message);
|
|
Print( 33);
|
|
}
|
|
else
|
|
{
|
|
if (!fawnInRoom)
|
|
{
|
|
Print( 4);
|
|
}
|
|
else
|
|
{
|
|
if (orderedWine && !seenDeliveryBoyGag)
|
|
{
|
|
Print( 25);
|
|
Print( 26);
|
|
}
|
|
else
|
|
{
|
|
Print( 6);
|
|
Print( 8);
|
|
}
|
|
|
|
Print( 10);
|
|
StartUpdate( aDoor);
|
|
EndOfLoop( aDoor, doorDone);
|
|
StopMotion( ego);
|
|
Set( programControl);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (Said( open, door))
|
|
{
|
|
if (!nearTHEDoor)
|
|
{
|
|
Print( 17);
|
|
}
|
|
else
|
|
{
|
|
Print( 9);
|
|
}
|
|
}
|
|
|
|
if ((Said( open, door, use, rol) ||
|
|
Said( break, door, rol)))
|
|
{
|
|
Print( 27);
|
|
}
|
|
|
|
|
|
if ((Said( unlock, door, rol) ||
|
|
Said( use, key, rol)))
|
|
{
|
|
if (!nearTHEDoor)
|
|
{
|
|
Set( notCloseEnough);
|
|
}
|
|
else
|
|
{
|
|
Print( 21);
|
|
}
|
|
}
|
|
|
|
if (Said( jump, rol))
|
|
{
|
|
Print( 31);
|
|
}
|
|
|
|
if ((Said( look, down) ||
|
|
Said( spit)))
|
|
{
|
|
Print( 28);
|
|
Print( 29);
|
|
Print( 30);
|
|
}
|
|
|
|
|
|
if (!script && inElevator)
|
|
{
|
|
if ((Said( press, one) ||
|
|
Said( press, button, one) ||
|
|
Said( one)))
|
|
{
|
|
destinationFloor = 1;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, two) ||
|
|
Said( press, button, two) ||
|
|
Said( two)))
|
|
{
|
|
destinationFloor = 2;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, three) ||
|
|
Said( press, button, three) ||
|
|
Said( three)))
|
|
{
|
|
destinationFloor = 3;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, four) ||
|
|
Said( press, button, four) ||
|
|
Said( four)))
|
|
{
|
|
destinationFloor = 4;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, five) ||
|
|
Said( press, button, five) ||
|
|
Said( five)))
|
|
{
|
|
destinationFloor = 5;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, six) ||
|
|
Said( press, button, six) ||
|
|
Said( six)))
|
|
{
|
|
destinationFloor = 6;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, seven) ||
|
|
Said( press, button, seven) ||
|
|
Said( seven)))
|
|
{
|
|
destinationFloor = 7;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( press, eight) ||
|
|
Said( press, button, eight) ||
|
|
Said( eight)))
|
|
{
|
|
destinationFloor = 8;
|
|
Set( scriptDone);
|
|
}
|
|
|
|
if ((Said( push, rol) ||
|
|
Said( push, button, rol)))
|
|
{
|
|
Print( 19);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[*****
|
|
:noInput
|
|
[*****
|
|
|
|
if (doorDone)
|
|
{
|
|
Reset( programControl);
|
|
newRoom = rmHoneymoonSuite;
|
|
}
|
|
|
|
|
|
if (scriptDone)
|
|
{
|
|
Reset( scriptDone);
|
|
++script;
|
|
|
|
if (script == 1)
|
|
{
|
|
Set( elevatorMoving);
|
|
currentStatus = IN_ELEVATOR;
|
|
StopMotion( ego);
|
|
Set( programControl);
|
|
SetView( ego, vEgoPushingElevator);
|
|
SetCel( ego, 0);
|
|
RepositionTo( ego, 76, 126);
|
|
CycleTime( ego, three);
|
|
Set( keepCycling);
|
|
EndOfLoop( ego, scriptDone);
|
|
}
|
|
|
|
if (script == 2)
|
|
{
|
|
Erase( ego);
|
|
SetView( ego, vEgo);
|
|
|
|
SetLoop( aElevator, L_WITH_EGO);
|
|
SetCel( aElevator, 0);
|
|
CycleTime( aElevator, three);
|
|
EndOfLoop( aElevator, scriptDone);
|
|
}
|
|
|
|
if (script == 3)
|
|
{
|
|
Erase( aFloor);
|
|
Draw( aDoors);
|
|
|
|
SetCelV( aNumber, currentFloor);
|
|
Draw( aNumber);
|
|
|
|
script = 200;
|
|
StopCycling( aElevator);
|
|
|
|
if (destinationFloor > currentFloor)
|
|
{
|
|
Reset( goingDown);
|
|
MoveObj( aElevator, 73, 36, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
if (destinationFloor < currentFloor)
|
|
{
|
|
Set( goingDown);
|
|
MoveObj( aElevator, 73, 167, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
Print( 3);
|
|
script = 101; [ We'll catch it immediately.
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (script == 101) [ He's at the floor he wants.
|
|
{
|
|
Erase( aDoors);
|
|
Erase( aNumber);
|
|
|
|
CycleTime( aElevator, two);
|
|
StartCycling( aElevator);
|
|
BeginningOfLoop( aElevator, scriptDone);
|
|
}
|
|
|
|
if (script == 102) [ Let him out.
|
|
{
|
|
Reset( elevatorMoving);
|
|
currentStatus = NORMAL;
|
|
destinationFloor = 0;
|
|
script = 0;
|
|
SetLoop( aElevator, L_EMPTY);
|
|
|
|
Draw( aFloor);
|
|
|
|
SetView( ego, vEgo);
|
|
SetLoop( ego, FACING_FRONT);
|
|
SetCel( ego, 0);
|
|
Position( ego, 76, 126);
|
|
Draw( ego);
|
|
StartMotion( ego);
|
|
CycleTime( ego, one);
|
|
Reset( keepCycling);
|
|
Reset( programControl);
|
|
}
|
|
|
|
|
|
|
|
if (script == 201)
|
|
{
|
|
if (goingDown)
|
|
{
|
|
--currentFloor;
|
|
if (currentFloor == 1)
|
|
{
|
|
newRoom = rmElevatorBottom;
|
|
Return();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
++currentFloor;
|
|
if (currentFloor == 8)
|
|
{
|
|
newRoom = rmSecurityDesk;
|
|
Return();
|
|
}
|
|
}
|
|
|
|
if (goingDown)
|
|
{
|
|
RepositionTo( aElevator, 73, 36);
|
|
}
|
|
else
|
|
{
|
|
RepositionTo( aElevator, 73, 167);
|
|
}
|
|
|
|
if (currentFloor != HONEYMOON_FLOOR)
|
|
{
|
|
Erase( aDoor);
|
|
}
|
|
else
|
|
{
|
|
Draw( aDoor);
|
|
StopUpdate( aDoor);
|
|
}
|
|
|
|
SetCelV( aNumber, currentFloor);
|
|
|
|
if (destinationFloor > currentFloor)
|
|
{
|
|
MoveObj( aElevator, 73, 36, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
if (destinationFloor < currentFloor)
|
|
{
|
|
MoveObj( aElevator, 73, 167, 2, scriptDone);
|
|
script = 200;
|
|
}
|
|
else
|
|
{
|
|
MoveObj( aElevator, 73, 128, 2, scriptDone);
|
|
script = 100;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
[*****
|
|
:exit [ test for leaving the room
|
|
[*****
|