{-# LANGUAGE TupleSections #-} module Dodge.Combine.Combinations ( itemCombinations , flatItemCombinations , bulletWeapons ) where --import Data.Bifunctor import Dodge.Item.Ammo import Dodge.Data.Item import Dodge.Item import LensHelp watchCombinations :: [([(ItAmount, ItemType)], Item)] watchCombinations = [ po [LEFT STOPWATCH, LEFT REWINDWATCH] scrollWatch , po [CRAFT TIMEMODULE, CRAFT MICROCHIP, CRAFT HARDDRIVE] scrollWatch , po [CRAFT TIMEMODULE, CRAFT MICROCHIP, CRAFT RAM] scrollWatch ] where po xs it = (map o xs, it) o = (1,) backpackCombinations :: [([(ItAmount,ItemType)],Item)] backpackCombinations = [ po [CRAFT HOSE, CRAFT STEELDRUM] fuelPack ] where po xs it = (map o xs, it) o = (1,) --hatCombinations :: [([(ItAmount,ItemBaseType)],Item)] --hatCombinations = -- [ po [EQUIP HAT, CRAFT (TARGETMODULE tt)] (targetingHat tt) | tt <- [minBound..] -- ] -- where -- po xs it = (map o xs, it) -- o = (1,) magazineCombinations :: [([(ItAmount,ItemType)],Item)] magazineCombinations = [ po [CRAFT TIN, CRAFT SPRING] tinMag ] where po xs it = (map o xs, it) o = (1,) flatItemCombinations :: [([ItemType], Item)] flatItemCombinations = map (over _1 (concatMap f)) itemCombinations where f (x,it) = replicate (_getItAmount x) it itemCombinations :: [([(ItAmount, ItemType)], Item)] itemCombinations = watchCombinations ++ backpackCombinations ++ -- hatCombinations ++ magazineCombinations ++ [ po [CRAFT PIPE, CRAFT HARDWARE] (bangStick 1) , po [HELD (BANGSTICK 1), CRAFT TIN] pistol , po [HELD PISTOL, CRAFT SPRING] autoPistol , po [HELD AUTOPISTOL, cr PLANK] smg , po [HELD AUTOPISTOL, cr SPRING] machinePistol , po [cr CAN, cr HARDWARE] bangCone , po [HELD BANGCONE, cr PLANK] blunderbuss , po [HELD BLUNDERBUSS, cr STEELDRUM] (grapeCannon 1) , po [HELD (BANGSTICK 1), cr PLANK] rifle , po [HELD (BANGSTICK 1), HELD (BANGSTICK 1), HELD (BANGSTICK 1)] (volleyGun 3) -- , po [HELD RIFLE, cr TIN] repeater , po [HELD RIFLE, cr SPRING] autoRifle , po [HELD RIFLE, cr CAN] burstRifle ] ++ [ po [cr MOTOR, HELD (VOLLEYGUN i)] $ miniGunX i | i <- [3 .. 10] ] ++ [ po [HELD AMR, cr PIPE] sniperRifle , po [HELD RIFLE, cr PIPE] amr , po [HELD AMR, cr SPRING] autoAmr -- , po [HELD AMR, cr MOTOR] machineGun , p [p 2 $ cr TUBE, o $ cr HARDWARE] launcher , p [p 2 $ cr TUBE, o $ HELD LAUNCHER] (launcherX 2) ] ++ [p [p 2 $ cr TUBE, o $ HELD (LAUNCHERX i)] (launcherX (i + 1)) | i <- [2 .. 9]] ++ [ po [cr LIGHTER, cr PUMP, cr CAN] flameSpitter , po [HELD FLAMESPITTER, cr CAN, cr PUMP] blowTorch , po [HELD FLAMESPITTER, cr STEELDRUM] flameThrower , po [HELD FLAMETHROWER, cr STEELDRUM] flameWall , po [HELD FLAMETHROWER, cr PUMP] flameTorrent , p [o $ cr PRISM, o $ cr TRANSFORMER, o $ cr PIPE] laser -- , po [HELD LASGUN, HELD LASGUN, cr HARDWARE] dualBeam -- , po [HELD LASGUN, cr TRANSFORMER] (lasWide 2) -- , po [HELD LASGUN, HELD LASGUN, HELD LASGUN, cr HARDWARE] lasCircle , p [o $ cr TRANSFORMER, p 2 $ cr CAN] sparkGun , p [o (HELD SPARKGUN), p 2 $ cr PIPE] teslaGun , p [o $ cr TELEPORTMODULE, p 2 $ cr MICROCHIP] blinkGun , p [o $ LEFT BLINKER, p 2 $ cr MICROCHIP] unsafeBlinkGun , po [cr MAGNET, cr TIN] magShield , p [p 2 $ cr PIPE, o $ cr PLATE, o $ cr MOTOR] powerLegs , p [p 4 $ cr CAN] plateCraft , p [p 3 $ cr TIN] plateCraft , p [p 2 $ cr STEELDRUM] plateCraft , p [p 2 $ cr PLATE] flatShield , po [cr MICROCHIP, cr PRISM] (makeTypeCraft LIGHTSENSOR) , po [cr MICROCHIP, cr MICROPHONE] (makeTypeCraft SOUNDSENSOR) , po [cr MICROCHIP, cr THERMOMETER] (makeTypeCraft HEATSENSOR) , po [cr MICROCHIP, cr TRANSMITTER, cr LIGHTSENSOR] (clickDetector ITEMDETECTOR) , po [cr MICROCHIP, cr TRANSMITTER, cr SOUNDSENSOR] (clickDetector WALLDETECTOR) , po [cr MICROCHIP, cr TRANSMITTER, cr HEATSENSOR] (clickDetector CREATUREDETECTOR) , po [AMMOMAG BATTERY, cr LED] torch , po [hd TORCH, eq HAT] headLamp -- , po [cr LIGHTER, cr THERMOMETER, cr MICROCHIP] (energyBallCraft IncBall) -- , po [cr TRANSFORMER, AMMOMAG BATTERY, cr MICROCHIP] (energyBallCraft TeslaBall) ] -- ++ map (\i -> po [HELD (LASWIDE i), cr TRANSFORMER] $ lasWide (i + 1)) [2 .. 9] ++ map (\i -> po [cr PIPE, HELD (BANGSTICK i)] $ bangStick (i + 1)) [1 .. 8] ++ map (\i -> po [hd (VOLLEYGUN i), HELD (BANGSTICK 1)] $ volleyGun (i + 1)) [3 .. 5] ++ map (\i -> po [hd (MINIGUNX i), HELD (BANGSTICK 1)] $ miniGunX (i + 1)) [3 .. 15] ++ map (\i -> po [hd (GRAPECANNON i), cr STEELDRUM] $ grapeCannon (i + 1)) [1, 2, 3] -- ++ [ po (_iyBase (_itType it) : mtype) $ it & itType . iyModules . ix modtype .~ m -- | (modtype, is, ms) <- moduleCombinations -- , it <- is -- , (mtype, m) <- ms -- ] where p = (,) po xs it = (map o xs, it) o = (1,) cr = CRAFT hd = HELD eq = EQUIP -- so there are two requirements for a module combination: the module slot must -- exist on the item, and the item must be in the given list below -- these two requirements should probably be combined --moduleCombinations :: [(ModuleSlot, [Item], [([ItemBaseType], ItemModuleType)])] --moduleCombinations = -- [ -- ( ModHeldAttach -- , -- [ rifle -- , autoRifle -- , burstRifle -- ] -- , -- [ amod [cr TAPE, HELD TORCH] ATTACHTORCH -- ] -- ) -- , -- ( ModAutoMag -- , -- [ autoRifle -- , autoPistol -- , smg -- ] -- , -- [ amod [cr MAGNET, cr HARDWARE] MAGNETMAG -- ] -- ) -- , -- ( ModBulletCollision -- , bulletWeapons -- , -- [ amod [cr (BULBODYCRAFT be)] (BULBODY be) | be <- [minBound..] -- ] -- ) -- , -- ( ModBulletPayload -- , bulletMagazines -- , -- [ amod [cr (ENERGYBALLCRAFT x)] (BULPAY (BulBall x)) | x <- [minBound ..] -- ] ++ -- [ amod [cr GASINJECTOR] (BULPAY BulGas) -- , amod [cr FRAGCRAFT] (BULPAY BulFrag) -- , amod [cr FLAKCRAFT] (BULPAY BulFlak) -- ] -- ) -- , -- ( ModTarget -- , homingLaunchers ++ bulletWeapons -- , -- [ amod [cr MICROCHIP, cr HEATSENSOR] (TARGET TargetRBCreature) -- , amod [cr MICROCHIP, cr LIGHTSENSOR] (TARGET TARGETLASER) -- , amod [cr MICROCHIP, cr SOUNDSENSOR] (TARGET TargetRBPress) -- ] -- ) -- , -- ( ModBulletTrajectory -- , bulletWeapons -- , -- [ amod [cr MAGNET, cr MICROCHIP, cr HARDWARE] (BULTRAJ MagnetTrajectoryType) -- , amod [cr MICROCHIP, cr HARDWARE] (BULTRAJ FlechetteTrajectoryType) -- , amod [cr ANTIMATTER, cr HARDWARE] (BULTRAJ BezierTrajectoryType) -- ] -- ) -- , -- ( ModDualBeam -- ,[] ---- , [dualBeam] -- , -- [ amod [cr (ENERGYBALLCRAFT IncBall)] INCENDLAS -- , amod [cr TRANSFORMER] SPLITLAS -- , amod [cr (ENERGYBALLCRAFT TeslaBall)] STATICLAS -- ] -- ) ---- , ---- ( ModTeleport ---- , teleportableWeapons ---- , ---- [ amod [cr TELEPORTMODULE, cr MICROCHIP] WEPTELE ---- ] ---- ) -- , -- ( ModLauncherHoming -- , homingLaunchers -- , -- [ amod [cr MICROCHIP, cr TRANSMITTER] LAUNCHHOME -- ] -- ) -- -- ] -- where -- amod = (,) -- cr = CRAFT --batteryGuns :: [Item] --batteryGuns = -- [ teslaGun -- , sparkGun -- , lasGun -- ] -- ++ [ lasWide i | i <- [2 .. 10] -- ] --teleportableWeapons :: [Item] --teleportableWeapons = bulletWeapons ++ batteryGuns ++ homingLaunchers --bulletMagazines :: [Item] --bulletMagazines = -- [tinMag -- ,revolveMag -- ,drumMag -- ,beltMag -- ] bulletWeapons :: [Item] bulletWeapons = [bangStick i | i <- [1 .. 9]] ++ [volleyGun i | i <- [3 .. 6]] ++ [miniGunX i | i <- [3 .. 16]] ++ [grapeCannon i | i <- [1, 2, 3, 4]] ++ [ pistol , autoPistol , smg , machinePistol , rifle -- , repeater , autoRifle , burstRifle , bangCone , blunderbuss -- , machineGun , elephantGun , sniperRifle , amr , autoAmr , bangRod ]