Raise number of left bullets after a bullet exploded

This commit is contained in:
Matthias Schiffer 2010-03-09 07:30:42 +01:00
parent 4993b2ef07
commit 9d34024718

View file

@ -147,7 +147,7 @@ updateTank angle move aangle = do
modify $ \tank -> tank {tankMoving = False} modify $ \tank -> tank {tankMoving = False}
updateBullet :: GameState -> State Bullet () updateBullet :: GameState -> State Bullet Bool
updateBullet game = do updateBullet game = do
bullet <- get bullet <- get
let angle = (fromRational . toRational . bulletDir $ bullet)*pi/180 let angle = (fromRational . toRational . bulletDir $ bullet)*pi/180
@ -159,11 +159,14 @@ updateBullet game = do
lw = fromIntegral . levelWidth . level $ game lw = fromIntegral . levelWidth . level $ game
lh = fromIntegral . levelHeight . level $ game lh = fromIntegral . levelHeight . level $ game
dir = bulletDir bullet 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) (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) = if y < 0 then (-y, -dir2) else if y > lh then (2*lh-y, -dir2) else (y, dir2) (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 () simulationStep :: Main ()
@ -173,8 +176,8 @@ simulationStep = do
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
ts = zip3 t s [0..] ts = zip3 t s [0..]
bulletingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, bullet, _) -> bullet && (tankBulletsLeft tank) > 0) $ ts shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (tankBulletsLeft tank) > 0) $ ts
newtanks = map (\(tank, bullet, _) -> if bullet then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts newtanks = map (\(tank, shoot, _) -> if (shoot && (tankBulletsLeft tank) > 0) then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts
newbullets = map (\(tank, n) -> Bullet newbullets = map (\(tank, n) -> Bullet
{ bulletX = tankX tank { bulletX = tankX tank
, bulletY = tankY tank , bulletY = tankY tank
@ -182,15 +185,19 @@ simulationStep = do
, bulletSpeed = tankBulletSpeed tank , bulletSpeed = tankBulletSpeed tank
, bulletBouncesLeft = tankBulletBounces tank , bulletBouncesLeft = tankBulletBounces tank
, bulletTank = n , bulletTank = n
}) bulletingtanks }) shootingtanks
modify $ \state -> state {players = p} 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 where
updateTank' (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank updateTank' (player, tank) = let (p, angle, move, aangle, bullet) = playerUpdate player tank
t = execState (updateTank angle move aangle) tank t = execState (updateTank angle move aangle) tank
in (p, t, bullet) 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 () handleEvents :: Main ()