Add simple flamethrower upgrade path
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
module Dodge.Item.Weapon.SprayGuns
|
||||
( poisonSprayer
|
||||
, flamer
|
||||
, flameStick
|
||||
, blowTorch
|
||||
, flameThrower
|
||||
, flameTorrent
|
||||
, flameWall
|
||||
) where
|
||||
import Dodge.Data
|
||||
@@ -36,38 +36,21 @@ import qualified Data.IntMap.Strict as IM
|
||||
--import Data.Function
|
||||
import System.Random
|
||||
poisonSprayer :: Item
|
||||
poisonSprayer = defaultAutoGun
|
||||
{ _itName = "POISON"
|
||||
, _itType = SPRAYER
|
||||
, _itConsumption = defaultAmmo
|
||||
{ _ammoBaseMax = 500
|
||||
, _ammoLoaded = 500
|
||||
, _reloadTime = 100
|
||||
poisonSprayer = flameThrower
|
||||
{ _itName = "POISONSPRAYER"
|
||||
, _itType = POISONSPRAYER
|
||||
}
|
||||
& itConsumption . aoType .~ GasAmmo
|
||||
{ _amString = "POISONGAS"
|
||||
, _amCreateGas = aGasCloud
|
||||
}
|
||||
, _itUse = ruseInstant (const aGasCloud) NoHammer
|
||||
& itUse . useMods .~
|
||||
[ ammoCheckI
|
||||
, withSoundForI foamSprayLoopS 5
|
||||
, useAmmoAmount 1
|
||||
-- , spreadNumI
|
||||
]
|
||||
& useAim . aimSpeed .~ 0.2
|
||||
& useAim . aimRange .~ 0
|
||||
& useAim . aimStance .~ TwoHandTwist
|
||||
, _itParams = Sprayer
|
||||
{ _nozzleSpread = 0.2
|
||||
, _nozzleNum = 3
|
||||
}
|
||||
, _itDimension = ItemDimension
|
||||
{ _dimRad = 7
|
||||
, _dimCenter = V3 9 0 0
|
||||
, _dimPortage = HeldItem
|
||||
{ _handlePos = 5
|
||||
, _muzPos = 18
|
||||
}
|
||||
, _dimSPic = flamerPic
|
||||
}
|
||||
-- , _itFloorPict = flamerPic
|
||||
}
|
||||
|
||||
flamerPic :: Item -> SPic
|
||||
flamerPic it =
|
||||
( colorSH yellow $
|
||||
@@ -82,24 +65,74 @@ flamerPic it =
|
||||
r = 5
|
||||
am = fractionLoadedAmmo2 it
|
||||
flameStick :: Item
|
||||
flameStick = flamer
|
||||
& itUse . rUse .~ const aFlame
|
||||
flameStick = flameThrower
|
||||
& itName .~ "FLAMESTICK"
|
||||
& itType .~ FLAMESTICK
|
||||
& itConsumption . ammoBaseMax .~ 10
|
||||
& itConsumption . reloadTime .~ 20
|
||||
& itParams . sprayNozzles . ix 0 . nzPressure .~ 4
|
||||
& itUse . useAim . aimStance .~ OneHand
|
||||
|
||||
flameTorrent :: Item
|
||||
flameTorrent = flameThrower
|
||||
& itName .~ "FLAMETORRENT"
|
||||
& itType .~ FLAMETORRENT
|
||||
& itUse . useAim . aimZoom .~ defaultItZoom
|
||||
& itParams . sprayNozzles . ix 0 %~
|
||||
( (nzPressure .~ 10)
|
||||
. (nzMaxWalkAngle .~ 1.5)
|
||||
. (nzWalkSpeed .~ 0.05)
|
||||
)
|
||||
|
||||
blowTorch :: Item
|
||||
blowTorch = flamer
|
||||
flameThrower :: Item
|
||||
flameThrower = flamer
|
||||
blowTorch = flameThrower
|
||||
& itName .~ "BLOWTORCH"
|
||||
& itType .~ BLOWTORCH
|
||||
flameWall :: Item
|
||||
flameWall = flamer
|
||||
flamer :: Item
|
||||
flamer = defaultAutoGun
|
||||
{ _itName = "FLAMER"
|
||||
, _itType = FLAMER
|
||||
flameWall = flameThrower
|
||||
& itName .~ "FLAMEWALL"
|
||||
& itType .~ FLAMEWALL
|
||||
& itParams . sprayNozzles .~
|
||||
[ Nozzle
|
||||
{ _nzPressure = 2.5
|
||||
, _nzDir = 0
|
||||
, _nzMaxWalkAngle = 0.2
|
||||
, _nzWalkSpeed = 0.01
|
||||
, _nzCurrentWalkAngle = 0
|
||||
, _nzLength = 20
|
||||
}
|
||||
, Nozzle
|
||||
{ _nzPressure = 3
|
||||
, _nzDir = 0.5
|
||||
, _nzMaxWalkAngle = 0.2
|
||||
, _nzWalkSpeed = 0.01
|
||||
, _nzCurrentWalkAngle = 0
|
||||
, _nzLength = 20
|
||||
}
|
||||
, Nozzle
|
||||
{ _nzPressure = 3
|
||||
, _nzDir = -0.5
|
||||
, _nzMaxWalkAngle = 0.2
|
||||
, _nzWalkSpeed = 0.01
|
||||
, _nzCurrentWalkAngle = 0
|
||||
, _nzLength = 20
|
||||
}
|
||||
]
|
||||
|
||||
flameThrower :: Item
|
||||
flameThrower = defaultAutoGun
|
||||
{ _itName = "FLAMETHROWER"
|
||||
, _itType = FLAMETHROWER
|
||||
, _itConsumption = defaultAmmo
|
||||
{ _ammoBaseMax = 250
|
||||
, _ammoLoaded = 250
|
||||
, _ammoLoaded = 0
|
||||
, _reloadTime = 100
|
||||
, _aoType = GasAmmo
|
||||
{_amString = "FLAME"
|
||||
,_amCreateGas = aFlame
|
||||
}
|
||||
}
|
||||
, _itUse = ruseInstant (\_ -> randWalkAngle aFlame) NoHammer
|
||||
, _itUse = ruseInstant (overNozzles useGasParams) NoHammer
|
||||
[ ammoCheckI
|
||||
, useAmmoAmount 1
|
||||
, withSidePushI 5
|
||||
@@ -112,43 +145,65 @@ flamer = defaultAutoGun
|
||||
-- , _itFloorPict = flamerPic
|
||||
-- , _itZoom = defaultItZoom
|
||||
, _itAttachment = NoItAttachment
|
||||
, _itParams = AngleWalk
|
||||
{_maxWalkAngle = 0.2
|
||||
,_walkSpeed = 0.01
|
||||
,_currentWalkAngle = 0
|
||||
, _itParams = Sprayer'
|
||||
{ _sprayNozzles =
|
||||
[ Nozzle
|
||||
{ _nzPressure = 4
|
||||
, _nzDir = 0
|
||||
, _nzMaxWalkAngle = 0.2
|
||||
, _nzWalkSpeed = 0.01
|
||||
, _nzCurrentWalkAngle = 0
|
||||
, _nzLength = 10
|
||||
}
|
||||
]
|
||||
}
|
||||
, _itDimension = ItemDimension
|
||||
{ _dimRad = 7
|
||||
, _dimCenter = V3 9 0 0
|
||||
, _dimPortage = HeldItem
|
||||
{ _handlePos = 5
|
||||
, _muzPos = 18
|
||||
}
|
||||
, _dimSPic = flamerPic
|
||||
}
|
||||
-- , _itFloorPict = flamerPic
|
||||
}
|
||||
aGasCloud :: Creature -> World -> World
|
||||
aGasCloud cr w = insertCloud $ set randGen g w
|
||||
where
|
||||
(a,g) = randomR (-0.1,0.1) (_randGen w)
|
||||
dir = _crDir cr + a
|
||||
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
|
||||
vel = (_crPos cr -.- _crOldPos cr) +.+ 10 *.* unitVectorAtAngle dir
|
||||
insertCloud = makeGasCloud pos vel
|
||||
|
||||
overNozzles :: (Creature -> World -> Nozzle -> (World,Nozzle))
|
||||
aGasCloud :: Float -> Point2 -> Float -> Creature -> World -> World
|
||||
aGasCloud pressure pos dir cr = makeGasCloud pos
|
||||
$ (_crPos cr -.- _crOldPos cr) +.+ pressure *.* unitVectorAtAngle dir
|
||||
|
||||
overNozzles :: (Nozzle -> Item -> Creature -> World -> World)
|
||||
-> Item -> Creature -> World -> World
|
||||
overNozzles eff it cr w = neww & creatures . ix cid . crInv . ix i . itParams . sprayerNozzles .~ newNozzles
|
||||
overNozzles = overNozzles' . overNozzle
|
||||
|
||||
overNozzles' :: (Item -> Creature -> World -> Nozzle -> (World,Nozzle))
|
||||
-> Item -> Creature -> World -> World
|
||||
overNozzles' eff it cr w = neww & creatures . ix cid . crInv . ix i . itParams . sprayNozzles .~ newNozzles
|
||||
where
|
||||
cid = _crID cr
|
||||
i = _crInvSel $ _creatures w IM.! cid
|
||||
(neww,newNozzles) = mapAccumR (eff cr) w $ _sprayerNozzles (_itParams it)
|
||||
(neww,newNozzles) = mapAccumR (eff it cr) w $ _sprayNozzles (_itParams it)
|
||||
|
||||
overNozzle :: (Creature -> World -> World)
|
||||
-> Creature -> World -> Nozzle -> (World, Nozzle)
|
||||
overNozzle eff cr w nz = (eff (cr & crDir +~ wa) w & randGen .~ g,nz & nzCurrentWalkAngle .~ wa)
|
||||
overNozzle :: (Nozzle -> Item -> Creature -> World -> World)
|
||||
-> Item -> Creature -> World -> Nozzle -> (World, Nozzle)
|
||||
overNozzle eff it cr w nz = (eff nz it (cr & crDir +~ wa + na) w & randGen .~ g,nz & nzCurrentWalkAngle .~ wa)
|
||||
where
|
||||
na = _nzDir nz
|
||||
(walkamount, g) = randomR (-aspeed,aspeed) (_randGen w)
|
||||
aspeed = _nzWalkSpeed nz
|
||||
maxa = _nzMaxWalkAngle nz
|
||||
wa = min maxa $ max (negate maxa) (_nzCurrentWalkAngle nz + walkamount)
|
||||
|
||||
aFlame :: Creature -> World -> World
|
||||
aFlame cr w = w & particles .:~ aFlameParticle t pos vel (Just cid)
|
||||
useGasParams :: Nozzle -> Item -> Creature -> World -> World
|
||||
useGasParams nz it cr = _amCreateGas (_aoType (_itConsumption it)) (_nzPressure nz) pos dir cr
|
||||
where
|
||||
dir = _crDir cr
|
||||
pos = _crPos cr +.+ (_nzLength nz *.* unitVectorAtAngle (_crDir cr))
|
||||
|
||||
aFlame :: Float -> Point2 -> Float -> Creature -> World -> World
|
||||
aFlame pressure pos dir cr w = w & particles .:~ aFlameParticle t pos vel (Just cid)
|
||||
where
|
||||
(t,_) = randomR (99,101) (_randGen w)
|
||||
cid = _crID cr
|
||||
dir = _crDir cr
|
||||
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
|
||||
vel = (_crPos cr -.- _crOldPos cr) +.+ 4 *.* unitVectorAtAngle dir
|
||||
vel = (_crPos cr -.- _crOldPos cr) +.+ pressure *.* unitVectorAtAngle dir
|
||||
|
||||
Reference in New Issue
Block a user