oglimmer/citybuilder

View on GitHub
server/rule_field.js

Summary

Maintainability
B
5 hrs
Test Coverage
var FieldType = require("./rule_defines.js").FieldType;
var LocalLevel = require("./rule_defines.js").LocalLevel;
var HouseType = require("./rule_defines.js").HouseType;
var HouseTypeMaxPop = require("./rule_defines.js").HouseTypeMaxPop;
var HouseTypeReverse = require("./rule_defines.js").HouseTypeReverse;
var log4js = require('log4js');
var logger = log4js.getLogger('game');


function Field(x,y,type,houseCard,localLevel) {
    this.x = x; // 0..n logical x coordiate on field 
    this.y = y; // 0..n logical y coordiate on field 
    this.type = type; // field type HOUSE, FOOD 
    this.owner = null; // player.no
    this.ownerName = null; // player.playerName
    this.attachedCard = houseCard; // a card doc which was played on this field
    this.buildState = 0; // 0:nothing build, 1:build in progress, 2: done
    this.localLevel = localLevel; // base for lower-class
    this.baseLocalLevel = this.localLevel;
}

/* Field must not have methods on its objects, since we don't reinit after loading */

Field.cor = function(field) {
    return field.x+":"+field.y;
}

Field.asFields = function(field) {
    var fields = {};
    fields[Field.cor(field)] = field;
    return fields;
}

Field.forPlayer = function(field, player) {
    if(field.owner == player.no || field.buildState != 1) {
        return field;
    } else {
        var obj = JSON.parse(JSON.stringify(field));
        obj.attachedCard = null;
        obj.type = FieldType.UNKNOWN;
        return obj;
    }    
}

Field.socialChange = function(field) {
    var oldHouseType = field.attachedCard.houseType;    
    [LocalLevel.UNDERCLASS, LocalLevel.LOWER_MIDDLE, LocalLevel.MIDDLE, LocalLevel.UPPER_MIDDLE, LocalLevel.UPPERCLASS].forEach(function(locLev) {        
        if(field.localLevel >= locLev.min && field.localLevel <= locLev.max) {            
            if(!locLev.buildings.in( HouseTypeReverse[field.attachedCard.houseType] )) {                
                var rnd = parseInt(Math.random() * locLev.buildings.length);
                field.attachedCard.houseType = HouseType[locLev.buildings[rnd]];
                field.attachedCard.housePopulation = parseInt(Math.random() * HouseTypeMaxPop[locLev.buildings[rnd]])+1
            }
        }
    });    
    if(oldHouseType != field.attachedCard.houseType) {
        logger.debug("[Field.socialChange] Changed houseType for " + field.x+","+field.y+" from "+oldHouseType+" to "+field.attachedCard.houseType);
    }
}


module.exports = Field;