// Starting point for an adventure language utility library /* Default nil procedure */ proc NilProc(){} /* A thing is an object or a location */ class thing; var Everything = thing(nil); class thing { public var obj_loc, obj_conts = {}; /* Tree of objects */ public proc insert( obj ) { obj_conts = obj_conts ## { obj }; } public proc create( loc ) { /* Insert into location (if not AllObjs) */ if( !loc ) { loc = Everything; } obj_loc = loc; if( loc ) { loc.insert( self ); } } } /* This is a non-location thing */ class object(thing) { public var noun, /* The one-word noun describing this thing */ adjecs = {}; /* Modifiers to this thing */ public var name; operator {} () // Completion operator { var i, n; n = adjecs.length(); name = ""; for( i = 0; i < n; i += 1 ) { name = name ## adjecs[i].name ## " "; } name = name ## noun; } /* Inherit create routine */ public var action = NilProc; /* No default action */ } /* This is a location thing */ class location(thing) { public proc create() { /* Pass nil to the parent */ (parent.create)( nil ); } public var ldesc = NilProc; public var sdesc = NilProc; public var action = NilProc; } class adjective { public var name; } adjective blue { name = "blue" } adjective big { name = "big" } location big_room { ldesc = proc() { "You are in a big room. You see no exits. It's\n", "pretty boring, really.\n"; } sdesc = proc() { "Big Room\n"; } } object blue_ball(big_room) { noun = "ball" adjecs = { big, blue } } proc main() { big_room.sdesc(); big_room.ldesc(); "\"", blue_ball.name, "\"\n"; say( blue_ball.obj_loc.name, "\n" ); }