From 1bb1a0610137fa59c64003a4bdef938ed9ba972d Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 5 Dec 2021 00:36:31 +0000 Subject: [PATCH] Reloading slows movement --- src/Dodge/ChainEffect.hs | 9 ++ src/Dodge/Combine.hs | 21 +++-- src/Dodge/Combine/Data.hs | 5 +- src/Dodge/Creature/Impulse/Movement.hs | 5 +- src/Dodge/Creature/Stance/Data.hs | 2 +- src/Dodge/Creature/YourControl.hs | 9 +- src/Dodge/Data.hs | 5 +- src/Dodge/Item/Weapon/BulletGuns.hs | 118 ++++++++++++++++++++++--- src/LensHelp.hs | 5 ++ 9 files changed, 155 insertions(+), 24 deletions(-) create mode 100644 src/Dodge/ChainEffect.hs diff --git a/src/Dodge/ChainEffect.hs b/src/Dodge/ChainEffect.hs new file mode 100644 index 000000000..35ec8a3e9 --- /dev/null +++ b/src/Dodge/ChainEffect.hs @@ -0,0 +1,9 @@ +module Dodge.ChainEffect where +import Dodge.Data + +type ChainEffect = + (Item -> Creature -> World -> World) + -> Item + -> Creature + -> World + -> World diff --git a/src/Dodge/Combine.hs b/src/Dodge/Combine.hs index 8492bd5ac..2b8292d27 100644 --- a/src/Dodge/Combine.hs +++ b/src/Dodge/Combine.hs @@ -5,6 +5,7 @@ import Dodge.Data --import Dodge.Combine.Data import Multiset import Dodge.Item.Weapon.BulletGuns +import Dodge.Item.Weapon.Launcher --import Dodge.Item.Craftable import Control.Lens @@ -18,22 +19,32 @@ import Data.List (scanl') itemCombinations :: [ (M.Map CombineType Int, Item) ] itemCombinations = map (first toMultiset) $ [ p [PIPE,HARDWARE] (bangStick 1) - , p [PIPE,PIPE,HARDWARE] bangCane - , p [PIPE,PIPE,PIPE,HARDWARE] bangRod - , p [BANGSTICK 1,CAN] revolver , p [BANGSTICK 1,TIN] pistol , p [PISTOL, SPRING, HARDWARE] autoPistol , p [AUTOPISTOL, PLANK, HARDWARE] smg , p [AUTOPISTOL, HARDWARE] machinePistol + , p [BANGSTICK 1,CAN] revolver , p [REVOLVER, SPRING, HARDWARE] $ revolverX 1 + , p [PIPE,TUBE,HARDWARE] bangCone , p [BANGCONE,PLANK] blunderbuss + , p [BLUNDERBUSS,TUBE] grapeShotCannon , p [BANGCONE,PUMP,HARDWARE] $ grenadeLauncher 1 , p [GRENADELAUNCHER 1,MOTOR,DRUM] $ grenadeLauncher 2 - , p [BLUNDERBUSS,TUBE] grapeShotCannon + + , p [PIPE,PIPE,HARDWARE] bangCane + , p [BANGCANE,PIPE,PIPE] (bangCaneX 2) + , p [BANGCANE,TIN] rifle + , p [RIFLE,SPRING,HARDWARE] autoRifle + , p [RIFLE,SPRING,CAN] assaultRifle + + , p [PIPE,PIPE,PIPE,HARDWARE] bangRod + + , p [TUBE,TUBE,TUBE,HARDWARE] launcher ] ++ map (\i -> ([PIPE,BANGSTICK i],bangStick (i+1))) [1..8] - ++ map (\i -> ([REVOLVERX i,CAN] ,revolverX (i+1))) [1..6] + ++ map (\i -> ([REVOLVERX i,CAN] ,revolverX (i+1))) [1..5] + ++ map (\i -> ([BANGCANEX i,PIPE,PIPE] ,bangCaneX (i+1))) [1..5] where p = (,) diff --git a/src/Dodge/Combine/Data.hs b/src/Dodge/Combine/Data.hs index ad5d01d1b..80085ab05 100644 --- a/src/Dodge/Combine/Data.hs +++ b/src/Dodge/Combine/Data.hs @@ -19,11 +19,13 @@ data CombineType | BLUNDERBUSS | GRAPESHOTCANNON | GRENADELAUNCHER Int -- number of chambers that can be reloaded - | MORTAR +-- | MORTARCONE / HANDMORTAR | MINIGUN | BANGCANE | BANGCANEX Int | RIFLE + | AUTORIFLE + | ASSAULTRIFLE | AUTOGUN | SPREADGUN | MULTGUN @@ -63,6 +65,7 @@ data CombineType | PUMP | MOTOR | PRISM + | LIGHTER | MAGNET | TPipe | NoCombineType diff --git a/src/Dodge/Creature/Impulse/Movement.hs b/src/Dodge/Creature/Impulse/Movement.hs index 977dbff7e..021ef706a 100644 --- a/src/Dodge/Creature/Impulse/Movement.hs +++ b/src/Dodge/Creature/Impulse/Movement.hs @@ -38,9 +38,12 @@ crMvAbsolute p' cr = advanceStepCounter (magV p) cr equipFactor | _posture (_crStance cr) == Aiming = product $ map equipAimSpeed $ IM.elems $ _crInv cr + | _posture (_crStance cr) == Reloading + = product $ map equipAimSpeed $ IM.elems $ _crInv cr | otherwise = product $ map equipSpeed $ IM.elems $ _crInv cr aimingFactor - | _posture (_crStance cr) == Aiming = fromMaybe 1 $ it ^? itUse . useAim . aimSpeed + | _posture (_crStance cr) == Aiming || _posture (_crStance cr) == Reloading + = fromMaybe 1 $ it ^? itUse . useAim . aimSpeed | otherwise = 1 it = _crInv cr IM.! _crInvSel cr diff --git a/src/Dodge/Creature/Stance/Data.hs b/src/Dodge/Creature/Stance/Data.hs index 15de38f51..36405895f 100644 --- a/src/Dodge/Creature/Stance/Data.hs +++ b/src/Dodge/Creature/Stance/Data.hs @@ -28,7 +28,7 @@ data FootForward | WasRightForward deriving (Eq,Ord,Show) -data Posture = Aiming | AtEase +data Posture = Aiming | Reloading | AtEase deriving (Eq,Ord,Show) diff --git a/src/Dodge/Creature/YourControl.hs b/src/Dodge/Creature/YourControl.hs index 6e8f576c3..ee6458cd7 100644 --- a/src/Dodge/Creature/YourControl.hs +++ b/src/Dodge/Creature/YourControl.hs @@ -12,6 +12,7 @@ import qualified SDL import qualified Data.Set as S import qualified Data.IntMap.Strict as IM import Data.Monoid +import Data.Maybe {- | The AI equivalent for your control. -} yourControl :: Creature @@ -62,8 +63,10 @@ wasdDir w = foldr ((+.+) . wasdM) (V2 0 0) $ _keys w {- | Set posture according to mouse presses. -} mouseActionsCr :: S.Set SDL.MouseButton -> Creature -> Creature -mouseActionsCr pkeys - | rbPressed = crStance . posture .~ Aiming - | otherwise = crStance . posture .~ AtEase +mouseActionsCr pkeys cr + | reloading = cr & crStance . posture .~ Reloading + | rbPressed = cr & crStance . posture .~ Aiming + | otherwise = cr & crStance . posture .~ AtEase where + reloading = isJust $ cr ^? crInv . ix (_crInvSel cr) . itConsumption . reloadState . _Just' rbPressed = SDL.ButtonRight `S.member` pkeys diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 33d4ab66c..047facba7 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -548,8 +548,9 @@ data TweakParam = TweakParam } data GunBarrels = MultiBarrel - { _brlSpread :: BarrelSpread - , _brlNum :: Int + { _brlSpread :: BarrelSpread + , _brlNum :: Int + , _brlInaccuracy :: Float } | RotBarrel { _brlNum :: Int diff --git a/src/Dodge/Item/Weapon/BulletGuns.hs b/src/Dodge/Item/Weapon/BulletGuns.hs index 4463aa6b5..29c7e5aef 100644 --- a/src/Dodge/Item/Weapon/BulletGuns.hs +++ b/src/Dodge/Item/Weapon/BulletGuns.hs @@ -8,6 +8,10 @@ module Dodge.Item.Weapon.BulletGuns , bangStick , bangRod , bangCane + , bangCaneX + , rifle + , autoRifle + , assaultRifle , autoGun , multGun , miniGun @@ -42,10 +46,11 @@ import Geometry import ShapePicture import Shape import Sound.Data +import LensHelp import Data.Maybe import qualified Data.Sequence as Seq -import Control.Lens +--import Control.Lens import Control.Monad.State import System.Random @@ -143,26 +148,109 @@ bangStick i = defaultGun , _gunBarrels = MultiBarrel {_brlNum = i ,_brlSpread = SpreadBarrels 0.2 + ,_brlInaccuracy = 0 } } , _itTweaks = defaultBulletSelTweak , _itInvSize = fromIntegral i / 3 } -bangCane,bangRod :: Item +bangCane :: Item bangCane = defaultGun - { _itParams = BulletShooter + { _itName = "BANGCANE" + , _itCombineType = BANGCANE + ,_itParams = BulletShooter { _muzVel = 0.8 , _rifling = 0.9 , _bore = 2 - , _gunBarrels = SingleBarrel 0.05 + , _gunBarrels = SingleBarrel 0.1 } + , _itConsumption = defaultAmmo + { _aoType = basicBullet + , _ammoMax = 1 + , _reloadTime = 20 + , _reloadType = ActivePartial 1 + } + , _itUse = useAmmoParamsRate 6 upHammer + [ ammoHammerCheck + , useTimeCheck + , withSoundStart tap3S + , useAmmoAmount 1 + , torqueAfterI 0.1 + , applyInaccuracy + , withMuzFlareI + , withRecoilI 50 + ] , _itFloorPict = autoGunPic + , _itTweaks = defaultBulletSelTweak } & itUse . useAim . aimSpeed .~ 0.4 & itUse . useAim . aimRange .~ 1 & itUse . useAim . aimStance .~ TwoHandTwist & itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5} +bangCaneX :: Int -> Item +bangCaneX i = bangCane + { _itName = "BANGCANEx"++show i + , _itCombineType = BANGCANEX i + , _itUse = useAmmoParamsRate 6 upHammer + [ ammoHammerCheck + , useTimeCheck + , withSoundItemChoiceStart bangStickSoundChoice + , useAmmoAmount 1 + , torqueAfterI 0.2 + , duplicateLoadedBarrels + , applyInaccuracy + , withMuzFlareI + , withRecoilI 50 + ] + } & itUse . useAim . aimSpeed .~ 0.4 + & itUse . useAim . aimRange .~ 1 + & itUse . useAim . aimStance .~ TwoHandTwist + & itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5} + & itConsumption . ammoMax .~ i + & itParams . gunBarrels .~ MultiBarrel + {_brlSpread = AlignedBarrels + ,_brlNum = i + ,_brlInaccuracy = 0.1 + } + +rifle :: Item +rifle = bangCane + & itName .~ "RIFLE" + & itCombineType .~ RIFLE + & itConsumption . ammoMax .~ 15 + & itConsumption . reloadType .~ ActiveClear + & itConsumption . reloadTime .~ 80 + +autoRifle :: Item +autoRifle = rifle + & itName .~ "AUTORIFLE" + & itCombineType .~ AUTORIFLE + & itUse . useMods %~ ((ammoCheckI :) . tail) +-- & itUse . useDelay . rateMax .~ 6 +assaultRifle :: Item +assaultRifle = rifle + & itName .~ "ASSAULTRIFLE" + & itCombineType .~ ASSAULTRIFLE + & itUse . useDelay . rateMax .~ 18 + & itUse . useMods .~ + [ ammoHammerCheck + , useTimeCheck + , torqueAfterI 0.2 + , lockInvFor 10 + , \f it -> repeatOnFrames (take (_ammoLoaded (_itConsumption it) - 1) [3,6]) f it + , withSoundStart tap3S + , useAmmoAmount 1 + , applyInaccuracy + , withMuzFlareI + , withRecoilI 50 + ] + + + +bangRod :: Item bangRod = bangCane - { _itParams = BulletShooter + { _itName = "BANGROD" + , _itCombineType = BANGROD + , _itParams = BulletShooter { _muzVel = 0.8 , _rifling = 1 , _bore = 2 @@ -187,10 +275,11 @@ revolverX i = revolver , \f it -> repeatOnFrames (take (_ammoLoaded (_itConsumption it) - 1) [2,4,6,8,10]) f it , withSoundStart tap3S , useAmmoUpTo 1 --- , applyInaccuracy + , applyInaccuracy , withMuzFlareI -- , spreadLoaded - , withRecoilI 25 + , torqueAfterI 0.2 + , withRecoilI 10 ] } & itConsumption . ammoMax .~ i * 6 bangCone :: Item @@ -257,6 +346,7 @@ blunderbuss = bangCone , withRandomItemParams coneRandItemParams ] & useAim . aimStance .~ TwoHandTwist + & useAim . aimSpeed .~ 0.4 } grapeShotCannon :: Item @@ -282,7 +372,6 @@ grapeShotCannon = blunderbuss & itConsumption . ammoMax .~ 15 & itConsumption . reloadTime .~ 30 - grenadeLauncher :: Int -> Item grenadeLauncher _ = bangCone @@ -415,11 +504,13 @@ hvAutoGunPic it = where am = _ammoLoaded $ _itConsumption it autoPistol :: Item -autoPistol = pistol & itUse . useMods .~ (ammoCheckI : pistolAfterHamMods) +autoPistol = pistol + & itUse . useMods .~ (ammoCheckI : pistolAfterHamMods) & itName .~ "AUTOPISTOL" & itCombineType .~ AUTOPISTOL machinePistol :: Item -machinePistol = autoPistol & itUse . useDelay . rateMax .~ 2 +machinePistol = autoPistol + & itUse . useDelay . rateMax .~ 2 & itUse . useMods .~ (ammoCheckI : machinePistolAfterHamMods) & itName .~ "MACHINEPISTOL" & itCombineType .~ MACHINEPISTOL @@ -428,6 +519,7 @@ smg = autoPistol -- & some parameter affecting stability & itUse . useMods .~ (ammoCheckI : smgAfterHamMods) & itName .~ "SMG" & itCombineType .~ SMG + & itUse . useAim . aimStance .~ TwoHandTwist ltAutoGun :: Item ltAutoGun = defaultAutoGun { _itName = "AUTO-LT" @@ -522,7 +614,9 @@ miniGun = defaultAutoGun , _bore = 2 , _gunBarrels = MultiBarrel {_brlSpread = RotatingBarrels 0.01 - ,_brlNum = 4} + ,_brlNum = 4 + ,_brlInaccuracy = 0 + } } , _itEquipPict = pictureWeaponAim miniGunPictItem , _itTweaks = defaultBulletSelTweak @@ -602,6 +696,7 @@ spreadGun = defaultGun , _gunBarrels = MultiBarrel {_brlNum = 5 ,_brlSpread = SpreadBarrels 0.5 + ,_brlInaccuracy = 0 } } , _itFloorPict = spreadGunPic @@ -648,6 +743,7 @@ multGun = defaultGun , _gunBarrels = MultiBarrel {_brlNum = 5 ,_brlSpread = AlignedBarrels + ,_brlInaccuracy = 0 } } , _itTweaks = defaultBulletSelTweak diff --git a/src/LensHelp.hs b/src/LensHelp.hs index 0ed841d57..a9ad32e13 100644 --- a/src/LensHelp.hs +++ b/src/LensHelp.hs @@ -2,6 +2,7 @@ module LensHelp ( module Control.Lens , (.:~) , (.++~) + , (++.~) ) where import Control.Lens @@ -12,3 +13,7 @@ infixr 4 .:~ infixr 4 .++~ (.++~) :: ASetter s t [a] [a] -> [a] -> s -> t (.++~) m x = m %~ (x ++) + +infixr 4 ++.~ +(++.~) :: ASetter s t [a] [a] -> [a] -> s -> t +(++.~) m x = m %~ (++ x)