Implement targeting launcher shells using separate item
This commit is contained in:
+41
-24
@@ -18,7 +18,7 @@ import Dodge.Data.DoubleTree
|
||||
--import Color
|
||||
import Data.Maybe
|
||||
--import Data.Traversable
|
||||
import Dodge.Base.Coordinate
|
||||
--import Dodge.Base.Coordinate
|
||||
--import Dodge.Bullet
|
||||
import Dodge.Creature.HandPos
|
||||
import Dodge.Data.World
|
||||
@@ -31,11 +31,11 @@ import Dodge.Item.Weapon.TriggerType
|
||||
import Dodge.Projectile.Create
|
||||
import Dodge.SoundLogic
|
||||
import Dodge.Tesla.Arc
|
||||
import Dodge.Wall.ForceField
|
||||
import Dodge.Wall.Move
|
||||
--import Dodge.Wall.ForceField
|
||||
--import Dodge.Wall.Move
|
||||
import Dodge.WorldEvent.Flash
|
||||
import Geometry
|
||||
import qualified IntMapHelp as IM
|
||||
--import qualified IntMapHelp as IM
|
||||
import LensHelp
|
||||
import RandomHelp
|
||||
import Sound.Data
|
||||
@@ -55,7 +55,7 @@ bulGunEffect' :: LabelDoubleTree ComposeLinkType Item -> Creature -> World -> Wo
|
||||
bulGunEffect' t cr w = fromMaybe (error "error in bulGunEffect") $ do
|
||||
muzzles <- t ^? ldtValue . itUse . heldAim . aimMuzzles
|
||||
let (upitm,loadedmuzzles) = mapAccumR loadMuzzle t muzzles
|
||||
cmew = foldl' (useLoadedAmmo (_ldtValue t) cr) (CME 0 0 False,w) $ zip [0..] loadedmuzzles
|
||||
cmew = foldl' (useLoadedAmmo t cr) (CME 0 0 False,w) $ zip [0..] loadedmuzzles
|
||||
return $ uncurry (applyCME (_ldtValue t) cr) cmew
|
||||
& cWorld . lWorld . lTestString .~ map (show . _mzAmmoSlot) muzzles
|
||||
& doWeaponRepetitions upitm cr
|
||||
@@ -184,23 +184,26 @@ isAmmoIntLink :: Int -> ComposeLinkType -> Bool
|
||||
isAmmoIntLink i (AmmoInLink j _) = i == j
|
||||
isAmmoIntLink _ _ = False
|
||||
|
||||
useLoadedAmmo :: Item -> Creature -> (CumulativeMuzzleEffect,World)
|
||||
useLoadedAmmo :: LabelDoubleTree ComposeLinkType Item
|
||||
-> Creature
|
||||
-> (CumulativeMuzzleEffect,World)
|
||||
-> (Int,Maybe (Muzzle,Int,LabelDoubleTree ComposeLinkType Item))
|
||||
-> (CumulativeMuzzleEffect,World)
|
||||
useLoadedAmmo _ _ (cme,w) (_,Nothing) = (cme, w)
|
||||
useLoadedAmmo itm cr (cme,w) (mzid,Just (mz,x,magtree)) = (,) (cme & cmeSound .~ True) $
|
||||
useLoadedAmmo itmtree cr (cme,w) (mzid,Just (mz,x,magtree)) = (,) (cme & cmeSound .~ True) $
|
||||
removeAmmoFromMag x mid cr . makeMuzzleFlare mz itm cr $ case _mzEffect mz of
|
||||
MuzzleShootBullet -> shootBullet itm cr w (mz,x,mid)
|
||||
MuzzleLaser -> shootLaser' itm cr mz w
|
||||
MuzzleTesla -> shootTeslaArc itm cr mz w
|
||||
MuzzleTractor -> shootTractorBeam itm cr w
|
||||
MuzzleLauncher -> createProjectile magtree mz itm cr w
|
||||
MuzzleLauncher -> createProjectile magtree mz itmtree cr w
|
||||
MuzzleNozzle {} -> useGasParams mid mz itm cr $ walkNozzle mzid mz itm cr w
|
||||
MuzzleShatter -> shootShatter itm cr w
|
||||
MuzzleForceField -> useForceFieldGun itm cr w
|
||||
MuzzleDetector -> itemDetectorEffect itm cr w
|
||||
where
|
||||
mid = magtree ^? ldtValue . itLocation . ilInvID
|
||||
itm = itmtree ^. ldtValue
|
||||
|
||||
itemDetectorEffect :: Item -> Creature -> World -> World
|
||||
itemDetectorEffect itm cr w = fromMaybe w $ do
|
||||
@@ -485,32 +488,46 @@ shootTeslaArc itm cr mz w =
|
||||
-- the rmb, it is possible for this to do nothing
|
||||
-- TODO investigate more and fix
|
||||
useForceFieldGun :: Item -> Creature -> World -> World
|
||||
useForceFieldGun itm cr w = fromMaybe w $ do
|
||||
a <- cr ^? crTargeting . ctPos . _Just
|
||||
let mwp = mouseWorldPos (w ^. input) (w ^. wCam)
|
||||
b = if dist a mwp < 100 then mwp else a +.+ 100 *.* normalizeV (mwp -.- a)
|
||||
wlline = (a, b)
|
||||
return $
|
||||
w
|
||||
& cWorld . lWorld . walls %~ IM.insertWith (\_ x -> x) i forceField{_wlID = i}
|
||||
& cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID (_itLocation itm)) . itParams . paramMID ?~ i
|
||||
& moveWallIDUnsafe i wlline
|
||||
where
|
||||
i = fromMaybe (IM.newKey (_walls (_lWorld (_cWorld w)))) $ itm ^? itParams . paramMID . _Just
|
||||
useForceFieldGun _ _ = id
|
||||
--useForceFieldGun itm cr w = fromMaybe w $ do
|
||||
-- a <- cr ^? crTargeting . ctPos . _Just
|
||||
-- let mwp = mouseWorldPos (w ^. input) (w ^. wCam)
|
||||
-- b = if dist a mwp < 100 then mwp else a +.+ 100 *.* normalizeV (mwp -.- a)
|
||||
-- wlline = (a, b)
|
||||
-- return $
|
||||
-- w
|
||||
-- & cWorld . lWorld . walls %~ IM.insertWith (\_ x -> x) i forceField{_wlID = i}
|
||||
-- & cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix (_ilInvID (_itLocation itm)) . itParams . paramMID ?~ i
|
||||
-- & moveWallIDUnsafe i wlline
|
||||
-- where
|
||||
-- i = fromMaybe (IM.newKey (_walls (_lWorld (_cWorld w)))) $ itm ^? itParams . paramMID . _Just
|
||||
|
||||
determineProjectileTracking :: LabelDoubleTree ComposeLinkType Item
|
||||
-> LabelDoubleTree ComposeLinkType Item
|
||||
-> ProjectileHoming
|
||||
determineProjectileTracking magtree itmtree = case lookup RemoteScreenLink (magtree ^. ldtLeft) of
|
||||
Just screen -> HomeUsingRemoteScreen (screen ^. ldtValue . itID)
|
||||
Nothing -> fromMaybe NoHoming $ do
|
||||
_ <- lookup AmmoTargetingLink (magtree ^. ldtLeft) -- should not have to give a direction
|
||||
targetingtree <- lookup WeaponTargetingLink (itmtree ^. ldtRight) -- left or right for these
|
||||
return $ HomeUsingTargeting (targetingtree ^. ldtValue . itID)
|
||||
|
||||
createProjectile
|
||||
:: LabelDoubleTree ComposeLinkType Item
|
||||
-> Muzzle -> Item -> Creature -> World -> World
|
||||
createProjectile magtree muz itm cr = fromMaybe failsound $ do
|
||||
-> Muzzle
|
||||
-> LabelDoubleTree ComposeLinkType Item
|
||||
-> Creature -> World -> World
|
||||
createProjectile magtree muz itmtree cr = fromMaybe failsound $ do
|
||||
magid <- magtree ^? ldtValue . itLocation . ilInvID
|
||||
ammoitem <- cr ^? crInv . ix magid
|
||||
let mscreen = lookup RemoteScreenLink (magtree ^. ldtLeft)
|
||||
let homing = determineProjectileTracking magtree itmtree
|
||||
j <- ammoitem ^? itLocation . ilInvID
|
||||
aparams <- ammoitem ^? itUse . amagParams
|
||||
return $ createShell (mscreen ^? _Just . ldtValue) aparams muz itm cr
|
||||
return $ createShell homing aparams muz itm cr
|
||||
. startthesound
|
||||
. useammo j
|
||||
where
|
||||
itm = itmtree ^. ldtValue
|
||||
useammo j = cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix j . itUse . amagLoadStatus . iaLoaded -~ 1
|
||||
|
||||
-- the sound should be moved to the projectile firing
|
||||
|
||||
Reference in New Issue
Block a user