Separate out bullet effects, allow for tweaking to change these
This commit is contained in:
@@ -32,8 +32,9 @@ defaultAimParams = AimParams
|
||||
}
|
||||
|
||||
useAmmoParams :: Item -> Creature -> World -> World
|
||||
useAmmoParams it = withVelWthHiteff (_amBulVel b) (_amBulWth b) (_amBulEff b)
|
||||
useAmmoParams it = withVelWthHiteff (muzvel *.* _amBulVel b) (_amBulWth b) (_amBulEff b)
|
||||
where
|
||||
muzvel = _muzVel $ _itParams it
|
||||
b = _aoType $ _itConsumption it
|
||||
|
||||
useAmmoParamsVelMod :: Float -> Item -> Creature -> World -> World
|
||||
|
||||
@@ -11,11 +11,11 @@ import Dodge.SoundLogic.LoadSound
|
||||
import Dodge.WorldEvent
|
||||
import Dodge.WorldEvent.Damage
|
||||
--import Dodge.Default
|
||||
import Dodge.Item.Weapon.InventoryDisplay
|
||||
--import Dodge.Item.Weapon.InventoryDisplay
|
||||
import Dodge.Item.Weapon.TriggerType
|
||||
import Dodge.Item.Weapon.AmmoParams
|
||||
import Dodge.Default.Weapon
|
||||
import Dodge.Item.Attachment
|
||||
--import Dodge.Item.Attachment
|
||||
import Dodge.WorldEvent.HelperParticle
|
||||
import Dodge.Base
|
||||
import Dodge.Zone
|
||||
@@ -26,11 +26,11 @@ import ShapePicture
|
||||
import Dodge.Picture
|
||||
|
||||
import Data.Function
|
||||
import qualified Data.Sequence as Seq
|
||||
--import qualified Data.Sequence as Seq
|
||||
import Data.List
|
||||
import Control.Lens
|
||||
import System.Random
|
||||
import Data.Maybe
|
||||
--import Data.Maybe
|
||||
import Data.Tuple
|
||||
import qualified Data.IntMap.Strict as IM
|
||||
teslaGun :: Item
|
||||
@@ -51,7 +51,6 @@ teslaGun = defaultGun
|
||||
& useAim . aimSpeed .~ 0.4
|
||||
& useAim . aimStance .~ TwoHandFlat
|
||||
, _itFloorPict = teslaGunPic
|
||||
-- , _itZoom = defaultItZoom
|
||||
}
|
||||
teslaGunPic :: Item -> SPic
|
||||
teslaGunPic _ = noPic $ colorSH blue $
|
||||
@@ -80,11 +79,30 @@ lasGun = defaultAutoGun
|
||||
& useAim . aimRange .~ 1
|
||||
& useAim . aimStance .~ TwoHandTwist
|
||||
, _itFloorPict = lasGunPic
|
||||
, _itAttachment = ItCharMode $ Seq.fromList "/VZ"
|
||||
, _itScroll = scrollCharMode
|
||||
, _itInvDisplay = basicWeaponDisplay
|
||||
, _itParams = Refracting {_phaseVel = 1}
|
||||
, _itParams = Refracting {_phaseV = 1}
|
||||
, _itTweaks = Tweakable
|
||||
{ _tweakParams = IM.fromList [(0,lasGunTweak)]
|
||||
, _tweakSel = 0
|
||||
}
|
||||
}
|
||||
lasGunTweak :: TweakParam
|
||||
lasGunTweak = TweakParam
|
||||
{ _doTweak = thetweak
|
||||
, _curTweak = 1
|
||||
, _maxTweak = 3
|
||||
, _showTweak = showPhaseV
|
||||
, _nameTweak = "PHASE VELOCITY"
|
||||
}
|
||||
where
|
||||
thetweak 0 = itParams . phaseV .~ 0.2
|
||||
thetweak 1 = itParams . phaseV .~ 1
|
||||
thetweak 2 = itParams . phaseV .~ 5
|
||||
thetweak _ = id
|
||||
showPhaseV 0 = "V"
|
||||
showPhaseV 1 = "/"
|
||||
showPhaseV 2 = "Z"
|
||||
showPhaseV i = "THIS SHOULD NOT BE POSSIBLE" ++ show i
|
||||
|
||||
lasGunPic :: Item -> SPic
|
||||
lasGunPic it =
|
||||
( colorSH blue $
|
||||
@@ -133,24 +151,23 @@ aTeslaArc cr w = set randGen g w
|
||||
chooseColor _ = cyan
|
||||
|
||||
aLaser :: Creature -> World -> World
|
||||
aLaser cr = particles %~ (makeLaserAt phaseV pos dir : )
|
||||
aLaser cr = particles %~ (makeLaserAt phasev pos dir : )
|
||||
where
|
||||
pos = _crPos cr +.+ ((_crRad cr +3) *.* unitVectorAtAngle dir)
|
||||
dir = _crDir cr
|
||||
phaseV = charToPhaseV
|
||||
$ fromMaybe '/' $ Seq.lookup 0 =<< cr ^? crInv . ix j . itAttachment . itCharMode
|
||||
phasev = _phaseV . _itParams $ _crInv cr IM.! j
|
||||
j = _crInvSel cr
|
||||
|
||||
charToPhaseV :: Fractional p => Char -> p
|
||||
charToPhaseV 'V' = 0.2
|
||||
charToPhaseV '/' = 1
|
||||
charToPhaseV 'Z' = 5
|
||||
charToPhaseV _ = error "Trying to set an undefined phaseV"
|
||||
--charToPhaseV :: Fractional p => Char -> p
|
||||
--charToPhaseV 'V' = 0.2
|
||||
--charToPhaseV '/' = 1
|
||||
--charToPhaseV 'Z' = 5
|
||||
--charToPhaseV _ = error "Trying to set an undefined phaseV"
|
||||
|
||||
makeLaserAt :: Float -> Point2 -> Float -> Particle
|
||||
makeLaserAt phaseV pos dir = Particle
|
||||
makeLaserAt phasev pos dir = Particle
|
||||
{ _ptDraw = const blank
|
||||
, _ptUpdate = moveLaser phaseV pos dir
|
||||
, _ptUpdate = moveLaser phasev pos dir
|
||||
}
|
||||
moveLaser
|
||||
:: Float -- ^ Phase velocity, controls deflection through windows
|
||||
@@ -159,7 +176,7 @@ moveLaser
|
||||
-> World
|
||||
-> Particle
|
||||
-> (World, Maybe Particle)
|
||||
moveLaser phaseV pos dir w pt
|
||||
moveLaser phasev pos dir w pt
|
||||
= ( hitEffect w
|
||||
, Just pt {_ptDraw = const pic ,_ptUpdate = ptSimpleTime 0 }
|
||||
)
|
||||
@@ -183,7 +200,7 @@ moveLaser phaseV pos dir w pt
|
||||
angleInc = piRange $ argV wlNormal - argV (x -.- y)
|
||||
angleRef
|
||||
| reflectExternal = angleInc
|
||||
| otherwise = asin $ sin angleInc / phaseV
|
||||
| otherwise = asin $ sin angleInc / phasev
|
||||
piRange a'
|
||||
| a' > pi = a' - 2 * pi
|
||||
| a' > negate pi = a'
|
||||
@@ -194,9 +211,9 @@ moveLaser phaseV pos dir w pt
|
||||
angleInc' = piRange $ argV wlNormal' - argV (x -.- y)
|
||||
angleRef'
|
||||
| reflectInternal = angleInc'
|
||||
| otherwise = asin $ phaseV * sin angleInc'
|
||||
reflectInternal = 1 < abs (phaseV * sin angleInc')
|
||||
reflectExternal = 1 < abs (sin angleInc / phaseV)
|
||||
| otherwise = asin $ phasev * sin angleInc'
|
||||
reflectInternal = 1 < abs (phasev * sin angleInc')
|
||||
reflectExternal = 1 < abs (sin angleInc / phasev)
|
||||
|
||||
h' ws (_,Right wl) = not $ any (\w' -> _wlID w' == _wlID wl) ws
|
||||
h' _ _ = True
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
module Dodge.Item.Weapon.Bullet
|
||||
( basicBullet
|
||||
, incBullet
|
||||
, conBullet
|
||||
, bounceBullet
|
||||
, ltBullet
|
||||
, hvBullet
|
||||
) where
|
||||
@@ -10,11 +13,32 @@ import Dodge.Particle.Bullet.HitEffect
|
||||
import Geometry.Data
|
||||
basicBullet :: AmmoType
|
||||
basicBullet = BulletAmmo
|
||||
{ _amString = "BULLET"
|
||||
{ _amString = "BASIC"
|
||||
, _amBulEff = destroyOnImpact bulHitCr bulHitWall
|
||||
, _amBulWth = 2
|
||||
, _amBulVel = V2 50 0
|
||||
}
|
||||
incBullet :: AmmoType
|
||||
incBullet = BulletAmmo
|
||||
{ _amString = "INCENDIARY"
|
||||
, _amBulEff = destroyOnImpact bulIncCr bulIncWall
|
||||
, _amBulWth = 2
|
||||
, _amBulVel = V2 50 0
|
||||
}
|
||||
conBullet :: AmmoType
|
||||
conBullet = BulletAmmo
|
||||
{ _amString = "CONCUSSIVE"
|
||||
, _amBulEff = destroyOnImpact bulConCr bulConWall
|
||||
, _amBulWth = 2
|
||||
, _amBulVel = V2 50 0
|
||||
}
|
||||
bounceBullet :: AmmoType
|
||||
bounceBullet = BulletAmmo
|
||||
{ _amString = "BOUNCING"
|
||||
, _amBulEff = destroyOnImpact bulHitCr bulBounceWall
|
||||
, _amBulWth = 2
|
||||
, _amBulVel = V2 10 0
|
||||
}
|
||||
ltBullet :: AmmoType
|
||||
ltBullet = BulletAmmo
|
||||
{ _amString = "LTBULLET"
|
||||
|
||||
@@ -12,6 +12,7 @@ module Dodge.Item.Weapon.BulletGuns
|
||||
)
|
||||
where
|
||||
import Dodge.Data
|
||||
import Dodge.TweakBullet
|
||||
import Dodge.Default.Weapon
|
||||
import Dodge.Default
|
||||
import Dodge.Item.Attachment
|
||||
@@ -67,7 +68,12 @@ autoGun = defaultAutoGun
|
||||
, _itAttachment = ItCharMode $ Seq.fromList "MS"
|
||||
, _itScroll = scrollCharMode
|
||||
, _itInvDisplay = basicWeaponDisplay
|
||||
, _itParams = SingleBarrel autogunSpread
|
||||
, _itParams = BulletShooter
|
||||
{ _muzVel = 1
|
||||
, _bore = 2
|
||||
, _gunBarrels = SingleBarrel 0.1
|
||||
}
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
}
|
||||
autoGunPic :: Item -> SPic
|
||||
autoGunPic it = noPic $
|
||||
@@ -105,7 +111,12 @@ pistol = defaultGun
|
||||
, _itInvDisplay = basicWeaponDisplay
|
||||
, _itInvColor = white
|
||||
, _itTargeting = Nothing
|
||||
, _itParams = SingleBarrel 0.05
|
||||
, _itParams = BulletShooter
|
||||
{ _muzVel = 0.8
|
||||
, _bore = 2
|
||||
, _gunBarrels = SingleBarrel 0.05
|
||||
}
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
}
|
||||
pistolPic :: Item -> SPic
|
||||
pistolPic it = noPic $ colorSH green (prismPoly
|
||||
@@ -177,7 +188,12 @@ ltAutoGun = defaultAutoGun
|
||||
, modClock 2 withMuzFlareI
|
||||
]
|
||||
, _itFloorPict = ltAutoGunPic
|
||||
, _itParams = SingleBarrel 0.1
|
||||
, _itParams = BulletShooter
|
||||
{ _muzVel = 1
|
||||
, _bore = 2
|
||||
, _gunBarrels = SingleBarrel autogunSpread
|
||||
}
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
}
|
||||
& itDimension . muzzleLength .~ 10
|
||||
ltAutoGunPic :: Item -> SPic
|
||||
@@ -239,6 +255,7 @@ miniGun = defaultAutoGun
|
||||
& useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
||||
, _itFloorPict = miniGunPictItem
|
||||
, _itEquipPict = pictureWeaponAim miniGunPictItem
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
} & itDimension . muzzleLength .~ 15
|
||||
where
|
||||
recoilAmount = 5
|
||||
@@ -299,11 +316,16 @@ spreadGun = defaultGun
|
||||
, withMuzFlareI
|
||||
, spreadNumI
|
||||
]
|
||||
, _itParams = MultiBarrel
|
||||
{_barrelNum = 5
|
||||
,_barrelSpread = SpreadBarrels 0.5
|
||||
, _itParams = BulletShooter
|
||||
{ _muzVel = 0.7
|
||||
, _bore = 2
|
||||
, _gunBarrels = MultiBarrel
|
||||
{_brlNum = 5
|
||||
,_brlSpread = SpreadBarrels 0.5
|
||||
}
|
||||
}
|
||||
, _itFloorPict = spreadGunPic
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
}
|
||||
spreadGunPic :: Item -> SPic
|
||||
spreadGunPic it =
|
||||
@@ -338,10 +360,15 @@ multGun = defaultGun
|
||||
& useAim . aimStance .~ TwoHandTwist
|
||||
& useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
|
||||
, _itFloorPict = multGunSPic
|
||||
, _itParams = MultiBarrel
|
||||
{_barrelNum = 5
|
||||
,_barrelSpread = AlignedBarrels
|
||||
, _itParams = BulletShooter
|
||||
{ _muzVel = 1
|
||||
, _bore = 3
|
||||
, _gunBarrels = MultiBarrel
|
||||
{_brlNum = 5
|
||||
,_brlSpread = AlignedBarrels
|
||||
}
|
||||
}
|
||||
, _itTweaks = defaultBulletSelTweak
|
||||
}
|
||||
multGunSPic :: Item -> SPic
|
||||
multGunSPic it =
|
||||
|
||||
@@ -21,7 +21,7 @@ import Dodge.Picture.Layer
|
||||
import Geometry
|
||||
import Picture
|
||||
import qualified IntMapHelp as IM
|
||||
import Padding
|
||||
--import Padding
|
||||
import ShapePicture
|
||||
import Shape
|
||||
|
||||
@@ -59,12 +59,14 @@ launcher = defaultGun
|
||||
, _itFloorPict = launcherPic
|
||||
, _itEffect = NoItEffect
|
||||
, _itParams = ShellLauncher
|
||||
{ _tweakSel = 0
|
||||
, _tweakParams = basicAmPjMoves
|
||||
, _shellSpinDrag = 1
|
||||
{ _shellSpinDrag = 1
|
||||
, _shellSpinAmount = 2
|
||||
, _shellThrustDelay = 1
|
||||
}
|
||||
, _itTweaks = Tweakable
|
||||
{ _tweakSel = 0
|
||||
, _tweakParams = basicAmPjMoves
|
||||
}
|
||||
}
|
||||
|
||||
defaultShellAmmo :: AmmoType
|
||||
@@ -92,24 +94,25 @@ spinDrag :: TweakParam
|
||||
spinDrag = TweakParam
|
||||
{ _doTweak = \i -> itParams . shellSpinDrag .~ i
|
||||
, _curTweak = 1
|
||||
, _showTweak = pjPadText "SPIN SLOWDOWN" . show
|
||||
, _showTweak = show
|
||||
, _maxTweak = 5
|
||||
, _nameTweak = "SPIN SLOWDOWN"
|
||||
}
|
||||
pjPadText :: String -> String -> String
|
||||
pjPadText s = (rightPad 12 ' ' s ++ ) . (' ':)
|
||||
spinStart :: TweakParam
|
||||
spinStart = TweakParam
|
||||
{ _doTweak = \i -> itParams . shellSpinAmount .~ i
|
||||
, _curTweak = 2
|
||||
, _showTweak = pjPadText "SPIN AMOUNT" . show
|
||||
, _showTweak = show
|
||||
, _maxTweak = 5
|
||||
, _nameTweak = "SPIN AMOUNT"
|
||||
}
|
||||
thrustParam :: TweakParam
|
||||
thrustParam = TweakParam
|
||||
{ _doTweak = \i -> itParams . shellThrustDelay .~ i
|
||||
, _curTweak = 1
|
||||
, _showTweak = pjPadText "THRUST DELAY" . show
|
||||
, _showTweak = show
|
||||
, _maxTweak = 5
|
||||
, _nameTweak = "THRUST DELAY"
|
||||
}
|
||||
|
||||
pjThrust :: Int -> Prop -> World -> World
|
||||
|
||||
@@ -48,8 +48,9 @@ poisonSprayer = defaultAutoGun
|
||||
& useAim . aimSpeed .~ 0.2
|
||||
& useAim . aimRange .~ 0
|
||||
& useAim . aimStance .~ TwoHandTwist
|
||||
, _itParams = MultiBarrel {_barrelSpread = SpreadBarrels 0.2
|
||||
, _barrelNum = 3
|
||||
, _itParams = Sprayer
|
||||
{ _nozzleSpread = 0.2
|
||||
, _nozzleNum = 3
|
||||
}
|
||||
, _itFloorPict = flamerPic
|
||||
}
|
||||
|
||||
@@ -320,7 +320,7 @@ withMuzFlareI f it cr w = makeTlsTimeRadColPos 3 100 (V3 1 1 0.5) flashPos
|
||||
applyInaccuracy :: ChainEffect
|
||||
applyInaccuracy f it cr w = f it (cr & crDir +~ a) $ set randGen g w
|
||||
where
|
||||
acc = _inaccuracy $ _itParams it
|
||||
acc = _brlInaccuracy . _gunBarrels $ _itParams it
|
||||
(a, g) = randomR (-acc,acc) $ _randGen w
|
||||
{- | Applies the effect to a randomly rotated creature. -}
|
||||
withRandomDirI
|
||||
@@ -391,8 +391,8 @@ spreadNumI eff item cr w = foldr f w dirs
|
||||
[-spread,-spread+(2*spread/fromIntegral numBul)..spread]
|
||||
(randomRs (0,spread/fromIntegral numBul) (_randGen w))
|
||||
f dir = eff item (cr & crDir +~ dir)
|
||||
spread = _spreadAngle . _barrelSpread $ _itParams item
|
||||
numBul = _barrelNum $ _itParams item
|
||||
spread = _spreadAngle . _brlSpread . _gunBarrels $ _itParams item
|
||||
numBul = _brlNum . _gunBarrels $ _itParams item
|
||||
numI :: ChainEffect
|
||||
numI eff item cr w = foldr f w poss
|
||||
where
|
||||
@@ -401,7 +401,7 @@ numI eff item cr w = foldr f w poss
|
||||
poss :: [V2 Float]
|
||||
poss = map (rotateV (_crDir cr) . V2 0 . (*5) . (+ cp) . fromIntegral) [0 .. numBul - 1]
|
||||
f pos = eff item (cr & crPos %~ (+.+ pos))
|
||||
numBul = _barrelNum $ _itParams item
|
||||
numBul = _brlNum . _gunBarrels $ _itParams item
|
||||
{- | Uses '_wpSpread' as a parameter for the current offset angle. -}
|
||||
randWalkAngle
|
||||
:: (Creature -> World -> World) -- ^ Underlying effect
|
||||
|
||||
Reference in New Issue
Block a user