Quantcast
Viewing all articles
Browse latest Browse all 34

Simple Game Manager

Just created a small script for helping me with the game – admittedly not the most sophisticated tool around, but it might help me to create content faster.

I can’t attach it to the blog (js files are not allowed) but I am obliged to show it, so here we go:

// Base namespace
var ben = {

};

// checks that the object is not null, and has a function with the given name
ben.hasFunction = function(obj, functionName) {
    var hasF = obj && obj[functionName] && typeof obj[functionName] === "function";
    if(!hasF) {
        console.log(obj + ' doesn\'t have \''+ functionName +'\' function');
    }
    return hasF;
};

// Orchestrates the player turns and the game updates
ben.doUpdate = function() {
    if(!ben.hasFunction(this, "update")) {
        return;
    }
    if(!ben.hasFunction(this, 'isSynchronous')) {
        return;
    }
    if(this.currentTurn >= this.maxTurns) {
        this.stop();
        return;
    }
    if(this.isSynchronous()) {
        if(!this.isReady()) {
            return;
        }
        var ndx;
        this.setReady(false);
        console.log('Processing turn '+this.getCurrentTurn()); 
        for(ndx in this.players) {
            var currentPlayer = this.players[ndx];
            if(!ben.hasFunction(currentPlayer, 'doTurn')) {
                continue;
            }
            currentPlayer.doTurn(this.context);
            this.context.currentPlayer = ndx;
            this.update(this.context);
        }
        this.increaseTurn();
        this.setReady(true);
    } else {
        this.stop();
        return;
        // TODO: Work on this when needed
    }
};

// Starts the update thread
ben.doStart = function() {
    if(!this ) {
        return;
    }
    var that = this;
    console.log('Starting');
    console.log(that);
    that._updateThread = window.setInterval(function() {that.doUpdate()}, that._updateDelay);
}

// Stops the update thread
ben.doStop = function() {
    console.log('Stopping');
    if(this._updateThread) {
        console.log('Has thread');
        window.clearInterval(this._updateThread);
        this._updateThread = null;
    }
}

// Creates the base Game object
// Params: 
//   gameName: The human readable name of the game
//   maxTurns: the number of total turns
//   playerList: an array of players
//   updateFunction: The update function to be called at an interval
//   synch: Synchronous flag. If true, the update waits for each players, otherwise the players input are processed in the regular updates
ben.Game = function(gameName, maxTurns, playerList, updateFunction, synch) {
    var game = {
        _updateDelay: 16, // ms, time between update calls
        _updateThread: null, // placeholder    
        _synchronous: synch, // Synchronous games wait for the players turn with an update
        _name: gameName, // the name of the game, for displaying
        players: playerList, // the players, incl ai
        maxTurns: maxTurns,
        currentTurn: 0,
        ready: true,
        context: {} // current game context
    };

    // to get the human readable name
    game.getName = function() {
        return game._name;
    };

    // to change the current players
    game.setPlayers = function(plList) {
        game.players = plList;
    }

    // to get the number of current players
    game.getPlayerCount = function() {
        return (players != null) ? players.length : 0;
    };

    // sets the ready flag to the given value
    game.setReady = function(rdy) {
        game.ready = rdy;
    };

    // returns the value of the ready flag
    game.isReady = function() {
        return game.ready;
    }

    // returns the value of the synchronous flag
    game.isSynchronous = function() {
        return game._synchronous;
    }    

    game.getCurrentTurn = function() {
        return game.currentTurn;
    }

    game.increaseTurn = function() {
        game.currentTurn += 1;
        return game.currentTurn;
    }

    // stores the update function
    if(updateFunction) {
        if(typeof updateFunction === "function") {
            game.update = updateFunction;
        } else {
            throw {message : "Passed updateFunction variable is not a function"};
        }
    };

    // this function is called with the update frequency
    game.doUpdate = ben.doUpdate;

    // calling this function starts the game
    game.start = ben.doStart;

    // calling this function stops the game
    game.stop = ben.doStop;

    return game;
};

Viewing all articles
Browse latest Browse all 34

Trending Articles