var FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20 FRONT_BACK = FRONT | BACK, LEFT_RIGHT = LEFT | RIGHT, FLOOR_CEILING = FLOOR | CEILING window.Room = (function(){ var Room = function(opt){ this.id = opt.id || clipper.rooms.length this.rect = opt.rect this.regions = [] this.walls = [] this.floor = [] this.ceiling = [] this.height = opt.height || 200 this.focused = false } Room.prototype.toString = function(){ return this.rect.toString() } Room.prototype.reset = function(){ var copy = this.rect.clone() copy.id = this.id copy.sides = FRONT | BACK | LEFT | RIGHT this.regions = [ copy ] this.intersects = [] this.constructed = false this.walls = [] this.floor = [] this.ceiling = [] } Room.prototype.bind = function(){ var base = this base.walls.forEach(function(wall){ $(wall.el).bind({ mouseover: function(){ }, mousemove: function(e){ var color = choice(window.palettes.colors) base.walls.forEach(function(wall){ $(wall.el).css("background-color", color) }) }, mousedown: function(){ } }) }) } Room.prototype.group_walls = function(){ var base = this var array_groups = {}, rect_groups = [] sort_wall_els_by_x_then_z(base.walls) base.walls.forEach(function(wall){ var w = array_groups[ wall.side ] if (w) { w.forEach(function(ww){ }) } else { array_groups[ wall.side ] = [[wall]] } }) return groups } Room.prototype.clipTo = function(r){ // for each of this rect's regions split the region if necessary var regions = this.regions var splits for (var i = 0, len = regions.length; i < len; i++) { if (regions[i] && regions[i].intersects(r)) { splits = regions[i].split(r) regions = regions.concat(splits) regions[i] = null } } this.regions = regions } Room.prototype.collides = function(x,y){ var collision = 0, wall_collision, contains_x, contains_y this.regions.forEach(function(r){ if (! r.sides) return wall_collision = 0 if ((r.sides & FRONT) && y < r.y.a) { wall_collision |= FRONT } if ((r.sides & BACK) && r.y.b < y) { wall_collision |= BACK } if ((r.sides & LEFT) && x < r.x.a) { wall_collision |= LEFT } if ((r.sides & RIGHT) && r.x.b < x) { wall_collision |= RIGHT } if (! wall_collision) return contains_y = r.y.contains(y) contains_x = r.x.contains(x) if (contains_x) { collision |= wall_collision & FRONT_BACK } else if (contains_y) { collision |= wall_collision & LEFT_RIGHT } else if (bitcount(wall_collision) > 1) { collision |= wall_collision } }) return collision } Room.prototype.collidesDisc = function(x,y,radius){ var collision = 0, wall_collision, contains_x, contains_y this.regions.forEach(function(r){ if (! r.sides) return wall_collision = 0 if ((r.sides & FRONT) && y-radius < r.y.a) { wall_collision |= FRONT } if ((r.sides & BACK) && r.y.b < y+radius) { wall_collision |= BACK } if ((r.sides & LEFT) && x-radius < r.x.a) { wall_collision |= LEFT } if ((r.sides & RIGHT) && r.x.b < x+radius) { wall_collision |= RIGHT } if (! wall_collision) return contains_x = r.x.contains(x, radius) contains_y = r.y.contains(y, radius) if (contains_x) { collision |= wall_collision & FRONT_BACK } else if (contains_y) { collision |= wall_collision & LEFT_RIGHT } else if (bitcount(wall_collision) > 1) { collision |= wall_collision } }) return collision } return Room })()