From 4cfb7d431a4ad777c91dba1dd21565aa10452752 Mon Sep 17 00:00:00 2001 From: justin Date: Sat, 20 May 2023 17:48:51 +0100 Subject: [PATCH] Explicitly store list of barrels for weapons --- src/Dodge/Base.hs | 6 +++ src/Dodge/Data/Item/Params.hs | 38 ++++++++--------- src/Dodge/HeldUse.hs | 7 ++-- src/Dodge/Item/Draw/SPic.hs | 17 +++----- src/Dodge/Item/Held/Cane.hs | 21 +++------- src/Dodge/Item/Held/Cone.hs | 3 +- src/Dodge/Item/Held/Rod.hs | 7 ++-- src/Dodge/Item/Held/Stick.hs | 11 ++--- src/Dodge/Item/Weapon/TriggerType.hs | 61 ++++++++++++---------------- 9 files changed, 73 insertions(+), 98 deletions(-) diff --git a/src/Dodge/Base.hs b/src/Dodge/Base.hs index b2134638d..da0c4c93e 100644 --- a/src/Dodge/Base.hs +++ b/src/Dodge/Base.hs @@ -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]] diff --git a/src/Dodge/Data/Item/Params.hs b/src/Dodge/Data/Item/Params.hs index 49ae238c4..83567da7b 100644 --- a/src/Dodge/Data/Item/Params.hs +++ b/src/Dodge/Data/Item/Params.hs @@ -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 diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index f7280b43c..32bf9b860 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -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 diff --git a/src/Dodge/Item/Draw/SPic.hs b/src/Dodge/Item/Draw/SPic.hs index bc7d928d7..4daa2e303 100644 --- a/src/Dodge/Item/Draw/SPic.hs +++ b/src/Dodge/Item/Draw/SPic.hs @@ -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 diff --git a/src/Dodge/Item/Held/Cane.hs b/src/Dodge/Item/Held/Cane.hs index a1bcb234f..bbd74f451 100644 --- a/src/Dodge/Item/Held/Cane.hs +++ b/src/Dodge/Item/Held/Cane.hs @@ -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 diff --git a/src/Dodge/Item/Held/Cone.hs b/src/Dodge/Item/Held/Cone.hs index a342047c9..1fd9c5635 100644 --- a/src/Dodge/Item/Held/Cone.hs +++ b/src/Dodge/Item/Held/Cone.hs @@ -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 diff --git a/src/Dodge/Item/Held/Rod.hs b/src/Dodge/Item/Held/Rod.hs index 1a12af7b0..000cdba46 100644 --- a/src/Dodge/Item/Held/Rod.hs +++ b/src/Dodge/Item/Held/Rod.hs @@ -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 diff --git a/src/Dodge/Item/Held/Stick.hs b/src/Dodge/Item/Held/Stick.hs index 72380843e..4b00e762d 100644 --- a/src/Dodge/Item/Held/Stick.hs +++ b/src/Dodge/Item/Held/Stick.hs @@ -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) ) diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index 1c7de4767..249e77bd2 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -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