scene.t

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


/*
 *   ****************************************************************************
 *    scene.t 
 *    This module forms an optional part of the adv3Lite library 
 *    (c) 2012-13 Eric Eve
 */

/* 
 *   The sceneManager object is used to control the scene-switching and
 *   execution mechanism.
 */
sceneManager: InitObject, Event
    execute()
    {
                
        /* 
         *   Set up a new Schedulable in the game to run our doScene method each
         *   turn
         */
       
        eventManager.schedulableList += self;
        
        /* 
         *   Run the executeEvent() method for the first time to set up any
         *   scenes that should be active at the start of play.
         */
//        executeEvent();
    }
    
    eventOrder = 200
    
    
    
    /* The executeEvent() method is run each turn to drive the Scenes mechanism */
    executeEvent()
    {
        /* Go through each Scene defined in the game in turn. */
        for(local scene = firstObj(Scene); scene != nil ; scene = nextObj(scene,
            Scene))
            
        {
            /* 
             *   If the scene's startsWhen condition is true and the scene is
             *   not already happening, then provided it's a recurring scene or
             *   it's never been started before, start the scene.
             */
            if(scene.startsWhen && !scene.isHappening 
               && (scene.recurring || scene.startedAt == nil))
                scene.start();
            
            /*  
             *   If the scene is happening and its endsWhen property is non-nil,
             *   then record the value of its endsWhen property in its howEnded
             *   property and end the scene.
             */
            if(scene.isHappening && (scene.howEnded = scene.endsWhen) != nil)
                scene.end();
            
            /* If the scene is happening, call its eachTurn() method */
            if(scene.isHappening)
                scene.eachTurn();
        }        
    }  
    
    execBeforeMe = [adv3LibInit]
    
    /* Run the beforeAction method on every currently active Scene */
    notifyBefore()
    {
        forEachInstance(Scene, function(scene) 
        {
            if(scene.isHappening)
                scene.beforeAction(); 
        });
    }

    
    notifyAfter()
    {
         forEachInstance(Scene, function(scene) 
        {
            if(scene.isHappening)
                scene.afterAction(); 
        });
    }
;


/* 
 *   A Scene is an object that represents a slice of time that starts and ends
 *   according to specified conditions, and which can define what happens when
 *   it starts and ends and also what happens each turn when it is happening.
 */
class Scene: object
    
    /* 
     *   An expression or method that evaluates to true when you want the scene
     *   to start
     */
    startsWhen = nil
    
    /*  
     *   an expression or method that evaluates to something other than nil when
     *   you want the scene to end
     */
    endsWhen = nil
    
    /* 
     *   Normally a scene will only occur once. Set recurring to true if you
     *   want the scene to start again every time its startsWhen condition is
     *   true.
     */
    recurring = nil
    
    /* 
     *   Is this scene currently taking place? (Game code should treat this as
     *   read-only)
     */
    isHappening = nil
    
    /* The turn this scene started at */
    startedAt = nil
    
    /* The turn this scene ended at */
    endedAt = nil
    
    /* 
     *   The method executed when this Scene starts. Game code should normally
     *   override whenStarting() rather than this method.
     */
    start()
    {
        /* Note that this Scene is now happening */
        isHappening = true;
        
        /* Note the turn on which this Scene started */
        startedAt = libGlobal.totalTurns;
        
        /* 
         *   Execute our whenStarting() method to carry out the particular
         *   effects of this scene starting.
         */
        whenStarting();
    }
    
    /* 
     *   The method executed when this Scene ends. Game code should normally
     *   override whenStarting() rather than this method.
     */    
    end()
    {  
        /* 
         *   Execute our whenEnding method to carry out any particular effects
         *   of this scene coming to an end.
         */
        whenEnding();
        
        /* Note that this scene is no longer happening. */
        isHappening = nil;
        
        /* Note the turn on which this scene ended. */
        endedAt = libGlobal.totalTurns;       
        
        /* 
         *   Increment the counter of the number of times this scene has
         *   happened.
         */
        timesHappened++ ;        
    }
    
    /* Routine to execute when this scene starts */
    whenStarting() {}
    
    /* Routine to execute when this scene ends */
    whenEnding() {}
    
    /* Routine to execute every turn this scene is in progress. */
    eachTurn() {}
    
    /* Flag to show whether this scene has ever happened. */
    hasHappened = (endedAt != nil)
    
    /* The numbter of times this scene has happened. */
    timesHappened = 0
    
    /*  A user defined flag showing how the scene ended */
    howEnded = nil    
    
    /* 
     *   This method is called on every active Scene just before an action is
     *   about to take place. By default we do nothing here.
     */
    beforeAction() { }
    
    /* 
     *   This method is called on every active Scene just after an action has
     *   taken place. By default we do nothing here.
     */
    afterAction() { }
    
    /* 
     *   The number of turms this Scene has been active. Is this Scene is not happening, return -1.
     */
    turnsActive = (isHappening ? startedAt - gTurns : -1)
;

Adv3Lite Library Reference Manual
Generated on 03/07/2024 from adv3Lite version 2.1