!--------------------------------------------------------------------------
! Example demonstrating "property_list", an exciting new feature in Library
! release 5/9.
! 
! Graham Nelson, 2/95
!--------------------------------------------------------------------------

Constant Story "LIST PROPERTY";
Constant Headline "^An Interactive Example^Copyright (c) 1995 by Graham \
    Nelson.^";
Constant MAX_CARRIED 8;

Include "parser";

Object  travel_bag "travel bag"
 has    container openable open
 with   name "travel" "bag";

Constant SACK_OBJECT travel_bag;

Include "verblib";
Include "grammar";

[ Initialise;
    location = Lost_Property;
    move travel_bag to player;
    print "^^^^^Fancy inspecting a miscellany?  Go on, you know you \
        do...^^";
];

Object  Lost_Property "Lost Property Office"
 has    light
 with   description "A dusty, echoing room with a green baize table.";

Nearby  table "green baize table"
 has    scenery supporter
 with   name "green" "baize" "table";

Class   plastic_cutlery
 with   name "plastic" "cutlery", article "a plastic",
        list_together [;
            if (inventory_stage ~= 1) rfalse;
            if (c_style & NOARTICLE_BIT == 0) c_style=c_style+NOARTICLE_BIT;
            if (c_style & ENGLISH_BIT == 0)   c_style=c_style+ENGLISH_BIT;
            if (c_style & NEWLINE_BIT ~= 0)   c_style=c_style-NEWLINE_BIT;
            if (c_style & INDENT_BIT ~= 0)    c_style=c_style-INDENT_BIT;
            print "a plastic ";
        ];
Nearby  fork  "fork"  class plastic_cutlery with name "fork";
Nearby  knife "knife" class plastic_cutlery with name "knife";
Nearby  spook "spoon" class plastic_cutlery with name "spoon";

Class   hat_class has clothing with list_together "hats", name "hat" "hats";
Nearby  hat1 "fez" class hat_class with name "fez";
Nearby  hat2 "Panama" class hat_class with name "panama";
Nearby  hat3 "sombrero" class hat_class with name "sombrero";

Attribute is_letter;
Class   letter
 has    is_letter
 with   list_together [;
            if (inventory_stage==1) {
                print "the letters ";
                c_style = c_style | (ENGLISH_BIT + NOARTICLE_BIT);
                if (c_style & NEWLINE_BIT ~= 0) c_style = c_style-NEWLINE_BIT;
                if (c_style & INDENT_BIT ~= 0)  c_style = c_style-INDENT_BIT;
            }
            else
                print " from a Scrabble set";
        ],
        short_name [;
            if (listing_together has is_letter) rfalse;
            print "letter ", object self, " from a Scrabble set";
            rtrue;
        ],
        article "the";
Nearby  s1 "X" class letter with name "x";
Nearby  s2 "Y" class letter with name "y";
Nearby  s3 "Z" class letter with name "z";
Nearby  s4 "P" class letter with name "p";
Nearby  s5 "Q" class letter with name "q";
Nearby  s6 "R" class letter with name "r";

Nearby  cake "defrosting Black Forest gateau"
 with   name "black" "forest" "gateau" "cake",
 has    edible;

Nearby  punch "Punch magazine"
 has    proper
 with   name "punch" "magazine",
        description "Five years out of date by the cover, a hundred by \
            the contents.",
        list_together 1;

Nearby  spectator "issue of the Spectator"
 with   name "spectator" "issue" "magazine", article "a recent",
        description "Up to date by the cover, a nightmare view of the \
            future within.",
        list_together 1;

Nearby  die "die"
  with  name "die" "dice",
        after [; 
         Drop: print "It comes up ", random(6); "!"; 
        ];

Attribute is_coin;
Class   coin_class
 has    is_coin
 with   name "coin",
        description "A round unstamped disc, presumably local currency.",
        parse_name [ i j w;
            if (parser_action==##TheSame) {
                if ((parser_one.&name)-->0 == (parser_two.&name)-->0)
                    return -1;
                return -2;
            }
            w = (self.&name)-->0;
            for (: : i++) {
                j = NextWord();
                if (j == 'coins') parser_action = ##PluralFound;
                else if (j ~= 'coin' or w) return i;
            }
        ],
        list_together "coins",
        plural [;
            print_addr (self.&name)-->0;
            if (listing_together hasnt is_coin) print " coins";
        ],
        short_name [;
            if (listing_together has is_coin) {
                print_addr (self.&name)-->0; 
                rtrue; 
            }
        ],
        article [;
            if (listing_together has is_coin) print "one"; 
            else print "a";
        ];
Class   gold_coin_class   class coin_class with name "gold";
Class   silver_coin_class class coin_class with name "silver";
Class   bronze_coin_class class coin_class with name "bronze";
Nearby  coin1 "silver coin" class silver_coin_class;
Nearby  coin2 "silver coin" class silver_coin_class;
Nearby  coin3 "silver coin" class silver_coin_class;
Nearby  coin4 "silver coin" class silver_coin_class;
Nearby  coin5 "bronze coin" class bronze_coin_class;
Nearby  coin6 "gold coin"   class gold_coin_class;
Nearby  coin7 "gold coin"   class gold_coin_class;
Nearby  coin8 "gold coin"   class gold_coin_class;

End;