234 lines
7.9 KiB
Haskell
234 lines
7.9 KiB
Haskell
{-# LANGUAGE TupleSections #-}
|
|
module Dodge.Combine.Combinations where
|
|
import Geometry
|
|
import Dodge.Data
|
|
import Dodge.WorldEvent.SpawnParticle
|
|
import Dodge.Particle.HitEffect.ExpireAndDamage
|
|
import Dodge.Particle.Damage
|
|
import Dodge.Item.Equipment
|
|
import Dodge.Item.Craftable
|
|
import Dodge.Item.Weapon
|
|
import Dodge.Base
|
|
import LensHelp
|
|
|
|
import Data.Maybe
|
|
|
|
itemCombinations :: [([(Int,CombineType)],Item)]
|
|
itemCombinations =
|
|
[ po [PIPE, HARDWARE] (bangStick 1)
|
|
, po [BANGSTICK 1, TIN] pistol
|
|
, po [PISTOL, SPRING, HARDWARE] autoPistol
|
|
, po [AUTOPISTOL, PLANK, HARDWARE] smg
|
|
, po [AUTOPISTOL, HARDWARE] machinePistol
|
|
, po [BANGSTICK 1,CAN] revolver
|
|
, po [REVOLVER, SPRING, HARDWARE] $ revolverX 1
|
|
|
|
, po [TUBE,HARDWARE] bangCone
|
|
, po [BANGCONE,PLANK] blunderbuss
|
|
, po [BLUNDERBUSS,TUBE] bigBlunderbuss
|
|
, po [BIGBLUNDERBUSS,TUBE] biggerBlunderbuss
|
|
, po [BIGGERBLUNDERBUSS,TUBE] biggestBlunderbuss
|
|
, po [BANGCONE,PUMP,HARDWARE] $ grenadeLauncher 1
|
|
, po [GRENADELAUNCHER 1,MOTOR,DRUM] $ grenadeLauncher 2
|
|
|
|
, p [p 2 PIPE,o HARDWARE] bangCane
|
|
, p [p 2 PIPE,o BANGCANE] (bangCaneX 2)
|
|
, po [BANGCANE,TIN] rifle
|
|
, po [RIFLE,PLANK] repeater
|
|
, po [REPEATER,SPRING,HARDWARE] autoRifle
|
|
, po [REPEATER,SPRING,CAN] burstRifle
|
|
, po [BURSTRIFLE,SPRING,HARDWARE] fastBurstRifle
|
|
, po [FASTBURSTRIFLE,SPRING,HARDWARE] completeBurstRifle
|
|
, po [MOTOR,BANGCANEX 3] $ miniGunX 3
|
|
, po [MOTOR,BANGCANEX 4] $ miniGunX 4
|
|
, po [MOTOR,BANGCANEX 5] $ miniGunX 5
|
|
, po [MOTOR,BANGCANEX 6] $ miniGunX 6
|
|
|
|
, p [p 3 PIPE,o HARDWARE] bangRod
|
|
, po [BANGROD,PLANK,HARDWARE] elephantGun
|
|
, po [ELEPHANTGUN,HARDWARE,PRISM] sniperRifle
|
|
, po [ELEPHANTGUN,HARDWARE,TIN] amr
|
|
, po [AMR,HARDWARE,SPRING] autoAmr
|
|
, po [BANGROD,PLATE,DRUM,MOTOR] machineGun
|
|
|
|
, p [p 2 TUBE,o HARDWARE] launcher
|
|
, p [p 2 TUBE,o LAUNCHER] (launcherX 2)
|
|
] ++ [ p [p 2 TUBE,o $ LAUNCHERX i] (launcherX (i+1)) | i <- [2..9]]
|
|
++
|
|
[ po [LIGHTER,PUMP,CAN] flameSpitter
|
|
, po [FLAMESPITTER,CAN,PUMP] blowTorch
|
|
, po [FLAMESPITTER,DRUM] flameThrower
|
|
, po [FLAMETHROWER,DRUM] flameWall
|
|
, po [FLAMETHROWER,PUMP] flameTorrent
|
|
|
|
, p [o PRISM,o TRANSFORMER,o PIPE] lasGun
|
|
, p [o LASGUN,o PRISM] lasGunSway
|
|
, p [o LASGUN,o HARDWARE] lasGunSwing
|
|
-- , p [o LASGUN,o PIPE] lasGunPulse
|
|
, p [o LASGUN,p 2 PIPE] lasGunDual
|
|
, p [o LASGUN,o PIPE, o PRISM] lasGunWidePulse
|
|
, p [o LASGUN,o TRANSFORMER,o PRISM] (lasGunWide 2)
|
|
|
|
, p [o TRANSFORMER,p 2 CAN] sparkGun
|
|
, p [o SPARKGUN,p 2 PIPE] teslaGun
|
|
|
|
, p [o TELEPORTMODULE,p 2 MICROCHIP] blinkGun
|
|
|
|
, po [MAGNET,TIN] magShield
|
|
|
|
, p [p 2 PIPE,o PLATE,o MOTOR] powerLegs
|
|
|
|
, p [p 4 CAN] plateCraft
|
|
, p [p 3 TIN] plateCraft
|
|
, p [p 2 DRUM] plateCraft
|
|
|
|
, p [p 2 PLATE] flatShield
|
|
]
|
|
++ map (\i -> po [LASGUNWIDE i,TRANSFORMER,PRISM] $ lasGunWide (i+1)) [1..9]
|
|
++ map (\i -> po [LASGUNWIDE i,HARDWARE] $ lasGunFocus i) [1..10]
|
|
++ map (\i -> po [PIPE,BANGSTICK i] $ bangStick (i+1)) [1..8]
|
|
++ map (\i -> po [REVOLVERX i,CAN] $ revolverX (i+1)) [1..5]
|
|
++ map (\i -> p [o (BANGCANEX i),p 2 PIPE] $ bangCaneX (i+1)) [1..5]
|
|
++ map (\i -> po [MINIGUNX i,BANGCANE] $ miniGunX (i+1)) [3..15]
|
|
++ [ po (_itType it:mtype) $ it & itModules . ix modtype .~ m
|
|
| (modtype,is,ms) <- moduleCombinations
|
|
, it <- is
|
|
, (mtype,m) <- ms
|
|
]
|
|
where
|
|
p = (,)
|
|
po xs it = (map o xs,it)
|
|
o = (1,)
|
|
|
|
moduleCombinations :: [( ModuleSlot, [Item], [([CombineType],ItemModule)] )]
|
|
moduleCombinations =
|
|
[ ( ModRifleMag
|
|
, [repeater
|
|
,autoRifle
|
|
,burstRifle
|
|
,fastBurstRifle
|
|
]
|
|
, [amod [DRUM,HARDWARE] "+DRUM MAG" (itConsumption . ammoBaseMax .~ 45)
|
|
,amod [MOTOR,HARDWARE] "+BELT FEED" (itConsumption . ammoBaseMax .~ 150)
|
|
]
|
|
)
|
|
, ( ModAutoMag
|
|
, [autoRifle
|
|
,autoPistol
|
|
,smg
|
|
]
|
|
, [amod [MAGNET,HARDWARE] "+MAGNET FEED" (itUse . useDelay . rateMax .~ 4)
|
|
]
|
|
)
|
|
, ( ModBullet
|
|
, bulletWeapons
|
|
, [amod [INCENDIARYMODULE] "+INCENDIARY" (f $ expireAndDamage $ spawnAtBulDams incBall)
|
|
,amod [BOUNCEMODULE] "+BOUNCE" (f $ expireAndDamage bounceBulDams)
|
|
,amod [STATICMODULE] "+STATIC" (f $ expireAndDamage $ spawnAtBulDams aStaticBall)
|
|
,amod [CONCUSSMODULE] "+CONCUSS" (f $ expireAndDamage $ spawnAtBulDams concBall)
|
|
]
|
|
)
|
|
, ( ModTarget
|
|
, homingLaunchers ++ bulletWeapons
|
|
, [amod [MICROCHIP,CREATURESENSOR] "+CREATURETARGETING" (itTargeting .~ targetRBCreature)
|
|
,amod [MICROCHIP,PRISM] "+LASERTARGETING" (itTargeting .~ targetLaser)
|
|
,amod [MICROCHIP,TIN] "+POSTIONALTARGETING" (itTargeting .~ targetRBPress)
|
|
]
|
|
)
|
|
, ( ModBulletTrajectory
|
|
, bulletWeapons
|
|
, [amod [MAGNET,MICROCHIP,HARDWARE] "+MAGNETTRAJECTORY"
|
|
( (itConsumption . aoType . amBulTraj .~ MagnetTrajectory)
|
|
. (itConsumption . aoType . amBulVel .~ V2 10 0)
|
|
)
|
|
,amod [MICROCHIP,HARDWARE] "+FLECHETTETRAJECTORY"
|
|
(itConsumption . aoType . amBulTraj .~ FlechetteTrajectory)
|
|
,amod [ANTIMATTER,HARDWARE] "+BEZIERTRAJECTORY"
|
|
(itConsumption . aoType . amBulTraj .~ BezierTrajectory)
|
|
]
|
|
)
|
|
, ( ModDualBeam
|
|
, [lasGunDual]
|
|
, [amod [INCENDIARYMODULE] "+INCENDIARY" (itParams . lasBeam .~ BeamCombine flameBeamCombine)
|
|
,amod [STATICMODULE] "+STATIC"
|
|
( (itParams . lasBeam .~ BeamCombine teslaBeamCombine)
|
|
. (itParams . subParams ?~ teslaParams)
|
|
)
|
|
,amod [TRANSFORMER] "+SPLIT" (itParams . lasBeam .~ BeamCombine splitBeamCombine)
|
|
]
|
|
)
|
|
, ( ModTeleport
|
|
, teleportableWeapons
|
|
, [amod [TELEPORTMODULE,MICROCHIP] "+DIRECTEDTELE" makeDirectedTele
|
|
]
|
|
)
|
|
, ( ModLauncherHoming
|
|
, homingLaunchers
|
|
, [ amod [MICROCHIP,TRANSMITTER] "+TARGET HOMING"
|
|
(itConsumption . aoType . amPjCreation .~ fireTrackingShell)
|
|
]
|
|
)
|
|
, ( ModBattery
|
|
, batteryGuns
|
|
, [amod [BATTERY] "+BATTERY" (itConsumption . ammoBaseMax +~ 1000)
|
|
]
|
|
)
|
|
]
|
|
where
|
|
makeDirectedTele it = it
|
|
& itTargeting .~ targetRBPress
|
|
& itUse . useMods .:~ withPosDirWallCheck directedTelPos
|
|
-- for the camera: the simplest option is to remove all zoom/offset
|
|
& itUse . useAim . aimZoom . itZoomFac .~ 1
|
|
& itUse . useAim . aimRange .~ 0
|
|
-- a better option would be to involve a "scope" centered on the firing
|
|
-- position
|
|
directedTelPos it cr w = (p,a)
|
|
where
|
|
p = fromMaybe (_crPos cr) $ it ^? itTargeting . tgPos . _Just
|
|
a = argV (mouseWorldPos w -.- p)
|
|
f ameff = itConsumption . aoType . amBulEff .~ ameff
|
|
amod cts str func = (cts,ItemModule [str] 1 func)
|
|
|
|
homingLaunchers :: [Item]
|
|
homingLaunchers = launcher : [launcherX i | i <- [2..10]]
|
|
|
|
batteryGuns :: [Item]
|
|
batteryGuns =
|
|
[ teslaGun
|
|
, sparkGun
|
|
, lasGun
|
|
, lasGunSway
|
|
, lasGunSwing
|
|
] ++
|
|
[ lasGunWide i | i <- [1..10]
|
|
] ++
|
|
[ lasGunFocus i | i <- [1..10]]
|
|
|
|
teleportableWeapons :: [Item]
|
|
teleportableWeapons = bulletWeapons ++ batteryGuns ++ homingLaunchers
|
|
|
|
bulletWeapons :: [Item]
|
|
bulletWeapons = [bangStick i | i <- [1..9] ]
|
|
++ [bangCaneX i | i <- [1..6] ]
|
|
++ [revolverX i | i <- [1..5] ]
|
|
++ [miniGunX i | i <- [3..16] ]
|
|
++ [bangCane
|
|
,pistol
|
|
,autoPistol
|
|
,smg
|
|
,machinePistol
|
|
,revolver
|
|
,rifle
|
|
,repeater
|
|
,autoRifle
|
|
,burstRifle
|
|
,fastBurstRifle
|
|
,completeBurstRifle
|
|
,bangCone
|
|
,blunderbuss
|
|
,bigBlunderbuss
|
|
,biggerBlunderbuss
|
|
,biggestBlunderbuss
|
|
]
|