From c4ae3b0ee4bd338995cfecf34e0aeb49f05fa70e Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Tue, 2 Sep 2014 21:35:58 +0200 Subject: Initial commit --- src/Step.elm | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/Step.elm (limited to 'src/Step.elm') diff --git a/src/Step.elm b/src/Step.elm new file mode 100644 index 0000000..7894e45 --- /dev/null +++ b/src/Step.elm @@ -0,0 +1,72 @@ +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 + } -- cgit v1.2.3