Push item use delay inside datatype, currently broken

This commit is contained in:
2021-11-27 16:37:30 +00:00
parent 224db733f6
commit 8639b2d428
21 changed files with 162 additions and 177 deletions
+9 -3
View File
@@ -1,11 +1,16 @@
{-# LANGUAGE StrictData #-}
module Dodge.Item.Data
where
{-# LANGUAGE TemplateHaskell #-}
module Dodge.Item.Data where
import Control.Lens
data HammerType
= NoHammer
| HasHammer {_hammerPosition :: HammerPosition}
deriving
(Eq, Ord, Show)
data HammerPosition
= HammerDown
| HammerReleased
| HammerUp
| NoHammer
deriving
(Eq, Ord, Show)
data ItemIdentity
@@ -49,3 +54,4 @@ data AimStance
| LeaveHolstered
deriving
(Eq,Show,Ord,Enum)
makeLenses ''HammerType
+16 -3
View File
@@ -1,5 +1,6 @@
module Dodge.Item.Weapon.AmmoParams
( useAmmoParams
, useAmmoParamsRate
, loadedAmmo
, useAmmoParamsVelMod
, fractionLoadedAmmo
@@ -11,9 +12,21 @@ import Geometry
import Control.Lens
useAmmoParams :: ItemUse
useAmmoParams = RightUse $ \it -> let b = _aoType $ _wpAmmo it
in withVelWthHiteff (_amBulVel b) (_amBulWth b) (_amBulEff b)
useAmmoParamsRate :: Int
-> HammerType
-> [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World]
-> ItemUse
useAmmoParamsRate rate ht usemods = RightUse
{ _rUse = useAmmoParams
, _useDelay = DelayRate {_rateMax = rate,_rateTime = 0}
, _useMods = usemods
, _useHammer = ht
}
useAmmoParams :: Item -> Creature -> World -> World
useAmmoParams it = withVelWthHiteff (_amBulVel b) (_amBulWth b) (_amBulEff b)
where
b = _aoType $ _wpAmmo it
useAmmoParamsVelMod :: Float -> Item -> Creature -> World -> World
useAmmoParamsVelMod vfact it = withDelayedVelWthHiteff vfact (_amBulVel b) (_amBulWth b) (_amBulEff b)
+3 -12
View File
@@ -42,11 +42,8 @@ teslaGun = defaultGun
, _wpLoadedAmmo = 200
, _wpReloadTime = 80
}
, _itUseRate = 0
, _itAimStance = TwoHandFlat
, _itUseTime = 0
, _itUse = RightUse $ const aTeslaArc
, _itUseModifiers =
, _itUse = ruseInstant (const aTeslaArc) NoHammer
[ ammoCheckI
, useTimeCheckI
, withTempLight 1 100 (V3 0 0 1)
@@ -77,10 +74,7 @@ lasGun = defaultAutoGun
, _wpLoadedAmmo = 200
, _wpReloadTime = 80
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = RightUse $ const aLaser
, _itUseModifiers =
, _itUse = ruseInstant (const aLaser) NoHammer
[ ammoCheckI
, useTimeCheckI
, withTempLight 1 100 (V3 1 1 0)
@@ -118,10 +112,7 @@ tractorGun = defaultAutoGun
, _wpLoadedAmmo = 10000
, _wpReloadTime = 40
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = RightUse aTractorBeam
, _itUseModifiers =
, _itUse = ruseInstant aTractorBeam NoHammer
[ ammoUseCheckI
]
, _wpSpread = 0.00001
+2 -4
View File
@@ -23,8 +23,8 @@ import Control.Monad.State
bezierGun :: Item
bezierGun = defaultGun
{ _itName = "B-GUN"
, _itUse = RightUse $ \_ -> useTargetPos $ \p -> shootBezier $ fromJust p -- <- the start point
, _itUseModifiers =
, _itUse = ruseRate 6 (\_ -> useTargetPos $ \p -> shootBezier $ fromJust p) -- <- the start point
NoHammer
[ ammoCheckI
, useTimeCheckI
, withSoundStart tap2S
@@ -36,14 +36,12 @@ bezierGun = defaultGun
, _itFloorPict = bezierGunSPic
, _itAttachment = NoItAttachment
, _itScroll = \_ _ -> removeItTarget
, _itHammer = HammerUp
, _itEffect = rbSetTarget
, _itZoom = defaultItZoom
, _itAimingRange = 0
, _wpAmmo = defaultAmmo
{ _wpMaxAmmo = 50
}
, _itUseRate = 6
, _itAimStance = TwoHandTwist
}
bezierGunSPic :: Item -> SPic
+1 -3
View File
@@ -118,9 +118,7 @@ boosterGun = defaultGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 20
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = LeftUse $ boostSelfL 10
, _itUse = luseInstantNoH $ boostSelfL 10
, _wpSpread = 0.05
, _wpRange = 20
, _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2 [(-2,-2),(-2,2),(2,2),(2,0),(0,0),(0,-2)]
+8 -33
View File
@@ -41,10 +41,7 @@ autoGun = defaultAutoGun
, _wpLoadedAmmo = 30
, _wpReloadTime = 80
}
, _itUseRate = 5
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 5 NoHammer
[ ammoCheckI
, charFiringStratI
[('S', hammerCheckI)
@@ -93,10 +90,7 @@ pistol = defaultGun
, _wpLoadedAmmo = 15
, _wpReloadTime = 40
}
, _itUseRate = 8
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 8 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheckI
@@ -142,10 +136,7 @@ hvAutoGun = defaultAutoGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 200
}
, _itUseRate = 25
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 25 NoHammer
[ ammoCheckI
, rateIncABI 24 7 (torqueBeforeAtLeast 0.1 0.1) (torqueAfterI 0.2)
, withSoundStart bangEchoS
@@ -178,10 +169,7 @@ ltAutoGun = defaultAutoGun
, _wpLoadedAmmo = 25
, _wpReloadTime = 80
}
, _itUseRate = 3
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 3 NoHammer
[ ammoCheckI
, useTimeCheckI
, withSoundStart tap1S
@@ -221,10 +209,7 @@ miniGun = defaultAutoGun
, _wpReloadTime = 200
}
, _wpMaxWarmUp = 100
, _itUseRate = 0
, _itUseTime = 0
, _itUse = RightUse $ useAmmoParamsVelMod vm4
, _itUseModifiers =
, _itUse = ruseInstant (useAmmoParamsVelMod vm4) NoHammer
[ ammoCheckI
, withWarmUpI crankSlowS
, useTimeCheckI
@@ -312,11 +297,7 @@ spreadGun = defaultGun
, _wpLoadedAmmo = 5
, _wpReloadTime = 80
}
, _itUseRate = 20
, _itUseTime = 0
--, _itUse = \_ -> spreadNumVelWthHiteff spreadGunSpread 9 (V2 30 0) 2 basicBulletEffect
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheckI
@@ -351,10 +332,7 @@ multGun = defaultGun
, _wpLoadedAmmo = 2
, _wpReloadTime = 40
}
, _itUseRate = 20
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 20 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheckI
@@ -400,10 +378,7 @@ longGun = defaultGun
, _wpReloadTime = 100
, _wpReloadType = PassiveReload skwareFadeTwoSecS
}
, _itUseRate = 100
, _itUseTime = 0
, _itUse = useAmmoParams
, _itUseModifiers =
, _itUse = useAmmoParamsRate 100 upHammer
[ ammoCheckI
, hammerCheckI
, useTimeCheckI
+2 -5
View File
@@ -1,6 +1,7 @@
module Dodge.Item.Weapon.Drone where
import Dodge.Data
import Dodge.Default.Weapon
import Dodge.Default
import Dodge.SoundLogic.LoadSound
import Dodge.Item.Weapon.TriggerType
import Geometry
@@ -28,10 +29,7 @@ lasDrones = defaultGun
, _wpLoadedAmmo = 2
, _wpReloadTime = 80
}
, _itUseRate = 20
, _itUseTime = 0
, _itUse = RightUse aDroneWithItemParams
, _itUseModifiers =
, _itUse = ruseRate 20 aDroneWithItemParams upHammer
[ ammoCheckI
, useTimeCheckI
, withSoundStart tap4S
@@ -42,7 +40,6 @@ lasDrones = defaultGun
, _itFloorPict = lasDronesPic
, _itAimingSpeed = 0.2
, _itAimingRange = 0.5
, _itHammer = NoHammer
, _itEffect = NoItEffect
, _itAimStance = TwoHandTwist
}
+2 -3
View File
@@ -38,8 +38,7 @@ wpRecock = ItInvEffect
moveHammerUp HammerDown = HammerReleased
moveHammerUp HammerReleased = HammerUp
moveHammerUp HammerUp = HammerUp
moveHammerUp NoHammer = NoHammer
fOnIt it = it & itHammer %~ moveHammerUp
fOnIt it = it & itUse . itHammer . hammerPosition %~ moveHammerUp
--{- |
--Special recock for the bezier gun.
--Not sure of its purpose at this time... -}
@@ -66,7 +65,7 @@ itemLaserScopeEffect
f _ cr invid w
| invid == _crInvSel cr && crIsAiming' cr = w
& particles %~ (:) (makeLaserScope sp ep reloadFrac)
& creatures . ix (_crID cr) . crInv . ix invid . itHammer %~ moveHammerUp
& creatures . ix (_crID cr) . crInv . ix invid . itUse . itHammer . hammerPosition %~ moveHammerUp
| otherwise = w
where
p = _crPos cr
+8 -14
View File
@@ -34,8 +34,7 @@ grenade = Throwable
, _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2 [(-3,-3),(-3,3),(3,3),(3,-3)]
, _twMaxRange = 150
, _twAccuracy = 30
, _itUse = RightUse $ \_ -> throwGrenade makeExplosionAt
, _itUseModifiers =
, _itUse = ruseRate 25 (\_ -> throwGrenade makeExplosionAt) upHammer
[ useTimeCheckI
]
, _itAimingSpeed = 1
@@ -44,13 +43,10 @@ grenade = Throwable
, _itAimZoom = defaultItZoom {_itZoomMax = f fuseTime, _itZoomMin = f fuseTime}
, _itEquipPict = pictureWeaponOnAim' $ \_ -> grenadePic fuseTime
, _itID = Nothing
, _itUseRate = 25
, _itUseTime = 0
, _itAttachment = ItFuse fuseTime
, _itInvColor = white
, _itInvDisplay = basicWeaponDisplay
, _itEffect = wpRecock
, _itHammer = HammerUp
, _itScroll = changeFuse
, _itAimStance = OneHand
}
@@ -133,7 +129,7 @@ throwArmReset x = ItInvEffect {_itInvEffect = f ,_itEffectCounter = x }
f _ cr i = creatures . ix (_crID cr) . crInv %~ IM.adjust counterDown i
counterDown it
| _itEffectCounter (_itEffect it) == 0 = it
& itHammer .~ HammerUp
& itUse . itHammer . hammerPosition .~ HammerUp
& itEquipPict .~ pictureWeaponOnAim' (\_ -> grenadePic 50)
| otherwise = it & itEffect . itEffectCounter -~ 1
@@ -227,10 +223,8 @@ remoteBomb = defaultThrowable
[(-3,-3),(-3,3),(3,3),(3,-3)]
, _twMaxRange = 150
, _twAccuracy = 30
, _itUse = RightUse $ const throwRemoteBomb
, _itUseModifiers =
[ hammerCheckI
]
, _itUse = ruseRate 25 (const throwRemoteBomb) upHammer
[ hammerCheckI ]
, _itAttachment = ItScope (V2 0 0) 0 1 True
, _itEquipPict = pictureWeaponOnAim' $ \_ -> (,) emptySH remoteBombUnarmedPic
}
@@ -259,8 +253,8 @@ throwRemoteBomb cr w = setLocation
j = _crInvSel cr
resetName = set (creatures . ix cid . crInv . ix j . itName) "REMOTE"
removePict = set (creatures . ix cid . crInv . ix j . itEquipPict) $ \ _ _ -> emptyBlank
resetFire = set (creatures . ix cid . crInv . ix j . itUse)
$ RightUse $ \_ -> explodeRemoteBomb itid i
resetFire = set (creatures . ix cid . crInv . ix j . itUse . rUse)
$ \_ -> explodeRemoteBomb itid i
p' = _crPos cr +.+ rotateV (_crDir cr) (V2 (_crRad cr) 0)
p | circOnSomeWall p' 4 w = _crPos cr +.+ rotateV (_crDir cr) (V2 (_crRad cr-4) 0)
| otherwise = p'
@@ -277,7 +271,7 @@ explodeRemoteBomb :: Int -> Int -> Creature -> World -> World
explodeRemoteBomb itid pjid cr w
= set (props . ix pjid . pjUpdate) (\_ -> retireRemoteBomb itid 30 pjid)
-- $ set (props . ix pjid . pjDraw) (\_ -> blank)
$ set (creatures . ix cid . crInv . ix j . itUse) (RightUse $ \_ -> const id)
$ set (creatures . ix cid . crInv . ix j . itUse . rUse) (\_ -> const id)
$ resetName
$ resetPict
-- $ resetScope
@@ -305,7 +299,7 @@ retireRemoteBomb itid 0 pjid w = w
& pointToItem (_itemPositions w IM.! itid) %~
( (itAttachment . scopePos .~ V2 0 0)
. (itZoom .~ defaultItZoom)
. (itUse .~ (RightUse $ const throwRemoteBomb))
. (itUse . rUse .~ const throwRemoteBomb)
)
& props %~ IM.delete pjid
retireRemoteBomb itid t pjid w = setScope w
+7 -13
View File
@@ -3,6 +3,7 @@ module Dodge.Item.Weapon.Launcher
, remoteLauncher
) where
import Dodge.Data
import Dodge.Default
import Dodge.Default.Weapon
import Dodge.Default.Shell
import Dodge.SoundLogic.LoadSound
@@ -48,10 +49,7 @@ launcher = defaultGun
, _wpLoadedAmmo = 30
, _wpReloadTime = 80
}
, _itUseRate = 20
, _itUseTime = 0
, _itUse = RightUse aRocketWithItemParams
, _itUseModifiers =
, _itUse = ruseRate 20 aRocketWithItemParams upHammer
[ ammoCheckI
, useTimeCheckI
, withSoundStart tap4S
@@ -62,7 +60,6 @@ launcher = defaultGun
, _itFloorPict = launcherPic
, _itAimingSpeed = 0.2
, _itAimingRange = 0.5
, _itHammer = NoHammer
, _itEffect = NoItEffect
, _itAimStance = TwoHandTwist
}
@@ -250,10 +247,7 @@ remoteLauncher = defaultGun
, _wpLoadedAmmo = 30
, _wpReloadTime = 80
}
, _itUseRate = 10
, _itUseTime = 0
, _itUse = RightUse $ const fireRemoteLauncher
, _itUseModifiers =
, _itUse = ruseRate 10 (const fireRemoteLauncher) upHammer
[ ammoCheckI
, hammerCheckI
]
@@ -294,8 +288,8 @@ fireRemoteLauncher cr w = setLocation
j = _crInvSel cr
newitid = IM.newKey $ _itemPositions w
maybeitid = cr ^? crInv . ix j . itID . _Just
resetFire = set (creatures . ix cid . crInv . ix j . itUse)
$ RightUse $ \_ _ -> explodeRemoteRocket itid i
resetFire = set (creatures . ix cid . crInv . ix j . itUse . rUse)
$ \_ _ -> explodeRemoteRocket itid i
resetName = set (creatures . ix cid . crInv . ix j . itName) "REMOTEROCKET"
setLocation :: World -> World
setLocation w' = case maybeitid of
@@ -355,7 +349,7 @@ explodeRemoteRocket
explodeRemoteRocket itid pjid w
= set (props . ix pjid . pjUpdate) (\_ -> retireRemoteRocket itid 30 pjid)
$ set (props . ix pjid . prDraw) (const mempty)
$ set (itPoint . itUse) (RightUse $ \_ _ -> id)
$ set (itPoint . itUse . rUse) (\_ _ -> id)
$ resetName
$ makeExplosionAt (_pjPos (_props w IM.! pjid)) w
where
@@ -387,7 +381,7 @@ remoteShellPic t
retireRemoteRocket :: Int -> Int -> Int -> World -> World
retireRemoteRocket itid 0 pjid w =
set (pointToItem (_itemPositions w IM.! itid) . itAttachment . scopePos) (V2 0 0)
$ set (pointToItem (_itemPositions w IM.! itid) . itUse) (RightUse $ const fireRemoteLauncher)
$ set (pointToItem (_itemPositions w IM.! itid) . itUse . rUse) (const fireRemoteLauncher)
(w & props %~ IM.delete pjid)
retireRemoteRocket itid t pjid w = setScope w
& props . ix pjid . pjUpdate .~ (\_ -> retireRemoteRocket itid (t-1) pjid)
+2 -10
View File
@@ -25,15 +25,11 @@ radar = defaultGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 200
}
, _itUseRate = 120
, _itUseTime = 0
, _itUse = RightUse $ const aRadarPulse
, _itUseModifiers =
, _itUse = ruseRate 120 (const aRadarPulse) upHammer
[ ammoUseCheckI
]
, _wpSpread = autogunSpread
, _wpRange = 20
, _itHammer = HammerUp
, _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ color blue $ polygon $ rectNESW 5 5 (-5) (-5)
, _itAimingRange = 1
, _itZoom = defaultItZoom { _itZoomMax = 1}
@@ -51,14 +47,10 @@ sonar = defaultGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 200
}
, _itUseRate = 120
, _itUseTime = 0
, _itUse = RightUse $ const aSonarPulse
, _itUseModifiers =
, _itUse = ruseRate 120 (const aSonarPulse) upHammer
[ ammoUseCheckI
]
, _wpRange = 20
, _itHammer = HammerUp
, _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ color blue $ polygon $ rectNESW 5 5 (-5) (-5)
, _itAimingRange = 1
, _itZoom = defaultItZoom {_itZoomMax = 1}
+4 -3
View File
@@ -3,6 +3,7 @@ import Dodge.Data
import Dodge.Item.Weapon.TriggerType
--import Dodge.Item.Weapon.Remote
import Dodge.Default.Weapon
import Dodge.Default
--import Dodge.Item.Weapon.Grenade
import Geometry
import qualified IntMapHelp as IM
@@ -21,9 +22,9 @@ spawnGun cr = defaultGun
, _wpLoadedAmmo = 1
, _wpReloadTime = 80
}
, _itUseRate = 100
, _itUse = RightUse $ \_ -> spawnCrNextTo cr
, _itUseModifiers =
, _itUse = ruseRate 100
(\_ -> spawnCrNextTo cr)
upHammer
[ ammoCheckI
, hammerCheckI
]
+2 -8
View File
@@ -39,10 +39,7 @@ poisonSprayer = defaultAutoGun
, _wpLoadedAmmo = 500
, _wpReloadTime = 100
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = RightUse $ const aGasCloud
, _itUseModifiers =
, _itUse = ruseInstant (const aGasCloud) NoHammer
[ ammoCheckI
, useTimeCheckI
, withSoundForI foamSprayLoopS 5
@@ -66,10 +63,7 @@ flamer = defaultAutoGun
, _wpLoadedAmmo = 250
, _wpReloadTime = 100
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = RightUse $ \_ -> randWalkAngle 0.2 0.01 aFlame
, _itUseModifiers =
, _itUse = ruseInstant (\_ -> randWalkAngle 0.2 0.01 aFlame) NoHammer
[ ammoUseCheckI
, withSidePushI 5
--, withTempLight 1 100 (V3 1 0 0)
+21 -18
View File
@@ -110,23 +110,23 @@ rateIncABI
-> ChainEffect
rateIncABI startRate fastRate exeffFirst exeffCont eff item cr w
| repeatFire = w
& pointItem %~ ( (itUseRate .~ max fastRate (currentRate - 1))
& pointItem %~ ( (itUse . useDelay . rateMax .~ max fastRate (currentRate - 1))
. (wpAmmo . wpLoadedAmmo -~ 1)
. (itUseTime .~ currentRate) )
. (itUse . useDelay . rateTime .~ currentRate) )
& exeffCont eff item cr
| firstFire = w
& pointItem %~ ( (itUseRate .~ startRate - 1)
& pointItem %~ ( (itUse . useDelay . rateMax .~ startRate - 1)
. (wpAmmo . wpLoadedAmmo -~ 1)
. (itUseTime .~ startRate) )
. (itUse . useDelay . rateTime .~ startRate) )
& exeffFirst eff item cr
| otherwise = w
where
cid = _crID cr
itRef = _crInvSel cr
pointItem = creatures . ix cid . crInv . ix itRef
currentRate = _itUseRate item
repeatFire = _wpReloadState (_wpAmmo item) == 0 && _itUseTime item == 1
firstFire = _wpReloadState (_wpAmmo item) == 0 && _itUseTime item == 0
currentRate = _rateMax (_useDelay (_itUse item))
repeatFire = _wpReloadState (_wpAmmo item) == 0 && _rateTime (_useDelay (_itUse item)) == 1
firstFire = _wpReloadState (_wpAmmo item) == 0 && _rateTime (_useDelay (_itUse item)) == 0
{- | Apply effect after a warm up. -}
withWarmUpI
:: SoundID -- ^ warm up sound id
@@ -221,26 +221,28 @@ useAmmo amAmount eff item cr = eff item cr
{- |
Applies a world effect after an item use cooldown check. -}
useTimeCheckI :: ChainEffect
useTimeCheckI f item cr w = case item ^? itUseTime of
useTimeCheckI f item cr w = case item ^? itUse . useDelay . rateTime of
Just 0 -> f item cr $ setUseTime w
_ -> w
where
cid = _crID cr
setUseTime = creatures . ix cid . crInv . ix (_crInvSel cr) . itUseTime +~ useRate
useRate = fromMaybe 0 $ item ^? itUseRate
setUseTime = creatures . ix cid . crInv . ix (_crInvSel cr) . itUse . useDelay . rateTime +~ userate
userate = fromMaybe 0 $ item ^? itUse . useDelay . rateMax
{- | Applies a world effect after a hammer position check. -}
hammerCheckI :: ChainEffect
hammerCheckI f it cr w = case it ^? itHammer of
hammerCheckI f it cr w = case it ^? itUse . itHammer . hammerPosition of
Just HammerUp -> f it cr $ setHammerDown w
_ -> setHammerDown w
where
cid = _crID cr
setHammerDown = creatures . ix cid . crInv . ix (_crInvSel cr) . itHammer .~ HammerDown
setHammerDown = creatures . ix cid . crInv . ix (_crInvSel cr) . itUse
. itHammer . hammerPosition .~ HammerDown
{- | Applies a world effect after an ammo check. -}
ammoUseCheckI :: ChainEffect
ammoUseCheckI f item cr w
| fireCondition = f item cr w & pointerToItem %~
( (wpAmmo . wpLoadedAmmo -~ 1) . (itUseTime .~ _itUseRate item) )
( (wpAmmo . wpLoadedAmmo -~ 1)
. (itUse . useDelay . rateTime .~ _rateMax ( _useDelay (_itUse item)) ))
| reloadCondition = fromMaybe w $ startReloadingWeapon cr w
| otherwise = w
where
@@ -248,7 +250,7 @@ ammoUseCheckI f item cr w
itRef = _crInvSel cr
pointerToItem = creatures . ix cid . crInv . ix itRef
fireCondition = _wpReloadState (_wpAmmo item) == 0
&& _itUseTime item == 0
&& _rateTime (_useDelay (_itUse item)) == 0
&& _wpLoadedAmmo (_wpAmmo item) > 0
reloadCondition = _wpLoadedAmmo (_wpAmmo item) == 0
{- | Applies a world effect after a hammer position check.
@@ -259,12 +261,12 @@ hammerCheckL
-> Int
-> World
-> World
hammerCheckL f cr invid w = case (_crInv cr IM.! invid) ^? itHammer of
hammerCheckL f cr invid w = case (_crInv cr IM.! invid) ^? itUse . itHammer . hammerPosition of
Just HammerUp -> f cr invid $ setHammerDown w
_ -> setHammerDown w
where
cid = _crID cr
setHammerDown = creatures . ix cid . crInv . ix invid . itHammer .~ HammerDown
setHammerDown = creatures . ix cid . crInv . ix invid . itUse . itHammer . hammerPosition .~ HammerDown
{- | Applies a world effect after an ammo check.
Arbitrary inventory position. -}
shootL
@@ -276,7 +278,8 @@ shootL
-> World
shootL f cr invid w
| fireCondition = f cr invid w & pointerToItem %~
( (wpAmmo . wpLoadedAmmo -~ 1) . (itUseTime .~ _itUseRate item) )
( (wpAmmo . wpLoadedAmmo -~ 1)
. (itUse . useDelay . rateTime .~ _rateMax (_useDelay (_itUse item))) )
| reloadCondition = fromMaybe w $ startReloadingWeapon cr w
| otherwise = w
where
@@ -284,7 +287,7 @@ shootL f cr invid w
item = _crInv cr IM.! invid
pointerToItem = creatures . ix cid . crInv . ix invid
fireCondition = _wpReloadState (_wpAmmo item) == 0
&& _itUseTime item == 0
&& _rateTime (_useDelay (_itUse item)) == 0
&& _wpLoadedAmmo (_wpAmmo item) > 0
reloadCondition = _wpLoadedAmmo (_wpAmmo item) == 0
withTempLight :: Int -> Float -> V3 Float -> ChainEffect
+5 -19
View File
@@ -25,7 +25,7 @@ rewindGun = defaultGun
, _wpCharge = 0
}
, _itEffect = ItRewindEffect rewindEffect []
, _itUse = LeftUse $ \cr invid -> useRewindGun (_crInv cr IM.! invid) cr
, _itUse = defaultlUse {_lUse = \cr invid -> useRewindGun (_crInv cr IM.! invid) cr}
}
rewindEffect :: ItEffect -> Creature -> Int -> World -> World
rewindEffect _ cr invid w
@@ -60,14 +60,8 @@ shrinkGun = defaultGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 20
}
, _itUseRate = 0
, _itUseTime = 0
, _itAimStance = TwoHandFlat
, _itUse = LeftUse $ \cr invid -> useShrinkGun (_crInv cr IM.! invid) cr
, _itUseModifiers =
[ ammoCheckI
, hammerCheckI
]
, _itUse = defaultlUse {_lUse = \cr invid -> useShrinkGun (_crInv cr IM.! invid) cr}
, _wpSpread = 0.05
, _wpRange = 20
, _itFloorPict = shrinkGunPic
@@ -99,13 +93,7 @@ blinkGun = defaultGun
, _wpLoadedAmmo = 100
, _wpReloadTime = 20
}
, _itUseRate = 0
, _itUseTime = 0
, _itUse = LeftUse $ hammerCheckL $ shootL aSelfL
, _itUseModifiers =
[ ammoCheckI
, hammerCheckI
]
, _itUse = defaultlUse {_lUse = hammerCheckL $ shootL aSelfL}
, _wpSpread = 0.05
, _wpRange = 20
, _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2[(-2,-2),(-2,2),(2,2),(2,0),(0,0),(0,-2)]
@@ -123,12 +111,12 @@ aSelfL cr _ = blinkAction cr
effectGun :: String -> (Creature -> World -> World) -> Item
effectGun name eff = defaultGun
{ _itName = name ++ "Gun"
, _itUse = RightUse $ const eff
, _itUse = defaultrUse {_rUse = const eff}
}
autoEffectGun :: String -> (Creature -> World -> World) -> Item
autoEffectGun name eff = defaultAutoGun
{ _itName = name ++ "Gun"
, _itUse = RightUse $ const eff
, _itUse = defaultrUse {_rUse = const eff}
}
forceFieldGun :: Item
forceFieldGun = defaultGun
@@ -140,8 +128,6 @@ forceFieldGun = defaultGun
, _wpReloadTime = 40
, _wpReloadState = 0
}
, _itUseRate = 10
, _itUseTime = 0
, _itUse = undefined
, _wpSpread = 0.02
, _wpRange = 20