diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 89e2dedff..8239d1e12 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -350,31 +350,31 @@ data Item , _itAimStance :: AimStance } | Throwable - { _itName :: String - , _itMaxStack :: Int - , _itAmount :: Int - , _itFloorPict :: Picture - , _twMaxRange :: Float - , _twAccuracy :: Float - , _itUse :: Item -> Creature -> World -> World - , _itUseRate :: Int - , _itUseTime :: Int - , _itUseModifiers :: [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World] - , _itAimingSpeed :: Float - , _itAimingRange :: Float - , _itZoom :: ItZoom - , _itAimZoom :: ItZoom - , _itEquipPict :: Creature -> Int -> Picture - , _itIdentity :: ItemIdentity - , _itID :: Maybe Int + { _itName :: String + , _itMaxStack :: Int + , _itAmount :: Int + , _itFloorPict :: Picture + , _twMaxRange :: Float + , _twAccuracy :: Float + , _itUse :: Item -> Creature -> World -> World + , _itUseRate :: Int + , _itUseTime :: Int + , _itUseModifiers :: [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World] + , _itAimingSpeed :: Float + , _itAimingRange :: Float + , _itZoom :: ItZoom + , _itAimZoom :: ItZoom + , _itEquipPict :: Creature -> Int -> Picture + , _itIdentity :: ItemIdentity + , _itID :: Maybe Int , _itAttachment :: ItAttachment , _itInvDisplay :: Item -> String - , _itInvColor :: Color - , _itEffect :: ItEffect - , _itHammer :: HammerPosition - , _itScrollUp :: Int -> World -> World + , _itInvColor :: Color + , _itEffect :: ItEffect + , _itHammer :: HammerPosition + , _itScrollUp :: Int -> World -> World , _itScrollDown :: Int -> World -> World - , _itAimStance :: AimStance + , _itAimStance :: AimStance } | NoItem diff --git a/src/Dodge/Item/Attachment.hs b/src/Dodge/Item/Attachment.hs index edc714922..64cf85438 100644 --- a/src/Dodge/Item/Attachment.hs +++ b/src/Dodge/Item/Attachment.hs @@ -1,4 +1,9 @@ module Dodge.Item.Attachment + ( charFiringStratI + , scrollCharMode + , decreaseFuse + , increaseFuse + ) where import Dodge.Data import Dodge.Item.Attachment.Data @@ -6,19 +11,9 @@ import Dodge.Default import Control.Lens hiding ((|>),(<|)) import Data.Sequence -import Data.Maybe (fromJust) +import Data.Maybe import qualified Data.IntMap.Strict as IM -incCharMode' :: ItAttachment -> ItAttachment -incCharMode' = itCharMode %~ cycleL - where - cycleL (x :<| xs) = xs |> x - cycleL xs = xs -decCharMode' :: ItAttachment -> ItAttachment -decCharMode' = itCharMode %~ cycleR - where - cycleR (xs :|> x) = x <| xs - cycleR xs = xs scrollCharMode :: Float -- ^ Amount scrolled @@ -34,34 +29,32 @@ incCharMode :: Int -- ^ Inventory selection -> World -> World -incCharMode i = creatures . ix 0 . crInv . ix i . itAttachment %~ incCharMode' +incCharMode i = creatures . ix 0 . crInv . ix i . itAttachment . itCharMode %~ cycleL + where + cycleL (x :<| xs) = xs |> x + cycleL xs = xs + decCharMode :: Int -- ^ Inventory selection -> World -> World -decCharMode i = creatures . ix 0 . crInv . ix i . itAttachment %~ decCharMode' - -charFiringStrat - :: [(Char, Creature -> World -> World)] -- ^ Different firing effects for different characters - -> Creature -- ^ Creature id - -> World - -> World -charFiringStrat strats cr w = case w ^? creatures . ix cid . crInv - . ix (_crInvSel $ _creatures w IM.! cid) . itAttachment . itCharMode of - Just (c :<| _) -> fromJust (Prelude.lookup c strats) cr w - _ -> w +decCharMode i = creatures . ix 0 . crInv . ix i . itAttachment . itCharMode %~ cycleR where - cid = _crID cr -charFiringStratI - :: [(Char, (Item -> Creature -> World -> World) -> Item -> Creature -> World -> World)] -- ^ Different firing effects for different characters - -> (Item -> Creature -> World -> World) + cycleR (xs :|> x) = x <| xs + cycleR xs = xs + +type ChainEffect = + (Item -> Creature -> World -> World) -> Item - -> Creature + -> Creature -> World -> World +charFiringStratI + :: [(Char, ChainEffect)] -- ^ Different firing effects for different characters + -> ChainEffect charFiringStratI strats eff item cr w = case w ^? creatures . ix cid . crInv . ix (_crInvSel $ _creatures w IM.! cid) . itAttachment . itCharMode of - Just (c :<| _) -> fromJust (Prelude.lookup c strats) eff item cr w + Just (c :<| _) -> fromMaybe id (Prelude.lookup c strats) eff item cr w _ -> w where cid = _crID cr @@ -84,7 +77,8 @@ increaseFuse fuse itid w = w decreaseFuse :: Int -- ^ Old fuse time -> Int -- ^ Inventory item reference (I believe) - -> World -> World + -> World + -> World decreaseFuse fuse itid w = w & creatures . ix 0 . crInv . ix itid %~ ( itScrollUp .~ decreaseFuse newTime ) diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 8393d752f..5ee3e5526 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -67,7 +67,7 @@ pistol = defaultGun , useTimeCheckI , withSoundI 0 , useAmmo 1 --- , withRandomDirI 0.1 + , randSpreadDir , withMuzFlareI ] , _itLeftClickUse = Nothing @@ -828,7 +828,7 @@ grenade = Throwable , _itInvDisplay = basicWeaponDisplay , _itEffect = wpRecock , _itHammer = HammerUp - , _itScrollUp = decreaseFuse fuseTime + , _itScrollUp = decreaseFuse fuseTime , _itScrollDown = increaseFuse fuseTime , _itAimStance = OneHand } diff --git a/src/Dodge/Item/Weapon/AutoGun.hs b/src/Dodge/Item/Weapon/AutoGun.hs index 0b28cacec..153ac65bc 100644 --- a/src/Dodge/Item/Weapon/AutoGun.hs +++ b/src/Dodge/Item/Weapon/AutoGun.hs @@ -32,10 +32,13 @@ autoGun = defaultAutoGun , _itUse = useAmmoParams , _itUseModifiers = [ ammoCheckI + , charFiringStratI + [('S', hammerCheckI) + ] , useTimeCheckI , charFiringStratI - [('M', torqueBefore 0.05) - ,('S', hammerCheckI) + [('M', torqueBefore 0.08) + ,('S', torqueBefore 0.05) ] , withSoundI autoGunSound , useAmmo 1 diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index c877d9af0..5ec85e812 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -31,6 +31,7 @@ module Dodge.Item.Weapon.TriggerType , shootL , useTimeCheckI , ammoCheckI + , randSpreadDir ) where import Dodge.Data @@ -282,6 +283,14 @@ withMuzFlareI f it cr w = tempLightForAt 3 pos2 -- . muzzleFlashAt pos2 where --pos = _crPos cr +.+ _crRad cr *.* unitVectorAtAngle (_crDir cr) pos2 = _crPos cr +.+ (2 * _crRad cr) *.* unitVectorAtAngle (_crDir cr) +{- | Applies the effect to a randomly rotated creature, + - rotation amount given by wpSpread -} +randSpreadDir :: ChainEffect +randSpreadDir f it cr w = f it (cr & crDir +~ a) $ set randGen g w + where + acc = _wpSpread it + (a, g) = randomR (-acc,acc) $ _randGen w + {- | Applies the effect to a randomly rotated creature. -} withRandomDirI :: Float -- ^ Max possible rotation diff --git a/src/Dodge/Render/Picture.hs b/src/Dodge/Render/Picture.hs index 3becb287b..b61dfc777 100644 --- a/src/Dodge/Render/Picture.hs +++ b/src/Dodge/Render/Picture.hs @@ -9,7 +9,7 @@ import Dodge.Picture import Dodge.Picture.Layer import Dodge.Render.HUD import Dodge.Render.MenuScreen -import Dodge.Graph +--import Dodge.Graph import Geometry import Picture import Polyhedra.Data @@ -59,7 +59,8 @@ customMouseCursor w = $ pictures [ line [V2 (-5) 0,V2 5 0] , line [V2 0 (-5),V2 0 5] ] testPic :: World -> Picture -testPic w = color green . pictures . map (flip thickLine 5 . tflat2) . graphToEdges $ _pathGraph w +testPic _ = blank +--testPic w = color green . pictures . map (flip thickLine 5 . tflat2) . graphToEdges $ _pathGraph w crDraw :: World -> Creature -> Picture crDraw w c = _crPict c c w