From 8ae58823f8c36bbfd7ca500daa68d881183d5844 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 15 Feb 2026 17:15:08 +0000 Subject: [PATCH] Stun turrets with electrical damage directly --- src/Dodge/Data/Machine.hs | 2 +- src/Dodge/HeldUse.hs | 2 +- src/Dodge/Machine/Destroy.hs | 2 +- src/Dodge/Machine/Draw.hs | 2 +- src/Dodge/Machine/Update.hs | 57 +++++++++++++------------- src/Dodge/Placement/Instance/Turret.hs | 7 ++-- src/Dodge/Wall/Damage.hs | 9 ++-- 7 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/Dodge/Data/Machine.hs b/src/Dodge/Data/Machine.hs index 69784e6f0..fed02faa6 100644 --- a/src/Dodge/Data/Machine.hs +++ b/src/Dodge/Data/Machine.hs @@ -44,7 +44,7 @@ data MachineType | McTerminal | McDamSensor DamageSensor | McProxSensor ProximitySensor - | McTurret {_mctTurret :: Turret} + | McTurret {_mctTurret :: Turret, _mctTurretStun :: Int} | McStorage {_mcsType :: AmmoType, _mcsAmount :: Int} | McDistributer {_mcdStorageMachine :: Maybe Int} | McTrigger {_mcTriggerID :: Int} diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 7427054ad..fd964e11d 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -1159,7 +1159,7 @@ mcShootLaser _ mc = shootLaser (MachinePrimarySound (_mcID mc)) (DamageLaser 11) 1 pos dir yellow where pos = _mcPos mc +.+ 20 *.* unitVectorAtAngle dir - dir = mc ^?! mcType . _McTurret . tuDir + dir = mc ^?! mcType . mctTurret . tuDir mcShootAuto :: Item -> Machine -> World -> World mcShootAuto itm mc w diff --git a/src/Dodge/Machine/Destroy.hs b/src/Dodge/Machine/Destroy.hs index 6380eabb7..adcfcf37f 100644 --- a/src/Dodge/Machine/Destroy.hs +++ b/src/Dodge/Machine/Destroy.hs @@ -21,7 +21,7 @@ destroyMachine mc = destroyMcType :: MachineType -> Machine -> World -> World destroyMcType mt mc w = case mt of - McTurret tu -> fromMaybe w $ do + McTurret tu _ -> fromMaybe w $ do itm <- w ^? cWorld . lWorld . items . ix (tu ^. tuWeapon) return $ copyItemToFloor (_mcPos mc) itm w McTrigger i -> w & cWorld . lWorld . triggers . ix i %~ not diff --git a/src/Dodge/Machine/Draw.hs b/src/Dodge/Machine/Draw.hs index d32fbd182..fdbfc8dbe 100644 --- a/src/Dodge/Machine/Draw.hs +++ b/src/Dodge/Machine/Draw.hs @@ -18,7 +18,7 @@ drawMachine :: CWorld -> Machine -> SPic drawMachine cw mc = case _mcType mc of McStatic -> mempty McTerminal -> terminalSPic lw mc - McTurret tu -> drawBaseMachine 20 mc <> drawTurret lw tu mc + McTurret tu _ -> drawBaseMachine 20 mc <> drawTurret lw tu mc McDamSensor se -> drawBaseMachine 25 mc <> drawDamSensor gp se McProxSensor{} -> drawBaseMachine 25 mc McStorage{} -> noPic $ colorSH (mcColor mc) storageShape diff --git a/src/Dodge/Machine/Update.hs b/src/Dodge/Machine/Update.hs index 14307aebd..61c8c362c 100644 --- a/src/Dodge/Machine/Update.hs +++ b/src/Dodge/Machine/Update.hs @@ -5,7 +5,7 @@ module Dodge.Machine.Update (updateMachine) where import Control.Monad import qualified Data.IntMap.Strict as IM import qualified Data.IntSet as IS -import Data.List (partition) +--import Data.List (partition) import Data.Maybe import Dodge.Base.Collide import Dodge.Base.You @@ -22,9 +22,7 @@ import Linear import Sound.Data updateMachine :: Machine -> World -> World -updateMachine mc - = mcPlaySound mc - . mcTypeUpdate mc (_mcType mc) +updateMachine mc = mcPlaySound mc . mcTypeUpdate mc (_mcType mc) -- | _mcHP mc < 1 = destroyMachine mc -- | otherwise = -- mcApplyDamage (_mcDamage mc) mc @@ -35,7 +33,7 @@ mcTypeUpdate :: Machine -> MachineType -> World -> World mcTypeUpdate mc = \case McStatic -> id McTerminal -> terminalScreenGlow mc - McTurret tu -> updateTurret (_tuTurnSpeed tu) mc + McTurret tu _ -> updateTurret (_tuTurnSpeed tu) mc McDamSensor se -> mcDamSensorTriggerUpdate se mc . mcDamSensorUpdate se mc McProxSensor se -> mcProxSensorTriggerUpdate se mc . mcProxSensorUpdate se mc McStorage{} -> id @@ -57,28 +55,36 @@ terminalScreenGlow mc w = fromMaybe w $ do updateTurret :: Float -> Machine -> World -> World updateTurret rotSpeed mc w = w - & dodamage + & decreasestun +-- & dodamage & mcUseItem mc & elecDamBranch where - dodamage = + decreasestun = cWorld . lWorld . machines . ix mcid - %~ ( (mcDamage .~ [Electrical (min 2500 $ max 0 (elecDam - 10))]) - . (mcHP -~ dam) - ) + . mcType + . mctTurretStun %~ (max 0 . subtract 1) +-- dodamage = +-- cWorld +-- . lWorld +-- . machines +-- . ix mcid +-- %~ ( (mcDamage .~ [Electrical (min 2500 $ max 0 (elecDam - 10))]) +-- . (mcHP -~ dam) +-- ) elecDamBranch - | elecDam < 10 = updateFiringStatus . doTurn + | mc ^?! mcType . mctTurretStun < 1 = updateFiringStatus . doTurn | otherwise = id mcid = _mcID mc ypos = you w ^. crPos . _xy mcpos = _mcPos mc seesYou = hasLOSIndirect mcpos ypos w - (elecDams, dams) = partition isElectrical $ _mcDamage mc - dam = sum $ map _dmAmount dams - elecDam = sum $ map _dmAmount elecDams +-- (elecDams, dams) = partition isElectrical $ _mcDamage mc +-- dam = sum $ map _dmAmount dams +-- elecDam = sum $ map _dmAmount elecDams doTurn | seesYou = cWorld @@ -86,32 +92,32 @@ updateTurret rotSpeed mc w = . machines . ix mcid . mcType - . _McTurret + . mctTurret . tuDir %~ turnTo rotSpeed mcpos ypos | otherwise = id closeFireAngle = seesYou -- && angleVV (ypos -.- mcpos) (unitVectorAtAngle mcdir) < 1 updateFiringStatus | closeFireAngle = - cWorld . lWorld . machines . ix mcid . mcType . _McTurret . tuFireTime .~ 20 + cWorld . lWorld . machines . ix mcid . mcType . mctTurret . tuFireTime .~ 20 | otherwise = cWorld . lWorld . machines . ix mcid . mcType - . _McTurret + . mctTurret . tuFireTime %~ (max 0 . subtract 1) -isElectrical :: Damage -> Bool -isElectrical dm = case dm of - Electrical{} -> True - _ -> False +--isElectrical :: Damage -> Bool +--isElectrical dm = case dm of +-- Electrical{} -> True +-- _ -> False mcUseItem :: Machine -> World -> World mcUseItem mc w = fromMaybe w $ do - tu <- mc ^? mcType . _McTurret + tu <- mc ^? mcType . mctTurret let i = tu ^. tuWeapon it <- w ^? cWorld . lWorld . items . ix i hit <- it ^? itType @@ -165,13 +171,6 @@ mcBackgroundSound mc = case mc ^. mcType of McDistributer{} -> Just (lowWhirS,1) McTrigger{} -> Just (throb1S,0.5) -mcApplyDamage :: [Damage] -> Machine -> World -> World -mcApplyDamage ds mc = case mc ^? mcType . _McDamSensor of - Nothing -> mcpointer %~ ((mcDamage .~ []) . (mcHP -~ sum (map _dmAmount ds))) - _ -> mcpointer . mcDamage .~ [] - where - mcpointer = cWorld . lWorld . machines . ix (_mcID mc) - mcDamSensorUpdate :: DamageSensor -> Machine -> World -> World mcDamSensorUpdate se = senseDamage (damageTypeThreshold (se ^. sensType)) (se ^. sensType) diff --git a/src/Dodge/Placement/Instance/Turret.hs b/src/Dodge/Placement/Instance/Turret.hs index 4a94ac3fb..b26d1afa4 100644 --- a/src/Dodge/Placement/Instance/Turret.hs +++ b/src/Dodge/Placement/Instance/Turret.hs @@ -27,16 +27,17 @@ putLasTurret rotSpeed = (reverse $ square 10) ( defaultMachine -- & mcColor .~ blue - & mcType .~ (lasTurret & _McTurret . tuTurnSpeed .~ rotSpeed) + & mcType .~ (lasTurret & mctTurret . tuTurnSpeed .~ rotSpeed) & mcHP .~ 50000 ) (Just laser) lasTurret :: MachineType -lasTurret = McTurret $ +lasTurret = McTurret Turret { _tuWeapon = 0 , _tuTurnSpeed = 0.1 , _tuFireTime = 0 , _tuDir = 0 - } + } + 0 diff --git a/src/Dodge/Wall/Damage.hs b/src/Dodge/Wall/Damage.hs index d4a165613..e65238433 100644 --- a/src/Dodge/Wall/Damage.hs +++ b/src/Dodge/Wall/Damage.hs @@ -48,14 +48,17 @@ damageMachine dam x mcid w = case w ^? cWorld . lWorld . machines . ix mcid of Just mc | Just se <- mc ^? mcType . _McDamSensor , sensorTypeDamages (se ^. sensType) dam -> (mempty,mcDamSensorUpdate' (_dmAmount dam) se mc w) + Just mc | McTurret{} <- mc ^. mcType + , Electrical edam <- dam + -> (mempty, w & cWorld . lWorld . machines . ix mcid . mcType . mctTurretStun %~ (min 100 . (+ edam))) Just mc | _mcHP mc < x -> destroyMachine' mc w _ -> (mempty, w & cWorld . lWorld . machines . ix mcid . mcHP -~ x) mcDamSensorUpdate' :: Int -> DamageSensor -> Machine -> World -> World -mcDamSensorUpdate' x se = senseDamage' x (damageTypeThreshold' (se ^. sensType)) (se ^. sensType) +mcDamSensorUpdate' x se = senseDamage' x (damageTypeThreshold' (se ^. sensType)) -senseDamage' :: Int -> Int -> SensorType -> Machine -> World -> World -senseDamage' x threshold dt mc = +senseDamage' :: Int -> Int -> Machine -> World -> World +senseDamage' x threshold mc = (cWorld . lWorld . machines . ix mcid %~ upmc) . updatels where