Files
loop/src/Dodge/Combine/Combinations.hs
T

269 lines
8.7 KiB
Haskell

{-# LANGUAGE TupleSections #-}
module Dodge.Combine.Combinations
( itemCombinations
, bulletWeapons
) where
import Dodge.Data.Item
import Dodge.Item
import LensHelp
watchCombinations :: [([(ItAmount, ItemBaseType)], 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,ItemBaseType)],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,)
itemCombinations :: [([(ItAmount, ItemBaseType)], Item)]
itemCombinations =
watchCombinations ++
backpackCombinations ++
hatCombinations ++
[ 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 [HELD (BANGSTICK 1), cr CAN] revolver
, po [HELD REVOLVER, cr SPRING] $ revolverX 1
, 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 REPEATER, cr SPRING] autoRifle
, po [HELD REPEATER, 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] lasGun
, 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] (autoDetector ITEMDETECTOR)
, po [cr MICROCHIP, cr TRANSMITTER, cr SOUNDSENSOR] (autoDetector WALLDETECTOR)
, po [cr MICROCHIP, cr TRANSMITTER, cr HEATSENSOR] (autoDetector CREATUREDETECTOR)
, po [cr BATTERY, cr LED] torch
, po [hd TORCH, eq HAT] headLamp
, po [cr LIGHTER, cr THERMOMETER, cr MICROCHIP] (energyBallCraft IncBall)
, po [cr TRANSFORMER, cr 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 (REVOLVERX i), cr CAN] $ revolverX (i + 1)) [1 .. 5]
++ 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 =
[
( ModRifleMag
,
[ repeater
, autoRifle
, burstRifle
]
,
[ amod [cr STEELDRUM, cr HARDWARE] DRUMMAG
, amod [cr MOTOR, cr HARDWARE] BELTMAG
]
)
,
( 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
, bulletWeapons
,
[ 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
]
)
,
( ModBattery
, batteryGuns
,
[ amod [cr BATTERY] EXTRABATTERY
]
)
]
where
amod = (,)
cr = CRAFT
homingLaunchers :: [Item]
homingLaunchers = launcher : [launcherX i | i <- [2 .. 10]]
batteryGuns :: [Item]
batteryGuns =
[ teslaGun
, sparkGun
, lasGun
]
++ [ lasWide i | i <- [2 .. 10]
]
teleportableWeapons :: [Item]
teleportableWeapons = bulletWeapons ++ batteryGuns ++ homingLaunchers
bulletWeapons :: [Item]
bulletWeapons =
[bangStick i | i <- [1 .. 9]]
++ [volleyGun i | i <- [3 .. 6]]
++ [revolverX i | i <- [1 .. 5]]
++ [miniGunX i | i <- [3 .. 16]]
++ [grapeCannon i | i <- [1, 2, 3, 4]]
++ [ pistol
, autoPistol
, smg
, machinePistol
, revolver
, rifle
, repeater
, autoRifle
, burstRifle
, bangCone
, blunderbuss
, machineGun
, elephantGun
, sniperRifle
, amr
, autoAmr
, bangRod
]