From 10c9e2261f596e887a4282221905492d17b33265 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 28 May 2023 10:17:32 +0100 Subject: [PATCH] Held item rclick use, tweak reload on lclick --- src/Dodge/Base.hs | 14 ++++++++- src/Dodge/Creature.hs | 2 +- src/Dodge/Creature/Impulse/UseItem.hs | 6 ++-- src/Dodge/HeldUse.hs | 35 +++++++++++---------- src/Dodge/Item/Display.hs | 2 +- src/Dodge/Item/Held/BatteryGuns.hs | 4 ++- src/Dodge/Item/Weapon/BatteryGuns.hs | 24 ++++++--------- src/Dodge/Item/Weapon/TriggerType.hs | 44 ++++++++++++--------------- src/Dodge/SelectionSections.hs | 2 +- 9 files changed, 68 insertions(+), 65 deletions(-) diff --git a/src/Dodge/Base.hs b/src/Dodge/Base.hs index da0c4c93e..a29dcf818 100644 --- a/src/Dodge/Base.hs +++ b/src/Dodge/Base.hs @@ -19,6 +19,7 @@ import Dodge.Base.Arithmetic import Dodge.Base.NewID import Dodge.Base.Coordinate import Dodge.Base.CardinalPoint +import Data.List (unfoldr) --import Dodge.Zone --import Dodge.Zone.Data import Dodge.Base.Window @@ -151,4 +152,15 @@ spreadAroundCenter :: Int -> Float -> [Float] spreadAroundCenter i x = [x * fromIntegral j - x*fromIntegral (i-1)*0.5 | j <- [0 .. i - 1]] spreadFromCenter :: Int -> Float -> [Float] -spreadFromCenter i x = [x * fromIntegral j - x*fromIntegral (i-1)*0.5 | j <- [0 .. i - 1]] +spreadFromCenter i x = [x * fromIntegral j | j <- js] + where + js = take i outwardIntegers + +outwardIntegers :: [Int] +outwardIntegers = unfoldr f (0, False) + where + f (x,True) = Just (x, (x,False)) + f (x,False) = Just (-x, (x+1,True)) + +spreadCenter :: Int -> Float -> [Float] +spreadCenter i x = [x * fromIntegral j - x*fromIntegral (i-1)*0.5 | j <- [0 .. i - 1]] diff --git a/src/Dodge/Creature.hs b/src/Dodge/Creature.hs index 4511b623b..df284ac18 100644 --- a/src/Dodge/Creature.hs +++ b/src/Dodge/Creature.hs @@ -259,7 +259,7 @@ stackedInventory = , flatShield , spawnGun (lamp 5) , lasGun - , lasWide 5 + , lasWide 20 , flameThrower , poisonSprayer , launcher diff --git a/src/Dodge/Creature/Impulse/UseItem.hs b/src/Dodge/Creature/Impulse/UseItem.hs index 189aaa8f8..73c749e45 100644 --- a/src/Dodge/Creature/Impulse/UseItem.hs +++ b/src/Dodge/Creature/Impulse/UseItem.hs @@ -5,8 +5,6 @@ module Dodge.Creature.Impulse.UseItem ( useItemHotkey, ) where -import Dodge.Inventory.RBList -import Dodge.Hotkey import Control.Lens import Control.Monad import Data.Foldable @@ -15,7 +13,9 @@ import Dodge.Cuse import Dodge.Data.World import Dodge.Euse import Dodge.HeldUse +import Dodge.Hotkey import Dodge.Inventory +import Dodge.Item.Location import Dodge.Luse import Dodge.Reloading import qualified IntMapHelp as IM @@ -28,6 +28,7 @@ useItemRightClick cr' w = fromMaybe (f w) $ do return $ itemEffect cr it w & worldEventFlags . at InventoryChange ?~ () + & f where f = cWorld . lWorld . creatures . ix (_crID cr') . crHammerPosition .~ HammerDown @@ -35,6 +36,7 @@ itemEffect :: Creature -> Item -> World -> World itemEffect cr it w = case it ^. itUse of HeldUse{_heldUse = eff, _heldMods = usemods} -> foldl' (&) (useHeld eff) (useMod usemods) it cr w + & pointerToItem it . itUse . heldHammer .~ HammerDown LeftUse{} -> doequipmentchange EquipUse{} -> doequipmentchange -- ConsumeUse will cause problems if the item is not selected diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index a3828e73b..7c278358b 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -72,36 +72,36 @@ useMod hm = case hm of ] CircleLaserMod -> [ duplicateItem fLasCircle - , withItemUpdate' increasecycleLasCircle , useAmmoAmount 1 , withSoundForI tone440sawtoothquietS 2 - , withItem $ \it -> withMuzPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 + , withItem $ \it -> withCrPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 , withItem $ \it -> withTempLight 1 100 (xyzV4 (_lasColor $ _itParams it)) + , withItemUpdateFirst increasecycleLasCircle , ammoCheckI ] LasWideMod n -> - [ withItem $ \it -> duplicateOffsetsV2 (xsLasWide it) - , withItemUpdate' (increasecycleLasWide n) - , crAtMuzPos - , useAmmoAmount 1 - , withSoundForI tone440sawtoothquietS 2 - , withItem $ \it -> withMuzPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 + [ useAmmoAmount 1 + , withItem $ \it -> duplicateNumBarrels (min + (it ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded) + (it ^?! itParams . lasCycle `div` lasWideRate)) + , withItem $ \it -> withCrPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 , withItem $ \it -> withTempLight 1 100 (xyzV4 (_lasColor $ _itParams it)) - , duplicateLoadedBarrels + , withSoundForI tone440sawtoothquietS 2 + , withItemUpdateFirst (increasecycleLasWide n) , ammoCheckI ] DualBeamMod -> [ useAmmoAmount 1 , withSoundForI tone440sawtoothquietS 2 - , withItem $ \it -> withMuzPosShift (V2 0 (- thegapDualBeam it)) $ flareCircleAt (_lasColor2 $ _itParams it) 0.8 - , withItem $ \it -> withMuzPosShift (V2 0 (thegapDualBeam it)) $ flareCircleAt (_lasColor $ _itParams it) 0.8 + , withItem $ \it -> withCrPosShift (V2 0 (- thegapDualBeam it)) $ flareCircleAt (_lasColor2 $ _itParams it) 0.8 + , withItem $ \it -> withCrPosShift (V2 0 (thegapDualBeam it)) $ flareCircleAt (_lasColor $ _itParams it) 0.8 , ammoCheckI ] LasMod -> [ useAmmoAmount 1 --- , withItem $ \it -> withMuzPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 + , withItem $ \it -> withCrPos $ flareCircleAt (_lasColor $ _itParams it) 0.8 , withSoundForI tone440sawtoothquietS 2 --- , withItem $ \it -> withTempLight 1 100 (xyzV4 (_lasColor $ _itParams it)) + , withItem $ \it -> withTempLight 1 100 (xyzV4 (_lasColor $ _itParams it)) , duplicateLoadedBarrels , ammoCheckI ] @@ -349,11 +349,7 @@ useMod hm = case hm of fLasCircle it = [it & itParams . lasCycle +~ x | x <- [0, 50 .. 1999]] increasecycleLasWide n it = case _heldHammer (_itUse it) of HammerUp -> it & itParams . lasCycle .~ 1 - _ -> it & itParams . lasCycle %~ (min (n * 5) . (+ 1)) - xsLasWide it = [V2 ((0.2 * yoff x) ^ (2 :: Int)) (yoff x) | x <- [(0 :: Int) .. n' -1]] - where - yoff x = fromIntegral x - fromIntegral (n' -1) / 2 - n' = _lasCycle (_itParams it) + _ -> it & itParams . lasCycle %~ (min (n * lasWideRate) . (+ 1)) thegapDualBeam = _dbGap . _itParams directedTelPos _ cr w = (p, a) where @@ -364,6 +360,9 @@ useMod hm = case hm of cr & crDir %~ tweenAngles x (_crOldDir cr) & crPos %~ alongSegBy x (_crOldPos cr) +lasWideRate :: Int +lasWideRate = 2 + mcUseHeld :: HeldItemType -> Item -> Machine -> World -> World mcUseHeld hit = case hit of LASGUN -> mcShootLaser diff --git a/src/Dodge/Item/Display.hs b/src/Dodge/Item/Display.hs index 7c3ee3162..ca4d5dca8 100644 --- a/src/Dodge/Item/Display.hs +++ b/src/Dodge/Item/Display.hs @@ -21,7 +21,7 @@ import Padding itemDisplayOffset :: Creature -> Item -> (Int,[String]) itemDisplayOffset cr itm = case itm ^. itType . iyBase of EQUIP (TARGETINGHAT tt) | targetItemCanAttachAbove cr itm - -> ((-1), leftPad 15 ' ' (targetingTypeString tt) : + -> (-1, leftPad 15 ' ' (targetingTypeString tt) : (itemDisplay cr itm & ix 0 %~ (\s -> itemDisplayPad s (replicate (length (targetingTypeString tt)) '^') ))) EQUIP (TARGETINGHAT tt) -> (0, itemDisplay cr itm & ix 0 %~ (\s -> itemDisplayPad s (targetingTypeString tt))) diff --git a/src/Dodge/Item/Held/BatteryGuns.hs b/src/Dodge/Item/Held/BatteryGuns.hs index 94570f9dd..d965adb4a 100644 --- a/src/Dodge/Item/Held/BatteryGuns.hs +++ b/src/Dodge/Item/Held/BatteryGuns.hs @@ -1,5 +1,6 @@ module Dodge.Item.Held.BatteryGuns where +import Dodge.Base import Dodge.Data.Beam import Dodge.Default.Item import Color @@ -40,7 +41,7 @@ lasGun = defaultAutoBatteryGun & itUse . heldConsumption .~ ( defaultLoadable - & laSource . _InternalSource . iaMax .~ 200 + & laSource . _InternalSource . iaMax .~ 200000 & laSource . _InternalSource . iaCycle .~ [loadEject 10, loadInsert 10, loadPrime 60] ) & itParams @@ -114,6 +115,7 @@ lasWide n = & itParams . lasColor .~ yellow & itParams . lasDamage .~ 2 & itUse . heldMods .~ LasWideMod n + & itUse . heldAim . aimMuzzles .~ [Muzzle (V2 30 y) 0 0 | y <- spreadFromCenter n 1] defaultBatteryGun :: Item defaultBatteryGun = diff --git a/src/Dodge/Item/Weapon/BatteryGuns.hs b/src/Dodge/Item/Weapon/BatteryGuns.hs index 27aacebfa..82ce63efa 100644 --- a/src/Dodge/Item/Weapon/BatteryGuns.hs +++ b/src/Dodge/Item/Weapon/BatteryGuns.hs @@ -3,7 +3,7 @@ module Dodge.Item.Weapon.BatteryGuns ( flameBeamCombine, teslaBeamCombine, splitBeamCombine, --- shootTeslaArc, + -- shootTeslaArc, shootLaser, circleLaser, shootDualLaser, @@ -22,8 +22,6 @@ import Picture --import Control.Monad.State - - --lasPulse :: Item --lasPulse = lasGun -- & itType . iyBase .~ LASPULSE @@ -42,8 +40,6 @@ import Picture -- & itParams . lasColor .~ frac it * orange -- frac it = 0.5 * (1 + sin (pi * fromIntegral (_lasCycle $ _itParams it) * 0.1)) - - --lasWidePulse :: Item --lasWidePulse = lasGun -- & itType . iyBase .~ LASGUNWIDEPULSE @@ -109,7 +105,6 @@ import Picture -- n' = 9 * n -- xs = [ 0.25 * (fromIntegral x - fromIntegral (n'-1) /2) | x <- [0..n'-1] ] - --lasSwing :: Item --lasSwing = lasGun -- & itType . iyBase .~ LASGUNSWING @@ -129,16 +124,15 @@ import Picture -- y = 15 * sin (pi * fromIntegral x' * 0.01) -- x' = _lasCycle $ _itParams it - - shootLaser :: Item -> Creature -> World -> World -shootLaser it cr = cWorld . lWorld . lasers .:~ lasRayAt (_lasColor $ _itParams it) dam phasev pos dir - where - pos = _crPos cr - dir = _crDir cr - phasev = _phaseV . _itParams $ _crInv cr IM.! itRef - itRef = cr ^?! crManipulation . manObject . inInventory . ispItem -- unsafe!! TODO change - dam = _lasDamage $ _itParams it +shootLaser it cr = + cWorld . lWorld . lasers + .:~ lasRayAt + (_lasColor $ _itParams it) + (_lasDamage $ _itParams it) + (_phaseV $ _itParams it) + (_crPos cr) + (_crDir cr) -- this has the feel of a left click item circleLaser :: Item -> Creature -> World -> World diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index 52a0117cd..854ed1fd7 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -9,16 +9,15 @@ module Dodge.Item.Weapon.TriggerType ( useAmmoUpTo, lockInvFor, withMuzFlareI, - withMuzPos, - withMuzPosShift, - crAtMuzPos, + withCrPos, + withCrPosShift, withOldDir, trigDoAlso, trigDoAlso', withTempLight, withItem, withItemUpdate, - withItemUpdate', + withItemUpdateFirst, rateIncAB, torqueBefore, torqueBeforeAtLeast, @@ -48,6 +47,7 @@ module Dodge.Item.Weapon.TriggerType ( sideEffectOnFrame, duplicateItem, duplicateLoadedBarrels, + duplicateNumBarrels, duplicateLoaded, duplicateOffsetsV2, duplicateOffsetsFocus, @@ -429,8 +429,8 @@ withItem :: (Item -> ChainEffect) -> ChainEffect withItem g f it = g it f it -- not ideal -withItemUpdate' :: (Item -> Item) -> ChainEffect -withItemUpdate' up f it cr = f (up it) cr . (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix itRef %~ up) +withItemUpdateFirst :: (Item -> Item) -> ChainEffect +withItemUpdateFirst up f it cr = f (up it) cr . (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix itRef %~ up) where itRef = cr ^?! crManipulation . manObject . inInventory . ispItem -- unsafe!! TODO change @@ -475,23 +475,13 @@ withMuzFlareI f it cr w = -- | crInAimStance OneHand cr = 10 -- | otherwise = 0 -withMuzPos :: (Point3 -> World -> World) -> ChainEffect -withMuzPos = withMuzPosShift (V2 0 0) +withCrPos :: (Point3 -> World -> World) -> ChainEffect +withCrPos = withCrPosShift (V2 0 0) -withMuzPosShift :: Point2 -> (Point3 -> World -> World) -> ChainEffect -withMuzPosShift p g f it cr = g thepos . f it cr +withCrPosShift :: Point2 -> (Point3 -> World -> World) -> ChainEffect +withCrPosShift p g f it cr = g thepos . f it cr where - thepos = (_crPos cr `v2z` 20) - --thepos = (pos `v2z` 20) - --pos = - -- _crPos cr - -- +.+ rotateV dir p - -- +.+ aimingMuzzlePos cr it *.* unitVectorAtAngle dir - --dir = _crDir cr - -crAtMuzPos :: ChainEffect ---crAtMuzPos f it cr = f it (cr & crPos +.+.~ (aimingMuzzlePos cr it *.* unitVectorAtAngle (_crDir cr))) -crAtMuzPos f it cr = f it cr + thepos = (_crPos cr +.+ rotateV (_crDir cr) p) `v2z` 20 -- | Applies the effect to a randomly rotated creature. withRandomDirI :: @@ -641,14 +631,13 @@ duplicateLoaded eff it cr w = foldr f w [1 .. numBul] f _ = eff it cr numBul = it ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded -duplicateLoadedBarrels :: ChainEffect -duplicateLoadedBarrels eff itm cr w = foldr f w (take numbul $ itm ^?! itUse . heldAim . aimMuzzles) +duplicateNumBarrels :: Int -> ChainEffect +duplicateNumBarrels n eff itm cr w = foldr f w (take n $ itm ^?! itUse . heldAim . aimMuzzles) where - numbul = itm ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded f brl w' = eff itm - ( cr & crPos +~ (rotateV (_crDir cr) (_mzPos brl)) + ( cr & crPos +~ rotateV (_crDir cr) (_mzPos brl) & crDir +~ (_mzRot brl + a) ) (w' & randGen .~ g) @@ -656,6 +645,11 @@ duplicateLoadedBarrels eff itm cr w = foldr f w (take numbul $ itm ^?! itUse . h inacc = _mzInaccuracy brl (a,g) = randomR (-inacc,inacc) $ _randGen w' +duplicateLoadedBarrels :: ChainEffect +duplicateLoadedBarrels eff itm = duplicateNumBarrels numbul eff itm + where + numbul = itm ^?! itUse . heldConsumption . laSource . _InternalSource . iaLoaded + duplicateOffsetsFocus :: [Float] -> ChainEffect duplicateOffsetsFocus xs eff item cr w = foldr f w poss where diff --git a/src/Dodge/SelectionSections.hs b/src/Dodge/SelectionSections.hs index 47788f69b..3f6bcb34c 100644 --- a/src/Dodge/SelectionSections.hs +++ b/src/Dodge/SelectionSections.hs @@ -130,7 +130,7 @@ selSecYint i j sss = do return . (secpos +) . subtract (ss ^. ssOffset) . sum - . fmap (_siHeight) + . fmap _siHeight . fst $ IM.split j (ss ^. ssItems) where