package engine.game { import engine.flixel.FlxG; import engine.flixel.FlxSave; import engine.flixel.FlxSprite; import engine.flixel.FlxState; import engine.game.actors.*; import engine.game.effects.*; import engine.game.maps.*; import engine.game.projectiles.*; import engine.game.ui.*; public class PlayState extends FlxState { //@desc This is the main state that runs the game. // GAME Properties // GAME: Map Conditions private var _map: MapBase; private var _isVacuum: Boolean; private var _isToxic: Boolean; private var _isRebellion: Boolean; private var _isLowGrav: Boolean; private var _isMagnetic: Boolean; private var _isExtermination: Boolean; private var _isExploration: Boolean; private var _isRetrieval: Boolean; private var _isRepair: Boolean; private var _isRescue: Boolean; private var _isDestroy: Boolean; private var _isSurvival: Boolean; // GAME: Map Conditions Effects private var _drainOxygen: Boolean; private var _vacuumCounter: Number = 2; private var _vacuumReset: Number = 2; private var _vacuumRate: Number = 3; private var _toxicHurt: Boolean; private var _toxicCounter: Number = 2; private var _toxicReset: Number = 2; private var _toxicRate: Number = 3; // GAME: Major Objects private var _player: Player; private var _hurtPlayerNow: Boolean; private var _NPC: Array; private var _bullets: Array; private var _DNALevel: Number; private var _hud: HUD; private var _overlays: Overlays; private var _enemyBasic: Array; private var _currentEnemyBasic: uint = 0; // GAME: Level Transitioning private var _fading: Boolean; private var _restartTimer: Number = 0; // GAME: Post-Processing Effects private var _fx: FlxSprite; private var _bloom: uint = 16; private var _fxBloom: Boolean = false; // DEV private var _memcounters: Memcounters; private var _playerPosUI: PlayerPos; // PlayState Initialization function PlayState():void { super(); addMemcounters(); defineMap(); checkMapConditions(); createPlayerAndBullets(); addPlayer(); setupCamera(); _overlays = new Overlays; _hud = new HUD; addPlayerPosUI(); createPostProcess(); setMapConditions(); trackPlays(); FlxG.log("PlayState Initilized"); }// function PlayState override public function update():void { super.update(); toggleAuxData(); gameRestartTimer(); checkCollisions(); checkVacuum(); checkToxic(); broadcastPlayerPosition(); updateHUD(); } // end function update private function checkMapConditions():void { _isVacuum = _map._vacuum; _isToxic = _map._toxic; _isRebellion = _map._rebellion; _isMagnetic = _map._magnetic; _isLowGrav = _map._lowgrav; _isExtermination = _map._extermination; _isExploration = _map._exploration; _isRetrieval = _map._retrieval; _isRepair = _map._repair; _isRescue = _map._rescue; _isDestroy = _map._destroy; _isSurvival = _map._survival; } // end function checkMapConditions private function addMemcounters():void { addChild(_memcounters = new Memcounters()); _memcounters.visible = false; _memcounters.x = 840; _memcounters.y = 5; } // end function addMemcounters private function addPlayerPosUI():void { _playerPosUI = new PlayerPos; PlayerPos._playerPosLabelTXT.visible = false; PlayerPos._playerPosTXT.visible = false; PlayerPos._playerPosLabelTXT.x = 840; PlayerPos._playerPosLabelTXT.y = 110; PlayerPos._playerPosTXT.x = 840; PlayerPos._playerPosTXT.y = 120; } // end function addPlayerPosUI private function defineMap():void { if (CurrentMap._currentMap == 0) { _map = new Sandbox; FlxG.log("MAP: " + _map._mapTitle); } if (CurrentMap._currentMap == 1) { _map = new Sandbox; FlxG.log("MAP: " + _map._mapTitle); } } // end function defineMap private function setMapConditions():void { // Engage Map Environment Conditions if (_isVacuum == true) { // Vacuum Conditions FlxG.log("MAP ENVIRONMENT: Vacuum"); _drainOxygen = true; } if (_isToxic == true) { // Toxic Conditions FlxG.log("MAP ENVIRONMENT: Toxic"); _toxicHurt = true; _bloom = 16; _fxBloom = true; } if (_isRebellion == true) { // Rebellion Conditions FlxG.log("MAP ENVIRONMENT: Rebellion"); _player.health = 20; ActorBase._isRebel = true; } if (_isLowGrav == true) { // Low Gravity Conditions Player._playerLowGrav = true; FlxG.log("MAP ENVIRONMENT: Low Gravity"); } if (_isMagnetic == true) { // Magnetic Conditions FlxG.log("MAP ENVIRONMENT: Magnetic"); _bloom = 16; _fxBloom = true; } // Engage Map Mission Objectives if (_isExtermination == true) { // Extermination Conditions FlxG.log("MAP OBJECTIVE: Extermination"); } if (_isExploration == true) { // Exploration Conditions FlxG.log("MAP OBJECTIVE: Exploration"); } if (_isRetrieval == true) { // Retrieval Conditions FlxG.log("MAP OBJECTIVE: Retrieval"); } if (_isRepair == true) { // Repair Conditions FlxG.log("MAP OBJECTIVE: Repair"); } if (_isRescue == true) { // Rescue Conditions FlxG.log("MAP OBJECTIVE: Rescue"); } if (_isDestroy == true) { // Destroy Conditions FlxG.log("MAP OBJECTIVE: Destroy"); } if (_isSurvival == true) { // Survival Conditions FlxG.log("MAP OBJECTIVE: Survival"); HUD._hudObjectiveTXT.text = "Survival"; } } // end function setMapConditions private function createPlayerAndBullets():void { _bullets = new Array(); _player = new Player(500, 500, _bullets); _player.addAnimationCallback(AnimationCallbackTest); for(var i:uint = 0; i < 100; i++) _bullets.push(this.add(new DNA1Bolt())); } // end function createPlayerAndBullets private function addPlayer():void { add(_player); _player.x = _map._playerStartX; _player.y = _map._playerStartY; } // end function addPlayer public function broadcastPlayerPosition():void { ActorBase._playerPos.x = _player.x; ActorBase._playerPos.y = _player.y; PlayerPos._playerPosX = _player.x; PlayerPos._playerPosY = _player.y; } // end function updatePlayerPos private function setupCamera():void { FlxG.follow(_player, 2.5); FlxG.followAdjust(0.5, 0.0); FlxG.followBounds(0,0,100000,100000); } // end function setupCamera private function trackPlays():void { var save:FlxSave = new FlxSave("Evolver"); if(save.data.plays == null) save.data.plays = 0; else save.data.plays++; FlxG.log("Number of plays: " + save.data.plays); } // end function trackPlays private function toggleAuxData():void { if(FlxG.keys.justPressed("I")) { _memcounters.visible = true; PlayerPos._playerPosLabelTXT.visible = true; PlayerPos._playerPosTXT.visible = true; } if(FlxG.keys.justPressed("O")) { _memcounters.visible = false; PlayerPos._playerPosLabelTXT.visible = false; PlayerPos._playerPosTXT.visible = false; } } // end function toggleMemcounters private function checkCollisions():void { // Collisions with environment _map.layerWalls.collideArray(_bullets); _map.layerWalls.collide(_player); _map.layerWalls.collideArray(_map._NPC); // Collisions between sprites FlxG.overlapArrays(_bullets, _map._NPC, bulletHitNPC); FlxG.overlapArray(_map._NPC, _player, NPCHitPlayer); FlxG.overlapArrays(_map._NPC, _map._NPC, NPCHitNPC); } // end function checkCollisions private function updateHUD():void { var os:uint = FlxG.score; // HUD UPDATE: Map Title HUD._hudMapTitleTXT.text = _map._mapTitle; // HUD UPDATE: Clip HUD._hudClip.text = _player._leftInClip + ' / ' + _player._clipSize; // HUD UPDATE: Vitality keepHealthPositive(); HUD._hudVitalityTXT.text = 'VITALITY: ' + _player.health + ' / 100'; // HUD UPDATE: Oxygen HUD._hudOxygenTXT.text = 'OXYGEN: ' + _player.oxygen + ' / 100'; // HUD UPDATE: Score or Chroma if(os != FlxG.score) { HUD._hudChromaTXT.text = 'CHROMA ' + FlxG.score.toString(); } // HUD UPDATE: DNA Level & Weapon Behavior if(FlxG.score >= 0 && FlxG.score <= 999) { _DNALevel = 1; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'PSYONIC BURST'; Player._projectileSpeed = -10000; Player._fireRate = 1.25; } if(FlxG.score >= 1000 && FlxG.score <= 2499) { _DNALevel = 2; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'RAPID PSYONICS'; Player._projectileSpeed = -10000; Player._fireRate = 0.7; } if(FlxG.score >= 2500 && FlxG.score <= 3999) { _DNALevel = 3; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'FUSION BLASTS'; Player._projectileSpeed = -10000; Player._fireRate = 0.5; } if(FlxG.score >= 4000 && FlxG.score <= 5999) { _DNALevel = 4; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'ANTI-MATTER'; Player._projectileSpeed = -10000; Player._fireRate = 0.3; } if(FlxG.score >= 6000 && FlxG.score <= 8499) { _DNALevel = 5; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'RAPID ANTI'; Player._projectileSpeed = -10000; Player._fireRate = 0.25; } if(FlxG.score >= 8500 && FlxG.score <= 9999) { _DNALevel = 6; HUD._hudDNALevelTXT.text = 'DNA LEVEL ' + _DNALevel.toString(); HUD._hudWeaponNameTXT.text = 'MIND KILL'; Player._projectileSpeed = -10000; Player._fireRate = 0.1; } if(FlxG.score >= 10000 && FlxG.score <= 19999) { _DNALevel = 7; HUD._hudDNALevelTXT.text = 'DNA MAXIMUM'; HUD._hudWeaponNameTXT.text = 'SHEER WILL'; Player._projectileSpeed = -10000; Player._fireRate = 0.1; } if(FlxG.score >= 20000) { _DNALevel = 8; HUD._hudDNALevelTXT.text = 'DNA GODMAKER'; HUD._hudWeaponNameTXT.text = 'DOMINATOR'; Player._projectileSpeed = -10000; Player._fireRate = 0.1; } // Update Player Position UI Feedback PlayerPos._playerPosTXT.text = PlayerPos._playerPosX + ', ' + PlayerPos._playerPosY; } // end function updateHUD private function checkVacuum():void { //@desc If Vacuum, Drain Oxygen if (_vacuumCounter >= 0) { _vacuumCounter -= FlxG.elapsed * _vacuumRate; } if (_drainOxygen == true && _player.oxygen >= 0 && _vacuumCounter <= 0) { _player.oxygen -= 1; _vacuumCounter = _vacuumReset; } if (_drainOxygen == true && _player.oxygen <= 0) { _player.oxygen = 0; _drainOxygen = false; } } // end function checkVacuum private function checkToxic():void { //@desc If Toxic, Turn on Overlay, Hurt Vitality if (_isToxic == true) { Overlays.layerToxic.visible = true; } if (_isToxic == false) { Overlays.layerToxic.visible = false; } if (_toxicCounter >= 0) { _toxicCounter -= FlxG.elapsed * _toxicRate; } if (_toxicHurt == true && _player.health >= 0 && _toxicCounter <= 0) { _player.health -= 1; _toxicCounter = _toxicReset; } if (_toxicHurt == true && _player.health <= 0) { _player.health = 0; _toxicHurt = false; } } // end function checkToxic private function bulletHitNPC(DNA1Bolt:FlxSprite, NPC:FlxSprite):void { DNA1Bolt.hurt(0); NPC.hurt(5); } // end function bulletHitNPC private function NPCHitPlayer(Player:FlxSprite, NPC:FlxSprite):void { ActorBase.meleeCheck(); } // end function NPCHitPlayer private function NPCHitNPC(NPC1:FlxSprite, NPC2:FlxSprite):void { } // end function NPCHitNPC private function keepHealthPositive():void { if (_player.health <= 0) { _player.health = 0 } } // end function keepHealthPositive private function AnimationCallbackTest(Name:String, Frame:uint, FrameIndex:uint):void { FlxG.log("ANIMATION NAME: " + Name + ", FRAME: " + Frame + ", FRAME INDEX: " + FrameIndex); } // end function AnimationCallbackTest private function gameRestartTimer():void { if(_player.dead) { _restartTimer += FlxG.elapsed; if(_restartTimer > 4) FlxG.switchState(PlayState); return; } } // end function gameRestartTimer private function createPostProcess():void { createScreenBuffer(); applyBloomFX(); } // end function postProcessing private function createScreenBuffer():void { _fx = new FlxSprite(); _fx.createGraphic(FlxG.width/_bloom, FlxG.height/_bloom, 0, true); _fx.origin.x = _fx.origin.y = 0; _fx.scale.x = _fx.scale.y = _bloom; _fx.antialiasing = true; _fx.color = 0xafffff; _fx.blend = "overlay"; } private function applyBloomFX():void { screen.scale.x = screen.scale.y = 1/_bloom; } override public function postProcess():void { if (_fxBloom == true) { _fx.draw(screen); screen.draw(_fx); } } } // end class PlayState } // end package