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.add_wall = function(){ } 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 })()