package { import flash.geom.Rectangle; public class GameStateController { public static const SECONDS_PER_DAY:Number = 60 * 2; public static const GAME_CLOCK_TIME_PER_TICK:Number = 1 / (60 * SECONDS_PER_DAY); private var model:GameStateModel; private var objectControllers:Vector.; public function GameStateController(model:GameStateModel):void { this.model = model; objectControllers = new Vector.(); } public function addObjectController(objectController:IObjectController):void { objectControllers.push(objectController); } public function update():void { model.timeOfDay += GAME_CLOCK_TIME_PER_TICK; if (model.timeOfDay >= 1) { // DAY IS OVER, DO SOMETHING ABOUT IT model.timeOfDay = 1; } for each (var objectController:IObjectController in objectControllers) { objectController.update(); } for each (var object:GameObjectModel in model.objects) { object.update(); } resolveAllCollisions(); if (model.player.committingMischief) { var caught:Boolean = false; for (var workerIndex:int = 1; workerIndex < model.objects.length; workerIndex++) { if (model.objects[workerIndex] is WorkerModel) { var worker:WorkerModel = model.objects[workerIndex] as WorkerModel; if (worker.canSeePlayer) { caught = true; worker.showEmote(WorkerModel.EMOTE_DEVIL); } } } if (caught) { model.player.showEmote(WorkerModel.EMOTE_CRY); // PLAYER IS CAUGHT, DO SOMETHING ABOUT IT } } } private function resolveAllCollisions():void { var bounds1:Rectangle, lastBounds1:Rectangle, bounds2:Rectangle; var worker:WorkerModel; var tile:TileModel; var collided:Boolean; for (var objectIndex:int = 0; objectIndex < model.objects.length; objectIndex++) { if (model.objects[objectIndex] is WorkerModel) { worker = model.objects[objectIndex] as WorkerModel; bounds1 = worker.bounds; lastBounds1 = worker.lastBounds; collided = false; if (bounds1.left < 0 || bounds1.right >= model.level.sizeX || bounds1.top < 0 || bounds1.bottom >= model.level.sizeZ) { collided = true; } else { for (var tileIndexZ:int = 0; tileIndexZ < model.level.sizeZ; tileIndexZ++) { for (var tileIndexX:int = 0; tileIndexX < model.level.sizeX; tileIndexX++) { if (model.isSolidTileAtPosition(tileIndexX, tileIndexZ)) { bounds2 = new Rectangle(tileIndexX, tileIndexZ, 1, 1); if (bounds1.intersects(bounds2) && !lastBounds1.intersects(bounds2)) { collided = true; } } if (collided) {break;} } if (collided) {break;} } } if (collided) { worker.position.x = worker.lastPosition.x; worker.position.z = worker.lastPosition.z; worker.velocity.x = worker.velocity.z = 0; } } } } } }