Require line of sight for creature targeting
This commit is contained in:
@@ -130,9 +130,6 @@ movementSideEff cr w
|
|||||||
|
|
||||||
heldItemUpdate :: Int -> Item -> Item
|
heldItemUpdate :: Int -> Item -> Item
|
||||||
heldItemUpdate invid = (itIsHeld .~ True) . invItemUpdate invid
|
heldItemUpdate invid = (itIsHeld .~ True) . invItemUpdate invid
|
||||||
-- . (itUse %~ useupdate)
|
|
||||||
-- where
|
|
||||||
-- useupdate = id
|
|
||||||
|
|
||||||
invItemUpdate :: Int -> Item -> Item
|
invItemUpdate :: Int -> Item -> Item
|
||||||
invItemUpdate invid = (itUse %~ useupdate) . (itIsHeld .~ False) . (itInvPos ?~ invid)
|
invItemUpdate invid = (itUse %~ useupdate) . (itIsHeld .~ False) . (itInvPos ?~ invid)
|
||||||
@@ -153,25 +150,17 @@ invSideEff cr w = weaponReloadSounds cr
|
|||||||
Just g -> g (_itEffect it) cr i w' & doitemupdate
|
Just g -> g (_itEffect it) cr i w' & doitemupdate
|
||||||
where
|
where
|
||||||
doitemupdate
|
doitemupdate
|
||||||
| i == _crInvSel cr = doHeldItemTargeting cr . (itpointer %~ heldItemUpdate i)
|
| i == _crInvSel cr = doItemTargeting i cr . (itpointer %~ heldItemUpdate i)
|
||||||
| otherwise = doNotHeldItemTargeting i cr . (itpointer %~ invItemUpdate i)
|
| otherwise = doItemTargeting i cr . (itpointer %~ invItemUpdate i)
|
||||||
itpointer = creatures . ix (_crID cr) . crInv . ix i
|
itpointer = creatures . ix (_crID cr) . crInv . ix i
|
||||||
|
|
||||||
doHeldItemTargeting :: Creature -> World -> World
|
doItemTargeting :: Int -> Creature -> World -> World
|
||||||
doHeldItemTargeting cr w = case cr ^? crInv . ix (_crInvSel cr) . itTargeting of
|
doItemTargeting invid cr w = case cr ^? crInv . ix invid . itTargeting of
|
||||||
Nothing -> w
|
Nothing -> w
|
||||||
Just NoTargeting -> w
|
Just NoTargeting -> w
|
||||||
Just t -> let (w',t') = _tgHeldUpdate t (_crInv cr IM.! _crInvSel cr) cr w t
|
Just t -> let (w',t') = _tgUpdate t (_crInv cr IM.! invid) cr w t
|
||||||
in w' & creatures . ix (_crID cr) . crInv . ix (_crInvSel cr) . itTargeting .~ t'
|
|
||||||
-- & testString .~ const ["Held"]
|
|
||||||
|
|
||||||
doNotHeldItemTargeting :: Int -> Creature -> World -> World
|
|
||||||
doNotHeldItemTargeting invid cr w = case cr ^? crInv . ix invid . itTargeting of
|
|
||||||
Nothing -> w
|
|
||||||
Just NoTargeting -> w
|
|
||||||
Just t -> let (w',t') = _tgNotHeldUpdate t (_crInv cr IM.! invid) cr w t
|
|
||||||
in w' & creatures . ix (_crID cr) . crInv . ix invid . itTargeting .~ t'
|
in w' & creatures . ix (_crID cr) . crInv . ix invid . itTargeting .~ t'
|
||||||
-- & testString .~ const ["Not"]
|
-- & testString .~ const ["Held"]
|
||||||
|
|
||||||
weaponReloadSounds :: Creature -> World -> World
|
weaponReloadSounds :: Creature -> World -> World
|
||||||
weaponReloadSounds cr w = case cr ^? crInv . ix (_crInvSel cr) . itConsumption of
|
weaponReloadSounds cr w = case cr ^? crInv . ix (_crInvSel cr) . itConsumption of
|
||||||
|
|||||||
+2
-3
@@ -429,10 +429,9 @@ data ItemValueType = MundaneItem | ArtefactItem
|
|||||||
|
|
||||||
data Targeting
|
data Targeting
|
||||||
= NoTargeting
|
= NoTargeting
|
||||||
| TargetingOnHeld
|
| Targeting
|
||||||
{ _tgPos :: Maybe Point2
|
{ _tgPos :: Maybe Point2
|
||||||
, _tgHeldUpdate :: Item -> Creature -> World -> Targeting -> (World, Targeting)
|
, _tgUpdate :: Item -> Creature -> World -> Targeting -> (World, Targeting)
|
||||||
, _tgNotHeldUpdate :: Item -> Creature -> World -> Targeting -> (World, Targeting)
|
|
||||||
, _tgDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
, _tgDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
||||||
, _tgID :: Maybe Int
|
, _tgID :: Maybe Int
|
||||||
, _tgActive :: Bool
|
, _tgActive :: Bool
|
||||||
|
|||||||
@@ -24,8 +24,11 @@ import Picture
|
|||||||
import Geometry.Vector
|
import Geometry.Vector
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
import LensHelp
|
import LensHelp
|
||||||
|
import qualified FoldlHelp as L
|
||||||
|
|
||||||
|
--import Data.Bifunctor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
--import qualified Control.Foldl as L
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
import qualified SDL
|
import qualified SDL
|
||||||
{- | Automatically send out radar pulses that detect walls. -}
|
{- | Automatically send out radar pulses that detect walls. -}
|
||||||
@@ -50,31 +53,28 @@ autoSonarEffect = ItInvEffect {_itInvEffect = f 50 ,_itEffectCounter = 0 }
|
|||||||
& creatures . ix (_crID cr) . crInv . ix i . itEffect . itInvEffect .~ f (t-1)
|
& creatures . ix (_crID cr) . crInv . ix i . itEffect . itInvEffect .~ f (t-1)
|
||||||
|
|
||||||
defaultTargeting :: Targeting
|
defaultTargeting :: Targeting
|
||||||
defaultTargeting = TargetingOnHeld
|
defaultTargeting = Targeting
|
||||||
{ _tgPos = Nothing
|
{ _tgPos = Nothing
|
||||||
, _tgHeldUpdate = \_ _ w t -> (w,t)
|
, _tgUpdate = \_ _ w t -> (w,t)
|
||||||
, _tgNotHeldUpdate = \_ _ w t -> (w,t)
|
|
||||||
, _tgDraw = \_ _ _ _ -> mempty
|
, _tgDraw = \_ _ _ _ -> mempty
|
||||||
, _tgID = Nothing
|
, _tgID = Nothing
|
||||||
, _tgActive = False
|
, _tgActive = False
|
||||||
}
|
}
|
||||||
targetLaser :: Targeting
|
targetLaser :: Targeting
|
||||||
targetLaser = defaultTargeting
|
targetLaser = defaultTargeting
|
||||||
& tgHeldUpdate .~ targetLaserUpdate
|
& tgUpdate .~ targetLaserUpdate
|
||||||
targetRBPress :: Targeting
|
targetRBPress :: Targeting
|
||||||
targetRBPress = defaultTargeting
|
targetRBPress = defaultTargeting
|
||||||
& tgHeldUpdate .~ targetUpdateWith targetRBPressUpdate
|
& tgUpdate .~ targetUpdateWith targetRBPressUpdate
|
||||||
& tgDraw .~ targetSimpleDraw
|
& tgDraw .~ targetSimpleDraw
|
||||||
targetRBCreature :: Targeting
|
targetRBCreature :: Targeting
|
||||||
targetRBCreature = defaultTargeting
|
targetRBCreature = defaultTargeting
|
||||||
& tgHeldUpdate .~ targetUpdateWith targetRBCreatureUpdate
|
& tgUpdate .~ targetRBCreatureUp
|
||||||
& tgNotHeldUpdate .~ targetUpdateWith
|
|
||||||
(const ((tgID .~ Nothing) . (tgPos .~ Nothing) . (tgActive .~ False)))
|
|
||||||
-- undefined
|
-- undefined
|
||||||
& tgDraw .~ targetRBCreatureDraw
|
& tgDraw .~ targetRBCreatureDraw
|
||||||
targetCursor :: Targeting
|
targetCursor :: Targeting
|
||||||
targetCursor = defaultTargeting
|
targetCursor = defaultTargeting
|
||||||
& tgHeldUpdate .~ targetUpdateWith targetCursorUpdate
|
& tgUpdate .~ targetUpdateWith targetCursorUpdate
|
||||||
& tgDraw .~ targetSimpleDraw
|
& tgDraw .~ targetSimpleDraw
|
||||||
targetSimpleDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
targetSimpleDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
||||||
targetSimpleDraw _ it _ cfig w = fromMaybe mempty $ do
|
targetSimpleDraw _ it _ cfig w = fromMaybe mempty $ do
|
||||||
@@ -83,6 +83,34 @@ targetSimpleDraw _ it _ cfig w = fromMaybe mempty $ do
|
|||||||
$ uncurryV translate (worldPosToScreen w p)
|
$ uncurryV translate (worldPosToScreen w p)
|
||||||
-- $ rotate (_cameraRot w)
|
-- $ rotate (_cameraRot w)
|
||||||
$ activeTargetCursorPic
|
$ activeTargetCursorPic
|
||||||
|
targetRBCreatureUp :: Item -> Creature -> World -> Targeting -> (World, Targeting)
|
||||||
|
targetRBCreatureUp it cr w t
|
||||||
|
| not $ _itIsHeld it = (w, t
|
||||||
|
& tgID .~ Nothing
|
||||||
|
& tgPos .~ Nothing
|
||||||
|
& tgActive .~ False
|
||||||
|
)
|
||||||
|
| SDL.ButtonRight `S.member` _mouseButtons w && isJust (t ^? tgID . _Just)
|
||||||
|
&& canSeeTarget = (w, t & updatePos
|
||||||
|
& tgActive .~ True
|
||||||
|
)
|
||||||
|
| otherwise = (w, t & tgID .~ fmap _crID newtarg
|
||||||
|
& updatePos
|
||||||
|
& tgActive .~ False
|
||||||
|
)
|
||||||
|
where
|
||||||
|
newtarg = L.fold
|
||||||
|
(L.prefilter (canseepos . _crPos) $ L.minimumOn (dist mwp . _crPos))
|
||||||
|
$ creaturesNearPointI 3 mwp w
|
||||||
|
canseepos p = hasLOS (_crPos cr) p w
|
||||||
|
mwp = mouseWorldPos w
|
||||||
|
updatePos t' = t' & tgPos .~ posFromMaybeID (_tgID t')
|
||||||
|
posFromMaybeID Nothing = Nothing
|
||||||
|
posFromMaybeID (Just i) = w ^? creatures . ix i . crPos
|
||||||
|
canSeeTarget = fromMaybe False $ do
|
||||||
|
cid <- t ^? tgID . _Just
|
||||||
|
cpos <- w ^? creatures . ix cid . crPos
|
||||||
|
Just $ hasLOS cpos (_crPos cr) w
|
||||||
|
|
||||||
targetRBCreatureDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
targetRBCreatureDraw :: Int -> Item -> Creature -> Configuration -> World -> Picture
|
||||||
targetRBCreatureDraw _ it _ cfig w = fromMaybe mempty $ do
|
targetRBCreatureDraw _ it _ cfig w = fromMaybe mempty $ do
|
||||||
|
|||||||
Reference in New Issue
Block a user