roomparts.t

documentation
#charset "us-ascii"
#include "advlite.h"

/* 
 *   roomparts.t
 *
 *   The ROOMPARTS extension is intended for use with the adv3Lite library. It
 *   adds walls and a ceiling to every Room. It also adds an OutdoorRoom class
 *   that has only ground and sky. It also allows Things to be associated with
 *   particular room parts, such as a picture hanging on a wall.
 *
 *   VERSION 1
 *.  20-Jul-13
 *
 *   Usage: include this extension after the adv3Lite library but before your
 *   own game-specific files. This will add four walls and a ceiling to every
 *   Room in your game. For outdoor rooms that have only sky and ground, use the
 *   OutdoorRoom class defined below.
 */
roomPartID: ModuleID
    name = 'Room Parts'
    byline = 'by Eric Eve'
    htmlByline = 'by Eric Eve'
    version = '1'    
;


/* 
 *   The RoomPart class is used to define room parts (walls, ceiling, sky)
 *   common to many locations. [DEFINED IN ROOMPARTS EXTENSION]
 */
class RoomPart: MultiLoc, Decoration
    initialLocationClass = Room
    
    /* 
     *   When examining a room part we list all the roomPartDescs of all the
     *   items in the room associated with this RoomPart.
     */
    examineStatus()
    {
        /* Carry out the inherited handling */
        inherited;
        
        /* 
         *   Construct a list of all the items directly in the current room for
         *   whom we're the associated roomPart.
         */
        local lst = gPlayerChar.getOutermostRoom.contents.subset(
            { o: o.roomPart == self });
        
        /* Show the roomPartDesc for every item in our list. */
        foreach(local cur in lst)
            cur.roomPartDesc;
    }
;

/* 
 * The class used for room parts that represent walls. 
 * [DEFINED IN ROOMPARTS EXTENSION]
 */
class DefaultWall: RoomPart 'wall'
    isInitiallyIn(obj) { return obj.wallObjs.indexOf(self) != nil; }
    
;

/* 
 *   Modifications to the Room class to allow for room parts. Note that the
 *   standard adv3Lite library already supplies a foor in every room defined via
 *   its floorObj property. [MODIFIED FOR ROOMPARTS EXTENSION]
 */
modify Room
    /* 
     *   The ceilingObj property defines the object to be used for this Room's
     *   ceiling. By default we use the defaultCeiling object defined below.
     *   [DEFINED IN ROOMPARTS EXTENSION]
     */
    ceilingObj = defaultCeiling
    
    /* 
     *   The wallObjs property defines the list of walls in this Room. By
     *   default we define use the four default walls. Particular rooms that
     *   don't have four walls (e.g. a length of passage) or which want to use
     *   custom wall objects can override this.
     *  [DEFINED IN ROOMPARTS EXTENSION]
     */
    wallObjs = [defaultNorthWall, defaultEastWall, defaultSouthWall,
        defaultWestWall]
;

/* 
 *  An OutdoorRoom is a room that has no walls and a sky instead of a ceiling 
 *  [DEFINED IN ROOMPARTS EXTENSION]
 */
class OutdoorRoom: Room
    ceilingObj = defaultSky
    wallObjs = []
;

/* 
 * The four default walls 
 * [DEFINED IN ROOMPARTS EXTENSION]
 */
defaultNorthWall: DefaultWall 'north +; (n)';

/* [DEFINED IN ROOMPARTS EXTENSION] */
defaultEastWall: DefaultWall 'east +; (e)';

/* [DEFINED IN ROOMPARTS EXTENSION] */
defaultSouthWall: DefaultWall 'south +; (s)';

/* [DEFINED IN ROOMPARTS EXTENSION] */
defaultWestWall: DefaultWall 'west +; (w)';

/* 
 * The class for ceiling/sky objects 
 * [DEFINED IN ROOMPARTS EXTENSION]
 */
class Ceiling: RoomPart
    isInitiallyIn(obj) { return obj.ceilingObj == self; }
;

/* 
 * The default ceiling that appears in every Room 
 * [DEFINED IN ROOMPARTS EXTENSION]
 */
defaultCeiling: Ceiling 'ceiling';

/* 
 *  The default sky that appears in every OutsideRoom 
 * [DEFINED IN ROOMPARTS EXTENSION]
 */
defaultSky: Ceiling 'sky'    
    notImportantMsg = BMsg(sky beyond reach, '{The subj cobj} {is} way beyond
        {my} reach. ')
;

/* 
 *   The Floor class is defined in the standard adv3Lite library. Here we modify
 *   it to use the ROOMPART EXTENSIONS's version of examineStatus.
 */
modify Floor
    /* [MODIFIED IN ROOMPARTS EXTENSION to use the ROOMPART EXTENSIONS's version of examineStatus] */
    examineStatus()
    {
        delegated RoomPart;
    }
;

/*  
 *   Modifications to Thing to allow things to be associated with room parts.
 *   Note that a Thing associated with a room part should be directly located in
 *   the room, not in the room part. [MODIFIED FOR ROOMPARTS EXTENSION]
 */
modify Thing
    /* 
     *   Note, the following two properties only take effect if the Thing is
     *   directly in its enclosing Room
     */
    
    /* 
     *   The room part (e.g. defaultNorthWall) with which we're notionally
     *   associated. [DEFINED IN ROOMPARTS EXTENSION]
     */
    roomPart = nil
    
    /*  
     *   The description of ourselves to be displayed when our associated
     *   roomPart is examined. [DEFINED IN ROOMPARTS EXTENSION]
     */
    roomPartDesc = nil
    
    /* 
     *   We modify actionMoveInto here so that an action that results in moving
     *   an object (e.g. taking a picture that's notionally hanging on a wall)
     *   removes the association between the object and its room part.
     *   [MODIFIED FOR ROOMPARTS EXTENSION]
     */
    actionMoveInto(dest)
    {
        /* carry out the inherited handling. */
        inherited(dest);
        
        /* If I'm moved I'm no longer associated with my original room part */
        roomPart = nil;
    }
;


Adv3Lite Library Reference Manual
Generated on 25/04/2024 from adv3Lite version 2.0