diff --git a/src/Dodge/Creature/Impulse/UseItem.hs b/src/Dodge/Creature/Impulse/UseItem.hs index 8cac0cf0b..d14a26fb4 100644 --- a/src/Dodge/Creature/Impulse/UseItem.hs +++ b/src/Dodge/Creature/Impulse/UseItem.hs @@ -32,23 +32,23 @@ itemEffect -> World itemEffect cr Consumable{_cnEffect=eff } w = maybe w (rmSelectedInvItem (_crID cr)) (eff (_crID cr) w) itemEffect cr it w = case it ^? itUse of - Just (Right eff) -> foldr ($) eff (_itUseModifiers it) it cr w - Just (Left _ ) -> w & creatures . ix (_crID cr) . crLeftInvSel ?~ _crInvSel cr - Nothing -> w + Just (RightUse eff) -> foldr ($) eff (_itUseModifiers it) it cr w + Just (LeftUse _ ) -> w & creatures . ix (_crID cr) . crLeftInvSel ?~ _crInvSel cr + _ -> w --this is ugly useLeftItem :: Int -> World -> World -useLeftItem cid w = case _crInv cr IM.! crinvsel ^? itUse . _Left of +useLeftItem cid w = case _crInv cr IM.! crinvsel ^? itUse . lUse of Just f -> f cr crinvsel w & creatures . ix cid . crLeftInvSel ?~ crinvsel Nothing -> case _crLeftInvSel cr of Just invid -> case _itUse $ _crInv cr IM.! invid of - Left f -> f cr invid w - Right _ -> w & creatures . ix cid . crLeftInvSel .~ Nothing + LeftUse f -> f cr invid w + _ -> w & creatures . ix cid . crLeftInvSel .~ Nothing Nothing -> case luse of Nothing -> w Just (invid, f) -> f cr invid w & creatures . ix cid . crLeftInvSel ?~ invid where crinvsel = _crInvSel cr cr = _creatures w IM.! cid - luses = IM.mapMaybe (^? itUse . _Left) (_crInv cr) + luses = IM.mapMaybe (^? itUse . lUse) (_crInv cr) luse = listToMaybe $ IM.toList luses diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index ff7fbe48f..d61629b6f 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -289,19 +289,20 @@ data FloorItem = FlIt { _flIt :: Item , _flItPos :: Point2 , _flItRot :: Float, data ItemPos = InInv { _itCrId :: Int , _itInvId :: Int } | OnFloor { _itFlID :: Int } -data Item' = Item' - { _iName :: String - , _iIdentity :: ItemIdentity - , _iType :: Item - , _iID :: Int - , _itPos :: ItemPos - } +data ItemUse + = RightUse { _rUse :: Item -> Creature -> World -> World } + | LeftUse { _lUse :: Creature -> Int -> World -> World } + | NoUse +data ItemAmmo + = LoadbleAmmo + { _aoType :: AmmoType + } data Item = Weapon { _itName :: String , _wpMaxAmmo :: Int , _wpLoadedAmmo :: Int - , _wpAmmo :: Ammo + , _wpAmmo :: AmmoType , _wpReloadTime :: Int , _wpReloadState :: Int , _wpReloadType :: ReloadType @@ -311,8 +312,7 @@ data Item , _wpCurCoolDown :: Int , _itUseRate :: Int , _itUseTime :: Int - , _itUse :: Either (Creature -> Int -> World -> World) - (Item -> Creature -> World -> World) + , _itUse :: ItemUse , _itUseModifiers :: [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World] --, _itLeftClickUse :: Maybe (Creature -> Int -> World -> World) , _wpSpread :: Float @@ -394,8 +394,7 @@ data Item , _itFloorPict :: Item -> SPic , _twMaxRange :: Float , _twAccuracy :: Float - , _itUse :: Either (Creature -> Int -> World -> World) - (Item -> Creature -> World -> World) + , _itUse :: ItemUse , _itUseRate :: Int , _itUseTime :: Int , _itUseModifiers :: [(Item -> Creature -> World -> World) -> Item -> Creature -> World -> World] @@ -509,7 +508,7 @@ type HitEffect = Particle -> World -> (World,Maybe Particle) -data Ammo +data AmmoType = ShellAmmo { _amPayload :: Point2 -> World -> World , _amString :: String @@ -858,11 +857,13 @@ makeLenses ''Creature makeLenses ''LightSource makeLenses ''TempLightSource makeLenses ''Item +makeLenses ''ItemUse makeLenses ''ItemPos makeLenses ''ItEffect makeLenses ''ItZoom makeLenses ''FloorItem -makeLenses ''Ammo +makeLenses ''ItemAmmo +makeLenses ''AmmoType makeLenses ''PjParam makeLenses ''Prop makeLenses ''Modification diff --git a/src/Dodge/Default/Weapon.hs b/src/Dodge/Default/Weapon.hs index 34c1cb658..f641f386b 100644 --- a/src/Dodge/Default/Weapon.hs +++ b/src/Dodge/Default/Weapon.hs @@ -27,7 +27,7 @@ defaultGun = Weapon , _wpCurCoolDown = 0 , _itUseRate = 8 , _itUseTime = 0 - , _itUse = Right $ \_ _ -> id + , _itUse = RightUse $ \_ _ -> id , _itUseModifiers = [] , _wpSpread = 0.02 , _wpRange = 20 @@ -67,7 +67,7 @@ defaultAutoGun = defaultGun { _itInvDisplay = basicWeaponDisplay , _itAimStance = TwoHandTwist } -defaultShellAmmo :: Ammo +defaultShellAmmo :: AmmoType defaultShellAmmo = ShellAmmo { _amPayload = const id , _amString = "Shell" diff --git a/src/Dodge/Item/Weapon/AmmoParams.hs b/src/Dodge/Item/Weapon/AmmoParams.hs index b0a3ac3b5..27bfc0b6d 100644 --- a/src/Dodge/Item/Weapon/AmmoParams.hs +++ b/src/Dodge/Item/Weapon/AmmoParams.hs @@ -11,8 +11,8 @@ import Geometry import Control.Lens -useAmmoParams :: Either a (Item -> Creature -> World -> World) -useAmmoParams = Right $ \it -> let b = _wpAmmo it +useAmmoParams :: ItemUse +useAmmoParams = RightUse $ \it -> let b = _wpAmmo it in withVelWthHiteff (_amBulVel b) (_amBulWth b) (_amBulEff b) useAmmoParamsVelMod :: Float -> Item -> Creature -> World -> World diff --git a/src/Dodge/Item/Weapon/BatteryGuns.hs b/src/Dodge/Item/Weapon/BatteryGuns.hs index 8df4c4499..83786f428 100644 --- a/src/Dodge/Item/Weapon/BatteryGuns.hs +++ b/src/Dodge/Item/Weapon/BatteryGuns.hs @@ -44,7 +44,7 @@ teslaGun = defaultGun , _itUseRate = 0 , _itAimStance = TwoHandFlat , _itUseTime = 0 - , _itUse = Right $ const aTeslaArc + , _itUse = RightUse $ const aTeslaArc , _itUseModifiers = [ ammoCheckI , useTimeCheckI @@ -77,7 +77,7 @@ lasGun = defaultAutoGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Right $ const aLaser + , _itUse = RightUse $ const aLaser , _itUseModifiers = [ ammoCheckI , useTimeCheckI @@ -117,7 +117,7 @@ tractorGun = defaultAutoGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Right aTractorBeam + , _itUse = RightUse aTractorBeam , _itUseModifiers = [ ammoUseCheckI ] diff --git a/src/Dodge/Item/Weapon/Bezier.hs b/src/Dodge/Item/Weapon/Bezier.hs index 3e8da95bf..f69e5221c 100644 --- a/src/Dodge/Item/Weapon/Bezier.hs +++ b/src/Dodge/Item/Weapon/Bezier.hs @@ -23,7 +23,7 @@ import Control.Monad.State bezierGun :: Item bezierGun = defaultGun { _itName = "B-GUN" - , _itUse = Right $ \_ -> useTargetPos $ \p -> shootBezier $ fromJust p -- <- the start point + , _itUse = RightUse $ \_ -> useTargetPos $ \p -> shootBezier $ fromJust p -- <- the start point , _itUseModifiers = [ ammoCheckI , useTimeCheckI diff --git a/src/Dodge/Item/Weapon/Booster.hs b/src/Dodge/Item/Weapon/Booster.hs index b274bcd0c..3a94869c0 100644 --- a/src/Dodge/Item/Weapon/Booster.hs +++ b/src/Dodge/Item/Weapon/Booster.hs @@ -119,7 +119,7 @@ boosterGun = defaultGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Left $ boostSelfL 10 + , _itUse = LeftUse $ boostSelfL 10 , _wpSpread = 0.05 , _wpRange = 20 , _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2 [(-2,-2),(-2,2),(2,2),(2,0),(0,0),(0,-2)] diff --git a/src/Dodge/Item/Weapon/Bullet.hs b/src/Dodge/Item/Weapon/Bullet.hs index f154d6459..e7d30862b 100644 --- a/src/Dodge/Item/Weapon/Bullet.hs +++ b/src/Dodge/Item/Weapon/Bullet.hs @@ -8,21 +8,21 @@ import Dodge.WorldEvent.HitEffect import Dodge.Particle.Bullet.HitEffect import Geometry.Data -basicBullet :: Ammo +basicBullet :: AmmoType basicBullet = BulletAmmo { _amString = "BULLET" , _amBulEff = destroyOnImpact bulHitCr bulHitWall , _amBulWth = 2 , _amBulVel = V2 50 0 } -ltBullet :: Ammo +ltBullet :: AmmoType ltBullet = BulletAmmo { _amString = "LTBULLET" , _amBulEff = destroyOnImpact bulHitCr bulHitWall , _amBulWth = 2 , _amBulVel = V2 40 0 } -hvBullet :: Ammo +hvBullet :: AmmoType hvBullet = BulletAmmo { _amString = "HVBULLET" , _amBulEff = penWalls hvBulHitCr hvBulHitWall diff --git a/src/Dodge/Item/Weapon/BulletGuns.hs b/src/Dodge/Item/Weapon/BulletGuns.hs index 3ac95628b..7f1c7d0b9 100644 --- a/src/Dodge/Item/Weapon/BulletGuns.hs +++ b/src/Dodge/Item/Weapon/BulletGuns.hs @@ -217,7 +217,7 @@ miniGun = defaultAutoGun , _wpMaxWarmUp = 100 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Right $ useAmmoParamsVelMod vm4 + , _itUse = RightUse $ useAmmoParamsVelMod vm4 , _itUseModifiers = [ ammoCheckI , withWarmUpI crankSlowS diff --git a/src/Dodge/Item/Weapon/Drone.hs b/src/Dodge/Item/Weapon/Drone.hs index 597cf55a3..7fbaa6e4a 100644 --- a/src/Dodge/Item/Weapon/Drone.hs +++ b/src/Dodge/Item/Weapon/Drone.hs @@ -28,7 +28,7 @@ lasDrones = defaultGun , _wpReloadState = 0 , _itUseRate = 20 , _itUseTime = 0 - , _itUse = Right aDroneWithItemParams + , _itUse = RightUse aDroneWithItemParams , _itUseModifiers = [ ammoCheckI , useTimeCheckI diff --git a/src/Dodge/Item/Weapon/Grenade.hs b/src/Dodge/Item/Weapon/Grenade.hs index 7b5aa1ade..5b0f0cd65 100644 --- a/src/Dodge/Item/Weapon/Grenade.hs +++ b/src/Dodge/Item/Weapon/Grenade.hs @@ -34,7 +34,7 @@ grenade = Throwable , _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2 [(-3,-3),(-3,3),(3,3),(3,-3)] , _twMaxRange = 150 , _twAccuracy = 30 - , _itUse = Right $ \_ -> throwGrenade makeExplosionAt + , _itUse = RightUse $ \_ -> throwGrenade makeExplosionAt , _itUseModifiers = [ useTimeCheckI ] @@ -227,7 +227,7 @@ remoteBomb = defaultThrowable [(-3,-3),(-3,3),(3,3),(3,-3)] , _twMaxRange = 150 , _twAccuracy = 30 - , _itUse = Right $ const throwRemoteBomb + , _itUse = RightUse $ const throwRemoteBomb , _itUseModifiers = [ hammerCheckI ] @@ -260,7 +260,7 @@ throwRemoteBomb cr w = setLocation resetName = set (creatures . ix cid . crInv . ix j . itName) "REMOTE" removePict = set (creatures . ix cid . crInv . ix j . itEquipPict) $ \ _ _ -> emptyBlank resetFire = set (creatures . ix cid . crInv . ix j . itUse) - $ Right $ \_ -> explodeRemoteBomb itid i + $ RightUse $ \_ -> explodeRemoteBomb itid i p' = _crPos cr +.+ rotateV (_crDir cr) (V2 (_crRad cr) 0) p | circOnSomeWall p' 4 w = _crPos cr +.+ rotateV (_crDir cr) (V2 (_crRad cr-4) 0) | otherwise = p' @@ -277,7 +277,7 @@ explodeRemoteBomb :: Int -> Int -> Creature -> World -> World explodeRemoteBomb itid pjid cr w = set (props . ix pjid . pjUpdate) (\_ -> retireRemoteBomb itid 30 pjid) -- $ set (props . ix pjid . pjDraw) (\_ -> blank) - $ set (creatures . ix cid . crInv . ix j . itUse) (Right $ \_ -> const id) + $ set (creatures . ix cid . crInv . ix j . itUse) (RightUse $ \_ -> const id) $ resetName $ resetPict -- $ resetScope @@ -305,7 +305,7 @@ retireRemoteBomb itid 0 pjid w = w & pointToItem (_itemPositions w IM.! itid) %~ ( (itAttachment . scopePos .~ V2 0 0) . (itZoom .~ defaultItZoom) - . (itUse .~ (Right $ const throwRemoteBomb)) + . (itUse .~ (RightUse $ const throwRemoteBomb)) ) & props %~ IM.delete pjid retireRemoteBomb itid t pjid w = setScope w diff --git a/src/Dodge/Item/Weapon/Launcher.hs b/src/Dodge/Item/Weapon/Launcher.hs index 8983f5fac..a388f67e2 100644 --- a/src/Dodge/Item/Weapon/Launcher.hs +++ b/src/Dodge/Item/Weapon/Launcher.hs @@ -43,7 +43,7 @@ launcher = defaultGun , _wpReloadState = 0 , _itUseRate = 20 , _itUseTime = 0 - , _itUse = Right aRocketWithItemParams + , _itUse = RightUse aRocketWithItemParams , _itUseModifiers = [ ammoCheckI , useTimeCheckI @@ -244,7 +244,7 @@ remoteLauncher = defaultGun , _wpReloadState = 0 , _itUseRate = 10 , _itUseTime = 0 - , _itUse = Right $ const fireRemoteLauncher + , _itUse = RightUse $ const fireRemoteLauncher , _itUseModifiers = [ ammoCheckI , hammerCheckI @@ -287,7 +287,7 @@ fireRemoteLauncher cr w = setLocation newitid = IM.newKey $ _itemPositions w maybeitid = cr ^? crInv . ix j . itID . _Just resetFire = set (creatures . ix cid . crInv . ix j . itUse) - $ Right $ \_ _ -> explodeRemoteRocket itid i + $ RightUse $ \_ _ -> explodeRemoteRocket itid i resetName = set (creatures . ix cid . crInv . ix j . itName) "REMOTEROCKET" setLocation :: World -> World setLocation w' = case maybeitid of @@ -347,7 +347,7 @@ explodeRemoteRocket explodeRemoteRocket itid pjid w = set (props . ix pjid . pjUpdate) (\_ -> retireRemoteRocket itid 30 pjid) $ set (props . ix pjid . prDraw) (const mempty) - $ set (itPoint . itUse) (Right $ \_ _ -> id) + $ set (itPoint . itUse) (RightUse $ \_ _ -> id) $ resetName $ makeExplosionAt (_pjPos (_props w IM.! pjid)) w where @@ -379,7 +379,7 @@ remoteShellPic t retireRemoteRocket :: Int -> Int -> Int -> World -> World retireRemoteRocket itid 0 pjid w = set (pointToItem (_itemPositions w IM.! itid) . itAttachment . scopePos) (V2 0 0) - $ set (pointToItem (_itemPositions w IM.! itid) . itUse) (Right $ const fireRemoteLauncher) + $ set (pointToItem (_itemPositions w IM.! itid) . itUse) (RightUse $ const fireRemoteLauncher) (w & props %~ IM.delete pjid) retireRemoteRocket itid t pjid w = setScope w & props . ix pjid . pjUpdate .~ (\_ -> retireRemoteRocket itid (t-1) pjid) diff --git a/src/Dodge/Item/Weapon/Radar.hs b/src/Dodge/Item/Weapon/Radar.hs index b86350774..7ab176c3d 100644 --- a/src/Dodge/Item/Weapon/Radar.hs +++ b/src/Dodge/Item/Weapon/Radar.hs @@ -26,7 +26,7 @@ radar = defaultGun , _wpReloadState = 0 , _itUseRate = 120 , _itUseTime = 0 - , _itUse = Right $ const aRadarPulse + , _itUse = RightUse $ const aRadarPulse , _itUseModifiers = [ ammoUseCheckI ] @@ -51,7 +51,7 @@ sonar = defaultGun , _wpReloadState = 0 , _itUseRate = 120 , _itUseTime = 0 - , _itUse = Right $ const aSonarPulse + , _itUse = RightUse $ const aSonarPulse , _itUseModifiers = [ ammoUseCheckI ] diff --git a/src/Dodge/Item/Weapon/Spawn.hs b/src/Dodge/Item/Weapon/Spawn.hs index e1d5cc1e6..4b903051c 100644 --- a/src/Dodge/Item/Weapon/Spawn.hs +++ b/src/Dodge/Item/Weapon/Spawn.hs @@ -21,7 +21,7 @@ spawnGun cr = defaultGun , _wpReloadTime = 80 , _wpReloadState = 0 , _itUseRate = 100 - , _itUse = Right $ \_ -> spawnCrNextTo cr + , _itUse = RightUse $ \_ -> spawnCrNextTo cr , _itUseModifiers = [ ammoCheckI , hammerCheckI diff --git a/src/Dodge/Item/Weapon/SprayGuns.hs b/src/Dodge/Item/Weapon/SprayGuns.hs index 279854e67..3cd77af1a 100644 --- a/src/Dodge/Item/Weapon/SprayGuns.hs +++ b/src/Dodge/Item/Weapon/SprayGuns.hs @@ -40,7 +40,7 @@ poisonSprayer = defaultAutoGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Right $ const aGasCloud + , _itUse = RightUse $ const aGasCloud , _itUseModifiers = [ ammoCheckI , useTimeCheckI @@ -66,7 +66,7 @@ flamer = defaultAutoGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Right $ \_ -> randWalkAngle 0.2 0.01 aFlame + , _itUse = RightUse $ \_ -> randWalkAngle 0.2 0.01 aFlame , _itUseModifiers = [ ammoUseCheckI , withSidePushI 5 diff --git a/src/Dodge/Item/Weapon/Utility.hs b/src/Dodge/Item/Weapon/Utility.hs index ecce5818a..9849a1af1 100644 --- a/src/Dodge/Item/Weapon/Utility.hs +++ b/src/Dodge/Item/Weapon/Utility.hs @@ -23,7 +23,7 @@ rewindGun = defaultGun , _wpMaxAmmo = 0 , _wpLoadedAmmo = 0 , _itEffect = ItRewindEffect rewindEffect [] - , _itUse = Left $ \cr invid -> useRewindGun (_crInv cr IM.! invid) cr + , _itUse = LeftUse $ \cr invid -> useRewindGun (_crInv cr IM.! invid) cr } rewindEffect :: ItEffect -> Creature -> Int -> World -> World rewindEffect _ cr invid w @@ -59,7 +59,7 @@ shrinkGun = defaultGun , _itUseRate = 0 , _itUseTime = 0 , _itAimStance = TwoHandFlat - , _itUse = Left $ \cr invid -> useShrinkGun (_crInv cr IM.! invid) cr + , _itUse = LeftUse $ \cr invid -> useShrinkGun (_crInv cr IM.! invid) cr , _itUseModifiers = [ ammoCheckI , hammerCheckI @@ -96,7 +96,7 @@ blinkGun = defaultGun , _wpReloadState = 0 , _itUseRate = 0 , _itUseTime = 0 - , _itUse = Left $ hammerCheckL $ shootL aSelfL + , _itUse = LeftUse $ hammerCheckL $ shootL aSelfL , _itUseModifiers = [ ammoCheckI , hammerCheckI @@ -118,12 +118,12 @@ aSelfL cr _ = blinkAction cr effectGun :: String -> (Creature -> World -> World) -> Item effectGun name eff = defaultGun { _itName = name ++ "Gun" - , _itUse = Right $ const eff + , _itUse = RightUse $ const eff } autoEffectGun :: String -> (Creature -> World -> World) -> Item autoEffectGun name eff = defaultAutoGun { _itName = name ++ "Gun" - , _itUse = Right $ const eff + , _itUse = RightUse $ const eff } forceFieldGun :: Item forceFieldGun = defaultGun