(function(){ var vec2, Rect, Room, sort, UidGenerator, _ if ('window' in this) { vec2 = window.vec2 Rect = window.Rect Room = window.Room sort = window.sort UidGenerator = window.UidGenerator _ = window._ } else { vec2 = require('../../models/vec2') Rect = require('../../models/rect') Room = require('../../models/room') Walls = require('./_walls') UidGenerator = require('../../util/uid') sort = require('../../util/sort') _ = require('lodash') FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20 TOP = CEILING, BOTTOM = FLOOR function sidesToString(sides){ var s = "" if (sides & FRONT) s += "front " if (sides & BACK) s += "back " if (sides & LEFT) s += "left " if (sides & RIGHT) s += "right " if (sides & TOP) s += "top " if (sides & BOTTOM) s += "bottom " return s } } var Rooms = new function(){ var base = this base.list = {} base.regions = [] base.uid = new UidGenerator(base.list) base.init = function(){ Rooms.builder.init() Rooms.clipper.init() Rooms.mover.init() } base.filter = function(f){ return _.values(base.list).filter(f) } base.add = function(room){ base.list[room.id] = room } base.add_with_rect = function(rect){ var room = new Room({ rect: rect, height: 500 }) base.add(room) return room } base.remove = function(room){ delete base.list[room.id] Rooms.rebuild() } base.removeAll = function(){ base.list = {} base.regions = [] Rooms.rebuild() } base.count = function(){ return this.values().length } base.forEach = function(f){ return base.values().forEach(f) } base.some = function(f){ return base.values().some(f) } base.map = function(f){ return base.values().map(f) } base.values = function(){ return _.values(base.list) } base.rebuild = function(walls_data){ walls_data = walls_data || Walls.serialize() Rooms.clipper.update() Rooms.builder.rebuild() Rooms.grouper.build() Walls.paint() Walls.deserialize(walls_data) app.tube("rooms-built") } base.serialize = function(){ var rooms = base.map(function(room){ return room.serialize() }) return rooms } base.deserialize = function(rooms_data, walls_data){ rooms_data.forEach(function(data){ if (! data || ! data.rect) return var rect = new Rect(data.rect.x[0], data.rect.y[0], data.rect.x[1], data.rect.y[1]) var room = new Room({ id: data.id, rect: rect, height: data.height }) base.add(room) }) Rooms.rebuild(walls_data) } base.report = function(){ var data = [] base.rooms.forEach(function(room){ data.push( room.report() ) }) return data } base.extent = function(){ var extent = new Rect ( new vec2(Infinity, -Infinity), new vec2(Infinity, -Infinity) ) base.forEach(function(room){ extent.expand(room.rect) }) return extent } base.sorted_by_position = function(){ return sort.rooms_by_position( base.values() ) } base.sorted_by_height = function(){ return sort.rooms_by_height( base.values() ) } base.sorted_by_area = function(){ return sort.rooms_by_area( base.values() ) } } if ('window' in this) { window.Rooms = Rooms } else { module.exports = Rooms } })()