From 3ae454acf421244f81c05bb696a76cbcb3d0651d Mon Sep 17 00:00:00 2001 From: jgk Date: Sun, 23 May 2021 20:32:15 +0200 Subject: [PATCH] Make bezierGun set target on right click --- src/Dodge/Base.hs | 8 +++++++ src/Dodge/Creature/ArmourChase.hs | 33 ++++++++++++++++++++++++++-- src/Dodge/Creature/State.hs | 2 +- src/Dodge/Creature/State/Data.hs | 1 + src/Dodge/Floor.hs | 1 + src/Dodge/Item/Weapon.hs | 33 ++++++++++++++-------------- src/Dodge/Item/Weapon/ExtraEffect.hs | 17 ++++++++++++++ 7 files changed, 76 insertions(+), 19 deletions(-) diff --git a/src/Dodge/Base.hs b/src/Dodge/Base.hs index 2eac083e5..fe3666ed7 100644 --- a/src/Dodge/Base.hs +++ b/src/Dodge/Base.hs @@ -106,6 +106,14 @@ creaturesNearPoint p w = IM.unions [f b $ f a $ _creaturesZone w | a<-[x-1,x,x+ Just val -> val _ -> IM.empty +creaturesNearPointI :: Int -> Point2 -> World -> IM.IntMap Creature +creaturesNearPointI n p w = IM.unions [f b $ f a $ _creaturesZone w | a<-[x-n..x+n] , b<-[y-n..y+n]] + where + (x,y) = crZoneOfPoint p + f i m = case IM.lookup i m of + Just val -> val + _ -> IM.empty + cloudsNearPoint :: Point2 -> World -> IM.IntMap Cloud cloudsNearPoint p w = IM.unions [f b $ f a $ _cloudsZone w | a<-[x-1,x,x+1] , b<-[y-1,y,y+1]] where diff --git a/src/Dodge/Creature/ArmourChase.hs b/src/Dodge/Creature/ArmourChase.hs index 10e593f62..0d0f963c9 100644 --- a/src/Dodge/Creature/ArmourChase.hs +++ b/src/Dodge/Creature/ArmourChase.hs @@ -1,5 +1,8 @@ module Dodge.Creature.ArmourChase + ( armourChaseCrit + ) where +import Dodge.Base import Dodge.Data import Dodge.Default import Dodge.Creature.State @@ -7,12 +10,14 @@ import Dodge.Creature.State.Data import Dodge.Creature.Rationality import Dodge.Creature.ReaderUpdate import Dodge.Creature.AlertLevel -import Dodge.Creature.ChooseTarget import Dodge.Creature.Picture import Dodge.Item.Equipment import Dodge.Item.Consumable import Picture +import Geometry +import Data.Maybe +import Data.List import qualified Data.IntMap.Strict as IM import Control.Lens import Control.Monad.Reader @@ -23,9 +28,10 @@ armourChaseCrit = defaultCreature watchUpdateStratR [] >=> doStrategyActionsR >=> performActionsR >=> - chaseTargetR targetYouLOS >=> + chaseTargetR (const . _crTarget) >=> basicPerceptionUpdateR [0] >=> targetYouWhenCognizantR >=> + flockACCR >=> overrideMeleeCloseTargetR >=> return . (crMeleeCooldown . _Just %~ max 0 . subtract 1) , _crHP = 300 @@ -37,3 +43,26 @@ armourChaseCrit = defaultCreature , _crMeleeCooldown = Just 0 , _crGroup = ShieldGroup } + +flockACCR :: Creature -> Reader World Creature +flockACCR = reader . flockACC + +flockACC :: Creature -> World -> Creature +flockACC cr w = fromMaybe cr $ mFlockACC cr w + +mFlockACC :: Creature -> World -> Maybe Creature +mFlockACC cr w = do + tcr <- _crTarget cr + let tpos = _crPos tcr + cpos = _crPos cr + isFarACC cr' = _crGroup cr' == ShieldGroup && _crID cr' /= _crID cr + && dist (_crPos cr') tpos > dist cpos tpos + -- && circOnSeg (_crPos cr') tpos cpos (_crRad cr + _crRad cr') + nearACCs = IM.filter isFarACC $ creaturesNearPointI 3 cpos w + acr <- listToMaybe $ sortOn (dist cpos . _crPos) $ IM.elems nearACCs + let r = _crRad acr + _crRad cr + 10 + horDir = normalizeV (vNormal (cpos -.- tpos)) + horShift = if isLHS tpos cpos (_crPos acr) + then r *.* horDir + else negate r *.* horDir + return $ cr & crActionPlan . crImpulse .~ [MoveForward 2.5,TurnToward (tpos +.+ horShift) 0.05 ] diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index cd9ed6b45..046a50669 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -118,7 +118,7 @@ movementSideEff cr w invSideEff :: Creature -> World -> World invSideEff cr w = weaponReloadSounds cr $ IM.foldrWithKey f w (_crInv cr) - where + where f i it w' = case it ^? itEffect . itInvEffect of Nothing -> w' Just g -> g cr i w' diff --git a/src/Dodge/Creature/State/Data.hs b/src/Dodge/Creature/State/Data.hs index 8fff1514c..1372a5b16 100644 --- a/src/Dodge/Creature/State/Data.hs +++ b/src/Dodge/Creature/State/Data.hs @@ -41,5 +41,6 @@ data CrGroup } | CrGroupID { _crGroupID :: Int } | ShieldGroup + deriving (Eq, Show) makeLenses ''CreatureState makeLenses ''CrSpState diff --git a/src/Dodge/Floor.hs b/src/Dodge/Floor.hs index 7b7915c10..032d9b13a 100644 --- a/src/Dodge/Floor.hs +++ b/src/Dodge/Floor.hs @@ -54,6 +54,7 @@ roomTreex = do ,[SpecificRoom . pure . pure . Right $ roomGlassOctogon 400 & rmPS %~ ([sPS (0,50) 0 $ PutCrit armourChaseCrit ,sPS (50,25) 0 $ PutCrit armourChaseCrit + ,sPS (50,0) 0 $ PutCrit armourChaseCrit ]++) ] --,[Corridor] diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index cb0206f29..7859663ab 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -58,7 +58,6 @@ pistol ,poisonLauncher ,teslaLauncher ,remoteLauncher - ,bezierGun ,defaultThrowable -- ,shatterGun ,longGun,flamer,blinkGun,forceFieldGun :: Item @@ -319,35 +318,37 @@ teslaLauncher = launcher , _wpFire = shootWithSound (fromIntegral launcherSound) $ aRocketWithPayload makeTeslaExplosionAt } +useTargetPos + :: (Point2 -> Int -> World -> World) + -> Int + -> World + -> World +useTargetPos f cid w = case cr ^? crInv . ix (_crInvSel cr) . itAttachment . _Just . itTargetPos of + Nothing -> w + Just p -> f p cid w + where + cr = _creatures w IM.! cid + +bezierGun :: Item bezierGun = defaultAutoGun { _itName = "B-GUN" - , _wpFire = hammerCheck $ maybeSetTarget $ \p -> + , _wpFire = useTargetPos $ \p -> shootWithSound 0 . withMuzFlare . withRecoil 40 . torqueBefore 0.05 -- I believe that this doesn't affect - $ shootBezier p -- <- the start point + $ shootBezier p -- <- the start point , _itAttachment = Nothing , _itScrollUp = removeItAttachment 0 , _itScrollDown = removeItAttachment 0 , _itHammer = HammerUp - , _itEffect = bezierRecock + , _itEffect = bezierTargetEffect , _itZoom = defaultItZoom , _itAimingRange = 0 } -maybeSetTarget :: (Point2 -> Int -> World -> World) -> Int -> World -> World -maybeSetTarget f cid w = case join $ w ^? creatures . ix cid . crInv . ix itRef . itAttachment of - Just (ItTargetPos targetp) - -> f targetp cid w - _ -> w & creatures . ix cid . crInv . ix itRef . itAttachment ?~ ItTargetPos mp - where - mp = mouseWorldPos w - cr = _creatures w IM.! cid - itRef = _crInvSel cr - shootBezier :: Point2 -> Int -> World -> World -shootBezier targetp cid w = over particles (theBullet :) w +shootBezier targetp cid w = w & particles %~ (theBullet :) where theBullet = aCurveBulAt (Just cid) @@ -365,7 +366,7 @@ shootBezier targetp cid w = over particles (theBullet :) w a <- randInCirc 10 b <- randInCirc 20 return (a,b) - + removeItAttachment :: Int -> Int -> World -> World removeItAttachment i _ w = w & creatures . ix i . crInv . ix itRef . itAttachment .~ Nothing where diff --git a/src/Dodge/Item/Weapon/ExtraEffect.hs b/src/Dodge/Item/Weapon/ExtraEffect.hs index e10a06185..75e4b823b 100644 --- a/src/Dodge/Item/Weapon/ExtraEffect.hs +++ b/src/Dodge/Item/Weapon/ExtraEffect.hs @@ -8,6 +8,7 @@ import Dodge.Data import Dodge.Base import Dodge.Item.Weapon.Decoration import Dodge.Item.Weapon.UseEffect +import Dodge.Item.Attachment.Data import Dodge.WorldEvent.Flash import Dodge.WorldEvent.ThingsHit import Picture @@ -16,6 +17,8 @@ import Geometry.Vector import Data.Maybe import Control.Lens import qualified Data.IntMap.Strict as IM +import qualified Data.Set as S +import qualified SDL {- | Controls resetting a weapon, allows for non-continuous fire needing a button release. -} wpRecock :: ItEffect @@ -98,3 +101,17 @@ autoSonarEffect = ItInvEffect {_itInvEffect = f 50 ,_itEffectCounter = 0 } . itEffect . itInvEffect .~ f 140 f t cr i w = w & creatures . ix (_crID cr) . crInv . ix i . itEffect . itInvEffect .~ f (t-1) + +bezierTargetEffect :: ItEffect +bezierTargetEffect = ItInvEffect + {_itInvEffect = setBezierTarget + ,_itEffectCounter = 0 + } +setBezierTarget :: Creature -> Int -> World -> World +setBezierTarget cr invid w + | _crInvSel cr /= invid = w + | SDL.ButtonRight `S.member` _mouseButtons w = w + & creatures . ix (_crID cr) . crInv . ix invid . itAttachment + %~ maybe (Just $ ItTargetPos $ mouseWorldPos w) Just + | otherwise = w & creatures . ix (_crID cr) . crInv . ix invid . itAttachment .~ Nothing +