Refactoring and linting

This commit is contained in:
2021-04-30 17:50:28 +02:00
parent 83c2220813
commit 9c0e4425da
18 changed files with 531 additions and 523 deletions
+9 -9
View File
@@ -467,7 +467,7 @@ miniAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -586,7 +586,7 @@ strafeOrChargeAI inRange outRange w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1101,7 +1101,7 @@ circleClockwiseAI inRange outRange w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1198,7 +1198,7 @@ twitchMissAI inRange outRange w (f,g) cr =
cid = _crID cr cid = _crID cr
ypos = _crPos $ you w ypos = _crPos $ you w
wp = _crInv cr IM.! _crInvSel cr wp = _crInv cr IM.! _crInvSel cr
fireRate = fromMaybe 0 $ wp ^? wpFireRate fireRate = fromMaybe 0 $ wp ^? itUseRate
noAmmo = 0 == _wpLoadedAmmo wp noAmmo = 0 == _wpLoadedAmmo wp
strafeCloseSlow p | errorAngleVV 22 (p -.- cpos) strafeCloseSlow p | errorAngleVV 22 (p -.- cpos)
(unitVectorAtAngle (_crDir cr)) < 0.1 (unitVectorAtAngle (_crDir cr)) < 0.1
@@ -1297,7 +1297,7 @@ closeToRangeAI inRange outRange w (f,g) cr =
cid = _crID cr cid = _crID cr
ypos = _crPos $ you w ypos = _crPos $ you w
wp = _crInv cr IM.! _crInvSel cr wp = _crInv cr IM.! _crInvSel cr
fireRate = fromMaybe 0 $ wp ^? wpFireRate fireRate = fromMaybe 0 $ wp ^? itUseRate
(aimtime,g1) = randomR (80,120) g (aimtime,g1) = randomR (80,120) g
noAmmo = 0 == _wpLoadedAmmo wp noAmmo = 0 == _wpLoadedAmmo wp
strafeCloseSlow p | errorAngleVV 22 (p -.- cpos) strafeCloseSlow p | errorAngleVV 22 (p -.- cpos)
@@ -1424,7 +1424,7 @@ suppressShooterAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1528,7 +1528,7 @@ basicShooterAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1631,7 +1631,7 @@ sniperAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1733,7 +1733,7 @@ sniperAI w (f,g) cr =
-- addAction newActions = over (creatures . ix cid . crState . goals) -- addAction newActions = over (creatures . ix cid . crState . goals)
-- (\(as:ass) -> (newActions++as):ass) -- (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = id -- autoFireTweak p | _wpIsAuto wp = id
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
-- in if _crHP cr <= 0 then killCr cid w else -- in if _crHP cr <= 0 then killCr cid w else
-- case head $ _goals $ _crState cr of -- case head $ _goals $ _crState cr of
-- [] | canSeeAny cid (_yourID w) w -- [] | canSeeAny cid (_yourID w) w
+9 -9
View File
@@ -469,7 +469,7 @@ miniAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -588,7 +588,7 @@ strafeOrChargeAI inRange outRange w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1103,7 +1103,7 @@ circleClockwiseAI inRange outRange w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1200,7 +1200,7 @@ twitchMissAI inRange outRange w (f,g) cr =
cid = _crID cr cid = _crID cr
ypos = _crPos $ you w ypos = _crPos $ you w
wp = _crInv cr IM.! _crInvSel cr wp = _crInv cr IM.! _crInvSel cr
fireRate = fromMaybe 0 $ wp ^? wpFireRate fireRate = fromMaybe 0 $ wp ^? itUseRate
noAmmo = 0 == _wpLoadedAmmo wp noAmmo = 0 == _wpLoadedAmmo wp
strafeCloseSlow p | errorAngleVV 22 (p -.- cpos) strafeCloseSlow p | errorAngleVV 22 (p -.- cpos)
(unitVectorAtAngle (_crDir cr)) < 0.1 (unitVectorAtAngle (_crDir cr)) < 0.1
@@ -1299,7 +1299,7 @@ closeToRangeAI inRange outRange w (f,g) cr =
cid = _crID cr cid = _crID cr
ypos = _crPos $ you w ypos = _crPos $ you w
wp = _crInv cr IM.! _crInvSel cr wp = _crInv cr IM.! _crInvSel cr
fireRate = fromMaybe 0 $ wp ^? wpFireRate fireRate = fromMaybe 0 $ wp ^? itUseRate
(aimtime,g1) = randomR (80,120) g (aimtime,g1) = randomR (80,120) g
noAmmo = 0 == _wpLoadedAmmo wp noAmmo = 0 == _wpLoadedAmmo wp
strafeCloseSlow p | errorAngleVV 22 (p -.- cpos) strafeCloseSlow p | errorAngleVV 22 (p -.- cpos)
@@ -1426,7 +1426,7 @@ suppressShooterAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1530,7 +1530,7 @@ basicShooterAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1633,7 +1633,7 @@ sniperAI w (f,g) cr =
addAction newActions addAction newActions
= Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass) = Just . over (crState . goals) (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = Just -- autoFireTweak p | _wpIsAuto wp = Just
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
in --if _crHP cr <= 0 then killCr w f cr else in --if _crHP cr <= 0 then killCr w f cr else
case head $ _goals $ _crState cr of case head $ _goals $ _crState cr of
[] | canSeeFire cpos ypos w -> ( ( f , g1 ) [] | canSeeFire cpos ypos w -> ( ( f , g1 )
@@ -1735,7 +1735,7 @@ sniperAI w (f,g) cr =
-- addAction newActions = over (creatures . ix cid . crState . goals) -- addAction newActions = over (creatures . ix cid . crState . goals)
-- (\(as:ass) -> (newActions++as):ass) -- (\(as:ass) -> (newActions++as):ass)
-- autoFireTweak p | _wpIsAuto wp = id -- autoFireTweak p | _wpIsAuto wp = id
-- | otherwise = replaceGoal [[AimAt p (_wpFireRate wp * 2)]] -- | otherwise = replaceGoal [[AimAt p (_itUseRate wp * 2)]]
-- in if _crHP cr <= 0 then killCr cid w else -- in if _crHP cr <= 0 then killCr cid w else
-- case head $ _goals $ _crState cr of -- case head $ _goals $ _crState cr of
-- [] | canSeeAny cid (_yourID w) w -- [] | canSeeAny cid (_yourID w) w
-9
View File
@@ -425,15 +425,6 @@ collidePointFireVision p1 p2 ws = any ( isJust
Just _ -> not $ _wlIsSeeThrough wl Just _ -> not $ _wlIsSeeThrough wl
Nothing -> True Nothing -> True
-- shit this is ugly
lineOfThickness :: Float -> [Point2] -> Picture
lineOfThickness t = pictures . f
where f (x:y:ys)
| x == y = f (x:ys)
| otherwise
= polygon [x +.+ n x y, x -.- n x y, y -.- n x y, y +.+ n x y] : f (y:ys)
f _ = []
n a b = (t*0.5) *.* errorNormalizeV 42 (vNormal (a -.- b))
lineGeom :: Float -> Point2 -> Point2 -> [Point2] lineGeom :: Float -> Point2 -> Point2 -> [Point2]
lineGeom t x y lineGeom t x y
+1 -1
View File
@@ -264,7 +264,7 @@ Items you start with.
-} -}
startInventory = IM.fromList (zip [0..20] startInventory = IM.fromList (zip [0..20]
( (
[lasGun [bezierGun
,remoteLauncher ,remoteLauncher
,grenade ,grenade
--,spawnGun lamp --,spawnGun lamp
+1 -1
View File
@@ -178,7 +178,7 @@ isFrictionless cr = case cr ^? crState . stance . carriage of
_ -> False _ -> False
updateReloadCounter :: Creature -> Creature updateReloadCounter :: Creature -> Creature
updateReloadCounter cr = over (crInv . ix iSel . wpFireState) decreaseToZero updateReloadCounter cr = over (crInv . ix iSel . itUseTime) decreaseToZero
. over (crInv . ix iSel . wpReloadState) decreaseToZero . over (crInv . ix iSel . wpReloadState) decreaseToZero
$ cr $ cr
where iSel = _crInvSel cr where iSel = _crInvSel cr
+4 -2
View File
@@ -215,8 +215,8 @@ data Item
, _wpLoadedAmmo :: Int , _wpLoadedAmmo :: Int
, _wpReloadTime :: Int , _wpReloadTime :: Int
, _wpReloadState :: Int , _wpReloadState :: Int
, _wpFireRate :: Int , _itUseRate :: Int
, _wpFireState :: Int , _itUseTime :: Int
, _wpFire :: Int -> World -> World , _wpFire :: Int -> World -> World
, _wpSpread :: Float , _wpSpread :: Float
, _wpRange :: Float , _wpRange :: Float
@@ -286,6 +286,8 @@ data Item
, _twMaxRange :: Float , _twMaxRange :: Float
, _twAccuracy :: Float , _twAccuracy :: Float
, _twFire :: Int -> World -> World , _twFire :: Int -> World -> World
, _itUseRate :: Int
, _itUseTime :: Int
, _itAimingSpeed :: Float , _itAimingSpeed :: Float
, _itAimingRange :: Float , _itAimingRange :: Float
, _itZoom :: ItZoom , _itZoom :: ItZoom
+2 -2
View File
@@ -276,8 +276,8 @@ data Item
, _wpLoadedAmmo :: Int , _wpLoadedAmmo :: Int
, _wpReloadTime :: Int , _wpReloadTime :: Int
, _wpReloadState :: Int , _wpReloadState :: Int
, _wpFireRate :: Int , _itUseRate :: Int
, _wpFireState :: Int , _itUseTime :: Int
, _wpFire :: Int -> World -> World , _wpFire :: Int -> World -> World
, _wpSpread :: Float , _wpSpread :: Float
, _wpRange :: Float , _wpRange :: Float
+1
View File
@@ -2,6 +2,7 @@ module Dodge.Debug where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Picture
import Geometry.Data import Geometry.Data
import Picture import Picture
+1
View File
@@ -4,6 +4,7 @@ module Dodge.Item
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Default import Dodge.Default
import Dodge.Picture
import Picture import Picture
keyToken :: Int -> Item keyToken :: Int -> Item
+161 -354
View File
@@ -21,6 +21,7 @@ import Dodge.Item.Weapon.InventoryDisplay
import Dodge.Item.Weapon.TriggerType import Dodge.Item.Weapon.TriggerType
import Dodge.Item.Weapon.ExtraEffect import Dodge.Item.Weapon.ExtraEffect
import Dodge.Item.Weapon.UseEffect import Dodge.Item.Weapon.UseEffect
import Dodge.Item.Weapon.Laser
import Dodge.Item.Attachment.Data import Dodge.Item.Attachment.Data
import Dodge.Item.Attachment import Dodge.Item.Attachment
import Geometry import Geometry
@@ -56,8 +57,8 @@ pistol = Weapon
, _wpLoadedAmmo = 15 , _wpLoadedAmmo = 15
, _wpReloadTime = 40 , _wpReloadTime = 40
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 8 , _itUseRate = 8
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = , _wpFire =
hammerCheck hammerCheck
. shootWithSound 0 . shootWithSound 0
@@ -108,8 +109,8 @@ autoGun = defaultGun
, _wpLoadedAmmo = 30 , _wpLoadedAmmo = 30
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 6 , _itUseRate = 6
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = charFiringStrat , _wpFire = charFiringStrat
[('M',autoFireMode) [('M',autoFireMode)
,('S',singleFireMode) ,('S',singleFireMode)
@@ -134,7 +135,6 @@ autoFireMode = shootWithSound (fromIntegral autoGunSound)
. torqueBefore 0.05 . torqueBefore 0.05
$ autoGunNonTwistEff $ autoGunNonTwistEff
singleFireMode = hammerCheck $ shootWithSound (fromIntegral autoGunSound) singleFireMode = hammerCheck $ shootWithSound (fromIntegral autoGunSound)
-- . torqueAfter 0.03
$ autoGunNonTwistEff $ autoGunNonTwistEff
autoGunNonTwistEff = withRecoil 40 autoGunNonTwistEff = withRecoil 40
. withRandomDir (autogunSpread/2) . withRandomDir (autogunSpread/2)
@@ -148,19 +148,21 @@ rezGun = defaultGun
, _wpLoadedAmmo = 50 , _wpLoadedAmmo = 50
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aTeslaArc , _wpFire = shoot aTeslaArc
, _wpSpread = 0.001 , _wpSpread = 0.001
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color chartreuse $ pictures [polygon $ rectNESW 7 3 1 (-3) , _itFloorPict = onLayer FlItLayer $ color chartreuse $ pictures
[polygon $ rectNESW 7 3 1 (-3)
,polygon $ rectNESW (-1) 3 (-7) (-3) ,polygon $ rectNESW (-1) 3 (-7) (-3)
] ]
, _itAmount = 1 , _itAmount = 1
, _itMaxStack = 1 , _itMaxStack = 1
, _itAimingSpeed = 0.4 , _itAimingSpeed = 0.4
, _itAimingRange = 0 , _itAimingRange = 0
, _itEquipPict = drawWeapon $ color chartreuse $ pictures [polygon $ rectNESW 7 3 1 (-3) , _itEquipPict = drawWeapon $ color chartreuse $ pictures
[polygon $ rectNESW 7 3 1 (-3)
,polygon $ rectNESW (-1) 3 (-7) (-3) ,polygon $ rectNESW (-1) 3 (-7) (-3)
] ]
} }
@@ -171,12 +173,13 @@ teslaGun = defaultAutoGun
, _wpLoadedAmmo = 200 , _wpLoadedAmmo = 200
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aTeslaArc , _wpFire = shoot aTeslaArc
, _wpSpread = 0.001 , _wpSpread = 0.001
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color blue $ pictures [polygon $ rectNESW 7 3 1 (-3) , _itFloorPict = onLayer FlItLayer $ color blue $ pictures
[polygon $ rectNESW 7 3 1 (-3)
,polygon $ rectNESW (-1) 3 (-7) (-3) ,polygon $ rectNESW (-1) 3 (-7) (-3)
] ]
, _itAmount = 1 , _itAmount = 1
@@ -184,7 +187,8 @@ teslaGun = defaultAutoGun
, _itAimingSpeed = 0.4 , _itAimingSpeed = 0.4
, _itZoom = defaultItZoom , _itZoom = defaultItZoom
, _itAimingRange = 0 , _itAimingRange = 0
, _itEquipPict = drawWeapon $ color blue $ pictures [polygon $ rectNESW 7 3 1 (-3) , _itEquipPict = drawWeapon $ color blue $ pictures
[polygon $ rectNESW 7 3 1 (-3)
,polygon $ rectNESW (-1) 3 (-7) (-3) ,polygon $ rectNESW (-1) 3 (-7) (-3)
] ]
} }
@@ -195,8 +199,8 @@ lasGun = defaultAutoGun
, _wpLoadedAmmo = 200 , _wpLoadedAmmo = 200
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aLaser , _wpFire = shoot aLaser
, _wpSpread = 0.001 , _wpSpread = 0.001
, _wpRange = 20 , _wpRange = 20
@@ -218,8 +222,8 @@ forceFieldGun = defaultGun
, _wpLoadedAmmo = 100 , _wpLoadedAmmo = 100
, _wpReloadTime = 40 , _wpReloadTime = 40
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 10 , _itUseRate = 10
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = undefined , _wpFire = undefined
, _wpSpread = 0.02 , _wpSpread = 0.02
, _wpRange = 20 , _wpRange = 20
@@ -236,8 +240,8 @@ forceFieldGun = defaultGun
-- , _wpLoadedAmmo = 1 -- , _wpLoadedAmmo = 1
-- , _wpReloadTime = 40 -- , _wpReloadTime = 40
-- , _wpReloadState = 0 -- , _wpReloadState = 0
-- , _wpFireRate = 10 -- , _itUseRate = 10
-- , _wpFireState = 0 -- , _itUseTime = 0
-- , _wpFire = grapFire -- , _wpFire = grapFire
-- , _wpSpread = 0.002 -- , _wpSpread = 0.002
-- , _wpRange = 20 -- , _wpRange = 20
@@ -255,8 +259,8 @@ tractorGun = defaultAutoGun
, _wpLoadedAmmo = 10000 , _wpLoadedAmmo = 10000
, _wpReloadTime = 40 , _wpReloadTime = 40
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot $ aTractorBeam 0 , _wpFire = shoot $ aTractorBeam 0
, _wpSpread = 0.00001 , _wpSpread = 0.00001
, _wpRange = 20 , _wpRange = 20
@@ -274,8 +278,8 @@ launcher = defaultGun
, _wpLoadedAmmo = 30 , _wpLoadedAmmo = 30
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 20 , _itUseRate = 20
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shootWithSound (fromIntegral launcherSound) $ aRocketWithPayload makeExplosionAt , _wpFire = shootWithSound (fromIntegral launcherSound) $ aRocketWithPayload makeExplosionAt
, _wpSpread = 0.02 , _wpSpread = 0.02
, _wpRange = 20 , _wpRange = 20
@@ -305,7 +309,7 @@ teslaLauncher = launcher
bezierGun = defaultAutoGun bezierGun = defaultAutoGun
{ _itName = "B-GUN" { _itName = "B-GUN"
, _wpFire = maybeSetTarget $ \p -> , _wpFire = hammerCheck $ maybeSetTarget $ \p ->
shootWithSound 0 shootWithSound 0
. withMuzFlare . withMuzFlare
. withRecoil 40 . withRecoil 40
@@ -324,7 +328,7 @@ maybeSetTarget :: (Point2 -> Int -> World -> World) -> Int -> World -> World
maybeSetTarget f cid w = case join $ w ^? creatures . ix cid . crInv . ix itRef . itAttachment of maybeSetTarget f cid w = case join $ w ^? creatures . ix cid . crInv . ix itRef . itAttachment of
Just (ItTargetPos targetp) Just (ItTargetPos targetp)
-> f targetp cid w -> f targetp cid w
_ -> w & creatures . ix cid . crInv . ix itRef . itAttachment .~ Just (ItTargetPos mp) _ -> w & creatures . ix cid . crInv . ix itRef . itAttachment ?~ ItTargetPos mp
where where
mp = mouseWorldPos w mp = mouseWorldPos w
cr = _creatures w IM.! cid cr = _creatures w IM.! cid
@@ -345,14 +349,15 @@ shootBezier targetp cid w = over particles (theBullet :) w
cr = _creatures w IM.! cid cr = _creatures w IM.! cid
dir = _crDir cr dir = _crDir cr
startp = _crPos cr +.+ rotateV dir (_crRad cr + 1,0) startp = _crPos cr +.+ rotateV dir (_crRad cr + 1,0)
(randPos,randPos') = flip evalState (_randGen w) (randPos,randPos') = flip evalState (_randGen w) $ do
$ do a <- randInCirc 10 a <- randInCirc 10
b <- randInCirc 20 b <- randInCirc 20
return (a,b) return (a,b)
removeItAttachment :: Int -> Int -> World -> World removeItAttachment :: Int -> Int -> World -> World
removeItAttachment i _ w = w & creatures . ix i . crInv . ix itRef . itAttachment .~ Nothing removeItAttachment i _ w = w & creatures . ix i . crInv . ix itRef . itAttachment .~ Nothing
where cr = _creatures w IM.! i where
cr = _creatures w IM.! i
itRef = _crInvSel cr itRef = _crInvSel cr
remoteLauncher = defaultGun remoteLauncher = defaultGun
@@ -362,9 +367,9 @@ remoteLauncher = defaultGun
, _wpLoadedAmmo = 1 , _wpLoadedAmmo = 1
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 10 , _itUseRate = 10
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = hammerCheck $ fireRemoteLauncher , _wpFire = hammerCheck fireRemoteLauncher
, _wpSpread = 0.02 , _wpSpread = 0.02
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color cyan $ polygon $ rectNESW 5 5 (-5) (-5) , _itFloorPict = onLayer FlItLayer $ color cyan $ polygon $ rectNESW 5 5 (-5) (-5)
@@ -382,10 +387,9 @@ hvAutoGun = defaultAutoGun
, _wpLoadedAmmo = 100 , _wpLoadedAmmo = 100
, _wpReloadTime = 200 , _wpReloadTime = 200
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 25 , _itUseRate = 25
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = rateIncAB 24 10 (torqueBeforeForced 0.1 mkHvBul) , _wpFire = rateIncAB 24 10 (torqueBeforeForced 0.1 mkHvBul) $ torqueAfter 0.2 mkHvBul
$ torqueAfter 0.2 mkHvBul
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color orange $ polygon $ rectNESW 5 5 (-5) (-5) , _itFloorPict = onLayer FlItLayer $ color orange $ polygon $ rectNESW 5 5 (-5) (-5)
, _itAmount = 1 , _itAmount = 1
@@ -394,12 +398,12 @@ hvAutoGun = defaultAutoGun
, _itAimingRange = 1 , _itAimingRange = 1
, _itEquipPict = drawWeapon $ color orange $ polygon $ rectNESW 5 5 (-5) (-5) , _itEquipPict = drawWeapon $ color orange $ polygon $ rectNESW 5 5 (-5) (-5)
} }
where mkHvBul = withSound (fromIntegral longGunSound) where
mkHvBul = withSound (fromIntegral longGunSound)
. withThinSmoke . withThinSmoke
. withMuzFlare . withMuzFlare
. withVelWthHiteff (80,0) 6 . withVelWthHiteff (80,0) 6
$ penWalls $ penWalls hvBulHitCr' hvBulHitWall' bulHitFF'
hvBulHitCr' hvBulHitWall' bulHitFF'
ltAutoGun = defaultAutoGun ltAutoGun = defaultAutoGun
{ _itName = "AUTO-LT" { _itName = "AUTO-LT"
@@ -408,8 +412,8 @@ ltAutoGun = defaultAutoGun
, _wpLoadedAmmo = 25 , _wpLoadedAmmo = 25
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 4 , _itUseRate = 4
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shootWithSound 0 . withRandomDir 0.3 . withSidePush 50 , _wpFire = shootWithSound 0 . withRandomDir 0.3 . withSidePush 50
. withMuzFlare $ withVelWthHiteff (30,0) 2 basicBulletEffect . withMuzFlare $ withVelWthHiteff (30,0) 2 basicBulletEffect
, _wpSpread = 0.5 , _wpSpread = 0.5
@@ -433,8 +437,8 @@ miniGun = defaultAutoGun
, _wpLoadedAmmo = 150 , _wpLoadedAmmo = 150
, _wpReloadTime = 200 , _wpReloadTime = 200
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 2 , _itUseRate = 2
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = withWarmUp 50 . torqueBefore 0.03 . withSidePush 50 . withRecoil 15 , _wpFire = withWarmUp 50 . torqueBefore 0.03 . withSidePush 50 . withRecoil 15
. withRandomDir 0.1 . withRandomDir 0.1
. withRandomOffset 9 . withRandomOffset 9
@@ -456,42 +460,21 @@ spreadGun = defaultGun
, _wpLoadedAmmo = 5 , _wpLoadedAmmo = 5
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 20 , _itUseRate = 20
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shootWithSound (fromIntegral shotgunSound) , _wpFire = shootWithSound (fromIntegral shotgunSound)
. withRecoil 100 . withRecoil 100
. withMuzFlare . withMuzFlare
$ spreadNumVelWthHiteff spreadGunSpread 9 (30,0) 2 basicBulletEffect $ spreadNumVelWthHiteff spreadGunSpread 9 (30,0) 2 basicBulletEffect
, _wpSpread = spreadGunSpread , _wpSpread = spreadGunSpread
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color green $ pictures [ polygon [(-3,0),(3,6),(3,-6)] , _itFloorPict = onLayer FlItLayer $ color green $ pictures [ polygon [(-3,0),(3,6),(3,-6)] ]
]
, _itAmount = 1 , _itAmount = 1
, _itMaxStack = 1 , _itMaxStack = 1
, _itAimingSpeed = 1 , _itAimingSpeed = 1
, _itAimingRange = 0 , _itAimingRange = 0
, _itEquipPict = drawWeapon $ color green $ pictures [ polygon [(-3,0),(3,6),(3,-6)] , _itEquipPict = drawWeapon $ color green $ pictures [ polygon [(-3,0),(3,6),(3,-6)] ]
]
} }
-- shatterGun = defaultGun
-- { _itName = "shatterGun"
-- , _itIdentity = ShatterGun
-- , _wpMaxAmmo = 50
-- , _wpLoadedAmmo = 50
-- , _wpReloadTime = 80
-- , _wpReloadState = 0
-- , _wpFireRate = 40
-- , _wpFireState = 0
-- , _wpFire = shatterGunFire
-- , _wpSpread = 3.14
-- , _wpRange = 20
-- , _wpIsAuto = False
-- , _itFloorPict = polygon [(-4,-4),(-4,4),(4,4),(4,0),(0,0),(0,-4)]
-- , _itAmount = 1
-- , _itMaxStack = 1
-- , _itAimingSpeed = 1
-- , _itAimingRange = 0.5
-- }
multGun = defaultGun multGun = defaultGun
{ _itName = "MULTGUN" { _itName = "MULTGUN"
, _itIdentity = MultGun , _itIdentity = MultGun
@@ -499,23 +482,24 @@ multGun = defaultGun
, _wpLoadedAmmo = 2 , _wpLoadedAmmo = 2
, _wpReloadTime = 40 , _wpReloadTime = 40
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 20 , _itUseRate = 20
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shootWithSound (fromIntegral shotgunSound) , _wpFire = shootWithSound (fromIntegral shotgunSound)
. withRecoil 200 . withRecoil 200
. withMuzFlare . withMuzFlare
$ numVelWthHitEff 5 (50,0) 5 basicBulletEffect $ numVelWthHitEff 5 (50,0) 5 basicBulletEffect
, _wpSpread = spreadGunSpread , _wpSpread = spreadGunSpread
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ multGunPic , _itFloorPict = onLayer FlItLayer multGunPic
, _itAmount = 1 , _itAmount = 1
, _itMaxStack = 1 , _itMaxStack = 1
, _itAimingSpeed = 0.4 , _itAimingSpeed = 0.4
, _itAimingRange = 1 , _itAimingRange = 1
, _itZoom = defaultItZoom {_itAimZoomFac = 1.5} , _itZoom = defaultItZoom {_itAimZoomFac = 1.5}
, _itEquipPict = drawWeapon $ multGunPic , _itEquipPict = drawWeapon multGunPic
} }
where multGunPic = color red $ pictures where
multGunPic = color red $ pictures
[ polygon $ rectNSEW 12 8 2 (-2) [ polygon $ rectNSEW 12 8 2 (-2)
, polygon $ rectNSEW 7 3 2 (-2) , polygon $ rectNSEW 7 3 2 (-2)
, polygon $ rectNSEW 2 (-2) 2 (-2) , polygon $ rectNSEW 2 (-2) 2 (-2)
@@ -530,16 +514,14 @@ longGun = defaultGun
, _wpLoadedAmmo = 1 , _wpLoadedAmmo = 1
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 100 , _itUseRate = 100
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shootWithSound (fromIntegral longGunSound) , _wpFire = shootWithSound (fromIntegral longGunSound)
. withThickSmoke . withThickSmoke
. torqueAfter 0.05 . torqueAfter 0.05
. withMuzFlare . withMuzFlare
. withVelWthHiteff (60,0) 6 . withVelWthHiteff (60,0) 6
$ penWalls hvBulHitCr' hvBulHitWall' bulHitFF' $ penWalls hvBulHitCr' hvBulHitWall' bulHitFF'
, _wpSpread = 0.0
, _wpRange = 200 , _wpRange = 200
, _itFloorPict = onLayer FlItLayer $ pictures [color orange $ polygon $ rectNESW 3 6 (-3) (-6) ] , _itFloorPict = onLayer FlItLayer $ pictures [color orange $ polygon $ rectNESW 3 6 (-3) (-6) ]
, _itAmount = 1 , _itAmount = 1
@@ -568,9 +550,9 @@ poisonSprayer = defaultAutoGun
, _wpLoadedAmmo = 500 , _wpLoadedAmmo = 500
, _wpReloadTime = 100 , _wpReloadTime = 100
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot $ aGasCloud , _wpFire = shoot aGasCloud
, _wpSpread = 0.3 , _wpSpread = 0.3
, _wpRange = 8 , _wpRange = 8
, _itFloorPict = onLayer FlItLayer $ color yellow $ polygon $ rectNESW 4 4 (-4) (-4) , _itFloorPict = onLayer FlItLayer $ color yellow $ polygon $ rectNESW 4 4 (-4) (-4)
@@ -589,8 +571,8 @@ flamer = defaultAutoGun
, _wpLoadedAmmo = 250 , _wpLoadedAmmo = 250
, _wpReloadTime = 100 , _wpReloadTime = 100
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot $ withSidePush 5 $ withSidePushAfter 10 $ randWalkAngle 0.5 0.05 aFlame , _wpFire = shoot $ withSidePush 5 $ withSidePushAfter 10 $ randWalkAngle 0.5 0.05 aFlame
, _wpSpread = 0 , _wpSpread = 0
, _wpRange = 8 , _wpRange = 8
@@ -610,8 +592,8 @@ blinkGun = defaultGun
, _wpLoadedAmmo = 100 , _wpLoadedAmmo = 100
, _wpReloadTime = 20 , _wpReloadTime = 20
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 0 , _itUseRate = 0
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aSelf , _wpFire = shoot aSelf
, _wpSpread = 0.05 , _wpSpread = 0.05
, _wpRange = 20 , _wpRange = 20
@@ -640,34 +622,15 @@ aTeslaArc' cid w =
(sideOffset,g) = randomR (-5,5) $ _randGen w (sideOffset,g) = randomR (-5,5) $ _randGen w
dir = _crDir cr dir = _crDir cr
aLaser :: Int -> World -> World
aLaser cid w = over particles ((makeLaserAt phaseV pos dir (Just cid)) : )
$ soundFrom LasSound 24 1 0
$ laserGunFlashAt (pos +.+ 5 *.* unitVectorAtAngle dir)
w
where
cr = (_creatures w IM.! cid)
i = newProjectileKey w
pos = _crPos cr +.+ ((_crRad cr +3) *.* unitVectorAtAngle dir)
dir = _crDir cr
phaseV = charToPhaseV $ fromMaybe '/' $ Seq.lookup 0 =<< cr ^? crInv . ix j . itAttachment . _Just . itCharMode
j = _crInvSel cr
charToPhaseV 'V' = 0.2
charToPhaseV '/' = 1
charToPhaseV 'Z' = 5
aRocketWithPayload aRocketWithPayload
:: (Point2 -> World -> World) :: (Point2 -> World -> World) -- ^ Payload
-- ^ Payload
-> Int -- ^ Creature id -> Int -- ^ Creature id
-> World -> World
-> World -> World
aRocketWithPayload pl cid w = over projectiles (IM.insert i theShell) w aRocketWithPayload pl cid w = over projectiles (IM.insert i theShell) w
where where
i = newProjectileKey w i = newProjectileKey w
cr = (_creatures w IM.! cid) cr = _creatures w IM.! cid
pos = _crPos cr +.+ ((_crRad cr +1) *.* unitVectorAtAngle dir) pos = _crPos cr +.+ ((_crRad cr +1) *.* unitVectorAtAngle dir)
dir = _crDir cr dir = _crDir cr
theShell = makeShellAt pl i cid pos dir theShell = makeShellAt pl i cid pos dir
@@ -717,9 +680,9 @@ moveShell time i cid rot accel w
& projectiles . ix i . pjPos %~ (+.+ vel) & projectiles . ix i . pjPos %~ (+.+ vel)
& randGen .~ g & randGen .~ g
& projectiles . ix i . pjPict .~ pic & projectiles . ix i . pjPict .~ pic
& projectiles . ix i . pjUpdate .~ (moveShell (time-1) i cid rot (rotateV rot accel)) & projectiles . ix i . pjUpdate .~ moveShell (time-1) i cid rot (rotateV rot accel)
& projectiles . ix i . pjVel %~ (\v -> accel +.+ frict *.* v) & projectiles . ix i . pjVel %~ (\v -> accel +.+ frict *.* v)
& soundFromPos (ShellSound i) newPos (fromIntegral smokeTrailSound) (1) 250 & soundFromPos (ShellSound i) newPos (fromIntegral smokeTrailSound) 1 250
& makeFlameletTimed (oldPos -.- vel) (vel +.+ rotateV (pi+sparkD) accel) Nothing 3 10 & makeFlameletTimed (oldPos -.- vel) (vel +.+ rotateV (pi+sparkD) accel) Nothing 3 10
& smokeGen & smokeGen
| time > -200 = w | time > -200 = w
@@ -739,41 +702,42 @@ moveShell time i cid rot accel w
newPos = oldPos +.+ vel newPos = oldPos +.+ vel
(frict,g) = randomR (0.6,0.9) $ _randGen w (frict,g) = randomR (0.6,0.9) $ _randGen w
(sparkD,_) = randomR (-0.2,0.2) $ _randGen w (sparkD,_) = randomR (-0.2,0.2) $ _randGen w
dir = argV $ vel dir = argV vel
pic = onLayer PtLayer $ uncurry translate newPos $ rotate (argV accel) shellPic pic = onLayer PtLayer $ uncurry translate newPos $ rotate (argV accel) shellPic
piclow = onLayerL [levLayer CrLayer - 2] piclow = onLayerL [levLayer CrLayer - 2]
$ uncurry translate newPos $ rotate (argV accel) shellPic $ uncurry translate newPos $ rotate (argV accel) shellPic
hitCr = fmap fst $ collideCircCrsPoint oldPos newPos 4 w hitCr = fst <$> collideCircCrsPoint oldPos newPos 4 w
hitWl = fmap fst $ collideCircWalls' oldPos newPos 2 $ wallsNearPoint newPos w hitWl = fst <$> collideCircWalls' oldPos newPos 2 (wallsNearPoint newPos w)
thingHit = hitCr <|> hitWl thingHit = hitCr <|> hitWl
spin = case w ^? creatures . ix cid of spin = case w ^? creatures . ix cid of
Just cr -> min 0.2 $ max (-0.2) Just cr -> min 0.2 $ max (-0.2) $ normalizeAnglePi (dir - _crDir cr) / 20
$ (normalizeAnglePi (dir - _crDir cr)) / 20
_ -> 0 _ -> 0
r1 = _randGen w & evalState (randInCirc 10) r1 = randInCirc 10 & evalState $ _randGen w
smokeGen = makeSmokeCloudAt (oldPos +.+ r1 +.+ 30 *.* (normalizeV (oldPos -.- newPos))) smokeGen = makeSmokeCloudAt (oldPos +.+ r1 +.+ 30 *.* normalizeV (oldPos -.- newPos))
normalizeAnglePi angle | normalizeAngle angle > pi = normalizeAngle angle - 2*pi normalizeAnglePi angle
| normalizeAngle angle > pi = normalizeAngle angle - 2*pi
| otherwise = normalizeAngle angle | otherwise = normalizeAngle angle
shellPic = color black $ polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)] shellPic = color black $ polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)]
remoteShellPic :: Int -> Picture remoteShellPic :: Int -> Picture
remoteShellPic i | rem (i+200) 20 < 9 = polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)] remoteShellPic i
| otherwise = pictures [ polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)] | rem (i+200) 20 < 9 = polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)]
| otherwise = pictures
[ polygon [(-6,4),(-6,-4),(6,-4),(8,0),(6,4)]
, color col $ circleSolid 3 , color col $ circleSolid 3
] ]
where col | i > (-99) = green where
col | i > (-99) = green
| otherwise = red | otherwise = red
shellExplosionAt = makeExplosionAt shellExplosionAt = makeExplosionAt
aGasCloud :: Int -> World -> World aGasCloud :: Int -> World -> World
aGasCloud cid w aGasCloud cid w = insertCloud $ set randGen g w
= insertCloud $ set randGen g $
w
where where
(a,g) = randomR (-0.1,0.1) (_randGen w) (a,g) = randomR (-0.1,0.1) (_randGen w)
cr = (_creatures w IM.! cid) cr = _creatures w IM.! cid
dir = _crDir cr + a dir = _crDir cr + a
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr)) pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
pos2 = (0.5 *.* vel) +.+ pos2 = (0.5 *.* vel) +.+
@@ -785,7 +749,7 @@ aFlame :: Int -> World -> World
aFlame cid w = insertFlame w aFlame cid w = insertFlame w
where where
(t,_) = randomR (99,101) (_randGen w) (t,_) = randomR (99,101) (_randGen w)
cr = (_creatures w IM.! cid) cr = _creatures w IM.! cid
dir = _crDir cr dir = _crDir cr
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr)) pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
vel = (_crPos cr -.- _crOldPos cr) +.+ 4 *.* unitVectorAtAngle dir vel = (_crPos cr -.- _crOldPos cr) +.+ 4 *.* unitVectorAtAngle dir
@@ -797,17 +761,18 @@ aSelf = blinkAction
reflect :: Float -> Float -> Float reflect :: Float -> Float -> Float
reflect a b = a + 2*(a-b) reflect a b = a + 2*(a-b)
moveGrenade :: Int -> Float -> Int -> World -> World moveGrenade
:: Int -- ^ Timer
-> Float -- ^ Direction
-> Int -- ^ Projectile id
-> World -> World
moveGrenade 0 dir pID w = over projectiles (IM.delete pID) moveGrenade 0 dir pID w = over projectiles (IM.delete pID)
$ explosion (_pjPos (_projectiles w IM.! pID)) $ explosion (_pjPos (_projectiles w IM.! pID))
-- set (pointToItem (_itemPositions w IM.! wpID) . itEquipPict)
-- (drawWeapon $ grenadePic 50)
w w
where where
pj = _projectiles w IM.! pID pj = _projectiles w IM.! pID
explosion = _pjPayload pj explosion = _pjPayload pj
moveGrenade time dir pID w moveGrenade time dir pID w = case hitWl of
= case hitWl of
Just _ -> soundOnce (fromIntegral tapQuiet) updatedWorld Just _ -> soundOnce (fromIntegral tapQuiet) updatedWorld
_ -> updatedWorld _ -> updatedWorld
where where
@@ -820,44 +785,40 @@ moveGrenade time dir pID w
oldPos = _pjPos pj oldPos = _pjPos pj
newPos = _pjVel pj +.+ oldPos newPos = _pjVel pj +.+ oldPos
hitWl = collideCircWalls' oldPos newPos 4 $ wallsNearPoint newPos w hitWl = collideCircWalls' oldPos newPos 4 $ wallsNearPoint newPos w
finalPos = fromMaybe newPos (fmap fst hitWl) finalPos = maybe newPos fst hitWl
setV v = set (projectiles .ix pID.pjVel) v setV v = set (projectiles .ix pID.pjVel) v
updateV = fromMaybe id (fmap (setV.snd) hitWl) updateV = maybe id (setV . snd) hitWl
pointToItem (InInv cid invid) = creatures . ix cid . crInv . ix invid pointToItem (InInv cid invid) = creatures . ix cid . crInv . ix invid
pointToItem (OnFloor flid) = floorItems . ix flid . flIt pointToItem (OnFloor flid) = floorItems . ix flid . flIt
retireRemoteRocket :: Int -> Int -> Int -> World -> World retireRemoteRocket :: Int -> Int -> Int -> World -> World
retireRemoteRocket itid 0 pjid w retireRemoteRocket itid 0 pjid w =
= set (pointToItem (_itemPositions w IM.! itid) . itAttachment . _Just . scopePos) set (pointToItem (_itemPositions w IM.! itid) . itAttachment . _Just . scopePos) (0,0)
(0,0) $ set (pointToItem (_itemPositions w IM.! itid) . wpFire) (hammerCheck fireRemoteLauncher)
$ set (pointToItem (_itemPositions w IM.! itid) . wpFire)
(hammerCheck fireRemoteLauncher)
(w & projectiles %~ IM.delete pjid) (w & projectiles %~ IM.delete pjid)
retireRemoteRocket itid t pjid w = setScope w & projectiles . ix pjid . pjUpdate .~ retireRemoteRocket itid (t-1) pjid retireRemoteRocket itid t pjid w = setScope w
& projectiles . ix pjid . pjUpdate .~ retireRemoteRocket itid (t-1) pjid
where where
setScope w' = case _itemPositions w' IM.! itid of setScope w' = case _itemPositions w' IM.! itid of
InInv cid invid InInv cid invid -> w'
-> w' & creatures . ix cid . crInv . ix invid . itAttachment & creatures . ix cid . crInv . ix invid . itAttachment
. _Just . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid)) . _Just . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid))
_ -> w' _ -> w'
pos = fromMaybe (0,0) $ w ^? projectiles . ix pjid . pjPos pos = fromMaybe (0,0) $ w ^? projectiles . ix pjid . pjPos
retireRemoteBomb :: Int -> Int -> Int -> World -> World retireRemoteBomb :: Int -> Int -> Int -> World -> World
retireRemoteBomb itid 0 pjid w retireRemoteBomb itid 0 pjid w =
= set (pointToItem (_itemPositions w IM.! itid) . itAttachment . _Just . scopePos) set (pointToItem (_itemPositions w IM.! itid) . itAttachment . _Just . scopePos) (0,0)
(0,0) $ set (pointToItem (_itemPositions w IM.! itid) . itZoom) defaultItZoom
$ set (pointToItem (_itemPositions w IM.! itid) . itZoom) $ set (pointToItem (_itemPositions w IM.! itid) . twFire) (hammerCheck throwRemoteBomb)
defaultItZoom
$ set (pointToItem (_itemPositions w IM.! itid) . twFire)
(hammerCheck throwRemoteBomb)
(w & projectiles %~ IM.delete pjid) (w & projectiles %~ IM.delete pjid)
retireRemoteBomb itid t pjid w retireRemoteBomb itid t pjid w = setScope w
= setScope w & projectiles . ix pjid . pjUpdate .~ retireRemoteBomb itid (t-1) pjid & projectiles . ix pjid . pjUpdate .~ retireRemoteBomb itid (t-1) pjid
where where
setScope w' = case _itemPositions w' IM.! itid of setScope w' = case _itemPositions w' IM.! itid of
InInv cid invid InInv cid invid -> w'
-> w' & creatures . ix cid . crInv . ix invid . itAttachment & creatures . ix cid . crInv . ix invid . itAttachment
. _Just . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid)) . _Just . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid))
_ -> w' _ -> w'
pos = fromMaybe (0,0) $ w ^? projectiles . ix pjid . pjPos pos = fromMaybe (0,0) $ w ^? projectiles . ix pjid . pjPos
@@ -893,180 +854,25 @@ moveRemoteBomb itid time pID w
pj = _projectiles w IM.! pID pj = _projectiles w IM.! pID
oldPos = _pjPos pj oldPos = _pjPos pj
newPos = _pjVel pj +.+ oldPos newPos = _pjVel pj +.+ oldPos
-- this is hacky, should use a version of collidePointWalls' that collides -- this is hacky, should use a version of collidePointWalls' that collides
-- circles and walls -- circles and walls
invShift x = x -.- 5 *.* normalizeV (_pjVel pj) invShift x = x -.- 5 *.* normalizeV (_pjVel pj)
hitWl = collideCircWalls' oldPos newPos 4 $ wallsNearPoint newPos w hitWl = collideCircWalls' oldPos newPos 4 $ wallsNearPoint newPos w
finalPos = fromMaybe newPos (fmap (invShift . fst) hitWl) finalPos = maybe newPos (invShift . fst) hitWl
setV v = set (projectiles .ix pID.pjVel) v setV v = set (projectiles . ix pID . pjVel) v
updateV = fromMaybe id (fmap (setV.snd) hitWl) updateV = maybe id (setV . snd) hitWl
halfV = over (projectiles . ix pID . pjVel) (\v -> 0.5 *.* v) halfV = projectiles . ix pID . pjVel %~ (0.5 *.*)
f x | x < -369 = -10 f x | x < -369 = -10
| otherwise = x - 1 | otherwise = x - 1
updatePicture = set (projectiles . ix pID.pjPict) updatePicture =
(onLayer PtLayer $ uncurry translate newPos set (projectiles . ix pID.pjPict)
$ remoteBombPic time) (onLayer PtLayer $ uncurry translate newPos $ remoteBombPic time)
. lowLightDirected (withAlpha 0.1 red) newPos . lowLightDirected
(withAlpha 0.1 red)
newPos
(50 *.* unitVectorAtAngle (negate $ degToRad (10 * fromIntegral time))) (50 *.* unitVectorAtAngle (negate $ degToRad (10 * fromIntegral time)))
[-0.2,-0.15,-0.1,-0.05,0,0.05,0.1,0.15,0.2] [-0.2,-0.15,-0.1,-0.05,0,0.05,0.1,0.15,0.2]
shootRateIncrease :: Int -> Int -> (Int -> World -> World) -> Int -> World -> World
shootRateIncrease startRate fastRate shootEffect cid w
| repeatFire = set (pointItem . wpFireRate) (max fastRate (currentRate - 1))
$ set (pointItem . wpFireState) currentRate
$ shootEffect cid
w
| firstFire = set (pointItem . wpFireRate) (startRate - 1)
$ set (pointItem . wpFireState) startRate
$ shootEffect cid
w
| reloadCondition = fromMaybe w $ reloadWeapon cid w
| otherwise = w
where cr = _creatures w IM.! cid
itRef = _crInvSel cr
item = _crInv cr IM.! itRef
pointItem = (creatures . ix cid . crInv . ix itRef)
currentRate = _wpFireRate item
repeatFire = _wpReloadState item == 0
&& _wpFireState item == 1
&& _wpLoadedAmmo item > 0
firstFire = _wpReloadState item == 0
&& _wpFireState item == 0
&& _wpLoadedAmmo item > 0
reloadCondition = _wpLoadedAmmo item == 0
rateIncAB :: Int -> Int -> (Int -> World -> World)
-> (Int -> World -> World)
-> Int -> World -> World
rateIncAB startRate fastRate shooteff1 shooteff2 cid w
| repeatFire = set (pointItem . wpFireRate) (max fastRate (currentRate - 1))
$ over (pointItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointItem . wpFireState) currentRate
$ shooteff2 cid
w
| firstFire = set (pointItem . wpFireRate) (startRate - 1)
$ over (pointItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointItem . wpFireState) startRate
$ shooteff1 cid
w
| reloadCondition = fromMaybe w $ reloadWeapon cid w
| otherwise = w
where cr = _creatures w IM.! cid
itRef = _crInvSel cr
item = _crInv cr IM.! itRef
pointItem = (creatures . ix cid . crInv . ix itRef)
currentRate = _wpFireRate item
repeatFire = _wpReloadState item == 0
&& _wpFireState item == 1
&& _wpLoadedAmmo item > 0
firstFire = _wpReloadState item == 0
&& _wpFireState item == 0
&& _wpLoadedAmmo item > 0
reloadCondition = _wpLoadedAmmo item == 0
makeLaserAt :: Float -> Point2 -> Float -> Maybe Int -> Particle
makeLaserAt phaseV pos dir mcid = Particle
{ _ptDraw = const blank
, _ptUpdate' = moveLaser phaseV pos dir mcid
}
moveLaser
:: Float -- ^ Phase velocity, controls deflection in windows
-> Point2
-> Float
-> Maybe Int
-> World
-> Particle
-> (World, Maybe Particle)
moveLaser phaseV pos dir mcid w pt
= ( set randGen g
-- $ over worldEvents ((.) flares)
$ hitEffect w
, Just pt {_ptDraw = const $ onLayer PtLayer $ pic
,_ptUpdate' = ptTimer' 0
}
)
where
xp = pos +.+ 800 *.* unitVectorAtAngle dir
(a,g) = randomR (-0.7,0.7) $ _randGen w
reflectDir wall = a + (argV $ reflectIn
(_wlLine wall !! 1 -.- _wlLine wall !! 0)
(xp -.- pos)
)
(colID,_) = randomR (0,11) $ _randGen w
-- flares w = foldr (\p w' -> flareAt' yellow 0.01 0.02 p w') w flarePs
-- flarePs = zipWith (\x y -> x +.+ 5 *.* normalizeV (y -.- x)) ps $ tail ps
-- flarePos p = p +.+ ((a + 0.8) * 3) *.* (normalizeV (pos -.- p))
f :: [Wall] -> Point2 -> Point2 -> (Maybe (Point2,Either3 Creature Wall ForceField),[Point2])
f seenWs x y = case listToMaybe $ filter (h' seenWs)
$ thingsHitExceptCrLongLine Nothing x y w of
Just (p,E3x2 wl)
| _wlIsSeeThrough wl -> f' p $ f (wl:seenWs)
p
(h x y wl p)
| otherwise -> (Just (p,E3x2 wl), [p])
Just (p,obj) -> (Just (p,obj), [p])
Nothing -> (Nothing, [y])
f' p (x,ps') = (x,p:ps')
h x y wl p | isEntering = p +.+ rotateV angleRef normalDist
| otherwise = p +.+ rotateV angleRef' normalDist'
where wlNormal = vNormal $ (_wlLine wl !! 1) -.- (_wlLine wl !! 0)
normalDist = magV (p -.- y) *.* normalizeV wlNormal
angleInc = piRange $ argV wlNormal - argV (x -.- y)
angleRef | reflectExternal = angleInc
| otherwise = asin $ sin angleInc / phaseV
piRange a | a > pi = a - 2 * pi
| a > 0 - pi = a
| otherwise = a + 2 * pi
isEntering = isLeftOf (x -.- y) ((_wlLine wl !! 1) -.- (_wlLine wl !! 0))
wlNormal' = vNormal $ (_wlLine wl !! 0) -.- (_wlLine wl !! 1)
normalDist' = magV (p -.- y) *.* normalizeV wlNormal'
angleInc' = piRange $ argV wlNormal' - argV (x -.- y)
angleRef' | reflectInternal = angleInc'
| otherwise = asin $ phaseV * sin angleInc'
reflectInternal = 1 < abs (phaseV * sin angleInc')
reflectExternal = 1 < abs (sin angleInc / phaseV)
h' ws (_,E3x2 wl) = not $ any (\w -> _wlID w == _wlID wl) ws
h' _ _ = True
(thHit, ps) = f [] pos xp
hitEffect
= case thHit of
Just (p,E3x1 cr)
-> over (creatures . ix (_crID cr) . crState . crDamage) ((:) $ Lasering 19 pos p xp)
-- . over worldEvents ((.) $ flareAt yellow (flarePos p))
Just (p,E3x2 wl) -> createSpark 8 colID (p +.+ safeNormalizeV (pos -.- p))
(reflectDir wl) Nothing
_ -> id
pic = pictures [ fadeLine pos (head ps) 0.2 40 yellow
, setLayer 1 $ color (withAlpha 0.9 white) $ vThickLine (pos:ps)
, setLayer 1 $ color (withAlpha 0.5 yellow) $ vvThickLine (pos:ps)
]
fadeLine :: Point2 -> Point2 -> Float -> Float -> Color -> Picture
fadeLine sp ep alph width col = setLayer 1 $
polygonCol [(sp , ca)
,(sp +.+ n , cb)
,(ep +.+ n , cb)
,(ep , ca)
,(ep -.- n , cb)
,(sp -.- n , cb)
]
where n = width *.* (normalizeV $ vNormal $ ep -.- sp)
ca = withAlpha alph col
cb = withAlpha 0 col
-- pictures [color (withAlpha (0.8 * alph) col) $ lineOfThickness width [sp,p 0.25]
-- ,color (withAlpha (0.6 * alph) col) $ lineOfThickness width [p 0.25,p 0.5]
-- ,color (withAlpha (0.4 * alph) col) $ lineOfThickness width [p 0.5,p 0.75]
-- ,color (withAlpha (0.2 * alph) col) $ lineOfThickness width [p 0.75,ep]
-- ]
-- where p x = sp +.+ x *.* (ep -.- sp)
grenadeLauncher :: Item
grenadeLauncher = pistol
grenade,remoteBomb :: Item grenade,remoteBomb :: Item
grenade = Throwable grenade = Throwable
{ _itName = "GRENADE " ++ show fuseTime { _itName = "GRENADE " ++ show fuseTime
@@ -1076,60 +882,74 @@ grenade = Throwable
, _itFloorPict = onLayer FlItLayer $ polygon [(-3,-3),(-3,3),(3,3),(3,-3)] , _itFloorPict = onLayer FlItLayer $ polygon [(-3,-3),(-3,3),(3,3),(3,-3)]
, _twMaxRange = 150 , _twMaxRange = 150
, _twAccuracy = 30 , _twAccuracy = 30
, _twFire = throwGrenade' makeExplosionAt fuseTime , _twFire = useTimeCheck $ throwGrenade makeExplosionAt fuseTime
, _itAimingSpeed = 1 , _itAimingSpeed = 1
, _itAimingRange = 0 , _itAimingRange = 0
, _itZoom = defaultItZoom {_itAimZoomMax = (f fuseTime), _itAimZoomMin = (f fuseTime)} , _itZoom = defaultItZoom {_itAimZoomMax = f fuseTime, _itAimZoomMin = f fuseTime}
, _itEquipPict = drawWeapon $ grenadePic fuseTime , _itEquipPict = drawWeapon $ grenadePic fuseTime
, _itID = Nothing , _itID = Nothing
, _itUseRate = 50
, _itUseTime = 0
, _itAttachment = Just $ ItFuse fuseTime , _itAttachment = Just $ ItFuse fuseTime
, _itInvColor = white , _itInvColor = white
, _itInvDisplay = _itName , _itInvDisplay = basicWeaponDisplay
, _itEffect = wpRecock , _itEffect = wpRecock
, _itHammer = HammerUp , _itHammer = HammerUp
, _itScrollUp = decreaseFuse fuseTime , _itScrollUp = decreaseFuse fuseTime
, _itScrollDown = increaseFuse fuseTime , _itScrollDown = increaseFuse fuseTime
} }
where fuseTime = 50 where
fuseTime = 50
f x = 50 / fromIntegral x f x = 50 / fromIntegral x
flameGrenade :: Item flameGrenade :: Item
flameGrenade = grenade { flameGrenade = grenade {
_itName = "FLMGREN " ++ show fuseTime _itName = "FLMGREN " ++ show fuseTime
, _twFire = throwGrenade' makeFlameExplosionAt fuseTime , _twFire = throwGrenade makeFlameExplosionAt fuseTime
} }
where fuseTime = 50 where
fuseTime = 50
f x = 50 / fromIntegral x f x = 50 / fromIntegral x
teslaGrenade :: Item teslaGrenade :: Item
teslaGrenade = grenade { teslaGrenade = grenade {
_itName = "TLSGREN " ++ show fuseTime _itName = "TLSGREN " ++ show fuseTime
, _twFire = throwGrenade' makeTeslaExplosionAt fuseTime , _twFire = throwGrenade makeTeslaExplosionAt fuseTime
} }
where fuseTime = 50 where
fuseTime = 50
f x = 50 / fromIntegral x f x = 50 / fromIntegral x
increaseFuse
increaseFuse :: Int -> Int -> World -> World :: Int -- ^ Old fuse time
increaseFuse fuse i w = w & creatures . ix 0 . crInv . ix itRef . itScrollUp .~ decreaseFuse newTime -> Int -- ^ Inventory item reference (I believe)
-> World
-> World
increaseFuse fuse i w = w
& creatures . ix 0 . crInv . ix itRef . itScrollUp .~ decreaseFuse newTime
& creatures . ix 0 . crInv . ix itRef . itScrollDown .~ increaseFuse newTime & creatures . ix 0 . crInv . ix itRef . itScrollDown .~ increaseFuse newTime
& creatures . ix 0 . crInv . ix itRef . itName .~ "GRENADE " ++ show newTime & creatures . ix 0 . crInv . ix itRef . itName .~ "GRENADE " ++ show newTime
& creatures . ix 0 . crInv . ix itRef . itAttachment .~ Just (ItFuse newTime) & creatures . ix 0 . crInv . ix itRef . itAttachment ?~ ItFuse newTime
& creatures . ix 0 . crInv . ix itRef . itZoom & creatures . ix 0 . crInv . ix itRef . itZoom
.~ (defaultItZoom {_itAimZoomMax = zm, _itAimZoomMin = zm}) .~ (defaultItZoom {_itAimZoomMax = zm, _itAimZoomMin = zm})
where itRef = fromMaybe (-2) $ w ^? creatures . ix 0 . crInvSel where
itRef = fromMaybe (-2) $ w ^? creatures . ix 0 . crInvSel
newTime = min (fuse + 5) 90 newTime = min (fuse + 5) 90
zm = 50 / fromIntegral newTime zm = 50 / fromIntegral newTime
decreaseFuse :: Int -> Int -> World -> World decreaseFuse
decreaseFuse fuse i w = w & creatures . ix 0 . crInv . ix itRef . itScrollUp .~ decreaseFuse newTime :: Int -- ^ Old fuse time
-> Int -- ^ Inventory item reference (I believe)
-> World -> World
decreaseFuse fuse i w = w
& creatures . ix 0 . crInv . ix itRef . itScrollUp .~ decreaseFuse newTime
& creatures . ix 0 . crInv . ix itRef . itScrollDown .~ increaseFuse newTime & creatures . ix 0 . crInv . ix itRef . itScrollDown .~ increaseFuse newTime
& creatures . ix 0 . crInv . ix itRef . itName .~ "GRENADE " ++ show newTime & creatures . ix 0 . crInv . ix itRef . itName .~ "GRENADE " ++ show newTime
& creatures . ix 0 . crInv . ix itRef . itAttachment .~ Just (ItFuse newTime) & creatures . ix 0 . crInv . ix itRef . itAttachment ?~ ItFuse newTime
& creatures . ix 0 . crInv . ix itRef . itZoom & creatures . ix 0 . crInv . ix itRef . itZoom
.~ (defaultItZoom {_itAimZoomMax = zm, _itAimZoomMin = zm}) .~ (defaultItZoom {_itAimZoomMax = zm, _itAimZoomMin = zm})
where itRef = fromMaybe (-2) $ w ^? creatures . ix 0 . crInvSel where
itRef = fromMaybe (-2) $ w ^? creatures . ix 0 . crInvSel
newTime = max (fuse - 5) 20 newTime = max (fuse - 5) 20
zm = 50 / fromIntegral newTime zm = 50 / fromIntegral newTime
@@ -1142,14 +962,13 @@ remoteBomb = defaultThrowable
, _itFloorPict = onLayer FlItLayer $ polygon [(-3,-3),(-3,3),(3,3),(3,-3)] , _itFloorPict = onLayer FlItLayer $ polygon [(-3,-3),(-3,3),(3,3),(3,-3)]
, _twMaxRange = 150 , _twMaxRange = 150
, _twAccuracy = 30 , _twAccuracy = 30
, _twFire = hammerCheck $ throwRemoteBomb , _twFire = hammerCheck throwRemoteBomb
, _itAttachment = Just $ ItScope (0,0) 0 1 True , _itAttachment = Just $ ItScope (0,0) 0 1 True
, _itEquipPict = drawWeapon remoteBombUnarmedPic , _itEquipPict = drawWeapon remoteBombUnarmedPic
} }
throwGrenade :: (Point2 -> World -> World) -> Int -> Int -> World -> World
throwGrenade' :: (Point2 -> World -> World) -> Int -> Int -> World -> World throwGrenade explosion fuseTime n w = setWp $ removePict $ over projectiles addG $ set randGen g w
throwGrenade' explosion fuseTime n w = setWp $ removePict $ over projectiles addG $ set randGen g w
where where
addG = IM.insert i $ Shell addG = IM.insert i $ Shell
{ _pjPos = p { _pjPos = p
@@ -1444,18 +1263,6 @@ jetPack = defaultEquipment
, _itID = Nothing , _itID = Nothing
} }
{- | {- |
Current thickness: 2 -}
thickLine :: [Point2] -> Picture
thickLine = lineOfThickness 2
{- |
Current thickness: 3 -}
vThickLine :: [Point2] -> Picture
vThickLine = lineOfThickness 3
{- |
Current thickness: 6 -}
vvThickLine :: [Point2] -> Picture
vvThickLine = lineOfThickness 6
{- |
Sends out pulses that display walls. -} Sends out pulses that display walls. -}
radar = defaultGun radar = defaultGun
{ _itName = "RADAR" { _itName = "RADAR"
@@ -1464,8 +1271,8 @@ radar = defaultGun
, _wpLoadedAmmo = 100 , _wpLoadedAmmo = 100
, _wpReloadTime = 200 , _wpReloadTime = 200
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 120 , _itUseRate = 120
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aRadarPulse , _wpFire = shoot aRadarPulse
, _wpSpread = autogunSpread , _wpSpread = autogunSpread
, _wpRange = 20 , _wpRange = 20
@@ -1486,8 +1293,8 @@ sonar = defaultGun
, _wpLoadedAmmo = 100 , _wpLoadedAmmo = 100
, _wpReloadTime = 200 , _wpReloadTime = 200
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 120 , _itUseRate = 120
, _wpFireState = 0 , _itUseTime = 0
, _wpFire = shoot aSonarPulse , _wpFire = shoot aSonarPulse
, _wpRange = 20 , _wpRange = 20
, _itHammer = HammerUp , _itHammer = HammerUp
@@ -1537,7 +1344,7 @@ spawnGun cr = defaultGun
, _wpLoadedAmmo = 1 , _wpLoadedAmmo = 1
, _wpReloadTime = 80 , _wpReloadTime = 80
, _wpReloadState = 0 , _wpReloadState = 0
, _wpFireRate = 100 , _itUseRate = 100
, _wpFire = spawnCrNextTo cr , _wpFire = spawnCrNextTo cr
} }
spawnCrNextTo spawnCrNextTo
+1
View File
@@ -5,6 +5,7 @@ module Dodge.Item.Weapon.Decoration
where where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Picture
import Geometry.Data import Geometry.Data
import Picture import Picture
+123
View File
@@ -0,0 +1,123 @@
module Dodge.Item.Weapon.Laser
where
import Dodge.Data
import Dodge.Picture
import Dodge.Item.Attachment.Data
import Dodge.Base
import Dodge.SoundLogic
import Dodge.WorldEvent.SpawnParticle
import Dodge.WorldEvent.ThingsHit
import Dodge.WorldEvent.HelperParticle
import Dodge.WorldEvent.Flash
import Geometry
import Picture
import Control.Lens
import System.Random
import Data.List (find)
import Data.Maybe (fromMaybe)
import qualified Data.Sequence as Seq
import qualified Data.IntMap.Strict as IM
aLaser :: Int -> World -> World
aLaser cid w = over particles (makeLaserAt phaseV pos dir (Just cid) : )
$ soundFrom LasSound 24 1 0
$ laserGunFlashAt (pos +.+ 5 *.* unitVectorAtAngle dir)
w
where
cr = _creatures w IM.! cid
i = newProjectileKey w
pos = _crPos cr +.+ ((_crRad cr +3) *.* unitVectorAtAngle dir)
dir = _crDir cr
phaseV = charToPhaseV
$ fromMaybe '/' $ Seq.lookup 0 =<< cr ^? crInv . ix j . itAttachment . _Just . itCharMode
j = _crInvSel cr
charToPhaseV 'V' = 0.2
charToPhaseV '/' = 1
charToPhaseV 'Z' = 5
makeLaserAt :: Float -> Point2 -> Float -> Maybe Int -> Particle
makeLaserAt phaseV pos dir mcid = Particle
{ _ptDraw = const blank
, _ptUpdate' = moveLaser phaseV pos dir mcid
}
moveLaser
:: Float -- ^ Phase velocity, controls deflection in windows
-> Point2
-> Float
-> Maybe Int
-> World
-> Particle
-> (World, Maybe Particle)
moveLaser phaseV pos dir mcid w pt
= ( set randGen g $ hitEffect w
, Just pt {_ptDraw = const $ onLayer PtLayer $ pic ,_ptUpdate' = ptTimer' 0 }
)
where
xp = pos +.+ 800 *.* unitVectorAtAngle dir
(a,g) = randomR (-0.7,0.7) $ _randGen w
reflectDir wall = a +
(argV $ reflectIn (_wlLine wall !! 1 -.- _wlLine wall !! 0) (xp -.- pos) )
(colID,_) = randomR (0,11) $ _randGen w
f :: [Wall] -> Point2 -> Point2 -> (Maybe (Point2,Either3 Creature Wall ForceField),[Point2])
f seenWs x y = case find (h' seenWs) $ thingsHitExceptCrLongLine Nothing x y w of
Just (p,E3x2 wl)
| _wlIsSeeThrough wl -> f' p $ f (wl:seenWs)
p
(h x y wl p)
| otherwise -> (Just (p,E3x2 wl), [p])
Just (p,obj) -> (Just (p,obj), [p])
Nothing -> (Nothing, [y])
f' p (x,ps') = (x,p:ps')
h x y wl p | isEntering = p +.+ rotateV angleRef normalDist
| otherwise = p +.+ rotateV angleRef' normalDist'
where
wlNormal = vNormal $ (_wlLine wl !! 1) -.- (_wlLine wl !! 0)
normalDist = magV (p -.- y) *.* normalizeV wlNormal
angleInc = piRange $ argV wlNormal - argV (x -.- y)
angleRef | reflectExternal = angleInc
| otherwise = asin $ sin angleInc / phaseV
piRange a | a > pi = a - 2 * pi
| a > negate pi = a
| otherwise = a + 2 * pi
isEntering = isLeftOf (x -.- y) ((_wlLine wl !! 1) -.- (_wlLine wl !! 0))
wlNormal' = vNormal $ (_wlLine wl !! 0) -.- (_wlLine wl !! 1)
normalDist' = magV (p -.- y) *.* normalizeV wlNormal'
angleInc' = piRange $ argV wlNormal' - argV (x -.- y)
angleRef' | reflectInternal = angleInc'
| otherwise = asin $ phaseV * sin angleInc'
reflectInternal = 1 < abs (phaseV * sin angleInc')
reflectExternal = 1 < abs (sin angleInc / phaseV)
h' ws (_,E3x2 wl) = not $ any (\w -> _wlID w == _wlID wl) ws
h' _ _ = True
(thHit, ps) = f [] pos xp
hitEffect
= case thHit of
Just (p,E3x1 cr)
-> over (creatures . ix (_crID cr) . crState . crDamage) ((:) $ Lasering 19 pos p xp)
-- . over worldEvents ((.) $ flareAt yellow (flarePos p))
Just (p,E3x2 wl) -> createSpark 8 colID (p +.+ safeNormalizeV (pos -.- p))
(reflectDir wl) Nothing
_ -> id
pic = pictures [ fadeLine pos (head ps) 0.2 40 yellow
, setLayer 1 $ color (withAlpha 0.9 white) $ vThickLine (pos:ps)
, setLayer 1 $ color (withAlpha 0.5 yellow) $ vvThickLine (pos:ps)
]
fadeLine :: Point2 -> Point2 -> Float -> Float -> Color -> Picture
fadeLine sp ep alph width col = setLayer 1 $ polygonCol
[(sp , ca)
,(sp +.+ n , cb)
,(ep +.+ n , cb)
,(ep , ca)
,(ep -.- n , cb)
,(sp -.- n , cb)
]
where
n = width *.* normalizeV (vNormal $ ep -.- sp)
ca = withAlpha alph col
cb = withAlpha 0 col
+63 -10
View File
@@ -42,6 +42,44 @@ withThickSmoke eff cid w = eff cid $ foldr (makeThickSmokeAt . (+.+ pos)) w ps
pos = _crPos cr +.+ (_crRad cr + 15) *.* unitVectorAtAngle dir pos = _crPos cr +.+ (_crRad cr + 15) *.* unitVectorAtAngle dir
ps = (replicateM 20 . randInCirc) 8 & evalState $ _randGen w ps = (replicateM 20 . randInCirc) 8 & evalState $ _randGen w
{- | {- |
Fires at an increasing rate.
Has different effect after first fire.
Applies ammo check and use cooldown check. -}
rateIncAB
:: Int -- ^ Start rate
-> Int -- ^ End rate
-> (Int -> World -> World) -- ^ Effect on first fire
-> (Int -> World -> World) -- ^ Effect on continued fire
-> Int -- ^ Creature id
-> World
-> World
rateIncAB startRate fastRate shooteff1 shooteff2 cid w
| repeatFire = set (pointItem . itUseRate) (max fastRate (currentRate - 1))
$ over (pointItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointItem . itUseTime) currentRate
$ shooteff2 cid
w
| firstFire = set (pointItem . itUseRate) (startRate - 1)
$ over (pointItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointItem . itUseTime) startRate
$ shooteff1 cid
w
| reloadCondition = fromMaybe w $ reloadWeapon cid w
| otherwise = w
where
cr = _creatures w IM.! cid
itRef = _crInvSel cr
item = _crInv cr IM.! itRef
pointItem = creatures . ix cid . crInv . ix itRef
currentRate = _itUseRate item
repeatFire = _wpReloadState item == 0
&& _itUseTime item == 1
&& _wpLoadedAmmo item > 0
firstFire = _wpReloadState item == 0
&& _itUseTime item == 0
&& _wpLoadedAmmo item > 0
reloadCondition = _wpLoadedAmmo item == 0
{- |
Shoot a weapon rapidly after a warm up. Shoot a weapon rapidly after a warm up.
Applies ammo check as well. -} Applies ammo check as well. -}
withWarmUp withWarmUp
@@ -55,18 +93,18 @@ withWarmUp t f cid w
| reloadCondition = fromMaybe w $ reloadWeapon cid w | reloadCondition = fromMaybe w $ reloadWeapon cid w
| _wpReloadState item /= 0 = w | _wpReloadState item /= 0 = w
| fState == 0 = set (pointerToItem . wpFire) (withWarmUp 100 f) | fState == 0 = set (pointerToItem . wpFire) (withWarmUp 100 f)
$ set (pointerToItem . wpFireState) 2 $ set (pointerToItem . itUseTime) 2
w w
| t > 2 = set (pointerToItem . wpFire) (withWarmUp (t-1) f) | t > 2 = set (pointerToItem . wpFire) (withWarmUp (t-1) f)
$ set (pointerToItem . wpFireState) 2 $ set (pointerToItem . itUseTime) 2
$ soundFrom (CrWeaponSound cid) 26 2 0 $ soundFrom (CrWeaponSound cid) 26 2 0
w w
| t > 0 = set (pointerToItem . wpFire) (withWarmUp (t-1) f) | t > 0 = set (pointerToItem . wpFire) (withWarmUp (t-1) f)
$ set (pointerToItem . wpFireState) 2 $ set (pointerToItem . itUseTime) 2
w w
| otherwise = set (pointerToItem . wpFire) (withWarmUp 1 f) | otherwise = set (pointerToItem . wpFire) (withWarmUp 1 f)
$ over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1) $ over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointerToItem . wpFireState) 2 $ set (pointerToItem . itUseTime) 2
$ f cid $ f cid
$ soundFrom (CrWeaponSound cid) 28 2 0 $ soundFrom (CrWeaponSound cid) 28 2 0
w w
@@ -75,8 +113,8 @@ withWarmUp t f cid w
itRef = _crInvSel cr itRef = _crInvSel cr
item = _crInv cr IM.! itRef item = _crInv cr IM.! itRef
pointerToItem = creatures . ix cid . crInv . ix itRef pointerToItem = creatures . ix cid . crInv . ix itRef
fState = _wpFireState item fState = _itUseTime item
fRate = _wpFireRate item fRate = _itUseRate item
reloadCondition = _wpLoadedAmmo item == 0 reloadCondition = _wpLoadedAmmo item == 0
{- | {- |
Adds a sound to a creature based world effect. Adds a sound to a creature based world effect.
@@ -136,7 +174,7 @@ shootWithSound
shootWithSound soundid f cid w shootWithSound soundid f cid w
| fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1) | fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ soundOncePos soundid (_crPos cr) $ soundOncePos soundid (_crPos cr)
$ set (pointerToItem . wpFireState) (_wpFireRate item) $ set (pointerToItem . itUseTime) (_itUseRate item)
$ f cid w $ f cid w
| reloadCondition = fromMaybe w $ reloadWeapon cid w | reloadCondition = fromMaybe w $ reloadWeapon cid w
| otherwise = w | otherwise = w
@@ -146,10 +184,25 @@ shootWithSound soundid f cid w
item = _crInv cr IM.! itRef item = _crInv cr IM.! itRef
pointerToItem = creatures . ix cid . crInv . ix itRef pointerToItem = creatures . ix cid . crInv . ix itRef
fireCondition = _wpReloadState item == 0 fireCondition = _wpReloadState item == 0
&& _wpFireState item == 0 && _itUseTime item == 0
&& _wpLoadedAmmo item > 0 && _wpLoadedAmmo item > 0
reloadCondition = _wpLoadedAmmo item == 0 reloadCondition = _wpLoadedAmmo item == 0
{- | {- |
Applies a world effect after an item use cooldown check. -}
useTimeCheck
:: (Int -> World -> World) -- ^ Underlying effect
-> Int -- ^ Creature id
-> World
-> World
useTimeCheck f cid w = case theItem ^? itUseTime of
Just 0 -> f cid $ setUseTime w
_ -> w
where
cr = _creatures w IM.! cid
setUseTime = creatures . ix cid . crInv . ix (_crInvSel cr) . itUseTime +~ useRate
theItem = _crInv cr IM.! _crInvSel cr
useRate = fromMaybe 0 $ theItem ^? itUseRate
{- |
Applies a world effect after a hammer position check. -} Applies a world effect after a hammer position check. -}
hammerCheck hammerCheck
:: (Int -> World -> World) -- ^ Underlying effect :: (Int -> World -> World) -- ^ Underlying effect
@@ -172,7 +225,7 @@ shoot
-> World -> World
shoot f cid w shoot f cid w
| fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1) | fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
$ set (pointerToItem . wpFireState) (_wpFireRate item) $ set (pointerToItem . itUseTime) (_itUseRate item)
$ f cid w $ f cid w
| reloadCondition = fromMaybe w $ reloadWeapon cid w | reloadCondition = fromMaybe w $ reloadWeapon cid w
| otherwise = w | otherwise = w
@@ -182,7 +235,7 @@ shoot f cid w
item = _crInv cr IM.! itRef item = _crInv cr IM.! itRef
pointerToItem = creatures . ix cid . crInv . ix itRef pointerToItem = creatures . ix cid . crInv . ix itRef
fireCondition = _wpReloadState item == 0 fireCondition = _wpReloadState item == 0
&& _wpFireState item == 0 && _itUseTime item == 0
&& _wpLoadedAmmo item > 0 && _wpLoadedAmmo item > 0
reloadCondition = _wpLoadedAmmo item == 0 reloadCondition = _wpLoadedAmmo item == 0
+31
View File
@@ -0,0 +1,31 @@
{- |
Compound, universal pictures.
Creates uniform sizes and commands for the Dodge modules. -}
module Dodge.Picture
where
import Geometry
import Picture
-- {- |
-- Current thickness: 2 -}
-- thickLine :: [Point2] -> Picture
-- thickLine = lineOfThickness 2
{- |
Current thickness: 3 -}
vThickLine :: [Point2] -> Picture
vThickLine = lineOfThickness 3
{- |
Current thickness: 6 -}
vvThickLine :: [Point2] -> Picture
vvThickLine = lineOfThickness 6
-- shit this is ugly
lineOfThickness :: Float -> [Point2] -> Picture
lineOfThickness t = pictures . f
where f (x:y:ys)
| x == y = f (x:ys)
| otherwise
= polygon [x +.+ n x y, x -.- n x y, y -.- n x y, y +.+ n x y] : f (y:ys)
f _ = []
n a b = (t*0.5) *.* errorNormalizeV 42 (vNormal (a -.- b))
+2 -5
View File
@@ -20,7 +20,8 @@ hudDrawings w = setLayer 1 . setDepth (-0.5) . pictures $
] ]
++ selectionText ++ selectionText
where where
selectionText = if _carteDisplay w selectionText =
if _carteDisplay w
then drawLocations w then drawLocations w
else drawInventory w else drawInventory w
scaler = scale (2 / getWindowX w) (2 / getWindowY w) scaler = scale (2 / getWindowX w) (2 / getWindowY w)
@@ -53,10 +54,6 @@ itemStringCol :: Item -> (String,Color)
itemStringCol NoItem = ("----", greyN 0.5) itemStringCol NoItem = ("----", greyN 0.5)
itemStringCol itm = (_itInvDisplay itm itm, _itInvColor itm) itemStringCol itm = (_itInvDisplay itm itm, _itInvColor itm)
dItem' NoItem = scale 0.1 0.1 $ dShadCol (greyN 0.5) $ text "----"
dItem' i = scale 0.1 0.1 $ dShadCol (_itInvColor i) t
where t = text $ _itInvDisplay i i
drawLocations :: World -> [Picture] drawLocations :: World -> [Picture]
drawLocations w = displayListTopLeft locs w drawLocations w = displayListTopLeft locs w
++ zipWith bFunc (displayListEndCoords w locTexts) locPoss ++ zipWith bFunc (displayListEndCoords w locTexts) locPoss
+1 -2
View File
@@ -2,10 +2,9 @@ module Dodge.Render.Picture
where where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Picture
import Dodge.Render.HUD import Dodge.Render.HUD
import Dodge.Render.MenuScreen import Dodge.Render.MenuScreen
import Geometry import Geometry
import Picture import Picture
+1
View File
@@ -12,6 +12,7 @@ module Dodge.WorldEvent.Flash
where where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Picture
import Dodge.LightSources import Dodge.LightSources
import Dodge.WorldEvent.ThingsHit import Dodge.WorldEvent.ThingsHit
+1
View File
@@ -5,6 +5,7 @@ module Dodge.WorldEvent.SpawnParticle
where where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.Picture
import Dodge.WorldEvent.HitEffect import Dodge.WorldEvent.HitEffect
import Dodge.WorldEvent.ThingsHit import Dodge.WorldEvent.ThingsHit
import Dodge.WorldEvent.Cloud import Dodge.WorldEvent.Cloud