!
! OKBLib - OKB's personal library of stuff
! Not intended for public release
System_file;
Attribute OwnParagraph;
Class Room
has light
with name 'room' 'wall' 'walls';
Class AutoRoom
class Room
with describe [;
if (self.description) PrintOrRun(self,description);
TreeWalk(self,AutoRoomDescribe);
print "^"; rtrue;
];
[AutoRoomDescribe obj depth iteration x;
if (obj provides describe) {
if (obj has OwnParagraph) print "^";
if (obj hasnt OwnParagraph && iteration>1) print " ";
switch (metaclass(obj.describe)) {
String: print (string) obj.describe; x=1;
Routine: x=obj.describe(depth,iteration);
Object: x=AutoRoomDescribe(obj.describe);
default: x=0;
}
give obj concealed;
if (x) rtrue;
else rfalse;
}
rfalse;
];
Class Thing ! This lets the contents of containers be printed automatically
with after [a b;
Examine: if (self hasnt supporter && (self hasnt container || TestScope(child(self)==0))) rfalse;
if (self has pluralname) b=" them."; else b=" it.";
if (children(self)<1) {print "There's nothing ";
if (self has supporter) print "on"; else print "in"; " it.";}
if (self has supporter) print "On "; else print "In "; print (the) self;
objectloop (a in self) {if (a has concealed) give a ~workflag; else give a workflag;}
WriteListFrom(child(self),ENGLISH_BIT+RECURSE_BIT+ISARE_BIT+WORKFLAG_BIT);
"."; ];
Class Decor ! Purely scenery
has scenery
with description [; if (noun hasnt pluralname) print "It's just a regular ",(name) self,". ";
else print "They're just regular ",(name) self,". "; ],
after [a;
Examine:
if (self hasnt supporter && (self hasnt container || TestScope(child(self))==0)) {
if (self.description~=self.Decor::description) rtrue; else "Nothing special.";
}
if (children(self)<1) {
print "There's nothing ";
if (self has supporter) print "on"; else print "in";
" it.";
}
if (self has supporter) print "On "; else print "In "; print (the) self;
objectloop (a in self) {
if (a has concealed) give a ~workflag; else give a workflag;
}
WriteListFrom(child(self),ENGLISH_BIT+RECURSE_BIT+ISARE_BIT+WORKFLAG_BIT);
".";
];
! TreeWalk(root, func) -- Walks the object tree, starting at (but not including) root. func may be an actual routine, or a property name. If it is a routine, func(obj,depth,iteration) is called for each obj in the tree. If it is a property, obj.func(obj,depth,iteration) is called for each obj in the tree.
! In all cases, depth is the depth of recursion -- for direct children of root it is 1, for grandchildren it is 2, etc. At any given depth, iteration is the relative "age" of obj compared to its siblings -- for the eldest child it is 1, for the second 2, etc.
[TreeWalk root func depth iteration i tempfunc;
depth=1;
for (i=child(root) : i : i=sibling(i)) {
iteration++;
if (metaclass(func)==nothing) tempfunc=i.func;
else tempfunc=func;
indirect(func, i, depth, iteration);
TreeWalk(i,func,depth);
}
depth--;
return; ];
! RandRange(min,max) -- returns a random number x such that min <= x <= max
[RandRange min max;
return random(max-min+1)+min-1;
];
! ObjName -- printing rule to get an object's internal source-code name
! Why doesn't the library already provide this?
[ObjName a;
if (a) print (object) a;
else print "nothing";
];