6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.
-
date post
21-Dec-2015 -
Category
Documents
-
view
216 -
download
0
Transcript of 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.
04/18/23 1
Inform Game Engine
CIS 577
Bruce R. Maxim
UM-Dearborn
04/18/23 2
Alice: Inform Tutorial Part 1Gareth Rees
04/18/23 3
Getting Started
• Graham Nelson's The Inform Designer's Manual which describes the Inform language in detail.
• You need to have release 6.01 or later of the Inform compiler and the Inform library in order to compile and run the examples.
• The Inform home pages http://www.inform-fiction.org/I7/Welcome.html also has links to Inform 7.0 (which is very free text format)
04/18/23 4
Through the Looking Glass
• Starts out in a room in Alice's house, in which Alice is playing with two kittens, one black and one white.
• The text mentions an arm chair, a ball of worsted, a fireplace, a hearth rug, a chess set, a clock, a cat, and a looking glass above the fireplace.
• It should be possible to involve many of these objects in the puzzle.
04/18/23 5
Goal
• The puzzle will be to get through the looking glass. How can that be made difficult?
• Perhaps the mantelpiece is too high for Alice to climb up onto without a chair, and the arm chair needs to be pushed over to the mantelpiece.
• But the kittens get in the way of the chair, and Alice wouldn't want to hurt them, would she? So she has to distract the kittens.
04/18/23 6
Simplest Inform Game
Constant Story "THROUGH THE LOOKING GLASS";
! ^ is the new line character
Constant Headline "^An Interactive Tutorial^by Gareth Rees^";
!Remove DEBUG line for production version
Constant DEBUG;
!Every game makes use of these three libraries
Include "parser";
Include "verblib";
Include "grammar";
04/18/23 7
Need at Least One Object
!Define initial location
Object Drawing_Room "Drawing room"
has light with name "snow", description "The gentle sound of snow against the window pane suggests that it's cold
outside, and you're glad to be here in the warmth. The drawing-room is reflected in the large looking-glass on the wall above the mantelpiece, and a very comfortable room it is too, with a warm hearth, a soft rug, and an arm-chair that you can curl up and sleep in.";
04/18/23 8
Initialise Function is Required[ Initialise;
location = Drawing_Room;
print "^^^^^It's a cold winter day outside, but in the looking-glass house it's summer. All you
need to do is pretend there's a way of getting through into it somehow...^^";
];
04/18/23 9
Return Codes
• A routine inside an object returns 0 (false) by default
• A routine outside of an object returns 1 (true) by default.
• You can override this default using the `return', `rtrue' and `rfalse' statements, or by omitting the `print' instruction from a print statement.
04/18/23 10
Meaning of Return Codes
`before‘
`life' – True (1) means that the routine has successfully
and completely dealt with the player's input, and the library shouldn't do anything more.
– False (0) means that the usual library rules should now apply to the player's input (note that this doesn't necessarily mean that the routine has done nothing).
04/18/23 11
Meaning of Return Codes
`after' – True (1) means that the `after' routine has printed
a suitable response to the player's input, and the library shouldn't do anything more.
– False (0) means that the usual library message should now be printed (again, this doesn't necessarily mean that the routine has done nothing).
04/18/23 12
Before and After
• ‘before’ – Should be used to change completely the effect of
a particular action
• ‘after’– Should be used to change the message
associated with a particular action
04/18/23 13
Meaning of Return Codes
`describe' – True (1) means that the `describe' routine has
printed a suitable description. The library shouldn't add anything else.
– False (0) means that the library should print the usual description of the object.
04/18/23 14
Programming Tip
• In an object's `before' routine, it's very common to want to – execute some code– print some text to tell the player what has
happened– return 1 to prevent the library from doing anything
else.
• A good trick in this situation is to omit the `print' keyword from the last print statement.
04/18/23 15
Evaluation Order
• Parse the command, setting up the variables `action', `noun' and `second' appropriately.
• Call `GamePreRoutine' (if there is one). If this returns non zero, stop here.
• Call the `before' routine of the player. If this returns non zero, stop here.
• Call the `before' routine of the current location. If this returns non zero, stop here.
04/18/23 16
Evaluation Order
• Call the `before' routine of the object `noun' (if any). If this returns non zero, stop here.
• Carry out the action, if possible. If there was no action to carry out (i.e., the action didn't do anything interesting, for example `jump' or `smell', or the action failed, for example `put apple in banana') then print a failure message and stop here.
• Call the `after' routine of the player. If this returns non zero, stop here.
04/18/23 17
Evaluation Order
• Call the `after' routine of the current location. If this returns non zero, stop here.
• Call the `after' routine of the object `noun' (if any). If this returns non zero, stop here.
• Call `GamePostRoutine' (if there is one). If this returns non zero, stop here.
• Print a message describing what happened at stage 6.
04/18/23 18
Simple Object
! Just need to give it a name a description
Object red_queen "red queen"
with name "red" "queen",
description "She's a fierce little chess piece.";
! Place this after the drawing room definition
! Absent from game at start and Inform assumes no
! parent object
04/18/23 19
More Complex Object
! Alice might want to put red Queen on the board
! So make it a supporter
Object chess_board "chess board" Drawing_Room
has supporter
with name "chess" "board" "checker" "chequer"
"chessboard",
initial "An abandoned chess board lies on
the floor.",
description "It's left here from the game
you were playing just now, but the pieces
are all missing - the kittens will insist
on playing with them.";
04/18/23 20
Scenery Object
! Just a decoration, only mentioned the first time room
! entered, Drawing_Room is parent object
Object hearth "hearth" Drawing_Room
has scenery
with name "hearth" "fire" "place" "fireplace",
description "Looking at the hearth, you wonder
if they have a hearth in the looking-glass
house. You can never tell by looking, unless
your fire smokes, and then smoke comes up in
the looking-glass room too - but that may be
only pretence, just to make it look as if they
had a fire.";
04/18/23 21
Defining Object Methods - 1
• `take rug' - so I make it `static', and also provide a `before' routine for the `Take' action to provide a better message than the library's default message (`That's hardly portable').
• `pull rug' and `push rug' - I provide a `before' routine that deals with these.
• `put red queen on rug' - make it a `supporter'.
04/18/23 22
Defining Object Methods
• `stand on rug' - make it `enterable'. • `look under rug' - provide a `before' routine for
the `LookUnder' action (this routine prevents Alice from looking under the rug while she is standing on it!).
04/18/23 23
Rug
Object rug "rug" Drawing_Room
has concealed static supporter enterable
! general prevents Alice from finding queen twice
with name "hearthrug" "hearth-rug" "rug" "indian" "arabian“
"beautiful" "soft",
description "It's a beautiful rug, made in some far
off country, perhaps India or Araby, wherever those
might be.",
before [;
Take: "The rug is much too large to carry.";
Push,Pull: “Hearth-rug need to be next to hearth!";
04/18/23 24
Rug LookUnder: if (player in self) "You try to lift up a corner of the rug, but fail. After a while, you realise that this is because you are standing on it. How curious the world is!"; if (self hasnt general) { give self general; move red_queen to player; "You lift up a corner of the rug and, peering underneath, discover the red queen from the chess set."; } ];
04/18/23 25
Armchair
• `take arm chair' - make it `static'. • `put chess board on arm chair' - make it a
`supporter'. • `enter arm chair' - make it `enterable'. • `push arm chair' or `pull arm chair' - these (if
successful) just toggle the position of the arm chair; either it's close enough to the mantelpiece to climb up, or it isn't. I'll use the `general' attribute to indicate which.
04/18/23 26
Armchair
Object
armchair "arm-chair“
Drawing_Room has
static concealed supporter enterable
! general if its by the mantelpiece
with name "arm" "chair" "armchair" "arm-chair", description "It's a huge arm-chair, the perfect place for a kitten or a little girl to curl up in and doze.",
04/18/23 27
Armchair
before [;
Push,Pull:
! code to check for the kittens
if (self has general){
give self ~general;
"You push the arm-chair away from the hearth."; }
give self general;
"You push the arm-chair over to the hearth.";
];
04/18/23 28
Mantlepiece - 1
• `climb on mantelpiece' - make it `enterable'. But since its so high up, I should prevent Alice from entering it unless she's standing on the arm chair. Also, she can't climb up if she's holding anything in her hands.
04/18/23 29
Mantlepiece - 2
• `put red queen on mantelpiece' - make it `supporter'. If it's too high for Alice to climb up onto unless she's on the arm chair, it's probably too high to put things on too. So a similar check is needed.
• `take red queen from mantelpiece' - the same discussion applies.
04/18/23 30
Mirror - 1
• `examine mirror' – the amount of the room that Alice can see in the
mirror varies, depending on where she is– if she's standing on the floor, she can only see the
ceiling in the mirror. – If she's on the arm chair she can see the whole
room in the mirror. – If she's on the mantelpiece, then she should be
able to see the mirror beginning to melt away.
04/18/23 31
Mirror - 2
• `touch mirror', `push mirror', `pull mirror‘– Alice shouldn't be able to touch the mirror unless
she's standing on the mantelpiece. – But if she's standing on the mantelpiece, then her
hand should go right through.
• `take mirror‘– make it `static'.
• `enter mirror‘– this will cause Alice to win the game.
04/18/23 32
Ball of WorstedObject worsted "ball of worsted“ Drawing_Room ! general if its in a tangle with name "ball" "of" "worsted" "fine" "blue" "wool", initial "A discarded ball of worsted lies on the floor here.", description [; if (self has general) "It's in a tangle. All that time you spent rolling it up, and now look at it!"; "It's a ball of fine blue wool, all rolled up in preparation for some
embroidery."; ],
04/18/23 33
Ball of Worsted before [;
Untangle:
give self ~general;
"You're as quick as can be at rolling up balls
of wool, though you say so yourself! Soon it's
neat and tidy again.";
];
04/18/23 34
Testing Alice2.inf
1. Throw queen at mirror
2. Get on chair
3. Push chair
4. Climb mantelpiece
5. Get on mantlepiece
6. Enter chair
7. Look under rug
8. Examine queen
9. Drop her
04/18/23 35
Characters - 1• State
– which is a set of values that describe how the actions of the character vary
– some aspects of character state that are handled by the Inform library
– we will have to invent some other aspects;
• Reactions– which are things the character does in response to
interaction from the player– using Inform these are typically coded in the `life',
`before', and `after' routines.
04/18/23 36
Characters - 2
• Autonomous actions– things the character does of his own accord,
without special prompting from the player.
– Using Inform, these are encoded in the `daemon' and `each_turn' routines.
04/18/23 37
Kitten States
Constant HELD_STATE = 0; ! Being held
Constant QUEEN_STATE = 1;
! Playing with the Red Queen
Constant WOOL_STATE = 2;
! Playing with the worsted
Constant CHAIR_STATE = 3;
! In the way of the chair
04/18/23 38
Changing States - 1
! If Alice takes Red Queen from a Kitten change state
! Add this code to Red Queen
after [; Take:
if (white_kitten.state == QUEEN_STATE)
white_kitten.state = CHAIR_STATE;
if (black_kitten.state == QUEEN_STATE)
black_kitten.state = CHAIR_STATE;
];
04/18/23 39
Changing States - 2
! Prevent Alice from moving the chair when holding kitten! Add this code to the chair’s before routineif (white_kitten in player || black_kitten in player)
"Not with a kitten in your arms!"; if (white_kitten.state == CHAIR_STATE) i = white_kitten;else if (black_kitten.state == CHAIR_STATE) i = black_kitten;if (i ~= 0) "You are about to start moving the chair when you
notice that ", (the) i, " is right in the way. It's a good thing you spotted it, or you would have squashed flat the poor little thing.";
04/18/23 40
Changing States - 3
! Give the ball and after routine in case Alice takes
! the ball away from the kitten
after [;
Take:
if (white_kitten.state == WOOL_STATE)
white_kitten.state = CHAIR_STATE;
if (black_kitten.state == WOOL_STATE)
black_kitten.state = CHAIR_STATE;
];
04/18/23 41
Kittens - 1
Class Kitten
has animate
with state CHAIR_STATE,
name "kitten" "kitty" "cat",
description [;
"What a beautiful kitten ", (the) self,
" is. Why, it's quite definitely your
favourite of the pair, and much
prettier than that naughty ",
(name) self.other_kitten, ".";
];
04/18/23 42
Kittens - 2
Kitten white_kitten "white kitten" Drawing_Room
with name "white",
this_kittens_turn false,
other_kitten black_kitten;
Kitten black_kitten "black kitten" Drawing_Room
with name "black",
this_kittens_turn true,
other_kitten white_kitten;
04/18/23 43
Kittens - 3
! Use a before routine to process a Take
before [; Take:
if (self.other_kitten in player)
"You can't hold two kittens at once!";
self.state = HELD_STATE;
move self to player;
"You pick up ", (the) self, ". What a beautiful
creature it is!";
],
04/18/23 44
Kittens - 4
! Use after to process the drop and transfer commands after [; Drop: self.state = CHAIR_STATE; move self to Drawing_Room; print_ret (The) self, " squirms out of your arms and scampers away.";
Transfer,PutOn,Insert: self.state = CHAIR_STATE; print (The) self, " jumps off ", (the) parent(self); move self to Drawing_Room; ", landing lightly on the floor before scampering away.";
],
04/18/23 45
Autonomous Actions
daemon [ i; give self ~general; self.this_kittens_turn = 1 - self.this_kittens_turn; if (self.this_kittens_turn || random(3) == 2) rtrue; new_line; print (The) self; switch (self.state) { HELD_STATE: switch(random(5)) { 1: " mews plaintively."; … 5: move self to Drawing_Room; self.state = CHAIR_STATE; " squirms out of your arms and scampers away."; }
04/18/23 46
Actions! To start daemons add these lines to Initialise StartDaemon(white_kitten); StartDaemon(black_kitten);
! Other actions processed by Kitten life routinelife [; Ask,Answer,Order: … Kiss: … Attack: … Give,ThrowAt: …];
04/18/23 47
Testing Alice3.inf
1. Examine chessboard
2. Examine white knight
3. Examine mirror
4. Get on mantelpiece
5. Move chair
6. Get black kitten
7. Examine black
8. look
04/18/23 48
Testing Alice3.inf
9. Move chair
10.Drop all
11.Get wool
12.Give wool to white
13.Get black
14.Move chair
15.Look under rug
16.Examine rug
04/18/23 49
Testing Alice3.inf
17.Give red queen to black
18.Move chair
19.Get on chair
20.Get on mantelpiece
21.Examine mirror
22.Enter mirror