Explicitly store list of barrels for weapons
This commit is contained in:
@@ -146,3 +146,9 @@ dbArg f x = f x x
|
||||
-- TODO check whether this is simply the reader monad, flipped
|
||||
dbArgChain :: (a -> b -> b) -> (a -> b -> b) -> a -> b -> b
|
||||
dbArgChain f g x = f x . g x
|
||||
|
||||
spreadAroundCenter :: Int -> Float -> [Float]
|
||||
spreadAroundCenter i x = [x * fromIntegral j - x*fromIntegral (i-1)*0.5 | j <- [0 .. i - 1]]
|
||||
|
||||
spreadFromCenter :: Int -> Float -> [Float]
|
||||
spreadFromCenter i x = [x * fromIntegral j - x*fromIntegral (i-1)*0.5 | j <- [0 .. i - 1]]
|
||||
|
||||
@@ -48,7 +48,7 @@ data ItemParams
|
||||
{ _muzVel :: Float
|
||||
, _rifling :: Float
|
||||
, _bore :: Float
|
||||
, _gunBarrels :: GunBarrels
|
||||
, _gunBarrels :: [GunBarrel]
|
||||
, _recoil :: Float
|
||||
, _torqueAfter :: Float
|
||||
, _randomOffset :: Float
|
||||
@@ -82,15 +82,15 @@ data GunBarrel = GunBarrel
|
||||
, _barlInaccuracy :: Float
|
||||
}
|
||||
|
||||
data GunBarrels
|
||||
= MultiBarrel
|
||||
{ _brlSpread :: BarrelSpread
|
||||
, _brlNum :: Int
|
||||
, _brlInaccuracy :: Float
|
||||
}
|
||||
| BarrelList
|
||||
{ _brlList :: [GunBarrel]
|
||||
}
|
||||
--data GunBarrels
|
||||
---- = MultiBarrel
|
||||
---- { _brlSpread :: BarrelSpread
|
||||
---- , _brlNum :: Int
|
||||
---- , _brlInaccuracy :: Float
|
||||
---- }
|
||||
-- = BarrelList
|
||||
-- { _brlList :: [GunBarrel]
|
||||
-- }
|
||||
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
|
||||
data Nozzle = Nozzle
|
||||
@@ -103,21 +103,21 @@ data Nozzle = Nozzle
|
||||
}
|
||||
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
|
||||
data BarrelSpread
|
||||
= AlignedBarrels
|
||||
| SpreadBarrels {_spreadAngle :: Float}
|
||||
| RotatingBarrels {_rotatingBarrelInaccuracy :: Float}
|
||||
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
--data BarrelSpread
|
||||
-- = AlignedBarrels
|
||||
-- | SpreadBarrels {_spreadAngle :: Float}
|
||||
-- | RotatingBarrels {_rotatingBarrelInaccuracy :: Float}
|
||||
-- --deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
|
||||
makeLenses ''BarrelSpread
|
||||
--makeLenses ''BarrelSpread
|
||||
makeLenses ''ItemParams
|
||||
makeLenses ''Nozzle
|
||||
makeLenses ''GunBarrels
|
||||
--makeLenses ''GunBarrels
|
||||
makeLenses ''GunBarrel
|
||||
deriveJSON defaultOptions ''ShrinkGunStatus
|
||||
deriveJSON defaultOptions ''PreviousArcEffect
|
||||
deriveJSON defaultOptions ''Nozzle
|
||||
deriveJSON defaultOptions ''BarrelSpread
|
||||
--deriveJSON defaultOptions ''BarrelSpread
|
||||
deriveJSON defaultOptions ''GunBarrel
|
||||
deriveJSON defaultOptions ''GunBarrels
|
||||
--deriveJSON defaultOptions ''GunBarrels
|
||||
deriveJSON defaultOptions ''ItemParams
|
||||
|
||||
@@ -208,12 +208,11 @@ useMod hm = case hm of
|
||||
reverse $ withPosDirWallCheck directedTelPos : useMod hm'
|
||||
BangStickMod ->
|
||||
[ withRecoil
|
||||
-- , applyInaccuracy
|
||||
, spreadLoaded
|
||||
, withTorqueAfter
|
||||
, withMuzFlareI
|
||||
, useAllAmmo
|
||||
, withSoundItemChoiceStart bangStickSoundChoice
|
||||
, duplicateLoadedBarrels
|
||||
, withTorqueAfter
|
||||
, withMuzFlareI
|
||||
, useTimeCheck
|
||||
, ammoCheckI
|
||||
, blCheck
|
||||
|
||||
@@ -118,14 +118,10 @@ ammoPosition itm hit = case hit of
|
||||
rhs = Q.axisAngle (V3 1 0 0) 0
|
||||
|
||||
bangStickAmmoPos :: Int -> Item -> AmmoPosition
|
||||
bangStickAmmoPos i itm =
|
||||
bangStickAmmoPos _ itm =
|
||||
Bullets
|
||||
[(rotate3z a (V3 5 0 3), Q.axisAngle (V3 0 0 1) a) | a <- map f [0 .. i - 1]]
|
||||
where
|
||||
f n =
|
||||
barrelspread * fromIntegral n
|
||||
- 0.5 * barrelspread * fromIntegral (_brlNum (_gunBarrels (_itParams itm)) -1)
|
||||
barrelspread = itm ^?! itParams . gunBarrels . brlSpread . spreadAngle
|
||||
[(rotate3z a (V3 5 0 3), Q.axisAngle (V3 0 0 1) a)
|
||||
| a <- map _barlRot (itm ^?! itParams . gunBarrels)]
|
||||
|
||||
volleygunAmmoPos :: Int -> AmmoPosition
|
||||
volleygunAmmoPos i =
|
||||
@@ -212,12 +208,9 @@ modulesSPic it _ imt = case imt of
|
||||
_ -> mempty
|
||||
|
||||
baseStickShapeX :: Item -> Int -> Shape
|
||||
baseStickShapeX it i = foldMap f [0 .. i -1]
|
||||
baseStickShapeX it _ = foldMap f (it ^?! itParams . gunBarrels)
|
||||
where
|
||||
f j = rotateSH ang baseStickShape
|
||||
where
|
||||
ang = fromIntegral j * barrelspread - (fromIntegral i - 1) * barrelspread * 0.5
|
||||
barrelspread = it ^?! itParams . gunBarrels . brlSpread . spreadAngle
|
||||
f brl = rotateSH (_barlRot brl) baseStickShape
|
||||
|
||||
baseStickShape :: Shape
|
||||
baseStickShape = colorSH green $ xCylinderST 3 10
|
||||
|
||||
@@ -7,7 +7,7 @@ module Dodge.Item.Held.Cane (
|
||||
miniGunX,
|
||||
) where
|
||||
|
||||
import Dodge.Item.Held.SingleBarrel
|
||||
import Dodge.Base
|
||||
import Dodge.Data.Item
|
||||
import Dodge.Default
|
||||
import Dodge.Reloading.Action
|
||||
@@ -22,7 +22,7 @@ defaultBangCane =
|
||||
{ _muzVel = 0.8
|
||||
, _rifling = 0.9
|
||||
, _bore = 2
|
||||
, _gunBarrels = singleBarrel 0.01
|
||||
, _gunBarrels = [GunBarrel 0 0 0.01]
|
||||
, _recoil = 50
|
||||
, _torqueAfter = 0.1
|
||||
, _randomOffset = 0
|
||||
@@ -54,17 +54,13 @@ volleyGun i =
|
||||
{ _muzVel = 0.8
|
||||
, _rifling = 0.9
|
||||
, _bore = 2
|
||||
, _gunBarrels = singleBarrel 0.01
|
||||
, _gunBarrels = [GunBarrel 0 0 0.01]
|
||||
, _recoil = 50
|
||||
, _torqueAfter = 0.1
|
||||
, _randomOffset = 0
|
||||
}
|
||||
& itParams . gunBarrels
|
||||
.~ MultiBarrel
|
||||
{ _brlSpread = AlignedBarrels
|
||||
, _brlNum = i
|
||||
, _brlInaccuracy = 0.1
|
||||
}
|
||||
.~ [ GunBarrel (V2 0 x) 0 0.1 | x <- spreadAroundCenter i 3]
|
||||
& itParams . torqueAfter .~ 0.48 + 0.2 * fromIntegral i
|
||||
& itType . iyBase .~ HELD (VOLLEYGUN i)
|
||||
|
||||
@@ -100,7 +96,7 @@ burstRifle :: Item
|
||||
burstRifle =
|
||||
repeater
|
||||
& itType . iyBase .~ HELD BURSTRIFLE
|
||||
& itParams . gunBarrels . brlInaccuracy .~ 0.05
|
||||
& itParams . gunBarrels . ix 0 . barlInaccuracy .~ 0.05
|
||||
& itUse . heldDelay . rateMax .~ 18
|
||||
& itUse . heldMods .~ BurstRifleMod
|
||||
|
||||
@@ -133,12 +129,7 @@ miniGunX i =
|
||||
{ _muzVel = 1
|
||||
, _rifling = 0.9
|
||||
, _bore = 2
|
||||
, _gunBarrels =
|
||||
MultiBarrel
|
||||
{ _brlSpread = RotatingBarrels 0.01
|
||||
, _brlNum = i
|
||||
, _brlInaccuracy = 0
|
||||
}
|
||||
, _gunBarrels = replicate i (GunBarrel 0 0 0.05)
|
||||
, _recoil = 10
|
||||
, _torqueAfter = 0
|
||||
, _randomOffset = 10
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
module Dodge.Item.Held.Cone
|
||||
where
|
||||
import Dodge.Item.Held.SingleBarrel
|
||||
import Dodge.Default.Item
|
||||
import Dodge.Data.Item
|
||||
import Dodge.Reloading.Action
|
||||
@@ -15,7 +14,7 @@ bangCone =
|
||||
{ _muzVel = 0.7
|
||||
, _rifling = 0.8
|
||||
, _bore = 5
|
||||
, _gunBarrels = singleBarrel 0.5
|
||||
, _gunBarrels = [GunBarrel 0 0 0.5]
|
||||
, _recoil = 150
|
||||
, _torqueAfter = 0.1
|
||||
, _randomOffset = 12
|
||||
|
||||
@@ -7,7 +7,6 @@ module Dodge.Item.Held.Rod (
|
||||
machineGun,
|
||||
) where
|
||||
|
||||
import Dodge.Item.Held.SingleBarrel
|
||||
import Dodge.Data.Item
|
||||
import Dodge.Default
|
||||
import Dodge.Item.Weapon.Bullet
|
||||
@@ -23,7 +22,7 @@ bangRod =
|
||||
{ _muzVel = 0.8
|
||||
, _rifling = 1
|
||||
, _bore = 2
|
||||
, _gunBarrels = singleBarrel 0.1
|
||||
, _gunBarrels = [GunBarrel 0 0 0.1]
|
||||
, _recoil = 50
|
||||
, _torqueAfter = 0.3
|
||||
, _randomOffset = 0
|
||||
@@ -48,7 +47,7 @@ elephantGun =
|
||||
bangRod
|
||||
& itType . iyBase .~ HELD ELEPHANTGUN
|
||||
& itUse . heldAim . aimStance .~ TwoHandTwist
|
||||
& itParams . gunBarrels .~ singleBarrel 0.05
|
||||
& itParams . gunBarrels .~ [GunBarrel 0 0 0.05]
|
||||
& itUse . heldMods .~ ElephantGunMod
|
||||
& itParams . recoil .~ 50
|
||||
& itParams . torqueAfter .~ 0.1
|
||||
@@ -69,7 +68,7 @@ sniperRifle :: Item
|
||||
sniperRifle =
|
||||
elephantGun
|
||||
& itType . iyBase .~ HELD SNIPERRIFLE
|
||||
& itParams . gunBarrels .~ singleBarrel 0
|
||||
& itParams . gunBarrels .~ [GunBarrel 0 0 0]
|
||||
& itUse . heldAim . aimZoom .~ defaultItZoom{_izMax = 0.5, _izMin = 0.5,_izFac = 1}
|
||||
& itUse . heldScroll .~ HeldScrollZoom -- zoomLongGun
|
||||
& itScope .~ ZoomScope (V2 0 0) 1 0.5 False
|
||||
|
||||
@@ -8,7 +8,7 @@ module Dodge.Item.Held.Stick (
|
||||
revolverX,
|
||||
) where
|
||||
|
||||
import Dodge.Item.Held.SingleBarrel
|
||||
import Dodge.Base
|
||||
import Dodge.Data.Item
|
||||
import Dodge.Default.Item
|
||||
import Dodge.Reloading.Action
|
||||
@@ -23,12 +23,7 @@ bangStick i =
|
||||
{ _muzVel = 0.8
|
||||
, _rifling = 0.8
|
||||
, _bore = 2
|
||||
, _gunBarrels =
|
||||
MultiBarrel
|
||||
{ _brlNum = i
|
||||
, _brlSpread = SpreadBarrels baseStickSpread
|
||||
, _brlInaccuracy = 0.01
|
||||
}
|
||||
, _gunBarrels = [GunBarrel 0 a 0.01 | a <- spreadAroundCenter i baseStickSpread]
|
||||
, _recoil = 25
|
||||
, _torqueAfter = 0.18 + 0.02 * fromIntegral i
|
||||
, _randomOffset = 0
|
||||
@@ -71,7 +66,7 @@ pistol =
|
||||
%~ ( (muzVel .~ 0.8)
|
||||
. (rifling .~ 0.8)
|
||||
. (bore .~ 2)
|
||||
. (gunBarrels .~ singleBarrel 0.05)
|
||||
. (gunBarrels .~ [GunBarrel 0 0 0.05])
|
||||
. (recoil .~ 10)
|
||||
. (torqueAfter .~ 0.2)
|
||||
)
|
||||
|
||||
@@ -44,8 +44,8 @@ module Dodge.Item.Weapon.TriggerType (
|
||||
withSidePushAfterI,
|
||||
withSidePushI,
|
||||
withWarmUp,
|
||||
spreadNumI,
|
||||
spreadLoaded,
|
||||
--spreadNumI,
|
||||
--spreadLoaded,
|
||||
repeatOnFrames,
|
||||
sideEffectOnFrame,
|
||||
duplicateItem,
|
||||
@@ -63,7 +63,6 @@ module Dodge.Item.Weapon.TriggerType (
|
||||
blCheck,
|
||||
) where
|
||||
|
||||
import Control.Applicative
|
||||
import qualified SDL
|
||||
import Data.Foldable
|
||||
import Data.Maybe
|
||||
@@ -498,10 +497,7 @@ crAtMuzPos f it cr = f it (cr & crPos +.+.~ (aimingMuzzlePos cr it *.* unitVecto
|
||||
applyInaccuracy :: ChainEffect
|
||||
applyInaccuracy f it = withRandomDirI acc f it
|
||||
where
|
||||
acc = fromMaybe 0 $
|
||||
(it ^? itParams . gunBarrels . brlList . ix 0 . barlInaccuracy)
|
||||
<|>
|
||||
(it ^? itParams . gunBarrels . brlInaccuracy)
|
||||
acc = fromMaybe 0 $ it ^? itParams . gunBarrels . ix 0 . barlInaccuracy
|
||||
|
||||
-- | Applies the effect to a randomly rotated creature.
|
||||
withRandomDirI ::
|
||||
@@ -616,26 +612,26 @@ withTorqueAfter feff item cr w
|
||||
(rot, g) = randomR (- torque, torque) $ _randGen w
|
||||
torque = fromMaybe 0 $ item ^? itParams . torqueAfter
|
||||
|
||||
spreadNumI :: ChainEffect
|
||||
spreadNumI eff item cr w = foldr f w dirs
|
||||
where
|
||||
dirs =
|
||||
zipWith
|
||||
(+)
|
||||
[- spread, - spread + (2 * spread / fromIntegral numBul) .. spread]
|
||||
(randomRs (0, spread / fromIntegral numBul) (_randGen w))
|
||||
f dir = eff item (cr & crDir +~ dir)
|
||||
spread = _spreadAngle . _brlSpread . _gunBarrels $ _itParams item
|
||||
numBul = _brlNum . _gunBarrels $ _itParams item
|
||||
--spreadNumI :: ChainEffect
|
||||
--spreadNumI eff item cr w = foldr f w dirs
|
||||
-- where
|
||||
-- dirs =
|
||||
-- zipWith
|
||||
-- (+)
|
||||
-- [- spread, - spread + (2 * spread / fromIntegral numBul) .. spread]
|
||||
-- (randomRs (0, spread / fromIntegral numBul) (_randGen w))
|
||||
-- f dir = eff item (cr & crDir +~ dir)
|
||||
-- spread = _spreadAngle . _brlSpread . _gunBarrels $ _itParams item
|
||||
-- numBul = _brlNum . _gunBarrels $ _itParams item
|
||||
|
||||
spreadLoaded :: ChainEffect
|
||||
spreadLoaded eff item cr w = foldr f w dirs
|
||||
where
|
||||
cd = 0.5 * spread * fromIntegral (numBulLoaded -1)
|
||||
dirs = subtract cd . (spread *) . fromIntegral <$> [0 .. numBulLoaded - 1]
|
||||
f dir = eff item (cr & crDir +~ dir)
|
||||
spread = _spreadAngle . _brlSpread . _gunBarrels $ _itParams item
|
||||
numBulLoaded = item ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded
|
||||
--spreadLoaded :: ChainEffect
|
||||
--spreadLoaded eff item cr w = foldr f w dirs
|
||||
-- where
|
||||
-- cd = 0.5 * spread * fromIntegral (numBulLoaded -1)
|
||||
-- dirs = subtract cd . (spread *) . fromIntegral <$> [0 .. numBulLoaded - 1]
|
||||
-- f dir = eff item (cr & crDir +~ dir)
|
||||
-- spread = _spreadAngle . _brlSpread . _gunBarrels $ _itParams item
|
||||
-- numBulLoaded = item ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded
|
||||
|
||||
sideEffectOnFrame ::
|
||||
Int ->
|
||||
@@ -673,15 +669,12 @@ duplicateLoaded eff it cr w = foldr f w [1 .. numBul]
|
||||
numBul = it ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded
|
||||
|
||||
duplicateLoadedBarrels :: ChainEffect
|
||||
duplicateLoadedBarrels eff item cr w = foldr f w poss
|
||||
duplicateLoadedBarrels eff itm cr w = foldr f w (take numbul $ itm ^?! itParams . gunBarrels)
|
||||
where
|
||||
cp :: Float
|
||||
cp = -0.5 * (fromIntegral numBar - 1)
|
||||
poss :: [V2 Float]
|
||||
poss = map (rotateV (_crDir cr) . V2 0 . (* 5) . (+ cp) . fromIntegral) [0 .. numBul - 1]
|
||||
f pos = eff item (cr & crPos %~ (+.+ pos))
|
||||
numBar = _brlNum . _gunBarrels $ _itParams item
|
||||
numBul = item ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded
|
||||
numbul = itm ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded
|
||||
f brl = eff itm (cr & crPos +~ _barlPos brl
|
||||
& crDir +~ _barlRot brl
|
||||
) -- worry about inaccuracy later
|
||||
|
||||
duplicateOffsetsFocus :: [Float] -> ChainEffect
|
||||
duplicateOffsetsFocus xs eff item cr w = foldr f w poss
|
||||
|
||||
Reference in New Issue
Block a user