461 lines
13 KiB
Haskell
461 lines
13 KiB
Haskell
module Dodge.Item.Weapon.BulletGuns
|
|
( bangRod
|
|
, elephantGun
|
|
, amr
|
|
, sniperRifle
|
|
, machineGun
|
|
, bangCone
|
|
, blunderbuss
|
|
, grapeShotCannon
|
|
, grenadeLauncher
|
|
, spreadGun
|
|
, ltAutoGun
|
|
, hvAutoGun
|
|
, autogunSpread
|
|
, autoGun
|
|
, multGun
|
|
, autoGunPic
|
|
, longGun
|
|
, module Dodge.Item.Weapon.BulletGun.Stick
|
|
, module Dodge.Item.Weapon.BulletGun.Cane
|
|
) where
|
|
import Dodge.Item.Weapon.BulletGun.Stick
|
|
import Dodge.Item.Weapon.BulletGun.Cane
|
|
--import Dodge.Item.Weapon.BulletGun.Clip
|
|
import Dodge.Data
|
|
--import Dodge.ChainEffect
|
|
import Dodge.TweakBullet
|
|
import Dodge.Default.Weapon
|
|
import Dodge.Item.Weapon.InventoryDisplay
|
|
import Dodge.Default
|
|
import Dodge.Item.Attachment
|
|
import Dodge.Item.Weapon.ExtraEffect
|
|
--import Dodge.Item.Weapon.InventoryDisplay
|
|
import Dodge.Item.Weapon.AmmoParams
|
|
import Dodge.Item.Draw
|
|
import Dodge.Item.Weapon.Bullet
|
|
import Dodge.Item.Weapon.TriggerType
|
|
import Dodge.SoundLogic.LoadSound
|
|
import Picture
|
|
import Geometry
|
|
import ShapePicture
|
|
import Shape
|
|
--import Sound.Data
|
|
import LensHelp
|
|
|
|
import Data.Maybe
|
|
import qualified Data.Sequence as Seq
|
|
--import Control.Lens
|
|
import Control.Monad.State
|
|
import System.Random
|
|
|
|
autoGun :: Item
|
|
autoGun = defaultAutoGun
|
|
{ _itName = "AUTOGUN"
|
|
, _itType = AUTOGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = basicBullet
|
|
, _ammoMax = 30
|
|
, _ammoLoaded = 30
|
|
, _reloadTime = 80
|
|
}
|
|
, _itUse = useAmmoParamsRate 4 NoHammer
|
|
[ ammoCheckI
|
|
, charFiringStratI
|
|
[('S', hammerCheckI)
|
|
]
|
|
, useTimeCheck
|
|
, charFiringStratI
|
|
[('M', torqueBefore 0.08)
|
|
,('S', torqueBefore 0.05)
|
|
]
|
|
, withSoundForI autoBS 5
|
|
--, withSoundForI seagullChatterS 5
|
|
, useAmmoAmount 1
|
|
, applyInaccuracy
|
|
, withMuzFlareI
|
|
, withSmoke 1 black 20 200 5
|
|
]
|
|
& useAim . aimSpeed .~ 0.4
|
|
& useAim . aimRange .~ 1
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
|
-- , _itFloorPict = autoGunPic
|
|
-- , _itZoom = defaultItZoom
|
|
, _itEquipPict = pictureWeaponOnAim
|
|
, _itAttachment = ItCharMode $ Seq.fromList "MS"
|
|
, _itScroll = scrollCharMode
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 1
|
|
, _rifling = 0.9
|
|
, _bore = 2
|
|
, _gunBarrels = SingleBarrel 0.1
|
|
}
|
|
, _itTweaks = defaultBulletSelTweak
|
|
}
|
|
autoGunPic :: Item -> SPic
|
|
autoGunPic it = noPic $
|
|
colorSH red (prismPoly
|
|
(map (addZ 5) $ rectNESW 2 12 (-2) (-8))
|
|
(map (addZ 0) $ rectNESW 4 12 (-4) (-12))
|
|
)
|
|
<> translateSHf 0 (-1) (rotateSHx (negate $ pi/4) . upperPrismPoly 2 $ rectNESW (negate $ 3 + 0.25 * x) 0 3 (-5))
|
|
where
|
|
x = fromIntegral $ _ammoLoaded $ _itConsumption it
|
|
|
|
bangRod :: Item
|
|
bangRod = defaultGun
|
|
{ _itName = "BANGROD"
|
|
, _itType = BANGROD
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 0.8
|
|
, _rifling = 1
|
|
, _bore = 2
|
|
, _gunBarrels = SingleBarrel 0.1
|
|
}
|
|
, _itUse = useAmmoParamsRate 6 upHammer
|
|
[ ammoHammerCheck
|
|
, useTimeCheck
|
|
, withSoundStart autoGunS
|
|
, useAmmoAmount 1
|
|
, torqueAfterI 0.3
|
|
, applyInaccuracy
|
|
, withMuzFlareI
|
|
, withRecoilI 50
|
|
]
|
|
, _itDimension = ItemDimension
|
|
{ _dimRad = 12
|
|
, _dimCenter = V3 5 0 0
|
|
, _dimPortage = HeldItem
|
|
{_handlePos = 5
|
|
,_muzPos = 30
|
|
}
|
|
, _dimSPic = const $ noPic $ colorSH orange $ upperPrismPoly 3 $ rectXH 30 2
|
|
}
|
|
}
|
|
& itConsumption . reloadType .~ ActiveClear
|
|
& itUse . useAim . aimSpeed .~ 0.2
|
|
& itUse . useAim . aimRange .~ 1
|
|
& itUse . useAim . aimStance .~ TwoHandTwist
|
|
& itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
|
elephantGun :: Item
|
|
elephantGun = bangRod
|
|
& itName .~ "ELEPHANTGUN"
|
|
& itType .~ ELEPHANTGUN
|
|
& itUse . useAim . aimStance .~ TwoHandTwist
|
|
& itParams . gunBarrels .~ SingleBarrel 0.05
|
|
& itUse . useMods .~
|
|
[ ammoHammerCheck
|
|
, useTimeCheck
|
|
, withSoundStart autoGunS
|
|
, useAmmoAmount 1
|
|
, torqueAfterI 0.1
|
|
, applyInaccuracy
|
|
, withMuzFlareI
|
|
, withRecoilI 50
|
|
]
|
|
amr :: Item
|
|
amr = elephantGun
|
|
& itName .~ "AMR"
|
|
& itType .~ AMR
|
|
& itConsumption . ammoMax .~ 15
|
|
sniperRifle :: Item
|
|
sniperRifle = elephantGun
|
|
& itName .~ "SNIPERRIFLE"
|
|
& itType .~ SNIPERRIFLE
|
|
& itParams . gunBarrels .~ SingleBarrel 0
|
|
machineGun :: Item
|
|
machineGun = bangRod
|
|
& itName .~ "MACHINEGUN"
|
|
& itType .~ MACHINEGUN
|
|
|
|
bangCone :: Item
|
|
bangCone = defaultGun
|
|
{ _itName = "BANGCONE"
|
|
, _itType = BANGCONE
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = basicBullet
|
|
, _ammoMax = 5
|
|
, _reloadTime = 25
|
|
, _reloadType = ActiveClear
|
|
}
|
|
, _itUse = useAmmoParamsRate 20 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart bangEchoS
|
|
, useAllAmmo
|
|
, torqueAfterI 0.6
|
|
, withRecoilI 150
|
|
, duplicateLoaded
|
|
, withMuzFlareI
|
|
, applyInaccuracy
|
|
, withRandomOffsetI 12
|
|
, withRandomItemParams coneRandItemParams
|
|
]
|
|
& useAim . aimSpeed .~ 0.4
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 0.7
|
|
, _rifling = 0.8
|
|
, _bore = 5
|
|
, _gunBarrels = SingleBarrel 0.5
|
|
}
|
|
, _itDimension = ItemDimension
|
|
{ _dimRad = 8
|
|
, _dimCenter = V3 5 0 0
|
|
, _dimPortage = HeldItem
|
|
{_handlePos = 5
|
|
,_muzPos = 15
|
|
}
|
|
, _dimSPic = const $ noPic $ colorSH cyan $ upperPrismPoly 3 (rectXH 5 2)
|
|
<> upperPrismPoly 6 (rectNSEW 4 (-4) 15 5)
|
|
}
|
|
, _itTweaks = defaultBulletSelTweak
|
|
}
|
|
coneRandItemParams :: State StdGen ItemParams
|
|
coneRandItemParams = do
|
|
muzv <- state $ randomR (0.5,1)
|
|
rifl <- state $ randomR (0.3,0.9)
|
|
return $ BulletShooter
|
|
{ _muzVel = muzv
|
|
, _rifling = rifl
|
|
, _bore = 5
|
|
, _gunBarrels = SingleBarrel 0.5
|
|
}
|
|
|
|
blunderbuss :: Item
|
|
blunderbuss = bangCone
|
|
{_itName = "BLUNDERBUSS"
|
|
,_itType = BLUNDERBUSS
|
|
,_itUse = useAmmoParamsRate 20 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart bangEchoS
|
|
, useAllAmmo
|
|
, torqueAfterI 0.1
|
|
, withRecoilI 150
|
|
, duplicateLoaded
|
|
, withMuzFlareI
|
|
, applyInaccuracy
|
|
, withRandomOffsetI 12
|
|
, withRandomItemParams coneRandItemParams
|
|
]
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimSpeed .~ 0.4
|
|
, _itDimension = ItemDimension
|
|
{ _dimRad = 8
|
|
, _dimCenter = V3 5 0 0
|
|
, _dimPortage = HeldItem
|
|
{_handlePos = 5
|
|
,_muzPos = 30
|
|
}
|
|
, _dimSPic = const $ noPic $ colorSH cyan $ upperPrismPoly 3 (rectXH 20 2)
|
|
<> upperPrismPoly 6 (rectNSEW 4 (-4) 30 20)
|
|
}
|
|
}
|
|
|
|
grapeShotCannon :: Item
|
|
grapeShotCannon = blunderbuss
|
|
{_itName = "GRAPESHOTCANNON"
|
|
,_itType = GRAPESHOTCANNON
|
|
,_itUse = useAmmoParamsRate 20 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart bangEchoS
|
|
, useAllAmmo
|
|
, torqueAfterI 0.1
|
|
, withRecoilI 150
|
|
, duplicateLoaded
|
|
, withMuzFlareI
|
|
, applyInaccuracy
|
|
, withRandomOffsetI 12
|
|
, withRandomItemParams coneRandItemParams
|
|
]
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimSpeed .~ 0.4
|
|
}
|
|
& itConsumption . ammoMax .~ 15
|
|
& itConsumption . reloadTime .~ 30
|
|
|
|
grenadeLauncher :: Int -> Item
|
|
grenadeLauncher _ = bangCone
|
|
|
|
|
|
|
|
hvAutoGun :: Item
|
|
hvAutoGun = defaultAutoGun
|
|
{ _itName = "AUTO-HV"
|
|
, _itType = HVAUTOGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = hvBullet
|
|
, _ammoMax = 100
|
|
, _ammoLoaded = 100
|
|
, _reloadTime = 200
|
|
}
|
|
, _itUse = useAmmoParamsRate 25 NoHammer
|
|
[ ammoCheckI
|
|
, rateIncAB (torqueBeforeAtLeast 0.1 0.1) (torqueAfterI 0.2)
|
|
, withSoundStart bangEchoS
|
|
, withThinSmokeI
|
|
, withMuzFlareI
|
|
]
|
|
& useAim . aimSpeed .~ 0.2
|
|
& useAim . aimRange .~ 1
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
|
& useDelay .~ VariableRate {_rateMax = 25, _rateMaxMax = 24, _rateMinMax = 7, _rateTime = 0}
|
|
-- , _itFloorPict = hvAutoGunPic
|
|
, _itInvSize = 3
|
|
, _itInvDisplay = \it -> head (basicItemDisplay it) :
|
|
["* FIRERATE: *"
|
|
,"* " ++ fromMaybe " " (maybeRateStatus it) ++ " *"
|
|
]
|
|
}
|
|
ltAutoGun :: Item
|
|
ltAutoGun = defaultAutoGun
|
|
{ _itName = "AUTO-LT"
|
|
, _itType = LTAUTOGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = basicBullet
|
|
, _ammoMax = 15
|
|
, _ammoLoaded = 0
|
|
, _reloadTime = 90
|
|
}
|
|
, _itUse = useAmmoParamsRate 2 NoHammer
|
|
[ ammoCheckI
|
|
, useTimeCheck
|
|
, withSoundStart tap1S
|
|
, useAmmoAmount 1
|
|
, applyInaccuracy
|
|
, torqueAfterI 0.2
|
|
, withSidePushI 50
|
|
, modClock 2 withMuzFlareI
|
|
]
|
|
-- , _itFloorPict = ltAutoGunPic
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 1
|
|
, _rifling = 0.8
|
|
, _bore = 2
|
|
, _gunBarrels = SingleBarrel autogunSpread
|
|
}
|
|
, _itTweaks = defaultBulletSelTweak
|
|
}
|
|
spreadGun :: Item
|
|
spreadGun = defaultGun
|
|
{ _itName = "SPREAD"
|
|
, _itType = SPREADGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = basicBullet
|
|
, _ammoMax = 5
|
|
, _ammoLoaded = 5
|
|
, _reloadTime = 80
|
|
}
|
|
, _itUse = useAmmoParamsRate 20 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart shotgunS
|
|
, useAmmoAmount 1
|
|
, withRecoilI 100
|
|
, withMuzFlareI
|
|
, spreadNumI
|
|
]
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 0.7
|
|
, _rifling = 0.8
|
|
, _bore = 2
|
|
, _gunBarrels = MultiBarrel
|
|
{_brlNum = 5
|
|
,_brlSpread = SpreadBarrels 0.5
|
|
,_brlInaccuracy = 0
|
|
}
|
|
}
|
|
-- , _itFloorPict = spreadGunPic
|
|
, _itTweaks = defaultBulletSelTweak
|
|
}
|
|
multGun :: Item
|
|
multGun = defaultGun
|
|
{ _itName = "MULTGUN"
|
|
, _itType = MULTGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = basicBullet
|
|
, _ammoMax = 5
|
|
, _ammoLoaded = 2
|
|
, _reloadTime = 10
|
|
, _reloadType = ActivePartial 1
|
|
}
|
|
, _itUse = useAmmoParamsRate 20 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart shotgunS
|
|
, useAllAmmo
|
|
, withRecoilI 200
|
|
, withMuzFlareI
|
|
, duplicateLoadedBarrels
|
|
]
|
|
& useAim . aimSpeed .~ 0.4
|
|
& useAim . aimRange .~ 1
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
|
-- , _itFloorPict = multGunSPic
|
|
, _itParams = BulletShooter
|
|
{ _muzVel = 1
|
|
, _rifling = 0.9
|
|
, _bore = 3
|
|
, _gunBarrels = MultiBarrel
|
|
{_brlNum = 5
|
|
,_brlSpread = AlignedBarrels
|
|
,_brlInaccuracy = 0
|
|
}
|
|
}
|
|
, _itTweaks = defaultBulletSelTweak
|
|
}
|
|
longGun :: Item
|
|
longGun = defaultGun
|
|
{ _itName = "LONGGUN"
|
|
, _itType = LONGGUN
|
|
, _itConsumption = defaultAmmo
|
|
{ _aoType = hvBullet
|
|
, _ammoMax = 1
|
|
, _ammoLoaded = 1
|
|
, _reloadTime = 100
|
|
, _reloadType = PassiveReload skwareFadeTwoSecS
|
|
}
|
|
, _itUse = useAmmoParamsRate 100 upHammer
|
|
[ ammoCheckI
|
|
, hammerCheckI
|
|
, useTimeCheck
|
|
, withSoundStart bangEchoS
|
|
, useAmmoAmount 1
|
|
, withThickSmokeI
|
|
, torqueAfterI 0.05
|
|
, withMuzFlareI
|
|
]
|
|
& useAim . aimSpeed .~ 0.2
|
|
& useAim . aimRange .~ 1
|
|
& useAim . aimStance .~ TwoHandTwist
|
|
& useAim . aimZoom .~ defaultItZoom {_itZoomMax = 0.5, _itZoomMin = 0.5}
|
|
-- , _itFloorPict = longGunSPic
|
|
-- , _itZoom = defaultItZoom
|
|
, _itScroll = zoomLongGun
|
|
, _itAttachment = ItScope (V2 0 0) 0 1 False
|
|
, _itEffect = itemLaserScopeEffect
|
|
}
|
|
|
|
zoomLongGun :: Float -> Creature -> Item -> Item
|
|
zoomLongGun x _
|
|
| x > 0 = startZoomInLongGun
|
|
| x < 0 = startZoomOutLongGun
|
|
| otherwise = id
|
|
|
|
startZoomInLongGun :: Item -> Item
|
|
startZoomInLongGun = itAttachment . scopeZoomChange %~ \x -> max 5 (x + 5)
|
|
startZoomOutLongGun :: Item -> Item
|
|
startZoomOutLongGun = itAttachment . scopeZoomChange %~ \x -> min (-5) (x-5)
|
|
|
|
autogunSpread :: Float
|
|
autogunSpread = 0.07
|