scenetopic.t

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

/* SceneTopic Extension, based on work by D.Smith */

/* Modifications to Scene for the SCENETOPIC EXTENSION */
modify Scene
    /* 
	 * Modified for SceneTopic Extension to notify any actor that we can talk to that this scene has ended.
	 */
    end()
    { 
        /* Carry out the inherited handling */
        inherited();
        
        /* Notify any actor that we can talk to that this scene has ended */
        notifyActors(&sceneEndTopics);
    }
    
    /*  
	 * Modified for SceneTopic Extension to notify any actor that we can talk to that this scene has started. 
	 */
    start()    
    {
        /* Carry out the inherited handling */     
        inherited();
        
         /* Notify any actor that we can talk to that this scene has started */
        notifyActors(&sceneStartTopics);
    }
    
    notifyActors(prop)
    {
        /* Set up a new vector */
        local vec = new Vector;
        
        /* 
         *   Loop through every actor in the game, adding every actor that
         *   gPlayerChar can talk to to our vector.
         */
        forEachInstance(Actor, function(a) {
            if(gPlayerChar.canTalkTo(a))
                vec.append(a);            
        });
        
        /* Remove the player char from the list of actors to notify */
        vec -= gPlayerChar;
        
        /* Sort the list in ascending order of notificationOrder */
        vec.sort(SortAsc, {a, b: a.notificationOrder - b.notificationOrder} );
        
        /* Notify each actor in the resultant list. */
        foreach(local cur in vec)
        {           
            /* 
             *   If we only want one actor to respond, stop here if the current
             *   actor's handleTopic method returns true to show that a
             *   SceneTopic was matched.
             */
            if(cur.handleTopic(prop, [self], nil) && notifySingleActor)
                break;
        }
    }
    
    /* 
     *   Flag (for use with SceneTopic extension): do we want to trigger a
     *   SceneTopic response from every actor the player char can talk to, or
     *   only the first one we find? By default we assume we want a response
     *   from only one actor. Note that the Actor notificationOrder property can
     *   be defined so that we can select which Actor this will be (the one with
     *   the lowest notificationOrder). [SCENETOPIC EXTENSION]
     */
    notifySingleActor = true
;


/* Modifications to ActorTopicDatabase for SceneTopic extension */
modify ActorTopicDatabase
    sceneStartTopics = []
    sceneEndTopics = []
;

/* 
 *   The SceneTopic class (defined in the SCENETOPIC EXTENSION) is the base
 *   class for SceneStartTopic and SceneEndTopic
 */
class SceneTopic: ActorTopicEntry
    handleTopic()
    {
        beforeResponse();
        inherited;
        afterResponse();
    }
    
    /* By default, we just dislpay a spacing paragraph break */
    beforeResponse()
    {
        "<.p>";       
    }
    
    /* By default we do nothing here, but game code can override. */
    afterResponse()
    {        
    }
    
;

/* 
 *   A SceneEndTopic is a topic entry that is triggered when any of the scenes
 *   in its matchObj property ends. [SCENETOPIC EXTENSION]
 */
class SceneEndTopic: SceneTopic
    includeInList = [&sceneEndTopics]
;


/* 
 *   A SceneStartTopic is a topic entry that is triggered when any of the scenes
 *   in its matchObj property starts. [SCENETOPIC EXTENSION]
 */
class SceneStartTopic: SceneTopic
    includeInList = [&sceneStartTopics]
;
Adv3Lite Library Reference Manual
Generated on 01/03/2024 from adv3Lite version 1.6.2