Make equipment effects use item locations
Move towards removing on/off equipment effects
This commit is contained in:
@@ -91,8 +91,8 @@ toggleEquipmentAt invid cr w = case getEquipmentAllocation w of
|
||||
itmat i = _crInv cr IM.! i
|
||||
itm = itmat itRef
|
||||
itRef = cr ^?! crManipulation . manObject . imSelectedItem -- unsafe!! TODO change?
|
||||
onequip itm' = useE ((_eeOnEquip . _uequipEffect . _itUse) itm') itm'
|
||||
onremove itm' = useE ((_eeOnRemove . _uequipEffect . _itUse) itm') itm'
|
||||
onequip itm' = doItmCrWdWd ((_eeOnEquip . _uequipEffect . _itUse) itm') itm'
|
||||
onremove itm' = doItmCrWdWd ((_eeOnRemove . _uequipEffect . _itUse) itm') itm'
|
||||
|
||||
-- need to make sure that the root item is not erroneously selected in the
|
||||
-- following
|
||||
|
||||
@@ -72,6 +72,8 @@ crUpdate f =
|
||||
, invSideEff
|
||||
-- , equipmentEffects
|
||||
]
|
||||
-- I have changed the ordering of item/equipment effects, which may have
|
||||
-- unforseen consequences, be aware
|
||||
|
||||
checkDeath :: Creature -> World -> World
|
||||
checkDeath cr w
|
||||
@@ -146,21 +148,10 @@ applyPastDamages cr w
|
||||
& randGen .~ g
|
||||
| otherwise = w
|
||||
|
||||
useEquipment :: Creature -> Int -> World -> World
|
||||
useEquipment cr i = useE (_eeUse (_uequipEffect $ _itUse itm)) itm cr
|
||||
where
|
||||
itm = _crInv cr IM.! i
|
||||
|
||||
-- a map updating all inventory items
|
||||
updateInv :: Creature -> World -> World
|
||||
updateInv cr = cWorld . lWorld . creatures . ix (_crID cr) . crInv %~ IM.map itemUpdate
|
||||
|
||||
-- a loop going over equipped items
|
||||
-- maybe this should be done during a different loop (invSideEff)?
|
||||
equipmentEffects :: Creature -> World -> World
|
||||
--equipmentEffects cr = flip (foldl' $ flip $ useEquipment cr) (IM.keys $ _crInvEquipped cr)
|
||||
equipmentEffects cr = alaf Endo foldMap (useEquipment cr) (IM.keys $ _crInvEquipped cr)
|
||||
|
||||
-- a loop going over all inventory items
|
||||
invSideEff :: Creature -> World -> World
|
||||
invSideEff cr = alaf Endo foldMap f (_crInv cr) . updateHeldRootItem cr
|
||||
@@ -176,7 +167,7 @@ invRootItemEffs cr =
|
||||
(invLDT (_crInv cr))
|
||||
|
||||
invItemLocUpdate :: Creature -> LocationLDT ItemLink ComposedItem -> World -> World
|
||||
invItemLocUpdate cr loc w = doAnyEquipmentEffect cr loc $ case itm ^. itType of
|
||||
invItemLocUpdate cr loc w = doAnyEquipmentEffect loc cr $ case itm ^. itType of
|
||||
ATTACH BULLETSYNTH -> trySynthBullet loc w
|
||||
EQUIP WRIST_ECG | haspulse -> tryUseParent loc w
|
||||
_ -> w
|
||||
@@ -186,9 +177,9 @@ invItemLocUpdate cr loc w = doAnyEquipmentEffect cr loc $ case itm ^. itType of
|
||||
== Just 0
|
||||
itm = loc ^. locLDT . ldtValue . _1
|
||||
|
||||
doAnyEquipmentEffect :: Creature -> LocationLDT ItemLink ComposedItem -> World -> World
|
||||
doAnyEquipmentEffect cr loc = case itm ^? itLocation . ilEquipPosition . _Just of
|
||||
Just _ -> useE (_eeUse (_uequipEffect $ _itUse itm)) itm cr
|
||||
doAnyEquipmentEffect :: LocationLDT ItemLink ComposedItem -> Creature -> World -> World
|
||||
doAnyEquipmentEffect loc cr = case itm ^? itLocation . ilEquipPosition . _Just of
|
||||
Just _ -> useE (_eeUse (_uequipEffect $ _itUse itm)) loc cr
|
||||
_ -> id
|
||||
where
|
||||
itm = loc ^. locLDT . ldtValue . _1
|
||||
|
||||
@@ -21,9 +21,6 @@ data Euse
|
||||
| EMagShield
|
||||
| EWristShield
|
||||
| EHeadLamp
|
||||
| ECamouflage {_euseCamouflageStatus :: CamouflageStatus}
|
||||
| EonWristShield
|
||||
| EoffWristShield
|
||||
-- | EFuelSource {_euseFuelAmount :: Int, _euseFuelMax :: Int}
|
||||
| EBatterySource {_euseBatteryAmount :: Int, _euseBatteryMax :: Int}
|
||||
| EAmmoSource
|
||||
|
||||
@@ -7,6 +7,7 @@ module Dodge.Data.Item.Use.Equipment (
|
||||
module Dodge.Data.Item.Use.Equipment,
|
||||
) where
|
||||
|
||||
import Dodge.Data.CamouflageStatus
|
||||
import Geometry.Data
|
||||
import Control.Lens
|
||||
import Data.Aeson
|
||||
@@ -16,8 +17,8 @@ import Dodge.Data.Item.HeldUse
|
||||
|
||||
data EquipEffect = EquipEffect
|
||||
{ _eeUse :: Euse --Item -> Creature -> World -> World
|
||||
, _eeOnEquip :: Euse --Item -> Creature -> World -> World
|
||||
, _eeOnRemove :: Euse --Item -> Creature -> World -> World
|
||||
, _eeOnEquip :: ItmCrWdWd --Item -> Creature -> World -> World
|
||||
, _eeOnRemove :: ItmCrWdWd --Item -> Creature -> World -> World
|
||||
, _eeSite :: EquipSite
|
||||
, _eeParams :: EquipParams
|
||||
, _eeViewDist :: Maybe Float
|
||||
@@ -25,6 +26,13 @@ data EquipEffect = EquipEffect
|
||||
}
|
||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
|
||||
data ItmCrWdWd
|
||||
= ItmCrWdWdDoNothing
|
||||
| ECamouflage {_euseCamouflageStatus :: CamouflageStatus}
|
||||
| EonWristShield
|
||||
| EoffWristShield
|
||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||
|
||||
data EquipParams
|
||||
= NoEquipParams
|
||||
| EquipID {_eparamID :: Int}
|
||||
@@ -33,5 +41,7 @@ data EquipParams
|
||||
|
||||
makeLenses ''EquipEffect
|
||||
makeLenses ''EquipParams
|
||||
makeLenses ''ItmCrWdWd
|
||||
deriveJSON defaultOptions ''ItmCrWdWd
|
||||
deriveJSON defaultOptions ''EquipParams
|
||||
deriveJSON defaultOptions ''EquipEffect
|
||||
|
||||
@@ -8,8 +8,8 @@ defaultEquip =
|
||||
EquipEffect
|
||||
{ _eeSite = GoesOnHead
|
||||
, _eeUse = EDoNothing
|
||||
, _eeOnEquip = EDoNothing
|
||||
, _eeOnRemove = EDoNothing
|
||||
, _eeOnEquip = ItmCrWdWdDoNothing
|
||||
, _eeOnRemove = ItmCrWdWdDoNothing
|
||||
, _eeParams = NoEquipParams
|
||||
, _eeViewDist = Nothing
|
||||
, _eeAttachPos = 0
|
||||
|
||||
+21
-14
@@ -1,5 +1,8 @@
|
||||
module Dodge.Euse where
|
||||
module Dodge.Euse
|
||||
where
|
||||
|
||||
import Dodge.Data.ComposedItem
|
||||
import Dodge.Data.DoubleTree
|
||||
import Color
|
||||
--import Control.Monad
|
||||
import Data.Maybe
|
||||
@@ -17,19 +20,23 @@ import Geometry
|
||||
import qualified IntMapHelp as IM
|
||||
import LensHelp
|
||||
|
||||
useE :: Euse -> Item -> Creature -> World -> World
|
||||
useE eo = case eo of
|
||||
EDoNothing -> const $ const id
|
||||
EMagShield -> useMagShield
|
||||
EWristShield -> setWristShieldPos
|
||||
EHeadLamp -> createHeadLamp
|
||||
ECamouflage vis -> overCID (crCamouflage .~ vis)
|
||||
EonWristShield -> onEquipWristShield
|
||||
EoffWristShield -> onRemoveWristShield
|
||||
-- EFuelSource 0 _ -> const . const id
|
||||
-- EFuelSource{} -> const . const id
|
||||
EBatterySource{} -> tryChargeBattery
|
||||
EAmmoSource{} -> tryAttachBulletBelt
|
||||
doItmCrWdWd :: ItmCrWdWd -> Item -> Creature -> World -> World
|
||||
doItmCrWdWd x itm cr = case x of
|
||||
(ECamouflage vis) -> overCID (crCamouflage .~ vis) itm cr
|
||||
EonWristShield -> onEquipWristShield itm cr
|
||||
EoffWristShield -> onRemoveWristShield itm cr
|
||||
_ -> id
|
||||
|
||||
useE :: Euse -> LocationLDT ItemLink ComposedItem -> Creature -> World -> World
|
||||
useE eo loc cr = case eo of
|
||||
EDoNothing -> id
|
||||
EMagShield -> useMagShield itm cr
|
||||
EWristShield -> setWristShieldPos itm cr
|
||||
EHeadLamp -> createHeadLamp itm cr
|
||||
EBatterySource{} -> tryChargeBattery itm cr
|
||||
EAmmoSource{} -> tryAttachBulletBelt itm cr
|
||||
where
|
||||
itm = loc ^. locLDT . ldtValue . _1
|
||||
|
||||
tryAttachBulletBelt :: Item -> Creature -> World -> World
|
||||
tryAttachBulletBelt _ _ w = w
|
||||
|
||||
@@ -90,7 +90,7 @@ rmInvItem cid invid w =
|
||||
itm = _crInv cr IM.! invid
|
||||
dounequipfunction = fromMaybe id $ do
|
||||
rmf <- itm ^? itUse . uequipEffect . eeOnRemove
|
||||
return $ useE rmf itm cr
|
||||
return $ doItmCrWdWd rmf itm cr
|
||||
doanyitemeffect = fromMaybe id $ do
|
||||
rmf <- itm ^? itEffect . ieOnDrop
|
||||
return $ doInvEffect rmf itm cr
|
||||
|
||||
Reference in New Issue
Block a user