module Dodge.Item.Weapon.Utility where
import Dodge.Data
import Dodge.Default
import Dodge.Picture.Layer
import Dodge.Creature.Action
import Dodge.Item.Weapon.TriggerType
import Dodge.Default.Weapon
import Geometry
import Picture
--import qualified IntMapHelp as IM
import Shape
import ShapePicture

import Control.Lens
shrinkGun :: Item
shrinkGun = defaultGun
    { _itName = "SHRINKER"
    , _itIdentity = Generic
    , _wpMaxAmmo = 100
    , _wpLoadedAmmo = 100
    , _wpReloadTime = 20
    , _wpReloadState = 0
    , _itUseRate = 0
    , _itUseTime = 0
    , _itAimStance = TwoHandFlat
    , _itUse = useShrinkGun
    , _itUseModifiers =
        [ ammoCheckI
        , hammerCheckI
        ]
    , _itLeftClickUse = Nothing
    , _wpSpread = 0.05
    , _wpRange = 20
    , _itFloorPict = shrinkGunPic
    , _itAimingSpeed = 1
    , _itAimingRange = 0
    , _itAttachment = ItBool True
    }

shrinkGunPic :: Item -> SPic
shrinkGunPic _ = noPic $ colorSH violet $ upperPrismPoly 5 $ square 5

-- be careful changing this around; potential problems include updating the
-- creature but using the old crInvSel value
useShrinkGun :: Item -> Creature -> World -> World
useShrinkGun it cr w = if _itBool $ _itAttachment it
    then tryResize 0.5 $ stripNoItems cr . f False UndroppableIdentified . dropUnselected cr
    else tryResize 1   $ f True Uncursed . setMinInvSize defaultInvSize cr
  where
    tryResize x g = maybe w g $ sizeSelf x cr w
    f isInUse cstatus = creatures . ix (_crID cr) . crInv . ix (_crInvSel cr) %~
        ( (itAttachment . itBool .~ isInUse) . (itCurseStatus .~ cstatus) )

blinkGun :: Item
blinkGun = defaultGun 
    { _itName = "BLINKER"
    , _itIdentity = Blinker
    , _wpMaxAmmo = 100
    , _wpLoadedAmmo = 100
    , _wpReloadTime = 20
    , _wpReloadState = 0
    , _itUseRate = 0
    , _itUseTime = 0
    , _itUse = const blinkAction
    , _itUseModifiers =
        [ ammoCheckI
        , hammerCheckI
        ]
    , _itLeftClickUse = Just $ hammerCheckL $ shootL aSelfL
    , _wpSpread = 0.05
    , _wpRange = 20
    , _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2[(-2,-2),(-2,2),(2,2),(2,0),(0,0),(0,-2)]
    , _itAimingSpeed = 1
    , _itAimingRange = 0
    }


aSelf :: Creature -> World -> World
aSelf = blinkAction

aSelfL :: Creature -> Int -> World -> World
aSelfL cr _ = blinkAction cr

effectGun :: String -> (Creature -> World -> World) -> Item
effectGun name eff = defaultGun
    { _itName = name ++ "Gun"
    , _itUse = const eff
    }
autoEffectGun :: String -> (Creature -> World -> World) -> Item
autoEffectGun name eff = defaultAutoGun
    { _itName = name ++ "Gun"
    , _itUse = const eff
    }
forceFieldGun :: Item
forceFieldGun = defaultGun 
    { _itName = "FORCEFIELD"
    , _itIdentity = ForceFieldGun
    , _wpMaxAmmo = 100
    , _wpLoadedAmmo = 100
    , _wpReloadTime = 40
    , _wpReloadState = 0
    , _itUseRate = 10
    , _itUseTime = 0
    , _itUse = undefined
    , _wpSpread = 0.02
    , _wpRange = 20
    , _itFloorPict = \_ -> (,) emptySH $ onLayer FlItLayer $ polygon $ map toV2 [(-4,-4),(-4,4),(4,4),(4,0),(0,0),(0,-4)]
    , _itAimingSpeed = 0.4
    , _itAimingRange = 0.5
    }
-- grapGun = defaultGun 
--     { _itName = "grapGun"
--     , _itIdentity = GrapGun
--     , _wpMaxAmmo = 1
--     , _wpLoadedAmmo = 1
--     , _wpReloadTime = 40
--     , _wpReloadState = 0
--     , _itUseRate = 10
--     , _itUseTime = 0
--     , _itUse = grapFire
--     , _wpSpread = 0.002
--     , _wpRange = 20
--     , _wpIsAuto = False
--     , _itFloorPict = onLayer FlItLayer $ polygon [(-4,-4),(-4,4),(4,4),(4,0),(0,0),(0,-4)]
--     , _itAmount = 1
--     , _itMaxStack = 1
--     , _itAimingSpeed = 1
--     , _itAimingRange = 0.5
--     }
