aboutsummaryrefslogtreecommitdiff
path: root/src/Step.elm
diff options
context:
space:
mode:
Diffstat (limited to 'src/Step.elm')
-rw-r--r--src/Step.elm72
1 files changed, 72 insertions, 0 deletions
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
+ }