From 3b452b900220fc290e2af9e7269f411089323ec9 Mon Sep 17 00:00:00 2001 From: justin Date: Fri, 3 Jan 2025 14:50:09 +0000 Subject: [PATCH] Add clicker items that use other items with a one frame delay --- src/Dodge/Data/Input.hs | 3 +++ src/Dodge/Data/Item/Combine.hs | 1 + src/Dodge/Data/WorldEffect.hs | 2 ++ src/Dodge/HeldUse.hs | 22 ++++++++++++++++++++++ src/Dodge/Item.hs | 1 + src/Dodge/Item/Display.hs | 1 + src/Dodge/Item/Draw/SPic.hs | 1 + src/Dodge/Item/Grammar.hs | 1 + src/Dodge/Item/Scope.hs | 7 +++++++ src/Dodge/WorldEffect.hs | 2 ++ 10 files changed, 41 insertions(+) diff --git a/src/Dodge/Data/Input.hs b/src/Dodge/Data/Input.hs index a15128634..ca0e98d3e 100644 --- a/src/Dodge/Data/Input.hs +++ b/src/Dodge/Data/Input.hs @@ -9,6 +9,8 @@ import Control.Lens import qualified Data.Map.Strict as M import Geometry.Data import SDL (MouseButton, Scancode) +import Data.Aeson +import Data.Aeson.TH data PressType = InitialPress @@ -69,3 +71,4 @@ data TermSignal makeLenses ''Input makeLenses ''MouseContext +deriveJSON defaultOptions ''PressType diff --git a/src/Dodge/Data/Item/Combine.hs b/src/Dodge/Data/Item/Combine.hs index 68bcfafaf..bae375be9 100644 --- a/src/Dodge/Data/Item/Combine.hs +++ b/src/Dodge/Data/Item/Combine.hs @@ -24,6 +24,7 @@ data ItemType | ITEMSCAN | MAPPER | DROPPER InventoryPathing + | CLICKER InventoryPathing | INTROSCAN {_ibtIntroScanType :: IntroScanType} | DETECTOR {_ibtDetector :: Detector} | ARHUD diff --git a/src/Dodge/Data/WorldEffect.hs b/src/Dodge/Data/WorldEffect.hs index c5f8052d2..d3133a409 100644 --- a/src/Dodge/Data/WorldEffect.hs +++ b/src/Dodge/Data/WorldEffect.hs @@ -5,6 +5,7 @@ module Dodge.Data.WorldEffect where +import Dodge.Data.Input import Dodge.Data.LightSource import Dodge.Data.ComposedItem import Dodge.Data.DoubleTree @@ -32,6 +33,7 @@ data WdWd | WdWdNegateTrig Int | WdWdFromItCrixWdWd (LabelDoubleTree ComposeLinkType Item) Int ItCrWdWd | MakeTempLight LSParam Int + | UseInvItem Int PressType --deriving (Eq, Show, Read) --, Generic) --h--deriving (Eq, Show, Read) --Generic, Flat) diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 7ee092fff..39c40e348 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -48,6 +48,9 @@ gadgetEffect pt loc | DROPPER x <- loc ^. locLDT . ldtValue . _1 . itType , Just i <- loc ^? locLDT . ldtValue . _1 . itUse . uInt , pt == InitialPress = dropInventoryPath i x loc + | CLICKER x <- loc ^. locLDT . ldtValue . _1 . itType + , Just i <- loc ^? locLDT . ldtValue . _1 . itUse . uInt + = useInventoryPath pt i x loc | otherwise = const id heldEffect :: @@ -793,6 +796,25 @@ dropInventoryPath i ip loc cr w = case ip of guard $ (i + j) `IM.member` (cr ^. crInv) return $ dropItem cr (i + j) w +useInventoryPath :: PressType -> + Int -> InventoryPathing -> LocationLDT ItemLink ComposedItem + -> Creature + -> World -> World +useInventoryPath pt i ip loc cr w = case ip of + ABSOLUTE -> fromMaybe w $ do + guard $ i `IM.member` (cr ^. crInv) + return $ w & cWorld . lWorld . delayedEvents .:~ (1,UseInvItem i pt) + RELCURS -> fromMaybe w $ do + j <- cr ^? crManipulation . manObject . imSelectedItem + guard $ (i + j) `IM.member` (cr ^. crInv) + return $ w + & cWorld . lWorld . delayedEvents .:~ (1,UseInvItem (i+j) pt) + RELITEM -> fromMaybe w $ do + j <- loc ^? locLDT . ldtValue . _1 . itLocation . ilInvID + guard $ (i + j) `IM.member` (cr ^. crInv) + return $ w + & cWorld . lWorld . delayedEvents .:~ (1,UseInvItem (i+j) pt) + --useRewindGun _ _ w = case w ^. cwTime . rewindWorlds of -- [w'] -> w & cwTime . maybeWorld .~ Just' w' -- (w' : ws) -> w diff --git a/src/Dodge/Item.hs b/src/Dodge/Item.hs index 785f003fd..44ad5d3fa 100644 --- a/src/Dodge/Item.hs +++ b/src/Dodge/Item.hs @@ -31,6 +31,7 @@ itemFromBase = \case DETECTOR d -> detector d ARHUD -> arHUD DROPPER x -> dropper x + CLICKER x -> clicker x itemFromAmmoMag :: AmmoMagType -> Item itemFromAmmoMag at = case at of diff --git a/src/Dodge/Item/Display.hs b/src/Dodge/Item/Display.hs index 43d433efc..361260655 100644 --- a/src/Dodge/Item/Display.hs +++ b/src/Dodge/Item/Display.hs @@ -72,6 +72,7 @@ itemBaseName = \case DETECTOR t -> show t ARHUD -> "AR-HUD" DROPPER x -> "DROPPER-" ++ showInventoryPathing x + CLICKER x -> "CLICKER-" ++ showInventoryPathing x showInventoryPathing :: InventoryPathing -> String showInventoryPathing = \case diff --git a/src/Dodge/Item/Draw/SPic.hs b/src/Dodge/Item/Draw/SPic.hs index 23d1bcbdc..051dc9382 100644 --- a/src/Dodge/Item/Draw/SPic.hs +++ b/src/Dodge/Item/Draw/SPic.hs @@ -47,6 +47,7 @@ itemSPic it = case it ^. itType of INTROSCAN {} -> defSPic DETECTOR dt -> noPic (colorSH (detectorColor dt) $ upperPrismPolySU 3 $ rectWH 2 2) DROPPER{} -> defSPic + CLICKER{} -> defSPic craftItemSPic :: CraftType -> Shape craftItemSPic = \case diff --git a/src/Dodge/Item/Grammar.hs b/src/Dodge/Item/Grammar.hs index 375842325..b3386d4fe 100644 --- a/src/Dodge/Item/Grammar.hs +++ b/src/Dodge/Item/Grammar.hs @@ -167,6 +167,7 @@ itemToFunction itm = case itm ^. itType of EQUIP{} -> EquipmentPlatformSF ATTACH SHELLPAYLOAD{} -> AmmoPayloadSF LauncherAmmo DROPPER{} -> GadgetPlatformSF + CLICKER{} -> GadgetPlatformSF _ -> NoSF structureToPotentialFunction :: diff --git a/src/Dodge/Item/Scope.hs b/src/Dodge/Item/Scope.hs index 8a0748548..48ee00424 100644 --- a/src/Dodge/Item/Scope.hs +++ b/src/Dodge/Item/Scope.hs @@ -18,6 +18,7 @@ module Dodge.Item.Scope ( introScan, mapper, dropper, + clicker, ) where import Dodge.Item.Attach @@ -74,6 +75,12 @@ dropper x = & itType .~ DROPPER x & itUse .~ UseInt 0 +clicker :: InventoryPathing -> Item +clicker x = + defaultHeldItem + & itType .~ CLICKER x + & itUse .~ UseInt 0 + bulletModule :: BulletMod -> Item bulletModule bm = defaultHeldItem diff --git a/src/Dodge/WorldEffect.hs b/src/Dodge/WorldEffect.hs index 91ec7fe34..49d5cb28d 100644 --- a/src/Dodge/WorldEffect.hs +++ b/src/Dodge/WorldEffect.hs @@ -5,6 +5,7 @@ module Dodge.WorldEffect ( lineOutputTerminal, ) where +import Dodge.Creature.Impulse.UseItem import Dodge.BlBl import Dodge.Data.Input import Dodge.HeldUse @@ -42,6 +43,7 @@ doWdWd we = case we of MakeTempLight _ 0 -> id MakeTempLight x t -> (cWorld . lWorld . lights .:~ x) . (cWorld . lWorld . worldEvents .:~ MakeTempLight x (t-1)) + UseInvItem invid pt -> \w -> fromMaybe w (useItem invid pt w) doItCrWdWd :: ItCrWdWd -> LabelDoubleTree ComposeLinkType Item -> Creature -> World -> World doItCrWdWd icww = case icww of