summaryrefslogtreecommitdiffstats
path: root/HTanks.hs
diff options
context:
space:
mode:
Diffstat (limited to 'HTanks.hs')
-rw-r--r--HTanks.hs42
1 files changed, 22 insertions, 20 deletions
diff --git a/HTanks.hs b/HTanks.hs
index 5e980fc..6d07cb6 100644
--- a/HTanks.hs
+++ b/HTanks.hs
@@ -90,8 +90,8 @@ mainLoop = do
updateAngle :: Micro -> State Tank ()
updateAngle angle = do
- oldangle <- gets dir
- tspeed <- gets turnspeed >>= return . (/1000)
+ oldangle <- gets tankDir
+ tspeed <- gets tankTurnspeed >>= return . (/1000)
let diff = angle - oldangle
let diff360 = if (diff > 180)
@@ -120,7 +120,7 @@ updateAngle angle = do
then (newangle+360)
else newangle
- modify $ \tank -> tank {dir = newangle180}
+ modify $ \tank -> tank {tankDir = newangle180}
updateTank :: Maybe Micro -> Bool -> Maybe Micro -> State Tank ()
@@ -129,30 +129,32 @@ updateTank angle move aangle = do
updateAngle $ fromJust angle
when (isJust aangle) $
- modify $ \tank -> tank {aim = fromJust aangle}
+ modify $ \tank -> tank {tankAim = fromJust aangle}
when move $ do
- tdir <- gets dir
- tspeed <- gets speed
- moved <- gets moving
+ tdir <- gets tankDir
+ tspeed <- gets tankSpeed
+ moved <- gets tankMoving
when (isNothing angle || (isJust angle && (tdir == fromJust angle)) || moved) $ do
let anglej = (fromRational . toRational $ tdir)*pi/180
x = tspeed * fromRational (round ((cos anglej)*1000)%1000000)
y = tspeed * fromRational (round ((sin anglej)*1000)%1000000)
- modify $ \tank -> tank {posx = x + posx tank, posy = y + posy tank, moving = True}
+ modify $ \tank -> tank {tankX = x + tankX tank, tankY = y + tankY tank, tankMoving = True}
when (not move) $ do
- modify $ \tank -> tank {moving = False}
+ modify $ \tank -> tank {tankMoving = False}
updateShoot :: State Shoot ()
-updateShoot = modify $ \shoot ->
- let angle = (fromRational . toRational . shootDir $ shoot)*pi/180
- dx = (shootSpeed shoot) * fromRational (round ((cos angle)*1000)%1000000)
- dy = (shootSpeed shoot) * fromRational (round ((sin angle)*1000)%1000000)
- in shoot {shootX = dx + shootX shoot, shootY = dy + shootY shoot}
+updateShoot = do
+ angle <- gets shootDir >>= return . (/180) . (*pi) . fromRational . toRational
+ speed <- gets shootSpeed
+ let dx = speed * fromRational (round ((cos angle)*1000)%1000000)
+ dy = speed * fromRational (round ((sin angle)*1000)%1000000)
+
+ modify $ \shoot -> shoot {shootX = dx + shootX shoot, shootY = dy + shootY shoot}
simulationStep :: Main ()
@@ -162,14 +164,14 @@ simulationStep = do
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
ts = zip3 t s [0..]
- shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (shootsLeft tank) > 0) $ ts
- newtanks = map (\(tank, shoot, _) -> if shoot then tank {shootsLeft = (shootsLeft tank) - 1} else tank) $ ts
+ shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (tankShootsLeft tank) > 0) $ ts
+ newtanks = map (\(tank, shoot, _) -> if shoot then tank {tankShootsLeft = (tankShootsLeft tank) - 1} else tank) $ ts
newshoots = map (\(tank, n) -> Shoot
- { shootX = posx tank
- , shootY = posy tank
- , shootDir = aim tank
+ { shootX = tankX tank
+ , shootY = tankY tank
+ , shootDir = tankAim tank
, shootSpeed = tankShootSpeed tank
- , bouncesLeft = tankShootBounces tank
+ , shootBouncesLeft = tankShootBounces tank
, shootTank = n
}) shootingtanks