Make equipment effects use item locations

Move towards removing on/off equipment effects
This commit is contained in:
2024-12-19 11:15:21 +00:00
parent 3ffe61e6db
commit a669632226
9 changed files with 110 additions and 103 deletions
+2 -2
View File
@@ -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
+6 -15
View File
@@ -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
-3
View File
@@ -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
+12 -2
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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