| !-------------------------------------------------------------------------- | |
| ! SHOWOBJ.H | |
| ! David Wagner | |
| ! Version 3 | |
| ! 7-Nov-1995 | |
| ! All rights given away. | |
| ! | |
| ! Defines the routines and grammar to create a debugging SHOWOBJ command, | |
| ! which will (to the best of its ability) reconstruct the definition of an | |
| ! object as it would appear in the Inform source code. This file is | |
| ! self-contained, so one could save this as a separate file and 'Include | |
| ! "showobj"' sometime after the parser has been Include'd. | |
| ! | |
| ! This requires that the DEBUG flag be set. | |
| ! | |
| ! Restrictions: Of course, it can't print out routine definitions, so it | |
| ! simply indicates that they exist by printing "[ ... ]". Also, it has to | |
| ! make guesses about whether objects are rooms, or daemons rather than | |
| ! timers, etc. and so it may get these wrong on occasion. Also, it only | |
| ! knows about those properties and attributes defined in the library | |
| ! (version 5/12), so you will have to modify it if you want your own | |
| ! properties / attributes printed (or if you using an earlier version of | |
| ! the libraries). Also, it doesn't know whether and object was originally | |
| ! defined using a "class" keyword. | |
| ! | |
| ! For the describe, description and short_name properties, this will | |
| ! actually call the routines to see what they print out; since calling | |
| ! routines can have unwanted side effects, this feature can be turned off | |
| ! by defining a constant SHOWOBJNOCALL before including this file. | |
| ! | |
| ! By default, it prints all the properties followed by all the attributes; | |
| ! this order can be reversed by defining a constant GARETH before including | |
| ! this file. | |
| !-------------------------------------------------------------------------- | |
| #IFDEF DEBUG; | |
| ! Use up one global here. Sorry. This initialized to 0; it is set to 1 if | |
| ! the keyword 'with' has been printed and 2 if the keyword 'has' has been | |
| ! printed and 3 if both have been printed | |
| Global ShowObjFlag; | |
| !----------------------------------------------------------------------- | |
| ! PropertyType | |
| ! Determines the type of property. Slightly more informative than ZRegion | |
| ! (also ZRegion(addr) has problems if it is called when addr is obj.prop | |
| ! where the property is an array of values). | |
| ! | |
| ! Input: obj = object | |
| ! prop = property | |
| ! iprop = element number if the property is an array | |
| ! | |
| ! Returns: 0 = property doesn't exist | |
| ! 1 = property is a valid object number | |
| ! 2 = property is routine | |
| ! 3 = property is a string | |
| ! 4 = property is some other number | |
| ! | |
| ! Calls: UnsignedCompare | |
| ! | |
| ! Local: addr = address of the property in question | |
| !----------------------------------------------------------------------- | |
| [ PropertyType obj prop iprop addr; | |
| if (obj.&prop == 0) return 0; ! property doesn't exist | |
| if (obj.#prop == 1) return 4; ! one-byte long = pure number | |
| addr = (obj.&prop)-->iprop; | |
| if (addr == NULL) return 0; | |
| if (addr == 0) return 4; | |
| if (addr >= 1 && addr <= top_object) return 1; | |
| if (UnsignedCompare(addr, #strings_offset)>=0) return 3; | |
| if (UnsignedCompare(addr, #code_offset)>=0) return 2; | |
| return 4; | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! PrintObjectProperty | |
| ! Prints one property for the noun object. | |
| ! Checks to see if the property exists first. | |
| ! Prints 'with' before printing the first property. | |
| ! | |
| ! Input: prop - the property to print | |
| ! propstring - the name of the property | |
| ! | |
| ! Called by: ShowObjSub | |
| ! | |
| ! Calls: PropertyType, RunRoutines | |
| ! | |
| ! Local: a - type of property (returned by PropertyType()) | |
| ! nprop - size of the property | |
| ! iprop - loop counter | |
| ! addr - number or address of the string / routine | |
| !----------------------------------------------------------------------- | |
| [ PrintObjectProperty prop propstring a nprop iprop addr itemp; | |
| ! Does the property exist at all? | |
| if (noun.&prop == 0) rfalse; | |
| if (noun. | |
| ! The property exists, so print its name (and "with" if it is the | |
| ! first) | |
| if ((ShowObjFlag & 1) == 0) { | |
| print "^ with "; | |
| ShowObjFlag = ShowObjFlag + 1; | |
| } | |
| else | |
| print ",^ "; | |
| print (string) propstring, " "; | |
| ! If the property is only one byte, it's just a number | |
| if (noun. | |
| ! Otherwise, loop over each word of the property | |
| nprop = noun. | |
| for (iprop=0: iprop<nprop: iprop++) { | |
| if (iprop ~= 0) print " "; | |
| ! Get the address of the property and its type | |
| addr = (noun.&prop)-->iprop; | |
| a = PropertyType(noun,prop,iprop); | |
| if (a == 0) jump ENDLOOP; | |
| ! Handle the name property special | |
| if (prop == name) { | |
| print "~", (address) addr, "~"; | |
| jump ENDLOOP | |
| } | |
| ! For found_in, we want to print the names of the room | |
| if (prop == found_in && a == 1) { | |
| PrintShortName(addr); | |
| jump ENDLOOP; | |
| } | |
| ! Some properties must always be routines: | |
| if (prop == before or after or life || | |
| prop == react_before or react_after or orders || | |
| prop == grammar or daemon) { | |
| print "[ ... ]"; | |
| jump ENDLOOP; | |
| } | |
| ! Call the describe, description and short name routines to see | |
| ! what they say about the object; since routines can have | |
| ! side-effects, this can be compiled with SHOWOBJNOCALL defined to | |
| ! prevent this from happening. | |
| #IFNDEF SHOWOBJNOCALL; | |
| if ( prop == describe || | |
| (prop == description && a == 2) || | |
| (prop == short_name && a == 2)) { | |
| self = noun; | |
| print "[ ~"; | |
| itemp=indirect(addr); | |
| print "~ ]"; | |
| jump ENDLOOP; | |
| } | |
| #ENDIF; | |
| #IFDEF SHOWOBJNOCALL; | |
| itemp = 0; | |
| #ENDIF; | |
| ! Handle door_dir property specially | |
| if (prop == door_dir && a == 1) { | |
| if (noun.door_dir == n_to) print "n_to"; | |
| if (noun.door_dir == ne_to) print "ne_to"; | |
| if (noun.door_dir == e_to) print "e_to"; | |
| if (noun.door_dir == se_to) print "se_to"; | |
| if (noun.door_dir == s_to) print "s_to"; | |
| if (noun.door_dir == sw_to) print "sw_to"; | |
| if (noun.door_dir == w_to) print "w_to"; | |
| if (noun.door_dir == nw_to) print "nw_to"; | |
| if (noun.door_dir == u_to) print "u_to"; | |
| if (noun.door_dir == d_to) print "d_to"; | |
| if (noun.door_dir == in_to) print "in_to"; | |
| if (noun.door_dir == out_to) print "out_to"; | |
| jump ENDLOOP; | |
| } | |
| ! All other cases | |
| if (a == 1 || a == 4) print addr; | |
| if (a == 2) print "[ ... ]"; | |
| if (a == 3) { print "~", (string) addr, "~"; } | |
| .ENDLOOP | |
| } | |
| rtrue; | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! PrintRoomProperty | |
| ! Prints one property for the noun object - assumes that noun is a room and | |
| ! prop is a direction; prints the name of the room that lies in that | |
| ! direction | |
| ! | |
| ! Input: prop - the property to print (must be a direction) | |
| ! propstring - the name of the property | |
| ! | |
| ! Called by: ShowObjSub | |
| ! | |
| ! Calls: ZRegion, PrintShortName | |
| ! | |
| ! Local: a - type of property (string or routine) | |
| !----------------------------------------------------------------------- | |
| [ PrintRoomProperty prop propstring a; | |
| if (noun.prop == NULL) rfalse; | |
| a = ZRegion(noun.prop); | |
| if (a == 0) rfalse; | |
| if ((ShowObjFlag & 1) == 0) { | |
| print "^ with "; | |
| ShowObjFlag = ShowObjFlag + 1; | |
| } | |
| else | |
| print ",^ "; | |
| print (string) propstring, " "; | |
| if (a == 1) PrintShortName(noun.prop); | |
| if (a == 2) print "[ ... ]"; | |
| if (a == 3) { print "~", (string) noun.prop, "~"; } | |
| rtrue; | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! PrintObjectAttribute | |
| ! Prints one attribute for the noun object. | |
| ! The caller has already checked that the attribute is set | |
| ! | |
| ! Input: attr - attribute to test for | |
| ! text - name of the attribute | |
| ! | |
| ! Called by: ShowObjAttributes | |
| !----------------------------------------------------------------------- | |
| [ PrintObjectAttribute attr text; | |
| if (noun hasnt attr) rfalse; | |
| if ((ShowObjFlag & 2) == 0) { | |
| if ((ShowObjFlag & 1) == 1) print ","; | |
| print "^ has "; | |
| ShowObjFlag = ShowObjFlag + 2; | |
| } | |
| print " ", (string) text; | |
| rtrue; | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! ShowObjProperties | |
| ! Prints the properties of an object | |
| ! | |
| ! Called by: ShowObjSub | |
| ! | |
| ! Calls: PrintObjectProperty, PrintRoomProperty, | |
| !----------------------------------------------------------------------- | |
| [ ShowObjProperties; | |
| PrintObjectProperty(name,"name"); | |
| PrintObjectProperty(article,"article"); | |
| PrintObjectProperty(short_name,"short_name"); | |
| PrintObjectProperty(parse_name,"parse_name"); | |
| ! Since when_open == when_on == initial, guess which is meant | |
| if (noun has switchable || noun has on) | |
| PrintObjectProperty(when_on,"when_on"); | |
| else { | |
| if (noun has open || noun has openable) | |
| PrintObjectProperty(when_open,"when_open"); | |
| else | |
| PrintObjectProperty(initial,"initial"); | |
| } | |
| PrintObjectProperty(description,"description"); | |
| PrintObjectProperty(describe,"describe"); | |
| ! Make the assumption that if the object isn't contained in something | |
| ! (or doesn't have a found_in property) then it is a room. This won't | |
| ! always be correct, though. PrintRoomProperty prints the directions | |
| if (parent(noun) == 0 && noun hasnt moved && noun.&found_in == 0) { | |
| PrintObjectProperty(cant_go,"cant_go"); | |
| PrintRoomProperty(n_to,"n_to"); | |
| PrintRoomProperty(ne_to,"ne_to"); | |
| PrintRoomProperty(e_to,"e_to"); | |
| PrintRoomProperty(se_to,"se_to"); | |
| PrintRoomProperty(s_to,"s_to"); | |
| PrintRoomProperty(sw_to,"sw_to"); | |
| PrintRoomProperty(w_to,"w_to"); | |
| PrintRoomProperty(nw_to,"nw_to"); | |
| PrintRoomProperty(u_to,"u_to"); | |
| PrintRoomProperty(d_to,"d_to"); | |
| PrintRoomProperty(in_to,"in_to"); | |
| PrintRoomProperty(out_to,"out_to"); | |
| } | |
| else { | |
| PrintObjectProperty(door_to,"door_to"); | |
| ! Since s_to == when_off == when_closed, guess which is meant | |
| if (noun has switchable || noun has on) | |
| PrintObjectProperty(when_off,"when_off"); | |
| else | |
| PrintObjectProperty(when_closed,"when_closed"); | |
| PrintObjectProperty(with_key,"with_key"); | |
| PrintObjectProperty(door_dir,"door_dir"); | |
| PrintObjectProperty(add_to_scope,"add_to_scope"); | |
| PrintObjectProperty(invent,"invent"); | |
| PrintObjectProperty(plural,"plural"); | |
| PrintObjectProperty(list_together,"list_together"); | |
| PrintObjectProperty(react_before,"react_before"); | |
| PrintObjectProperty(react_after,"react_after"); | |
| PrintObjectProperty(grammar,"grammar"); | |
| PrintObjectProperty(orders,"orders"); | |
| } | |
| PrintObjectProperty(before,"before"); | |
| PrintObjectProperty(after,"after"); | |
| PrintObjectProperty(life,"life"); | |
| PrintObjectProperty(number,"number"); | |
| PrintObjectProperty(found_in,"found_in"); | |
| PrintObjectProperty(capacity,"capacity"); | |
| ! Check to see if the time_left property exists to distinguish between | |
| ! daemons and timers | |
| if (noun.&time_left ~= 0) | |
| PrintObjectProperty(time_out,"time_out"); | |
| else | |
| PrintObjectProperty(daemon,"daemon"); | |
| PrintObjectProperty(time_left,"time_left"); | |
| PrintObjectProperty(each_turn,"each_turn"); | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! ShowObjAttributes | |
| ! Prints all the attributes of an object | |
| ! | |
| ! Called by: ShowObjSub | |
| ! | |
| ! Calls: PrintObjectAttribute | |
| !----------------------------------------------------------------------- | |
| [ ShowObjAttributes; | |
| PrintObjectAttribute(animate,"animate"); | |
| PrintObjectAttribute(clothing,"clothing"); | |
| PrintObjectAttribute(concealed,"concealed"); | |
| PrintObjectAttribute(container,"container"); | |
| PrintObjectAttribute(door,"door"); | |
| PrintObjectAttribute(edible,"edible"); | |
| PrintObjectAttribute(enterable,"enterable"); | |
| PrintObjectAttribute(absent,"female/absent"); | |
| PrintObjectAttribute(general,"general"); | |
| PrintObjectAttribute(light,"light"); | |
| PrintObjectAttribute(lockable,"lockable"); | |
| PrintObjectAttribute(locked,"locked"); | |
| PrintObjectAttribute(moved,"moved"); | |
| PrintObjectAttribute(on,"on"); | |
| PrintObjectAttribute(open,"open"); | |
| PrintObjectAttribute(openable,"openable"); | |
| PrintObjectAttribute(proper,"proper"); | |
| PrintObjectAttribute(scenery,"scenery"); | |
| PrintObjectAttribute(scored,"scored"); | |
| PrintObjectAttribute(static,"static"); | |
| PrintObjectAttribute(supporter,"supporter"); | |
| PrintObjectAttribute(switchable,"switchable"); | |
| PrintObjectAttribute(talkable,"talkable"); | |
| PrintObjectAttribute(transparent,"transparent"); | |
| PrintObjectAttribute(visited,"visited"); | |
| PrintObjectAttribute(workflag,"workflag"); | |
| PrintObjectAttribute(worn,"worn"); | |
| ]; | |
| !----------------------------------------------------------------------- | |
| ! ShowObjSub | |
| ! Provides the SHOWOBJ verb to print all properties and attributes of | |
| ! the noun object | |
| ! | |
| ! Calls: ShowObjProperties ShowObjAttributes | |
| ! | |
| !----------------------------------------------------------------------- | |
| [ ShowObjSub; | |
| if (noun == 0) noun = inp1; | |
| if (noun <= 0 || noun > top_object) rfalse; | |
| ShowObjFlag = 0; | |
| ! Print the header - a rare case where we actually want to use | |
| ! "print object" | |
| print "Object ",noun," ~", object noun, "~"; | |
| ! Print everything | |
| #IFNDEF GARETH; | |
| ShowObjProperties(); | |
| ShowObjAttributes(); | |
| #IFNOT; | |
| ShowObjAttributes(); | |
| ShowObjProperties(); | |
| #ENDIF; | |
| print ";^"; | |
| ]; | |
| ! Define the verb SHOWOBJ here | |
| Verb meta "showobj" | |
| * noun -> ShowObj | |
| * number -> ShowObj; | |
| #ENDIF; | |
Xet Storage Details
- Size:
- 14.3 kB
- Xet hash:
- 7058d4592285ee0915e7c6ada4f46dc0e81e9ad2c2122c660e226ba1e302a13c
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.