window.room = (function(){ var room = function(opt){ this.id = opt.id || clipper.rooms.length this.rect = opt.rect this.regions = [] this.height = opt.height || 200 this.focused = false this.$walls = $([]) this.$floor = $([]) this.$ceiling = $([]) } 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(){ this.$walls.bind({ mouseover: function(){ }, mousemove: function(e){ }, mousedown: function(){ $(this).css("background-color", choice(window.palettes.colors)) } }) } 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 })()