Elevator and stairs (JACL example)
From IFWiki
The guy who did the Inform example wasn't wrong...
#!../bin/jacl
variable GAME_VERSION 2
string GAME_TITLE "Smell Restrictions"
attribute OUTSIDE_LIFT
variable FLOOR_MAPPING ground_floor first_floor second_floor
{+intro
clear
write "^^Elevator and stairs example^^"
execute "+look_around"
}
{+eachturn
execute "+lift_action"
}
location ground_floor : ground floor
short the "ground floor"
has OUTSIDE_LIFT
up first_floor
{look
write "You are on the ground floor. The "
if here(north) != nowhere
write "open "
else
write "closed "
endif
print:
door door to an elevator is to the north and a set of stairs lead up.
Beside the door is a call button.^
.
}
{movement
break +door_warning
break false
}
object stairs : stairs
mass scenery
{examine
if here = ground_floor
write "The stairs go up.^"
endif
if here = first_floor
write "The go stairs up and down.^"
endif
if here = second_floor
write "The go stairs down.^"
endif
}
{take
if here = first_floor
write "Do you want to take the stairs up, or take the stairs down?^"
endif
if here = ground_floor
proxy "up"
endif
if here = second_floor
proxy "down"
endif
}
{take_up
proxy "up"
}
{take_down
proxy "down"
}
grammar take *here up >take_up
{+take_up
write "You can't take " noun1{the} " up.^"
}
grammar take *here down >take_down
{+take_down
write "You can't take " noun1{the} " down.^"
}
object callbuttong: call button
short a "call button"
floor 0
{examine : *examine_callbutton1 : *examine_callbutton2
write "Pushing this button summons the elevator to this floor. It's currently "
if self has ON
write "lit.^"
else
write "dark.^"
endif
}
{press : *press_callbutton1 : *press_callbutton2
if lift_obj(moving_to) != arrived
write "The button lights as you press it, only to go off again when you release it.^"
return
endif
if lift_obj(floor) = self(floor)
if here(out) = nowhere
write "The lift doors slide open.^"
execute "+lift_open"
return
endif
write "The button lights as you press it, only to go off again when you "
write "release it.^"
return
endall
set lift_obj(moving_to) = self(floor)
ensure self has ON
write "The button lights up as you press it.^"
}
location lift : lift
short the "elevator"
{look
write "You are inside the elevator. The door to the south is "
if here(south) != nowhere
write "open, "
else
write "closed, "
endif
write "and there is the usual panel of buttons beside it.^"
}
{movement
if COMPASS = south : COMPASS = out
if destination = nowhere
write "The lift doors are currently closed.^"
return
endall
if destination = false
write "The only way out of the lift is to the west.^"
return
endif
return false
}
object cbutton: east eastern close door button control 1
short a "close doors button"
{press : move
if lift_obj(turns_till_doors_close) = 0
write "The doors are already closed.^"
set TIME = false
return
endif
write "The lift doors slide closed.^"
execute "+lift_close"
}
object obutton: east eastern open door button control 1
short an "open doors button"
{press : move
if lift_obj(turns_till_doors_close) > 0
write "The doors are already open.^"
set TIME = false
return
endif
if lift_obj(moving_to) != arrived
write "The lift doors refuse to open while the lift is in motion.^"
return
endif
write "The lift doors slide open.^"
execute "+lift_open"
}
object gbutton: ground floor button g
short a "ground floor button"
floor 0
{press : move
execute +floorbuttonpress<self
}
object 1button: first floor button 1
short a "first floor button"
floor 1
{press : move
execute +floorbuttonpress<self
}
object 2button: second floor button 2
short a "second floor button"
floor 2
{press : move
execute +floorbuttonpress<self
}
object panel : panel of buttons
short a "panel of buttons"
{examine
write "The panel consists of five buttons labelled ground, one, two, "
write "open and close. "
if gbutton has ON
write "The button for the ground floor is currently lit."
endif
if 1button has ON
write "The button for the first floor is currently lit."
endif
if 2button has ON
write "The button for the second floor is currently lit."
endif
write ^
execute examine_display
}
string led_display G 1 2
object display : led display
short an "LED display"
{examine
write "Above the panel is an LED display with a large red '"
write led_display[lift_obj(floor)] "'.^"
}
# Elements of lift object:
constant floor 5
constant moving_to 6
constant arrived 42; POSSIBLE VALUE OF moving_to
constant turns_till_doors_close 7
constant delta 8
object lift_obj: lift door doors
short name "east lift"
moving_to arrived
{examine
if lift_obj(turns_till_doors_close) > 0;
write "The lift doors are open.^"
else
write "The lift doors are closed.^"
endif
}
{enter
if here = lift
write "You are already in the lift.^"
set TIME = false
return
endif
proxy "east"
}
{open
if lift_obj(turns_till_doors_close) > 0;
write "The lift doors are already open.^"
return
endif
if here = lift
write "(by pressing the open doors button)^"
proxy "press open doors button"
return
endif
write "(by pressing the call button)^"
proxy "press call button"
}
{close
if lift_obj(turns_till_doors_close) = 0;
write "The lift doors are already closed.^"
break
endif
if here = lift
write "(by pressing the close doors button)^"
proxy "press close doors button"
return
endif
write "There is no way to close the lift doors from the outside.^"
}
location first_floor : first floor
short the "first floor"
has OUTSIDE_LIFT
down ground_floor
up second_floor
{look
write "<You are on the first floor. The "
if here(north) != nowhere
write "open "
else
write "closed "
endif
print:
door door to an elevator is to the north and a set of stairs lead up
and down from here. Beside the door is a call button.^
.
}
{movement
if +door_warning = true
return true
endif
return false
}
object callbutton1: call button
short a "call button"
floor 1
location second_floor : second floor
short the "second floor"
has OUTSIDE_LIFT
down first_floor
{look
write "You are on the second floor. The "
if here(north) != nowhere
write "open "
else
write "closed "
endif
print:
door door to an elevator is to the north and a set of stairs lead
down. Beside the door is a call button.^
.
}
{movement
break +door_warning
break false
}
object callbutton2: call button
short a "call button"
floor 2
{+lift_close
set lift_obj(turns_till_doors_close) = 0
set noun3 = FLOOR_MAPPING[lift_obj(floor)]
set lift(south) = nowhere
set lift(out) = nowhere
set lift(south) = nowhere
set lift(out) = nowhere
set noun3(in) = nowhere
set noun3(north) = nowhere
}
{+lift_open
set lift_obj(turns_till_doors_close) = 3;
set noun3 = FLOOR_MAPPING[lift_obj(floor)]
set lift(south) = noun3
set lift(out) = noun3
set noun3(in) = lift
set noun3(north) = lift
}
{+lift_action
if here = lift
move lift_obj to here
endif
if here has OUTSIDE_LIFT
move stairs to here
move lift_obj to here
endif
if lift_obj(turns_till_doors_close) > 0
# THE LIFT DOORS ARE OPEN...
set lift_obj(turns_till_doors_close) - 1
if lift_obj(turns_till_doors_close) = 0
if here = lift : here = FLOOR_MAPPING[lift_obj(floor)]
write "^The lift doors slide closed.^"
endif
execute "+lift_close"
endif
return # THE LIFT CAN'T DO ANYTHING ELSE UNTIL THE DOORS HAVE CLOSED
endif
if lift_obj(moving_to) != arrived
if lift_obj(moving_to) != lift_obj(floor)
# THE LIFT IS STILL ON ITS WAY TO SOMEWHERE
set lift_obj(delta) = lift_obj(moving_to)
set lift_obj(delta) - lift_obj(floor)
if lift_obj(delta) < 0
set lift_obj(floor) - 1
else
set lift_obj(floor) + 1
endif
if here = lift
write "^The lift vibrates as it slowly "
if lift_obj(delta) < 0
write "descends.^"
else
write "ascends.^"
endif
endif
return
endif
set lift_obj(moving_to) = arrived
if here = FLOOR_MAPPING[lift_obj(floor)]
write "^A crisp-sounding bell rings briefly and the doors "
write "to the lift slide open.^"
endif
if here = lift
write "^Having arrived at the selected floor, the lift "
write "gently comes to a halt and the doors open.^"
endif
execute "+lift_open"
execute "+disable_callbuttons"
endif
}
{+press_callbutton
if arg[0] has ON
write "The call button has already been pressed.^"
set TIME = false
return
endif
if lift_obj(floor) = arg[0](floor)
if lift_obj(turns_till_doors_close) > 0
write "There is already a lift here.^"
set TIME = false
return
endif
write "A crisp-sounding bell rings briefly and the doors "
write "to the lift slide open.^"
execute "+lift_open"
ensure arg[0] hasnt ON
return
endif
write "<p>As you press the call button it lights up.^"
ensure arg[0] has ON
set lift_obj(moving_to) = arg[0](floor)
}
{+disable_callbuttons
ensure gbutton hasnt ON
ensure 1button hasnt ON
ensure 2button hasnt ON
ensure callbuttong hasnt ON
ensure callbutton1 hasnt ON
ensure callbutton2 hasnt ON
}
{+door_warning
if COMPASS = north : COMPASS = in
if destination = false
write "The lift doors are closed.^"
return
endif
endif
return false
}
object kryten: myself self me
has ANIMATE
short name "yourself"
quantity 50
parent ground_floor
player
#include "verbs.library"