-- clock.ala (0.3)
-- demonstrates:
-- - updating a clock using a recurring event to repeat
-- an action each turn
-- - using some of arithmetic functions of Alan, Note that all
-- numbers in Alan are integers. So the result of a division calculation
-- is always an integer, a 'whole number'. If there's any decimal part
-- or remainder it is disgarded. EG: 11 / 4 = 2 (Not 2.75)
-- (This fact is used to advantage in this example program when
-- calculating the hour of the day given the number of minutes
-- since midnight.)
-- Comments, corrections, etc to
[email protected]
----------------------------------
LOCATION platform
DESCRIPTION
"You are standing on a subway platform, clutching a timetable,
hoping your train will arrive soon."
EXIT north, south, east, west, 'exit', out TO platform
CHECK "Don't go away, you might miss your train.
(Use quit to finish running this program.)"
END Exit.
END LOCATION.
----------------------------------
OBJECT clock at platform
HAS Hour 4. -- set these three attributes
HAS Minute 50. -- to specify the time of day
HAS AmPm "pm". -- you want when the game starts
HAS TimeInMinutes 0. -- (the time expressed as minutes past midnight. This is
-- calculated by the game - in the START section - and
-- updated each turn by the TickTock event so left
-- at the default initial value here)
VERB Read
DOES ONLY "" -- don't need to read clock coz the time
END VERB. -- displayed by the TickTock event anyway
END OBJECT clock.
----------------------------------
OBJECT Timetable at platform
HAS Hour 2. -- set these three attributes
HAS Minute 03. -- to specify the arrival time
HAS AmPm "am". -- you want for the next train
HAS TimeInMinutes 0. -- calculated by the game in the START section
HAS WaitMinutes 0. -- the time to wait until the next train (calculated
-- in the Read verb)
-- Blank description because timetable mentioned in location description
DESCRIPTION
VERB Read
DOES ONLY
"The next train is at"
SAY Hour of Timetable.
"$$:$$" -- ($$ means don't put a space here when formatting this text on screen)
IF Minute of Timetable > 9 THEN
SAY Minute of Timetable.
ELSE
"0$$"
SAY Minute of Timetable.
END IF.
SAY AmPm OF Timetable.
IF TimeInMinutes OF Timetable >= TimeInMinutes OF Clock THEN
SET WaitMinutes OF Timetable TO
TimeInMinutes OF Timetable - TimeInMinutes OF Clock.
ELSE --ie:train's arrival is other side of midnight (1440 minutes)
SET WaitMinutes OF Timetable TO
1440 - (TimeInMinutes OF Clock - TimeInMinutes OF Timetable).
END IF.
"$$. You check the clock."
IF WaitMinutes OF Timetable > 20 THEN
"Wow,"
IF WaitMinutes OF Timetable > 61 THEN
SAY WaitMinutes of Timetable / 60 .
"hours and"
SAY WaitMinutes of Timetable
- ((WaitMinutes of Timetable / 60) * 60) .
"minutes to wait!"
ELSE
SAY WaitMinutes of Timetable.
"minutes to go!"
END IF.
"A bit boring to wait"
SAY WaitMinutes OF Timetable.
"turns as there's nothing to do in this game but wait or read
the timetable. Hey, maybe you could make the train arrive
faster if you just quit and changed the source code!"
"You can experiment with the clock and timetable time-settings
to see how the two interact."
ELSIF WaitMinutes OF Timetable = 0 THEN
"Hmm, the train should be here by now.
$pAhh!"
ELSE
"Only"
SAY WaitMinutes of Timetable.
"minutes to go."
END IF.
END VERB.
END OBJECT Timetable.
---------------------------------
EVENT Arrival
IF TimeInMinutes of Timetable = TimeInMinutes of Clock THEN
"The train arrives.
$pThe doors open. You step aboard and take a seat. As the train moves
off again you breathe a sigh of relief, happy to be on your way.$p$p$p"
QUIT.
ELSE
SCHEDULE Arrival AFTER 1.
END IF.
END EVENT.
---------------------------------
EVENT TickTock
-- Displays the current time and then increments the time by another minute
-- Convert time from "minutes past midnight" to hh:mm am/pm format
SET Hour OF Clock TO TimeInMinutes of Clock / 60.
IF Hour OF Clock >= 12 THEN
SET AmPm OF Clock TO "pm" .
IF Hour OF Clock > 12 THEN
SET Hour OF Clock TO Hour of Clock - 12 .
END IF.
ELSE
SET AmPm OF Clock TO "am" .
IF Hour OF Clock = 0 THEN
SET Hour OF Clock TO 12 .
END IF.
END IF.
SET Minute of Clock TO
TimeInMinutes of Clock - ((TimeInMinutes of Clock / 60) * 60).
-- Display the time on screen
"$pThe clock reads"
SAY Hour of Clock.
"$$:$$"
IF Minute of Clock > 9 THEN
SAY Minute of Clock.
ELSE
"0$$"
SAY Minute of Clock.
END IF.
SAY AmPm OF Clock.
-- Increment time by one minute
-- (If its 11:59pm set clock to zero ie:midnight instead)
IF TimeInMinutes OF Clock < 1439 THEN
INCREASE TimeInMinutes OF Clock.
ELSE
SET TimeInMinutes OF Clock TO 0 .
END IF.
-- schedule this event to happen again next turn
SCHEDULE TickTock AFTER 1.
END EVENT TickTock.
----------------------------------
SYNONYMS
examine,x,'look',l,'check'=read.
z=wait.
q=quit.
----------------------------------
SYNTAX quit=quit.
VERB quit
DOES
QUIT.
END VERB.
SYNTAX wait=wait.
VERB wait
DOES
"Another minute passes as you impatiently watch the clock."
END VERB.
----------------------------------
START AT platform.
"$pWaiting for a train"
-- Convert the train's arrival time and clock's initial time
-- from the hh:mm am/pm format
-- used in source-code to "minutes past midnight" format to make
-- calculations easier
SET TimeInMinutes OF Clock TO (Hour OF Clock * 60) + Minute OF Clock.
IF AmPm OF Clock = "pm" THEN
IF Hour OF Clock < 12 THEN
SET TimeInMinutes OF Clock TO (TimeInMinutes OF Clock + 720).
END IF.
END IF.
SET TimeInMinutes OF Timetable TO (Hour OF Timetable * 60) + Minute OF Timetable.
IF AmPm OF Timetable = "pm" THEN
IF Hour OF Timetable < 12 THEN
SET TimeInMinutes OF Timetable TO (TimeInMinutes OF Timetable + 720).
END IF.
END IF.
SCHEDULE Arrival AFTER 0. -- checks if its time for the train to arrive
SCHEDULE TickTock AFTER 0. -- start the clock "ticking"