Move targeting to dedicated datatype within item

This commit is contained in:
2022-02-22 21:49:10 +00:00
parent 055fcf4cce
commit 8a7d06783d
9 changed files with 48 additions and 29 deletions
+2 -1
View File
@@ -40,11 +40,12 @@ bezierGun = defaultGun
-- , _itFloorPict = bezierGunSPic
, _itAttachment = NoItAttachment
, _itScroll = \_ _ -> removeItTarget
, _itEffect = rbSetTarget
-- , _itEffect = rbSetTarget
-- , _itZoom = defaultItZoom
, _itConsumption = defaultAmmo
{ _ammoBaseMax = 15
}
, _itTargeting' = targetRBPress
}
shootBezier :: Point2 -> Creature -> World -> World
shootBezier targetp cr w = w & particles .:~ aCurveBulAt
-2
View File
@@ -65,7 +65,6 @@ bangStick i = defaultGun
]
, _itID = Nothing
, _itInvColor = white
, _itTargeting = Nothing
, _itParams = BulletShooter
{ _muzVel = 0.8
, _rifling = 0.8
@@ -185,7 +184,6 @@ pistol = (bangStick 1)
-- , _itEquipPict = pictureWeaponAim pistolPic
, _itID = Nothing
, _itInvColor = white
, _itTargeting = Nothing
, _itParams = BulletShooter
{ _muzVel = 0.8
, _rifling = 0.8
+37 -12
View File
@@ -7,7 +7,8 @@ module Dodge.Item.Weapon.ExtraEffect
itemLaserScopeEffect
, autoSonarEffect
, autoRadarEffect
, rbSetTarget
, targetRBPress
-- , rbSetTarget
) where
import Dodge.Data
import Dodge.Base
@@ -81,19 +82,43 @@ autoSonarEffect = ItInvEffect {_itInvEffect = f 50 ,_itEffectCounter = 0 }
f t _ cr i w = w
& creatures . ix (_crID cr) . crInv . ix i . itEffect . itInvEffect .~ f (t-1)
rbSetTarget :: ItEffect
rbSetTarget = ItInvEffect
{_itInvEffect = setTarg
,_itEffectCounter = 0
targetRBPress :: Targeting
targetRBPress = TargetingOnHeld
{ _tgPos = Nothing
, _tgHeldUpdate = targetRBPressUpdate
, _tgDraw = targetRBPressDraw
}
targetRBPressDraw :: Int -> Item -> Creature -> World -> Picture
targetRBPressDraw _ it _ w' = fromMaybe mempty $ do
mwp <- it ^? itTargeting' . tgPos . _Just
return $ setLayer 1 $ color red $ onLayer InvLayer $ uncurryV translate mwp
$ rotate (_cameraRot w')
$ pictures
[line [V2 x x, V2 (-x) (-x)]
,line [V2 (-x) x, V2 x (-x)]
]
where
setTarg :: ItEffect -> Creature -> Int -> World -> World
setTarg _ cr invid w
| _crInvSel cr /= invid = w
| SDL.ButtonRight `S.member` _mouseButtons w = w
& creatures . ix (_crID cr) . crInv . ix invid . itTargeting
%~ maybe (Just $ targetRBMousePos w) Just
| otherwise = w & creatures . ix (_crID cr) . crInv . ix invid . itTargeting .~ Nothing
x = 5 / _cameraZoom w'
targetRBPressUpdate :: Item -> Creature -> World -> Targeting -> Targeting
targetRBPressUpdate _ _ w t
| SDL.ButtonRight `S.member` _mouseButtons w = t
& tgPos %~ maybe (Just $ mouseWorldPos w) Just
| otherwise = t & tgPos %~ const Nothing
--rbSetTarget :: ItEffect
--rbSetTarget = ItInvEffect
-- {_itInvEffect = setTarg
-- ,_itEffectCounter = 0
-- }
-- where
-- setTarg :: ItEffect -> Creature -> Int -> World -> World
-- setTarg _ cr invid w
-- | _crInvSel cr /= invid = w
-- | SDL.ButtonRight `S.member` _mouseButtons w = w
-- & creatures . ix (_crID cr) . crInv . ix invid . itTargeting
-- %~ maybe (Just $ targetRBMousePos w) Just
-- | otherwise = w & creatures . ix (_crID cr) . crInv . ix invid . itTargeting .~ Nothing
targetRBMousePos
:: World
+3 -3
View File
@@ -10,9 +10,9 @@ useTargetPos
-> Creature
-> World
-> World
useTargetPos f cr w = case cr ^? crInv . ix (_crInvSel cr) . itTargeting . _Just of
useTargetPos f cr w = case cr ^? crInv . ix (_crInvSel cr) . itTargeting' . tgPos of
Nothing -> w
Just (g,_) -> f (g w) cr w
Just p -> f p cr w
removeItTarget :: Item -> Item
removeItTarget = itTargeting .~ Nothing
removeItTarget = itTargeting' . tgPos .~ Nothing