Raise number of left bullets after a bullet exploded
This commit is contained in:
parent
4993b2ef07
commit
9d34024718
1 changed files with 16 additions and 9 deletions
|
@ -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 ()
|
||||
|
|
Reference in a new issue