var Maze = function(game, options) { this.id = 'maze_'+Math.random()+'_'+Math.random(); this.enabled_cells = {}; var perso = game.focus_perso; this.ennemys=[]; this.getObstacles = function() { var obstacles = [this.doors.walls]; for(var i in this.doors.closed_doors) { obstacles.push(this.doors.closed_doors[i]); } return obstacles; }; this.getCollisionCallbacks = function() { var self=this; if(perso.current_cell!==null) { var cbs=[]; var cell = this.doors.cells[perso.current_cell]; var params = cell.params; var doors = this.doors.near_doors(params.x, params.z); cell.separation_lines.forEach(function(line) { if(line.enter_leave_door && !line.outside_door) { cbs.push(line); } }); cbs = cbs.concat(cell.keys); doors.forEach(function(door) { var door_x = door[0]; var door_z = door[1]; var near_cell = self.doors.cells[door_x*self.doors.num_items_line+door_z]; cbs=cbs.concat(near_cell.separation_lines) }); return cbs; } else { return []; } }; this.getOutsideCollisionCallbacks = function() { return this.doors.outside_separators; }; this.callCollisionCallbacks = function(perso,collisions) { if(collisions.length===0) { return; } var self=this; var cellids = []; var keyids = []; var mazeaction = ''; collisions.forEach(function (obj) { if(obj.callback_data.type=='change_cell') { if(cellids.indexOf(obj.callback_data.cellid)===-1) { if(obj.callback_data.mazeaction) { mazeaction= obj.callback_data.mazeaction; } cellids.push(obj.callback_data.cellid); } } else if(obj.callback_data.type=='key') { obj.callback_data.callback_function(); } }); var leaving = perso.in_cells.filter(function(x) { return cellids.indexOf(x)===-1; }); var adding = cellids.filter(function(x) { return perso.in_cells.indexOf(x)===-1; }); if(adding.length>0 || leaving.length>0) { perso.in_cells = cellids; if(leaving.length>0) { leaving.forEach(function(cellid) { console.log('leaving ',cellid); }); } if(adding.length>0) { adding.forEach(function(cellid) { if(cellid!='outside') { self.changeCell(perso,cellid); } else { game.leaveMaze(); console.log('entering maze ',cellid); } }); } if(mazeaction=='leave_maze_from_start') { game.leaveMaze(this.id, this.start_path); } else if(mazeaction=='leave_maze_from_end') { game.leaveMaze(this.id, this.end_path); } game.updateCollisionsCache(); } }; this.changeCell= function(changeperso,cellid) { changeperso.current_cell=cellid; var cell = this.doors.cells[cellid]; console.log('entering cell ',cellid); }; this.build = function() { var self=this; this.doors = new Doors(game, this, options); this.doors.build(); }; this.add_ennemy = function(options) { var ennemy = new Ennemy(game, { x: options.x, z: options.z, moveable: false, ai: true, maze: this, patrol_positions: options.patrol_positions, game: game }); ennemy.build(); ennemy.name='ennemy'; ennemy.current_cell = this.doors.cells.length-1; this.ennemys.push(ennemy); return ennemy; }; this.update= function(delta) { if(this.ennemys) { this.ennemys.forEach(function(ennemy) { ennemy.update(delta); }); } }; };