Limit number of bullets/tank; save tank number with shoot
This commit is contained in:
parent
907cb95dae
commit
e03de6bfe6
2 changed files with 23 additions and 18 deletions
26
Game.hs
26
Game.hs
|
@ -17,23 +17,25 @@ import qualified Data.Map as M
|
||||||
|
|
||||||
|
|
||||||
data Tank = Tank
|
data Tank = Tank
|
||||||
{ posx :: !Micro
|
{ posx :: !Micro
|
||||||
, posy :: !Micro
|
, posy :: !Micro
|
||||||
, dir :: !Micro
|
, dir :: !Micro
|
||||||
, aim :: !Micro
|
, aim :: !Micro
|
||||||
, speed :: !Micro
|
, speed :: !Micro
|
||||||
, turnspeed :: !Micro
|
, turnspeed :: !Micro
|
||||||
, moving :: !Bool
|
, moving :: !Bool
|
||||||
, tankShootSpeed :: !Micro
|
, tankShootSpeed :: !Micro
|
||||||
, tankShootBounces :: !Int
|
, tankShootBounces :: !Int
|
||||||
|
, shootsLeft :: !Int
|
||||||
} deriving Show
|
} deriving Show
|
||||||
|
|
||||||
data Shoot = Shoot
|
data Shoot = Shoot
|
||||||
{ shootX :: !Micro
|
{ shootX :: !Micro
|
||||||
, shootY :: !Micro
|
, shootY :: !Micro
|
||||||
, shootDir :: !Micro
|
, shootDir :: !Micro
|
||||||
, shootSpeed :: !Micro
|
, shootSpeed :: !Micro
|
||||||
, bouncesLeft :: !Int
|
, bouncesLeft :: !Int
|
||||||
|
, shootTank :: !Int
|
||||||
} deriving Show
|
} deriving Show
|
||||||
|
|
||||||
data GameState = GameState
|
data GameState = GameState
|
||||||
|
|
15
HTanks.hs
15
HTanks.hs
|
@ -47,8 +47,8 @@ main = do
|
||||||
[ SomePlayer $ DefaultPlayer S.empty 0 0 False
|
[ SomePlayer $ DefaultPlayer S.empty 0 0 False
|
||||||
, SomePlayer $ CPUPlayer 0
|
, SomePlayer $ CPUPlayer 0
|
||||||
]}
|
]}
|
||||||
gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False 3 2
|
gameState = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 2 270 False 3 2 5
|
||||||
, Tank 5.0 3.5 0 0 2 270 False 3 2
|
, Tank 5.0 3.5 0 0 2 270 False 3 2 5
|
||||||
], shoots = [], textures = M.empty}
|
], shoots = [], textures = M.empty}
|
||||||
|
|
||||||
runGame gameState $ do
|
runGame gameState $ do
|
||||||
|
@ -161,18 +161,21 @@ simulationStep = do
|
||||||
oldtanks <- lift $ gets tanks
|
oldtanks <- lift $ gets tanks
|
||||||
|
|
||||||
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
|
let (p, t, s) = unzip3 $ map updateTank' $ zip oldplayers oldtanks
|
||||||
shootingtanks = map fst $ filter snd $ zip t s
|
ts = zip3 t s [0..]
|
||||||
newshoots = map (\tank -> Shoot
|
shootingtanks = map (\(tank, _, n) -> (tank, n)) $ filter (\(tank, shoot, _) -> shoot && (shootsLeft tank) > 0) $ ts
|
||||||
{shootX = posx tank
|
newtanks = map (\(tank, shoot, _) -> if shoot then tank {shootsLeft = (shootsLeft tank) - 1} else tank) $ ts
|
||||||
|
newshoots = map (\(tank, n) -> Shoot
|
||||||
|
{ shootX = posx tank
|
||||||
, shootY = posy tank
|
, shootY = posy tank
|
||||||
, shootDir = aim tank
|
, shootDir = aim tank
|
||||||
, shootSpeed = tankShootSpeed tank
|
, shootSpeed = tankShootSpeed tank
|
||||||
, bouncesLeft = tankShootBounces tank
|
, bouncesLeft = tankShootBounces tank
|
||||||
|
, shootTank = n
|
||||||
}) shootingtanks
|
}) shootingtanks
|
||||||
|
|
||||||
|
|
||||||
modify $ \state -> state {players = p}
|
modify $ \state -> state {players = p}
|
||||||
lift $ modify $ \state -> state {tanks = t, shoots = map (execState updateShoot) (shoots state ++ newshoots)}
|
lift $ modify $ \state -> state {tanks = newtanks, shoots = map (execState updateShoot) (shoots state ++ newshoots)}
|
||||||
where
|
where
|
||||||
updateTank' (player, tank) = let (p, angle, move, aangle, shoot) = playerUpdate player tank
|
updateTank' (player, tank) = let (p, angle, move, aangle, shoot) = playerUpdate player tank
|
||||||
t = execState (updateTank angle move aangle) tank
|
t = execState (updateTank angle move aangle) tank
|
||||||
|
|
Reference in a new issue