From 9d34024718835132b45c586fc97d75839badf355 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 9 Mar 2010 07:30:42 +0100 Subject: Raise number of left bullets after a bullet exploded --- src/HTanks.hs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/HTanks.hs b/src/HTanks.hs index 4b66944..88ac4e4 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -147,7 +147,7 @@ updateTank angle move aangle = do modify $ \tank -> tank {tankMoving = False} -updateBullet :: GameState -> State Bullet () +updateBullet :: GameState -> State Bullet Bool updateBullet game = do bullet <- get let angle = (fromRational . toRational . bulletDir $ bullet)*pi/180 @@ -159,11 +159,14 @@ updateBullet game = do lw = fromIntegral . levelWidth . level $ game lh = fromIntegral . levelHeight . level $ game dir = bulletDir bullet + bounces = bulletBouncesLeft bullet - (newx, dir2) = if x < 0 then (-x, (signum dir)*180 - dir) else if x > lw then (2*lw-x, (signum dir)*180 - dir) else (x, dir) - (newy, dir3) = if y < 0 then (-y, -dir2) else if y > lh then (2*lh-y, -dir2) else (y, dir2) + (newx, dir2, bounces2) = if x < 0 then (-x, (signum dir)*180 - dir, bounces-1) else if x > lw then (2*lw-x, (signum dir)*180 - dir, bounces-1) else (x, dir, bounces) + (newy, dir3, bounces3) = if y < 0 then (-y, -dir2, bounces2-1) else if y > lh then (2*lh-y, -dir2, bounces2-1) else (y, dir2, bounces2) - put bullet {bulletX = newx, bulletY = newy, bulletDir = dir3} + put bullet {bulletX = newx, bulletY = newy, bulletDir = dir3, bulletBouncesLeft = bounces3} + + return (bounces3 >= 0) simulationStep :: Main () @@ -173,8 +176,8 @@ simulationStep = do let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks ts = zip3 t s [0..] - bulletingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, bullet, _) -> bullet && (tankBulletsLeft tank) > 0) $ ts - newtanks = map (\(tank, bullet, _) -> if bullet then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts + shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (tankBulletsLeft tank) > 0) $ ts + newtanks = map (\(tank, shoot, _) -> if (shoot && (tankBulletsLeft tank) > 0) then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts newbullets = map (\(tank, n) -> Bullet { bulletX = tankX tank , bulletY = tankY tank @@ -182,15 +185,19 @@ simulationStep = do , bulletSpeed = tankBulletSpeed tank , bulletBouncesLeft = tankBulletBounces tank , bulletTank = n - }) bulletingtanks - + }) shootingtanks modify $ \state -> state {players = p} - lift $ modify $ \state -> state {tanks = newtanks, bullets = map (execState $ updateBullet state) (newbullets ++ bullets state)} + lift $ modify $ \state -> + let thebullets = map (runState $ updateBullet state) $ newbullets ++ bullets state + thetanks = map (\(tank, n) -> tank {tankBulletsLeft = (tankBulletsLeft tank) + (countLostTankBullets n thebullets)}) $ zip newtanks [0..] + in state {tanks = thetanks, bullets = map snd . filter fst $ thebullets} where updateTank' (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank t = execState (updateTank angle move aangle) tank in (p, t, bullet) + countLostTankBullets n (x:xs) = (if ((not . fst $ x) && (n == (bulletTank . snd $ x))) then 1 else 0) + (countLostTankBullets n xs) + countLostTankBullets n [] = 0 handleEvents :: Main () -- cgit v1.2.3