Coffee disambiguation (JACL example)

From IFWiki

The key to achieving this type of disambiguation in JACL is being careful with the number of names each object is given. For example, consider the following three objects:

object ball_1: ball
object ball_2: small red ball
object ball_3: big red ball

Presuming all these objects were in the current location, if the player referred to ball, then ball_1 would be selected. This is because the JACL interpreter divides the number of names an object has by the number of names supplied to come up with a best match. Although all three objects have the name ball, ball_1 matches 100% while ball_2 and ball_3 only match 33%. If the player referred to red ball, then ball_1 would automatically be excluded, as it does not have the name red. On the other hand, both ball_2 and ball_3 have the names red ball, and both would match 66%. In this case a message displays stating that the reference was ambiguous. If the player referred to big, then ball_3 would automatically be selected as neither of the other two objects have the name big at all.

The following transcript:

Coffee disambiguation: v1.0

This pleasant living room is ever-so-lightly furnished with a coffee table. A
kitchen can be found to the north.

>examine coffee
The coffee table is a modern piece of furniture with metal legs and a square
glass top. 

>n
This test kitchen is very clean. It's so clean, it hardly has anything in it.
The living room is to the south.

There is a coffee mug here.

Sitting on the bench is a large coffee urn.

>take mug
You take the coffee mug.

>pour coffee
Using the urn, you fill the mug with hot coffee.

>drink coffee
You drink the mug of coffee. Aaah. The satisfaction.

>drink coffee
How rude! Use a mug!

>s
This pleasant living room is ever-so-lightly furnished with a coffee table. A
kitchen can be found to the north.

>examine coffee
Are you referring to:
  [1] the coffee mug
  [2] the coffee table

Type the number of the object >1

The mug has the phrase 'WORLD'S BEST EXAMPLE CODER' prominently on the outside.
The inside of the mug is empty.

Is produced by this code:

#!../bin/jacl

constant 	GAME_VERSION	1

location kitchen : test kitchen
   short		the "test kitchen"
   south		living_room

{look
print:
   This test kitchen is very clean. It's so clean, it hardly has
   anything in it. The living room is to the south.^
.
}

object mug : world's best example coder coffee mug
   short		the "coffee mug"
   long			"There is a coffee mug here."
   mass			4
   capacity		5
   has			CONTAINER

{examine
print:
   The mug has the phrase 'WORLD'S BEST EXAMPLE CODER' prominently on
   write "the outside. The inside of the mug is
.
if cup_full(parent) = mug
   write "full of coffee.^"
else
   write "empty.^"
endif
}

object coffee_urn : big large round heavy coffee urn
   short		the "coffee urn"
   long			"Sitting on the bench is a large coffee urn."
   mass			heavy
   capacity		10
   has			CONTAINER

{examine
print:
The urn is large, round, and heavy. It has to be large to hold the
endless supply of coffee inside it. Perhaps you'd like to pour some
into a mug?^
.
}

{pour 
if mug is *present
   if cup_full(parent) = mug
      write "But the mug is full!^"
      set TIME = false
   else
      write "Using the urn, you fill the mug with hot coffee.^"
      move cup_full to mug
   endif
else
   write "But you don't have a mug!^"
endif
}

{pour_on_mug
if cup_full(parent) = mug
   write "But the mug is full!^"
   set TIME = false
else
   write "Using the urn, you fill the mug with hot coffee.^"
   move cup_full to mug
endif
}

{take_all_from
write "You can't empty the urn.^"
set TIME = false
}

object coffee_supply : endless supply dark of coffee
   short		the "endless supply of coffee"
   parent		coffee_urn
   mass			5
   has			LIQUID

{examine
write "Hello, tall, dark, and endless.^"
} 

{pour
proxy "pour urn"
}

{pour_on_mug
proxy "pour urn into mug"
}

{smell
write "Hello, tall, dark, and endless.^"
}

{drink
write "How rude! Use a mug!^"
set TIME = false
}

object cup_full : cup full of coffee
   short		a "cup full of coffee"
   mass			4
   has			LIQUID
   parent		limbo

{examine
write "The coffee in the mug looks quite drinkable.^"
}

{smell
write "Smells good. A cupful of good.^"
}

{drink : taste
write "You drink the mug of coffee. Aaah. The satisfaction.^"
move cup_full to limbo
}

location living_room : living room
   short		the "living room"
   north		kitchen

{look
print:
   This pleasant living room is ever-so-lightly furnished with a
   coffee table. A kitchen can be found to the north.^
.
}

object coffee_table : modern square glass top coffee table
   short		the "coffee table"
   mass			scenery
   has			SURFACE
   capacity		20

{examine
print:
   The coffee table is a modern piece of furniture with metal legs
   and a square glass top.
.
execute +details<noun1
write ^
}

{sit_on : jump_on
write "<p>The spec says you're not allowed to.^"
set TIME = false
}

{+intro
clear
write "^^<p>Coffee disambiguation: v1.0^^"
look
}

object kryten: myself self me
 has		ANIMATE
 short		name "yourself"
 quantity	42
 parent		living_room
 player

#include "verbs.library"