packages feed

roguestar-engine-0.2.1: src/Substances.hs

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