{-# 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 ]