6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

49
06/20/22 1 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.

Page 1: 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

Page 2: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

04/18/23 2

Alice: Inform Tutorial Part 1Gareth Rees

Page 3: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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)

Page 4: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 5: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 6: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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";

Page 7: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

Page 8: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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...^^";

];

Page 9: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 10: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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).

Page 11: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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).

Page 12: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 13: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 14: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 15: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 16: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 17: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 18: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 19: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

Page 20: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

Page 21: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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'.

Page 22: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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!).

Page 23: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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!";

Page 24: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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."; } ];

Page 25: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 26: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.",

Page 27: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

];

Page 28: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 29: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 30: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 31: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 32: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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."; ],

Page 33: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

];

Page 34: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 35: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 36: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.

Page 37: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 38: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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;

];

Page 39: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

Page 40: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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;

];

Page 41: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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, ".";

];

Page 42: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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;

Page 43: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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!";

],

Page 44: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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.";

],

Page 45: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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."; }

Page 46: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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: …];

Page 47: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 48: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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

Page 49: 6/28/20151 Inform Game Engine CIS 577 Bruce R. Maxim UM-Dearborn.

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