| //////////////////////////////////////////////////////////////////////// | |
| // | |
| // SimpleSense.t | |
| // Version 1.0 | |
| // | |
| // Provides a simplified method of sense-passing that is compatible | |
| // with ADV.T/STD.T. Simply #include this module after ADV.T/STD.T. | |
| // Next, connect locations using obstacle class objects. These objects | |
| // should be given a passesSense() method that returns either true or | |
| // nil indicating whether the obstacle passes sensing to its doordest. | |
| // | |
| // Copyright (c) 2000 Kevin Forchione. All rights reserved. | |
| // Based on ADV.T (c) and STD.T (c) Michael Roberts. | |
| // | |
| // This file is a library extension for ADV.T and | |
| // STD.T and requires TADS 2.2.6 or later. | |
| // | |
| //////////////////////////////////////////////////////////////////////// | |
| #ifndef _SIMPLE_SENSE_T_ | |
| #define _SIMPLE_SENSE_T_ | |
| #pragma C+ | |
| class SimpleSense: object | |
| /* | |
| * canSenseObj( vantage, obj ) | |
| * | |
| * Returns true or nil depending upon whether the obj is found in | |
| * the scope list. | |
| */ | |
| canSenseObj( vantage, obj ) = { | |
| return ( find( self.scope( vantage ), obj ) != nil ); | |
| } | |
| /* | |
| * scope( vantage ) | |
| * | |
| * Builds a scope list using the scopeList() method for the | |
| * vantage's location and each connected location. It then appends | |
| * the floatingList. | |
| */ | |
| scope( vantage ) = { | |
| local ret, objList, i, len; | |
| objList = ret = self.scopeList( vantage ); | |
| len = length( objList ); | |
| for (i = 1; i <= len; i++) { | |
| if ( isclass( objList[i], obstacle ) | |
| && objList[i].passesSense( self ) ) | |
| { | |
| if ( objList[i].doordest ) { | |
| local oth = objList[i].otherside; | |
| if ( oth == nil ) | |
| oth = []; | |
| else oth = [ oth ]; | |
| /* | |
| * Add the scope list produced from the obstacle's | |
| * doordest, removing the obstacle's otherside! | |
| */ | |
| ret += self.scopeList( objList[i].doordest ) - oth; | |
| } | |
| } | |
| } | |
| /* Append the global.floatingList to the scope */ | |
| return ret + global.floatingList; | |
| } | |
| /* | |
| * scopeList( vantage ) | |
| * | |
| * This method is a variation of ADV.T's validDoList() and takes | |
| * advantage of the ADV.T library's visibleList() function to | |
| * recurse down the object tree. | |
| */ | |
| scopeList( vantage ) = { | |
| local ret, loc; | |
| /* | |
| * find the top level location (bubble-up) to begin the filter- | |
| * down process. | |
| */ | |
| loc = vantage; | |
| while ( loc.location ) | |
| loc = loc.location; | |
| ret = visibleList( vantage, vantage ) | |
| + visibleList( loc, vantage ); | |
| return ret; | |
| } | |
| ; | |
| visibleSense: SimpleSense | |
| ; | |
| reachableSense: SimpleSense | |
| /* | |
| * scopeList( vantage ) | |
| * | |
| * This method is a variation of ADV.T's validDoList() and takes | |
| * advantage of the ADV.T library's reachableList() function to | |
| * recurse down the object tree. | |
| */ | |
| scopeList( vantage ) = { | |
| local ret, loc; | |
| /* | |
| * find the top level location (bubble-up) to begin the filter- | |
| * down process. | |
| */ | |
| loc = vantage; | |
| while ( loc.location ) | |
| loc = loc.location; | |
| ret = reachableList( vantage ) | |
| + reachableList( loc ); | |
| return ret; | |
| } | |
| ; | |
| modify thing | |
| /* | |
| * Replaced to use the visibleSense.canSenseObj() | |
| * This method is required by the parser. | |
| */ | |
| isVisible(vantage) = { | |
| return visibleSense.canSenseObj( vantage, self ); | |
| } | |
| /* | |
| * Replaced to use the reachableSense.canSenseObj() | |
| * This method is not required by the parser, but provided for | |
| * completeness. | |
| */ | |
| isReachable( vantage ) = { | |
| return reachableSense.canSenseObj( vantage, self ); | |
| } | |
| /* | |
| * Replaced validActor to use reachableSense.canSenseObj() and | |
| * allows the player object to communicate to actors in sense- | |
| * connected locations. | |
| */ | |
| sense = reachableSense | |
| validActor = { | |
| if ( self.sense.canSenseObj( parserGetMe(), self ) ) | |
| return true; | |
| pass validActor; | |
| } | |
| ; | |
| /* | |
| * Provide obstacle classs with passesSense() method, which is used to | |
| * determine if this particular obstacle passes sight / touch to its | |
| * doordest. | |
| * | |
| * Connections are made simply by placing obstacle class objects in | |
| * any room and providing them with a passesSense() method that | |
| * returns either true or nil. This can be conditional upon the | |
| * state of the obstacle as well as upon the particular SimpleSense | |
| * class object passed as an argument. | |
| * | |
| * For example, doors and windows can allow sense-passing when open by | |
| * giving them a passesSense( sense ) = (self.isopen) attribute. | |
| */ | |
| modify obstacle | |
| passesSense( sense ) = { return nil; } | |
| ; | |
| modify deepverb | |
| /* | |
| * Replaced to use visibleSense.scope(). This method is called by | |
| * the parser to provide a list of objects to intersect with the | |
| * list produced by the dictionary match in order to limit the size | |
| * of reasonable choices for object resolution. | |
| */ | |
| validDoList(actor, prep, iobj) = { | |
| local ret = visibleSense.scope( actor ); | |
| /* | |
| * If the scope list is an empty list we return nil, telling | |
| * the parser to use the dictionary match-list for | |
| * disambiguation purposes. | |
| */ | |
| if ( length( ret ) == 0 ) | |
| return nil; | |
| else return ret; | |
| } | |
| /* | |
| * Replaced to use reachableSense.canSenseObj() using reachability. | |
| * This method is called by the parser in order to provide a model | |
| * world validation hook for the library for the direct object. | |
| */ | |
| validDo(actor, obj, seqno) = { | |
| return reachableSense.canSenseObj( actor, obj ); | |
| } | |
| /* | |
| * Replaced to use scope using reachability | |
| * This method is called by the parser in order to provide a model | |
| * world validation hook for the library for the indirect object. | |
| */ | |
| validIo(actor, obj, seqno) = { | |
| return reachableSense.canSenseObj( actor, obj ); | |
| } | |
| ; | |
| #pragma C- | |
| #endif /* SIMPLE_SENSE_T_ */ | |
Xet Storage Details
- Size:
- 6.02 kB
- Xet hash:
- 63a7fe3834c8872efb4f380131732f2f1beb5a47ab3059d690790d506f51a8e2
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.