module Substances (Gas(..), Material(..), Chromalite(..), Solid(..), materialValue, MaterialValue(..), Substance, substances, prettySubstance, printSubstances, gasWeight, chromaliteAlignment, chromalitePotency) where import Alignment import Data.List import Data.Ord data Substance = GasSubstance Gas | MaterialSubstance Material | ChromaliteSubstance Chromalite deriving (Read,Show,Eq,Ord) substances :: [Substance] substances = map GasSubstance [minBound..maxBound] ++ map MaterialSubstance [minBound..maxBound] ++ map ChromaliteSubstance [minBound..maxBound] prettySubstance :: Substance -> String prettySubstance (GasSubstance x) = show x prettySubstance (MaterialSubstance x) = show x prettySubstance (ChromaliteSubstance x) = show x printSubstances :: IO () printSubstances = putStrLn $ unlines $ map (\(x,y) -> prettySubstance y ++ ": " ++ show x) $ sortBy (comparing fst) $ map (\x -> (substanceValue x,x)) substances data Solid = MaterialSolid Material | ChromaliteSolid Chromalite deriving (Read,Show,Eq,Ord) data Gas = Hydrogen | Helium | Oxygen | Nitrogen | Flourine | Neon | Argon | Krypton | Xenon | Radon | Chlorine deriving (Eq,Enum,Ord,Show,Read,Bounded) data Material = Aluminum | Titanium | Palladium | Molybdenum | Lead | Copper | Iron | Cobalt | Zirconium | Gold | Silver | Platinum | Zinc | Uranium | Plutonium | Thorium | Diamond | Carbon | Wood | Plastic deriving (Eq,Enum,Ord,Show,Read,Bounded) -- -- Chromalite is an engineered, crystaline metamaterial capable of storing many times it's own rest mass energy. -- Precisely how many times is indicated by the chromalitePotency function. -- -- Because any accidental release of this energy would obviously be catastrophic, chromalite is itself intelligent -- and capable of adapting to stressful situations to avoid any such accidental release. -- data Chromalite = Rutilium -- red Chromalite | Crudnium -- green Chromalite | Pteulanium -- blue Chromalite | Caerulite -- azure Chromalite | Ionidium -- violet Chromalite | Aurite -- yellow Chromalite | Argentate -- silver Chromalite | Trabanate -- brown Chromalite | Arumate -- gold Chromalite | Candonium -- white Chromalite | Canitium -- gray Chromalite | Infuscanoid -- black Chromalite | Endurium -- blue/shadowy Chromalite | Malignite -- yellow/shadowy Chromalite | Diabolite -- radiant white Chromalite | Bectonite -- radiant black Chromalite deriving (Eq,Enum,Ord,Show,Read,Bounded) data MaterialValue = MaterialValue { material_construction_value :: Integer, -- value of material for constructing buildings, pipes, casings for gadgets, etc material_critical_value :: Integer, -- value of material for critical purposes, such as miniature electronic components material_scarcity :: Integer } -- how rare the material is in nature and by synthesis gasWeight :: Gas -> Integer gasWeight Hydrogen = 1 gasWeight Helium = 4 gasWeight Oxygen = 16 gasWeight Nitrogen = 14 gasWeight Flourine = 19 gasWeight Neon = 20 gasWeight Argon = 40 gasWeight Krypton = 84 gasWeight Xenon = 131 gasWeight Radon = 222 gasWeight Chlorine = 35 materialValue :: Material -> MaterialValue materialValue Aluminum = MaterialValue 10 10 10 materialValue Titanium = MaterialValue 15 10 20 materialValue Palladium = MaterialValue 2 150 5 materialValue Molybdenum = MaterialValue 1 50 3 materialValue Lead = MaterialValue 3 20 2 materialValue Copper = MaterialValue 8 80 15 materialValue Iron = MaterialValue 5 10 2 materialValue Cobalt = MaterialValue 3 60 7 materialValue Zirconium = MaterialValue 2 40 10 materialValue Gold = MaterialValue 4 20 50 materialValue Silver = MaterialValue 3 30 20 materialValue Platinum = MaterialValue 1 100 70 materialValue Zinc = MaterialValue 6 50 4 materialValue Uranium = MaterialValue 1 300 40 materialValue Plutonium = MaterialValue 1 500 100 materialValue Thorium = MaterialValue 2 200 4 materialValue Diamond = MaterialValue 40 20 15 materialValue Carbon = MaterialValue 2 20 1 materialValue Wood = MaterialValue 3 0 2 materialValue Plastic = MaterialValue 4 0 2 chromaliteAlignment :: Chromalite -> Alignment chromaliteAlignment Rutilium = (Chaotic,Strategic) chromaliteAlignment Crudnium = (Neutral,Strategic) chromaliteAlignment Pteulanium = (Lawful,Strategic) chromaliteAlignment Caerulite = (Lawful,Tactical) chromaliteAlignment Ionidium = (Neutral,Tactical) chromaliteAlignment Aurite = (Chaotic,Tactical) chromaliteAlignment Argentate = (Lawful,Diplomatic) chromaliteAlignment Trabanate = (Neutral,Diplomatic) chromaliteAlignment Arumate = (Chaotic,Diplomatic) chromaliteAlignment Candonium = (Lawful,Indifferent) chromaliteAlignment Canitium = (Neutral,Indifferent) chromaliteAlignment Infuscanoid = (Chaotic,Indifferent) chromaliteAlignment Endurium = (Evil,Strategic) chromaliteAlignment Malignite = (Evil,Tactical) chromaliteAlignment Diabolite = (Evil,Diplomatic) chromaliteAlignment Bectonite = (Evil,Indifferent) class SubstanceType a where substanceValue :: a -> Integer toSubstance :: a -> Substance instance SubstanceType Gas where substanceValue x = gasWeight x ^ 2 - gasWeight x toSubstance x = GasSubstance x instance SubstanceType Material where substanceValue x = nom * crit * scarce + nom + crit + scarce where MaterialValue nom crit scarce = materialValue x toSubstance x = MaterialSubstance x instance SubstanceType Chromalite where substanceValue x = 10 * chromalitePotency x ^ 2 + 100 * chromalitePotency x toSubstance x = ChromaliteSubstance x instance SubstanceType Substance where substanceValue (GasSubstance x) = substanceValue x substanceValue (MaterialSubstance x) = substanceValue x substanceValue (ChromaliteSubstance x) = substanceValue x toSubstance x = x instance SubstanceType Solid where substanceValue = substanceValue . toSubstance toSubstance (MaterialSolid x) = toSubstance x toSubstance (ChromaliteSolid x) = toSubstance x chromalitePotency :: Chromalite -> Integer chromalitePotency = alignmentPotency . chromaliteAlignment