From d1690ed3acd161d0420a5a47bc855e6b3c186cf6 Mon Sep 17 00:00:00 2001 From: justin Date: Fri, 27 Sep 2024 23:10:01 +0100 Subject: [PATCH] Cleanup --- ghcidOutput | 9 +- src/Dodge/Data/Item/Use/Consumption/Ammo.hs | 23 +--- src/Dodge/HeldUse.hs | 2 +- src/Dodge/Item/Weapon.hs | 3 - src/Dodge/Item/Weapon/Launcher.hs | 28 ---- src/Dodge/LinearShockwave/Update.hs | 6 +- src/Dodge/Projectile/Create.hs | 20 +-- src/Dodge/Projectile/Update.hs | 136 ++++++++------------ src/Dodge/SelectUse.hs | 2 +- tags | 89 +++++++------ 10 files changed, 124 insertions(+), 194 deletions(-) delete mode 100644 src/Dodge/Item/Weapon/Launcher.hs diff --git a/ghcidOutput b/ghcidOutput index 79b80b946..2ba7a7edb 100644 --- a/ghcidOutput +++ b/ghcidOutput @@ -1 +1,8 @@ -All good (617 modules, at 21:51:38) +/home/justin/Haskell/loop/src/Dodge/Data/Item/Use/Consumption/Ammo.hs:53:27-44: error: + • Not in scope: type constructor or class ‘ProjectileCreate’ + Perhaps you meant one of these: + ‘ProjectileUpdate’ (line 21), ‘ProjectileDraw’ (line 18) + • In the Template Haskell quotation ''ProjectileCreate + | +53 | deriveJSON defaultOptions ''ProjectileCreate + | ^^^^^^^^^^^^^^^^^^ diff --git a/src/Dodge/Data/Item/Use/Consumption/Ammo.hs b/src/Dodge/Data/Item/Use/Consumption/Ammo.hs index 62b253e16..3b84f80a8 100644 --- a/src/Dodge/Data/Item/Use/Consumption/Ammo.hs +++ b/src/Dodge/Data/Item/Use/Consumption/Ammo.hs @@ -18,22 +18,14 @@ import Dodge.Data.Payload data ProjectileDraw = DrawShell | DrawRemoteShell | DrawDrone | DrawBlankProjectile deriving (Show, Eq, Ord, Enum, Bounded, Read) --Generic, Flat) -data ProjectileCreate = CreateShell | CreateTrackingShell - deriving (Show, Eq, Ord, Enum, Bounded, Read) --Generic, Flat) - data ProjectileUpdate - = PJThrust {_pjuStart :: Int, _pjuEnd :: Int} - | PJSpin {_pjuTime :: Int, _pjuCID :: Int, _pjuSpinAmound :: Int} --- | PJTrack {_pjuStart :: Int, _pjuEnd :: Int, _pjuScreenID :: Int} - | PJRemoteSetDirection {_pjuStart :: Int, _pjuEnd :: Int, _pjuControllerID :: Maybe Int} - | PJReduceSpin {_pjuReduceSpin :: Float} --- | PJRemoteDirection {_pjuStart :: Int, _pjuEnd :: Int, _pjuCID :: Int, _pjuITID :: Int} --- | PJSetScope {_pjuITID :: Int} - | PJRetireRemote {_pjuScreenID :: Maybe Int, _pjuTimer :: Int, _pjuPJID :: Int} - | PJDecTimMvVel --- | PJShellCollisionCheck - | PJRemoteShellCollisionCheck {_pjuScreenID :: Maybe Int} --- | PJRemoteShellExplosion + = ThrustPU {_pjuStart :: Int, _pjuEnd :: Int} + | StartSpinPU {_pjuTime :: Int, _pjuCID :: Int, _pjuSpinAmound :: Int} + | RemoteDirectionPU {_pjuStart :: Int, _pjuEnd :: Int, _pjuControllerID :: Maybe Int} + | ReduceSpinPU {_pjuReduceSpin :: Float} + | DestroyPU {_pjuScreenID :: Maybe Int, _pjuTimer :: Int} + | TimePU + | CollisionEffectPU {_pjuScreenID :: Maybe Int} deriving (Show, Eq, Ord, Read) --Generic, Flat) data AmmoType @@ -58,7 +50,6 @@ makeLenses ''ProjectileUpdate makeLenses ''AmmoType deriveJSON defaultOptions ''GasFuel deriveJSON defaultOptions ''ProjectileDraw -deriveJSON defaultOptions ''ProjectileCreate deriveJSON defaultOptions ''ProjectileUpdate deriveJSON defaultOptions ''GasCreate deriveJSON defaultOptions ''ForceFieldType diff --git a/src/Dodge/HeldUse.hs b/src/Dodge/HeldUse.hs index 6d9f1b6e8..9411a44e6 100644 --- a/src/Dodge/HeldUse.hs +++ b/src/Dodge/HeldUse.hs @@ -506,7 +506,7 @@ createProjectile magtree muz itm cr = fromMaybe failsound $ do let mscreen = lookup RemoteScreenLink (magtree ^. ldtLeft) j <- ammoitem ^? itLocation . ilInvID aparams <- ammoitem ^? itUse . amagParams - return $ fireTrackingShell (mscreen ^? _Just . ldtValue) aparams muz itm cr + return $ createShell (mscreen ^? _Just . ldtValue) aparams muz itm cr . startthesound . useammo j where diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index b92029457..92ab95e16 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -8,7 +8,6 @@ module Dodge.Item.Weapon ( module Dodge.Item.Weapon.Radar, module Dodge.Item.Weapon.Utility, module Dodge.Item.Weapon.BatteryGuns, - module Dodge.Item.Weapon.Launcher, module Dodge.Item.Weapon.Drone, ) where @@ -16,9 +15,7 @@ import Dodge.Item.Weapon.BatteryGuns import Dodge.Item.Weapon.Drone import Dodge.Item.Weapon.ExtraEffect import Dodge.Item.Weapon.Grenade -import Dodge.Item.Weapon.Launcher import Dodge.Item.Weapon.Radar ---import Dodge.Item.Weapon.Remote import Dodge.Item.Weapon.Spawn import Dodge.Item.Weapon.TriggerType import Dodge.Item.Weapon.Utility diff --git a/src/Dodge/Item/Weapon/Launcher.hs b/src/Dodge/Item/Weapon/Launcher.hs deleted file mode 100644 index 52aa3b66b..000000000 --- a/src/Dodge/Item/Weapon/Launcher.hs +++ /dev/null @@ -1,28 +0,0 @@ -module Dodge.Item.Weapon.Launcher ( - explodeRemoteRocket, -) where - -import Dodge.SoundLogic -import Control.Lens -import Dodge.Data.World ---import Dodge.Item.Location -import Dodge.Payload - -explodeRemoteRocket :: - -- | Item id - Maybe Int -> - -- | Projectile id - Int -> - World -> - World -explodeRemoteRocket mitid pjid w = - w - & cWorld . lWorld . projectiles . ix pjid . prjUpdates .~ [PJRetireRemote mitid 30 pjid] - & cWorld . lWorld . projectiles . ix pjid . prjDraw .~ DrawBlankProjectile --- & itPoint . itUse . heldUse .~ HeldDoNothing --- & itPoint . itUse . heldMods .~ DoNothingMod - & usePayload (_prjPayload thepj) (_prjPos thepj) - & stopSoundFrom (ShellSound pjid) - where --- itPoint = pointerToItemLocation $ w ^?! cWorld . lWorld . itemLocations . ix itid-- _itemLocations (_cWorld w) IM.! itid - thepj = w ^?! cWorld . lWorld . projectiles . ix pjid diff --git a/src/Dodge/LinearShockwave/Update.hs b/src/Dodge/LinearShockwave/Update.hs index 0f0b8c16e..8887f3727 100644 --- a/src/Dodge/LinearShockwave/Update.hs +++ b/src/Dodge/LinearShockwave/Update.hs @@ -6,9 +6,9 @@ import qualified IntMapHelp as IM import Control.Lens updateLinearShockwave :: LinearShockwave -> World -> World -updateLinearShockwave lw w - | t < 1 = w & cWorld . lWorld . linearShockwaves %~ IM.delete lwid - | otherwise = w & cWorld . lWorld . linearShockwaves . ix lwid . lwTimer -~ 1 +updateLinearShockwave lw + | t < 1 = cWorld . lWorld . linearShockwaves %~ IM.delete lwid + | otherwise = cWorld . lWorld . linearShockwaves . ix lwid . lwTimer -~ 1 where lwid = _lwID lw t = _lwTimer lw diff --git a/src/Dodge/Projectile/Create.hs b/src/Dodge/Projectile/Create.hs index 0d17b5b7f..015c5d9f0 100644 --- a/src/Dodge/Projectile/Create.hs +++ b/src/Dodge/Projectile/Create.hs @@ -1,5 +1,5 @@ module Dodge.Projectile.Create ( - fireTrackingShell, + createShell, ) where import Data.Maybe @@ -9,8 +9,8 @@ import qualified IntMapHelp as IM import LensHelp -- assumes the mscreen is in your inventory -fireTrackingShell :: Maybe Item -> AmmoParams -> Muzzle -> Item -> Creature -> World -> World -fireTrackingShell mscreen aparams muz it cr w = w +createShell :: Maybe Item -> AmmoParams -> Muzzle -> Item -> Creature -> World -> World +createShell mscreen aparams muz it cr w = w & updatescreen & cWorld . lWorld . projectiles . at i ?~ Shell @@ -26,12 +26,12 @@ fireTrackingShell mscreen aparams muz it cr w = w , _prjPayload = _ampPayload aparams , _prjTimer = 350 , _prjUpdates = - [ PJRemoteShellCollisionCheck (mscreen ^? _Just . itID) --Just screenid) - , PJDecTimMvVel - , PJSpin 335 (_crID cr) (_shellSpinAmount params) - , PJRemoteSetDirection (350 - thrustdelay) 0 (mscreen ^? _Just . itID) - , PJThrust (350 - thrustdelay) 0 - , PJReduceSpin (1 - fromIntegral (_shellSpinDrag params) * 2 / 200) + [ CollisionEffectPU (mscreen ^? _Just . itID) --Just screenid) + , TimePU + , StartSpinPU 335 (_crID cr) (_shellSpinAmount params) + , RemoteDirectionPU (350 - thrustdelay) 0 (mscreen ^? _Just . itID) + , ThrustPU (350 - thrustdelay) 0 + , ReduceSpinPU (1 - fromIntegral (_shellSpinDrag params) * 2 / 200) ] } where @@ -44,6 +44,6 @@ fireTrackingShell mscreen aparams muz it cr w = w . itUse . atLinkedProjectile ?~ i - i = IM.newKey $ w ^. cWorld . lWorld . projectiles -- _props (_cWorld w) + i = IM.newKey $ w ^. cWorld . lWorld . projectiles dir = _crDir cr + _mzRot muz pos = _crPos cr +.+ rotateV dir (_mzPos muz) diff --git a/src/Dodge/Projectile/Update.hs b/src/Dodge/Projectile/Update.hs index dbaa7255a..dc1bcd2f3 100644 --- a/src/Dodge/Projectile/Update.hs +++ b/src/Dodge/Projectile/Update.hs @@ -3,80 +3,62 @@ module Dodge.Projectile.Update ( updateProjectile ) where +import Dodge.Payload import Control.Lens import Data.Maybe import Dodge.Base import Dodge.Data.World import Dodge.EnergyBall import Dodge.Item.Location -import Dodge.Item.Weapon.Launcher import Dodge.SoundLogic import Dodge.WorldEvent.Cloud import Geometry import qualified IntMapHelp as IM import RandomHelp +import Data.Foldable updateProjectile :: Projectile -> World -> World -updateProjectile pj w' = foldr (`upProjectile` pj) w' (_prjUpdates pj) ---updateProjectile pj = case pj of --- Shell{} -> upsProjectile pj --- ---upsProjectile :: Projectile -> World -> World ---upsProjectile pj w' = foldr (`upProjectile` pj) w' (_prjUpdates pj) +updateProjectile pj w = foldl' (\w' pu -> upProjectile pu pj w') w (_prjUpdates pj) + +upProjectile :: ProjectileUpdate -> Projectile -> World -> World +upProjectile pu pj = case pu of + CollisionEffectPU mscreenid -> shellCollisionEffect mscreenid pj + TimePU -> decTimMvVel pj + ThrustPU st et + | act st et -> doThrust pj + | otherwise -> id + StartSpinPU t cid spinamount + | time == t -> trySpinByCID cid spinamount pj + | otherwise -> id + RemoteDirectionPU st et mscreenid + | act st et -> pjRemoteSetDirection mscreenid pj + | otherwise -> id + ReduceSpinPU x -> reduceSpinBy x (_prjID pj) + DestroyPU mitid 0 -> destroyProjectile mitid (_prjID pj) +-- the following requires that this is at the top of the update list, which is +-- not ideal + DestroyPU _ _ -> cWorld . lWorld . projectiles . ix (_prjID pj) . prjUpdates . ix 0 . pjuTimer -~ 1 + where + time = _prjTimer pj + act st et = time <= st && time >= et + +shellCollisionEffect :: Maybe Int -> Projectile -> World -> World +shellCollisionEffect mscreenid = shellCollisionCheck + $ \pj -> explodeShell mscreenid (_prjID pj) shellCollisionCheck :: (Projectile -> World -> World) -> Projectile -> World -> World -shellCollisionCheck doExplode pj w - | time > 330 && circOnSomeWall oldPos 4 w = doExplode pj w - | time <= 330 && anythingHitCirc 2 oldPos newPos w = doExplode pj w - | time <= 0 = doExplode pj w +shellCollisionCheck f pj w + | time > 330 && circOnSomeWall oldPos 4 w = f pj w + | time <= 330 && anythingHitCirc 2 oldPos newPos w = f pj w + | time <= 0 = f pj w | otherwise = w where time = _prjTimer pj oldPos = _prjPos pj - vel = _prjVel pj - newPos = oldPos +.+ vel + newPos = oldPos +.+ _prjVel pj -remoteShellCollisionCheck :: Maybe Int -> Projectile -> World -> World -remoteShellCollisionCheck mscreenid = shellCollisionCheck - $ \pj -> explodeRemoteRocket mscreenid (_prjID pj) - ---plainShellCollisionCheck :: Proj -> World -> World ---plainShellCollisionCheck = shellCollisionCheck $ \pj -> --- usePayload (_prjPayload pj) (_prjPos pj) --- . stopSoundFrom (ShellSound (_prjID pj)) --- . (cWorld . lWorld . projectiles %~ IM.delete (_prjID pj)) - - -upProjectile :: ProjectileUpdate -> Projectile -> World -> World -upProjectile pu pj = case pu of - PJRemoteShellCollisionCheck mscreenid -> remoteShellCollisionCheck mscreenid pj --- PJShellCollisionCheck -> plainShellCollisionCheck pj - PJDecTimMvVel -> decTimMvVel pj - PJThrust st et - | act st et -> doThrust pj - | otherwise -> id - PJSpin t cid spinamount - | ain t -> trySpinByCID cid spinamount pj - | otherwise -> id - PJRemoteSetDirection st et mscreenid - | act st et -> pjRemoteSetDirection mscreenid pj - | otherwise -> id - PJReduceSpin x -> reduceSpinBy x pj --- PJRemoteDirection st et cid itid --- | act st et -> setRemoteDir cid itid pj --- | otherwise -> id --- PJSetScope itid -> setRemoteScope itid (_prjPos pj) - PJRetireRemote mitid 0 pjid -> retireRemoteProj mitid pjid --- the following requires that this is at the top of the update list, which is --- not ideal - PJRetireRemote _ _ pjid -> cWorld . lWorld . projectiles . ix pjid . prjUpdates . ix 0 . pjuTimer -~ 1 - where - time = _prjTimer pj - act st et = time <= st && time >= et - ain t = time == t - -retireRemoteProj :: Maybe Int -> Int -> World -> World -retireRemoteProj mitid pjid w = w & cWorld . lWorld . projectiles %~ IM.delete pjid +destroyProjectile :: Maybe Int -> Int -> World -> World +destroyProjectile mitid pjid w = w & cWorld . lWorld . projectiles %~ IM.delete pjid & removelink where removelink = fromMaybe id $ do @@ -124,20 +106,6 @@ trySpinByCID cid i pj w = w & cWorld . lWorld . projectiles . ix pjid . prjSpin _ -> 0 spinFactor = 5 * (6 - fromIntegral i) ---pjTrack :: Int -> Proj -> World -> World ---pjTrack crid pj w = rotateToTarget pj w --- where --- rotateToTarget _ = fromMaybe id $ do --- tpos <- w ^? cWorld . lWorld . creatures . ix crid . crTargeting . ctPos . _Just --- return $ --- cWorld . lWorld . projectiles . ix (_prjID pj) . prjSpin --- .~ turnToAmount --- 0.15 --- (_prjPos pj) --- tpos --- (argV $ _prjAcc pj) --- --itPoint = pointerToItemLocation $ w ^?! cWorld . lWorld . itemLocations . ix itid - -- note this only allows YOU to remotely track projectiles pjRemoteSetDirection :: Maybe Int -> Projectile -> World -> World pjRemoteSetDirection mscreenid pj w = fromMaybe w $ do @@ -150,23 +118,8 @@ pjRemoteSetDirection mscreenid pj w = fromMaybe w $ do turntonewdir = magV (_prjAcc pj) *.* unitVectorAtAngle newdir return $ w & cWorld . lWorld . projectiles . ix (_prjID pj) . prjAcc .~ turntonewdir ---pjTrack :: Int -> Proj -> World -> World ---pjTrack screenid pj w = w-- rotateToTarget pj w --- where --- rotateToTarget _ = fromMaybe id $ do --- tpos <- w ^? cWorld . lWorld . creatures . ix crid . crTargeting . ctPos . _Just --- return $ --- cWorld . lWorld . projectiles . ix (_prjID pj) . prjSpin --- .~ turnToAmount --- 0.15 --- (_prjPos pj) --- tpos --- (argV $ _prjAcc pj) --- --itPoint = pointerToItemLocation $ w ^?! cWorld . lWorld . itemLocations . ix itid - -reduceSpinBy :: Float -> Projectile -> World -> World -reduceSpinBy x pj = cWorld . lWorld . projectiles . ix (_prjID pj) . prjSpin *~ x - +reduceSpinBy :: Float -> Int -> World -> World +reduceSpinBy x pjid = cWorld . lWorld . projectiles . ix pjid . prjSpin *~ x decTimMvVel :: Projectile -> World -> World decTimMvVel pj = @@ -179,3 +132,16 @@ decTimMvVel pj = rot = _prjSpin pj vel = _prjVel pj pjid = _prjID pj + +explodeShell :: Maybe Int -> Int -> World -> World +explodeShell mitid pjid w = + w + & cWorld . lWorld . projectiles . ix pjid . prjUpdates .~ [DestroyPU mitid 30] + & cWorld . lWorld . projectiles . ix pjid . prjDraw .~ DrawBlankProjectile +-- & itPoint . itUse . heldUse .~ HeldDoNothing +-- & itPoint . itUse . heldMods .~ DoNothingMod + & usePayload (_prjPayload thepj) (_prjPos thepj) + & stopSoundFrom (ShellSound pjid) + where +-- itPoint = pointerToItemLocation $ w ^?! cWorld . lWorld . itemLocations . ix itid-- _itemLocations (_cWorld w) IM.! itid + thepj = w ^?! cWorld . lWorld . projectiles . ix pjid diff --git a/src/Dodge/SelectUse.hs b/src/Dodge/SelectUse.hs index cb23a6c5b..07165d80e 100644 --- a/src/Dodge/SelectUse.hs +++ b/src/Dodge/SelectUse.hs @@ -14,7 +14,7 @@ selectUse ittree _ w = fromMaybe w $ do pjid <- ittree ^? ldtValue . itUse . atLinkedProjectile . _Just thepj <- w ^? cWorld . lWorld . projectiles . ix pjid return $ w - & cWorld . lWorld . projectiles . ix pjid . prjUpdates .~ [PJRetireRemote (Just itid) 30 pjid] -- 69 is placeholder, should be removed + & cWorld . lWorld . projectiles . ix pjid . prjUpdates .~ [DestroyPU (Just itid) 30] -- 69 is placeholder, should be removed & cWorld . lWorld . projectiles . ix pjid . prjDraw .~ DrawBlankProjectile -- & itPoint . itUse . heldUse .~ HeldDoNothing -- & itPoint . itUse . heldMods .~ DoNothingMod diff --git a/tags b/tags index 9bc2e7f7d..a7b75a467 100644 --- a/tags +++ b/tags @@ -85,7 +85,7 @@ AmmoParams src/Dodge/Item/Weapon/AmmoParams.hs 1;" m AmmoPosition src/Dodge/Item/AmmoPosition.hs 8;" t AmmoPosition src/Dodge/Item/AmmoPosition.hs 2;" m AmmoType src/Dodge/Data/Ammo.hs 30;" t -AmmoType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 39;" t +AmmoType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 34;" t Amount src/Dodge/Item/Amount.hs 1;" m AnRoom src/Dodge/Annotation/Data.hs 17;" C AnTree src/Dodge/Annotation/Data.hs 18;" C @@ -226,7 +226,7 @@ BeamShooterParams src/Dodge/Data/Item/Use.hs 97;" C BeamSimple src/Dodge/Data/Beam.hs 50;" C BeamType src/Dodge/Data/Beam.hs 46;" t BecomePowerful src/Dodge/Data/Scenario.hs 9;" C -BeltBulletAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 42;" C +BeltBulletAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 37;" C Bezier src/Dodge/Item/Weapon/Bezier.hs 1;" m Bezier src/Geometry/Bezier.hs 1;" m BezierTrajectory src/Dodge/Data/Bullet.hs 52;" C @@ -298,7 +298,7 @@ Bullet src/Dodge/Bullet.hs 1;" m Bullet src/Dodge/Data/Bullet.hs 6;" m Bullet src/Dodge/Item/Weapon/Bullet.hs 1;" m BulletAmmo src/Dodge/Data/Ammo.hs 37;" C -BulletAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 41;" C +BulletAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 36;" C BulletBeltAttachment src/Dodge/Data/Item.hs 54;" C BulletClipAttachment src/Dodge/Data/Item.hs 53;" C BulletEffect src/Dodge/Data/Bullet.hs 36;" t @@ -394,7 +394,7 @@ ChaseCritters src/Dodge/Data/Creature/State.hs 38;" C Check src/Framebuffer/Check.hs 1;" m CheckConsistency src/Dodge/Room/CheckConsistency.hs 1;" m CheckSlots src/Dodge/Inventory/CheckSlots.hs 1;" m -ChemFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 51;" C +ChemFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 46;" C ChooseMovementLtAuto src/Dodge/Data/CreatureEffect.hs 62;" C ChooseMovementSpreadGun src/Dodge/Data/CreatureEffect.hs 61;" C ChooseTarget src/Dodge/Creature/ChooseTarget.hs 1;" m @@ -426,6 +426,7 @@ Cognizant src/Dodge/Creature/AlertLevel/Data.hs 27;" C Cognizant src/Dodge/Creature/Perception/Data.hs 74;" C Cognizant src/Dodge/Data/Creature/Perception.hs 67;" C Collide src/Dodge/Base/Collide.hs 14;" m +CollisionEffectPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 31;" C Collision_test src/Dodge/Data/Config.hs 84;" C Color src/Color/Data.hs 33;" t Color src/Color.hs 1;" m @@ -540,11 +541,11 @@ Create src/Dodge/Projectile/Create.hs 1;" m Create src/Dodge/Prop/Create.hs 1;" m Create src/Dodge/Wall/Create.hs 1;" m CreateFlame src/Dodge/Data/Gas.hs 6;" C -CreateFlame src/Dodge/Data/Item/Use/Consumption/Ammo.hs 54;" C +CreateFlame src/Dodge/Data/Item/Use/Consumption/Ammo.hs 49;" C CreateHeldLight src/Dodge/Data/ItEffect.hs 41;" C CreateHeldLight src/Dodge/Data/Item/Effect.hs 25;" C CreatePoisonGas src/Dodge/Data/Gas.hs 6;" C -CreatePoisonGas src/Dodge/Data/Item/Use/Consumption/Ammo.hs 54;" C +CreatePoisonGas src/Dodge/Data/Item/Use/Consumption/Ammo.hs 49;" C CreateShell src/Dodge/Data/Ammo.hs 17;" C CreateShell src/Dodge/Data/Item/Use/Consumption/Ammo.hs 21;" C CreateShieldWall src/Dodge/Data/ItEffect.hs 42;" C @@ -673,7 +674,7 @@ DefaultCrGroupUpdate src/Dodge/Data/CrGroupParams.hs 22;" C DefaultDrawButton src/Dodge/Data/Button.hs 17;" C DefaultDrawSwitch src/Dodge/Data/Button.hs 18;" C DefaultFlareType src/Dodge/Data/Item/Use.hs 142;" C -DefaultForceField src/Dodge/Data/Item/Use/Consumption/Ammo.hs 48;" C +DefaultForceField src/Dodge/Data/Item/Use/Consumption/Ammo.hs 43;" C DefaultHeldParams src/Dodge/Data/Item/Use.hs 84;" C DefaultLightSourceDraw src/Dodge/Data/LightSource.hs 13;" C DefaultRoomType src/Dodge/Data/Room.hs 31;" C @@ -685,6 +686,7 @@ DestroyBeing src/Dodge/Data/Scenario.hs 8;" C DestroyBullet src/Dodge/Data/Bullet.hs 37;" C DestroyDamage src/Dodge/Particle/Bullet/DestroyDamage.hs 1;" m DestroyItem src/Dodge/Data/Scenario.hs 7;" C +DestroyPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 29;" C DestroyTLS src/Dodge/Data/LightSource.hs 22;" C Detector src/Dodge/Combine/Data.hs 224;" t Detector src/Dodge/Data/Item/Combine.hs 220;" t @@ -782,7 +784,7 @@ DrawShell src/Dodge/Data/Item/Use/Consumption/Ammo.hs 18;" C DrawnWall src/Dodge/Data/Wall.hs 41;" C Drone src/Dodge/Item/Weapon/Drone.hs 1;" m DroneAmmo src/Dodge/Data/Ammo.hs 41;" C -DroneAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 44;" C +DroneAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 39;" C DropAll src/Dodge/Creature/State/Data.hs 15;" C DropAll src/Dodge/Data/Creature/State.hs 24;" C DropAmount src/Dodge/Creature/State/Data.hs 16;" C @@ -832,7 +834,7 @@ EffectWhileRoot src/Dodge/Data/Item/Effect.hs 28;" C EighthRes src/Dodge/Data/Config.hs 95;" C Either src/Dodge/Layout/Tree/Either.hs 4;" m Eldritch src/Dodge/Data/Scenario.hs 34;" C -ElectricalAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 43;" C +ElectricalAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 38;" C Electronics src/Dodge/Data/Material.hs 11;" C EllShad src/Picture/Data.hs 41;" C Enable_debug src/Dodge/Data/Config.hs 68;" C @@ -995,7 +997,7 @@ FootstepSound src/Dodge/Data/SoundOrigin.hs 27;" C ForceField src/Dodge/ForceField.hs 1;" m ForceField src/Dodge/Wall/ForceField.hs 1;" m ForceFieldAmmo src/Dodge/Data/Ammo.hs 47;" C -ForceFieldType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 48;" t +ForceFieldType src/Dodge/Data/Item/Use/Consumption/Ammo.hs 43;" t Foreground src/Dodge/Default/Foreground.hs 1;" m Foreground src/Dodge/Room/Foreground.hs 1;" m ForegroundShape src/Dodge/Data/ForegroundShape.hs 14;" t @@ -1025,11 +1027,11 @@ GameRoom src/Dodge/GameRoom.hs 8;" m Gas src/Dodge/Data/Gas.hs 3;" m Gas src/Dodge/Gas.hs 1;" m GasAmmo src/Dodge/Data/Ammo.hs 43;" C -GasAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 45;" C +GasAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 40;" C GasCloud src/Dodge/Data/Cloud.hs 31;" C GasCreate src/Dodge/Data/Gas.hs 6;" t -GasCreate src/Dodge/Data/Item/Use/Consumption/Ammo.hs 54;" t -GasFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 51;" t +GasCreate src/Dodge/Data/Item/Use/Consumption/Ammo.hs 49;" t +GasFuel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 46;" t GasParams src/Dodge/Data/Item/Use.hs 122;" C GasSprayParams src/Dodge/Data/Item/Use.hs 85;" C GenCr src/Dodge/Creature/State/Data.hs 24;" C @@ -1862,19 +1864,12 @@ PIPE src/Dodge/Combine/Data.hs 27;" C PIPE src/Dodge/Data/Item/Combine.hs 30;" C PISTOL src/Dodge/Combine/Data.hs 135;" C PISTOL src/Dodge/Data/Item/Combine.hs 161;" C -PJDecTimMvVel src/Dodge/Data/Item/Use/Consumption/Ammo.hs 33;" C PJReduceSpin src/Dodge/Data/Ammo.hs 24;" C -PJReduceSpin src/Dodge/Data/Item/Use/Consumption/Ammo.hs 29;" C PJRemoteDirection src/Dodge/Data/Ammo.hs 25;" C -PJRemoteSetDirection src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" C -PJRemoteShellCollisionCheck src/Dodge/Data/Item/Use/Consumption/Ammo.hs 35;" C PJRetireRemote src/Dodge/Data/Ammo.hs 27;" C -PJRetireRemote src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" C PJSetScope src/Dodge/Data/Ammo.hs 26;" C PJSpin src/Dodge/Data/Ammo.hs 22;" C -PJSpin src/Dodge/Data/Item/Use/Consumption/Ammo.hs 26;" C PJThrust src/Dodge/Data/Ammo.hs 21;" C -PJThrust src/Dodge/Data/Item/Use/Consumption/Ammo.hs 25;" C PJTrack src/Dodge/Data/Ammo.hs 23;" C PLANK src/Dodge/Combine/Data.hs 35;" C PLANK src/Dodge/Data/Item/Combine.hs 39;" C @@ -2007,11 +2002,11 @@ PreviousArcEffect src/Dodge/Data/Item/Params.hs 61;" t PrimitiveMode src/Shader/Data.hs 99;" t Prison src/Dodge/Data/Scenario.hs 65;" C Procedural src/Dodge/Room/Procedural.hs 2;" m -Proj src/Dodge/Data/Projectile.hs 14;" t +Projectile src/Dodge/Data/Projectile.hs 14;" t Projectile src/Dodge/Data/Projectile.hs 6;" m Projectile src/Dodge/Projectile.hs 1;" m ProjectileAmmo src/Dodge/Data/Ammo.hs 31;" C -ProjectileAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 40;" C +ProjectileAmmo src/Dodge/Data/Item/Use/Consumption/Ammo.hs 35;" C ProjectileCreate src/Dodge/Data/Ammo.hs 17;" t ProjectileCreate src/Dodge/Data/Item/Use/Consumption/Ammo.hs 21;" t ProjectileDraw src/Dodge/Data/Ammo.hs 14;" t @@ -2136,6 +2131,7 @@ ReactorSS src/Dodge/Data/Scenario.hs 111;" C ReaderUpdate src/Dodge/Creature/ReaderUpdate.hs 1;" m RecRoomSS src/Dodge/Data/Scenario.hs 103;" C RectRoomType src/Dodge/Data/Room.hs 32;" C +ReduceSpinPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" C Reflect src/Dodge/Wall/Reflect.hs 1;" m Refracting src/Dodge/Data/Item/Params.hs 29;" C Regex src/Regex.hs 1;" m @@ -2146,6 +2142,7 @@ ReloadAction src/Dodge/Data/LoadAction.hs 26;" C ReloadStatus src/Dodge/Data/Item/Use/Consumption.hs 20;" t Reloading src/Dodge/Reloading.hs 1;" m Remote src/Dodge/Item/Weapon/Remote.hs 1;" m +RemoteDirectionPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 27;" C RemoteScope src/Dodge/Data/Item/Attachment.hs 23;" C RemoteScope src/Dodge/Item/Attachment/Data.hs 26;" C RemoteScreenLink src/Dodge/Data/ComposedItem.hs 20;" C @@ -2459,6 +2456,7 @@ Start src/Dodge/Room/Start.hs 3;" m StartNewGame src/Dodge/StartNewGame.hs 1;" m StartRoom src/Dodge/Layout/Tree/Annotate.hs 20;" C StartSentinelPost src/Dodge/Data/ActionPlan.hs 153;" C +StartSpinPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 26;" C State src/Dodge/Creature/State.hs 1;" m State src/Dodge/Data/Creature/State.hs 6;" m StaticWalls src/Dodge/LevelGen/StaticWalls.hs 5;" m @@ -2632,12 +2630,14 @@ Text src/Picture/Text.hs 1;" m TextShad src/Picture/Data.hs 39;" C ThingsHit src/Dodge/WorldEvent/ThingsHit.hs 6;" m ThirdPartyLens src/ThirdPartyLens.hs 2;" m +ThrustPU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 25;" C Tile src/Data/Tile.hs 14;" t Tile src/Data/Tile.hs 3;" m Tile src/Dodge/Tile.hs 1;" m Tile src/Tile.hs 1;" m Tiled src/Data/Tile.hs 13;" C TimeFlowStatus src/Dodge/Data/World.hs 57;" t +TimePU src/Dodge/Data/Item/Use/Consumption/Ammo.hs 30;" C TimerTLS src/Dodge/Data/LightSource.hs 23;" C Tiny src/Shape/Data.hs 32;" C TmId src/Dodge/Data/Terminal.hs 58;" C @@ -2745,7 +2745,7 @@ Update src/Dodge/Machine/Update.hs 1;" m Update src/Dodge/Magnet/Update.hs 1;" m Update src/Dodge/Particle/Bullet/Update.hs 3;" m Update src/Dodge/Particle/Update.hs 1;" m -Update src/Dodge/Projectile/Update.hs 3;" m +Update src/Dodge/Projectile/Update.hs 2;" m Update src/Dodge/Prop/Update.hs 1;" m Update src/Dodge/Shockwave/Update.hs 1;" m Update src/Dodge/TractorBeam/Update.hs 1;" m @@ -3731,29 +3731,25 @@ _piercedPoints src/Dodge/Data/Creature/State.hs 30;" f _pjuCID src/Dodge/Data/Ammo.hs 22;" f _pjuCID src/Dodge/Data/Ammo.hs 25;" f _pjuCID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 26;" f -_pjuControllerID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" f +_pjuControllerID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 27;" f _pjuEnd src/Dodge/Data/Ammo.hs 21;" f _pjuEnd src/Dodge/Data/Ammo.hs 25;" f _pjuEnd src/Dodge/Data/Item/Use/Consumption/Ammo.hs 25;" f -_pjuEnd src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" f _pjuITID src/Dodge/Data/Ammo.hs 23;" f _pjuITID src/Dodge/Data/Ammo.hs 26;" f _pjuPJID src/Dodge/Data/Ammo.hs 27;" f -_pjuPJID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" f _pjuReduceSpin src/Dodge/Data/Ammo.hs 24;" f -_pjuReduceSpin src/Dodge/Data/Item/Use/Consumption/Ammo.hs 29;" f -_pjuScreenID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" f -_pjuScreenID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 35;" f +_pjuReduceSpin src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" f +_pjuScreenID src/Dodge/Data/Item/Use/Consumption/Ammo.hs 29;" f _pjuSpinAmound src/Dodge/Data/Ammo.hs 22;" f _pjuSpinAmound src/Dodge/Data/Item/Use/Consumption/Ammo.hs 26;" f _pjuStart src/Dodge/Data/Ammo.hs 21;" f _pjuStart src/Dodge/Data/Ammo.hs 25;" f _pjuStart src/Dodge/Data/Item/Use/Consumption/Ammo.hs 25;" f -_pjuStart src/Dodge/Data/Item/Use/Consumption/Ammo.hs 28;" f _pjuTime src/Dodge/Data/Ammo.hs 22;" f _pjuTime src/Dodge/Data/Item/Use/Consumption/Ammo.hs 26;" f _pjuTimer src/Dodge/Data/Ammo.hs 27;" f -_pjuTimer src/Dodge/Data/Item/Use/Consumption/Ammo.hs 32;" f +_pjuTimer src/Dodge/Data/Item/Use/Consumption/Ammo.hs 29;" f _plIDCont src/Dodge/Data/GenWorld.hs 83;" f _plMID src/Dodge/Data/GenWorld.hs 82;" f _plOrder src/Dodge/Data/GenWorld.hs 79;" f @@ -5002,6 +4998,7 @@ debugOn src/Dodge/Data/Config.hs 149;" f debugSelectCreatureList src/Dodge/Debug.hs 61;" f debugSelectCreatureMessage src/Dodge/Debug.hs 52;" f decTimMvVel src/Dodge/Item/Weapon/Shell.hs 9;" f +decTimMvVel src/Dodge/Projectile/Update.hs 125;" f decodedtmap src/Dodge/Terminal.hs 203;" f decomposeSelfTree src/Dodge/Tree/Compose.hs 60;" f decomposeTree src/Dodge/Tree/Compose.hs 57;" f @@ -5137,6 +5134,7 @@ destroyMatS src/Dodge/Material/Sound.hs 7;" f destroyMcType src/Dodge/Machine/Destroy.hs 21;" f destroyMount src/Dodge/Block.hs 98;" f destroyMounts src/Dodge/Block.hs 95;" f +destroyProjectile src/Dodge/Projectile/Update.hs 61;" f detV src/Geometry/Vector.hs 93;" f detectorColor src/Dodge/Item/Draw/SPic.hs 504;" f detectorEffect src/Dodge/Item/Weapon/Radar.hs 19;" f @@ -5239,7 +5237,7 @@ doTerminalEffectLB src/Dodge/Terminal/LeftButton.hs 12;" f doTestDrawing src/Dodge/Render.hs 42;" f doTextInputOver src/Dodge/Update/Input/Text.hs 15;" f doTextInputOverUniverse src/Dodge/Update/Input/Text.hs 12;" f -doThrust src/Dodge/Projectile/Update.hs 94;" f +doThrust src/Dodge/Projectile/Update.hs 72;" f doTimeScroll src/Dodge/Update.hs 185;" f doTmTm src/Dodge/TmTm.hs 6;" f doTmWdWd src/Dodge/WorldEffect.hs 109;" f @@ -5341,12 +5339,12 @@ drawPathEdge src/Dodge/Debug/Picture.hs 220;" f drawPathing src/Dodge/Debug/Picture.hs 383;" f drawPlus src/Dodge/Render/Picture.hs 89;" f drawPointLabel src/Dodge/Render/Label.hs 13;" f -drawProjectile src/Dodge/Projectile/Draw.hs 10;" f +drawProjectile src/Dodge/Projectile/Draw.hs 12;" f drawProp src/Dodge/Prop/Draw.hs 15;" f drawProp' src/Dodge/Prop/Draw.hs 12;" f drawRBOptions src/Dodge/Render/HUD.hs 132;" f drawRadarSweep src/Dodge/RadarSweep/Draw.hs 7;" f -drawRemoteShell src/Dodge/Projectile/Draw.hs 27;" f +drawRemoteShell src/Dodge/Projectile/Draw.hs 29;" f drawSelectionCursor src/Dodge/Render/List.hs 40;" f drawSelectionList src/Dodge/Render/List.hs 28;" f drawSelectionSections src/Dodge/SelectionSections/Draw.hs 10;" f @@ -5354,7 +5352,7 @@ drawSensor src/Dodge/Machine/Draw.hs 19;" f drawShader src/Shader.hs 27;" f drawShaderLay src/Shader.hs 16;" f drawShadowsByImportance src/Dodge/Shadows.hs 8;" f -drawShell src/Dodge/Projectile/Draw.hs 17;" f +drawShell src/Dodge/Projectile/Draw.hs 19;" f drawShockwave src/Dodge/Shockwave/Draw.hs 7;" f drawSpark src/Dodge/Spark/Draw.hs 6;" f drawStaticBall src/Dodge/EnergyBall/Draw.hs 14;" f @@ -5450,6 +5448,7 @@ expireAndDamage src/Dodge/Bullet.hs 183;" f expireAndDamage src/Dodge/Particle/HitEffect/ExpireAndDamage.hs 11;" f expireAndDamageFL src/Dodge/Flame.hs 48;" f explodeRemoteRocket src/Dodge/Item/Weapon/Launcher.hs 11;" f +explodeShell src/Dodge/Projectile/Update.hs 137;" f explosionFlashAt src/Dodge/WorldEvent/Flash.hs 56;" f explosionS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 396;" f explosiveBarrel src/Dodge/Creature/Inanimate.hs 29;" f @@ -6492,7 +6491,7 @@ pistol src/Dodge/Item/Held/Stick.hs 35;" f pistol src/Dodge/Item/Weapon/BulletGun/Stick.hs 59;" f pistolCrit src/Dodge/Creature/PistolCrit.hs 13;" f pistolerRoom src/Dodge/Room/Room.hs 323;" f -pjRemoteSetDirection src/Dodge/Projectile/Update.hs 147;" f +pjRemoteSetDirection src/Dodge/Projectile/Update.hs 111;" f plBlock src/Dodge/Placement/PlaceSpot/Block.hs 18;" f plDoor src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 22;" f plLineBlock src/Dodge/Placement/PlaceSpot/Block.hs 50;" f @@ -6792,7 +6791,7 @@ rectXH src/Geometry/Polygon.hs 36;" f rectXY src/Geometry/Polygon.hs 39;" f rectanglePairs src/Dodge/LevelGen/DoorPane.hs 7;" f red src/Color.hs 14;" f -reduceSpinBy src/Dodge/Projectile/Update.hs 172;" f +reduceSpinBy src/Dodge/Projectile/Update.hs 122;" f reflDirWall src/Dodge/Base/Wall.hs 16;" f reflDirWall src/Dodge/Wall/Reflect.hs 6;" f reflVelWall src/Dodge/Base/Wall.hs 24;" f @@ -6817,8 +6816,7 @@ reloadSound src/Dodge/SoundLogic/Synonyms.hs 4;" f rememberSounds src/Dodge/Creature/Perception.hs 177;" f remoteBombUnarmedPic src/Dodge/Item/Weapon/Grenade.hs 268;" f remoteScreen src/Dodge/Item/Scope.hs 24;" f -remoteShellCollisionCheck src/Dodge/Projectile/Update.hs 42;" f -remoteShellShape src/Dodge/Projectile/Draw.hs 39;" f +remoteShellShape src/Dodge/Projectile/Draw.hs 41;" f removeAmmoFromMag src/Dodge/HeldUse.hs 262;" f removeEither src/Dodge/Layout/Tree/Either.hs 41;" f removeHotkey src/Dodge/Hotkey.hs 41;" f @@ -6852,7 +6850,6 @@ restrictLinkType src/Dodge/RoomLink.hs 32;" f restrictOutLinks src/Dodge/RoomLink.hs 45;" f restrictRMInLinksPD src/Dodge/Room/Link.hs 25;" f resumeSound src/Dodge/SoundLogic.hs 45;" f -retireRemoteProj src/Dodge/Projectile/Update.hs 83;" f retreatActionsPistol src/Dodge/Humanoid.hs 248;" f retreatFireLauncher src/Dodge/Humanoid.hs 269;" f retreatPointForFrom src/Dodge/Creature/Action/Flee.hs 7;" f @@ -7101,9 +7098,10 @@ shardShape src/Dodge/Block/Debris.hs 181;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f shatterGunSPic src/Dodge/Item/Draw/SPic.hs 239;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 26;" f -shellCollisionCheck src/Dodge/Projectile/Update.hs 30;" f +shellCollisionCheck src/Dodge/Projectile/Update.hs 50;" f +shellCollisionEffect src/Dodge/Projectile/Update.hs 46;" f shellMag src/Dodge/Item/Ammo.hs 54;" f -shellShape src/Dodge/Projectile/Draw.hs 24;" f +shellShape src/Dodge/Projectile/Draw.hs 26;" f shellTrailCloud src/Dodge/WorldEvent/Cloud.hs 65;" f shieldWall src/Dodge/Euse.hs 114;" f shiftByV2 src/Dodge/PlacementSpot.hs 239;" f @@ -7601,7 +7599,7 @@ tryPutFloorItemIDInInv src/Dodge/Inventory/Add.hs 23;" f tryPutItemInInv src/Dodge/Inventory/Add.hs 29;" f trySeedFromClipboard src/Dodge/Menu.hs 88;" f trySiphonFuel src/Dodge/Euse.hs 46;" f -trySpinByCID src/Dodge/Projectile/Update.hs 115;" f +trySpinByCID src/Dodge/Projectile/Update.hs 93;" f tryStartLoadMagazine src/Dodge/Reloading.hs 57;" f tryStartLoading src/Dodge/Reloading.hs 50;" f tryUseItem src/Dodge/Creature/Action/UseItem.hs 20;" f @@ -7644,7 +7642,7 @@ unusedSpotAwayFromLink src/Dodge/PlacementSpot.hs 122;" f unusedSpotNearInLink src/Dodge/PlacementSpot.hs 191;" f upCT src/Dodge/Targeting.hs 34;" f upHammer src/Dodge/Default.hs 77;" f -upProjectile src/Dodge/Projectile/Update.hs 55;" f +upProjectile src/Dodge/Projectile/Update.hs 24;" f updateAllNodes src/TreeHelp.hs 85;" f updateArc src/Dodge/Tesla/Arc.hs 86;" f updateAutoRecharge src/Dodge/Creature/State.hs 271;" f @@ -7715,7 +7713,7 @@ updatePreload src/Dodge/PreloadData.hs 12;" f updatePreload src/Preload/Update.hs 20;" f updatePressedButtonsCarte src/Dodge/Update/Input/InGame.hs 66;" f updatePressedButtonsCarte' src/Dodge/Update/Input/InGame.hs 69;" f -updateProjectile src/Dodge/Projectile/Update.hs 26;" f +updateProjectile src/Dodge/Projectile/Update.hs 21;" f updateProp src/Dodge/Prop/Update.hs 11;" f updateRBList src/Dodge/Inventory/RBList.hs 16;" f updateRadarBlip src/Dodge/RadarBlip.hs 8;" f @@ -7781,7 +7779,6 @@ upperPrismPolyST src/Shape.hs 106;" f upperPrismPolySU src/Shape.hs 112;" f upperPrismPolyTS src/Shape.hs 118;" f upperRounded src/Shape.hs 181;" f -upsProjectile src/Dodge/Projectile/Update.hs 52;" f useAmmoParams src/Dodge/Item/Weapon/AmmoParams.hs 17;" f useBreakListsLinkTest src/Dodge/Item/Grammar.hs 20;" f useC src/Dodge/Cuse.hs 8;" f