module Step where import Vec2 (..) import Game (..) import Player (..) import EnemyState (..) import Player (playerSpeed) import Enemy (enemySpeed, enemyMove, enemyAwayDist) import Input (Input) import Physics (getNewPosAndSpeed, getMove) import Board (boardSize, boardDiagonal) import Geometry (..) import RandomValues (RandomValues) step : Input -> Game -> Game step {dir, delta, randomValues} {time, player, enemyState, bestTime} = if(playerEnemiesCollision time player enemyState.enemies) then let newBestTime = if(time > bestTime) then time else bestTime in initialGame player.pos newBestTime else let newTime = time + delta newPlayer = playerStep delta dir player newEnemyState = enemyStep time randomValues enemyState in { time = newTime , player = newPlayer , enemyState = newEnemyState , bestTime = bestTime } playerStep : Float -> Vec2 -> Player -> Player playerStep dt dir player = let (pos, speed) = getNewPosAndSpeed dt dir playerSpeed (player.pos, player.speed) in { pos = inBoard playerSize pos , speed = speed } enemyStep : Float -> RandomValues -> EnemyState -> EnemyState enemyStep time randomValues {enemies, spawn, lastSpawn} = let isPresent enemy = (distance (enemyMove enemy time) originVec) < enemyAwayDist presentEnemies = filter isPresent enemies in if time > lastSpawn + spawn then let newEnemy = { initTime = time , initPos = enemyInitPos randomValues , initDest = enemyDestination randomValues , move initTime initPos initDest time = let delta = time - initTime move = getMove (enemySpeed delta) (initDest `sub` initPos) in initPos `add` move } in { enemies = newEnemy :: presentEnemies , spawn = spawn - sqrt(spawn) / 50 , lastSpawn = time } else { enemies = presentEnemies , spawn = spawn , lastSpawn = lastSpawn } enemyInitPos : RandomValues -> Vec2 enemyInitPos randomValues = let angle = randomValues.enemyAngle * (degrees 360) dist = boardDiagonal * 3 / 5 in polarToCartesian angle dist enemyDestination : RandomValues -> Vec2 enemyDestination randomValues = let destWidth = boardSize.x destHeight = boardSize.y in { x = destWidth * randomValues.enemyX - destWidth / 2 , y = destHeight * randomValues.enemyY - destHeight / 2 }