module MonsterGen ( cave_monster ) where import Control.Monad.State import Data.Ratio import RandT import Color import Glyph import Body import Language import Monsters monster_variation :: NounPhrase -> RandT (State NounPhrase) () monster_variation start = do lift $ put start perhaps (1 % 3) $ adj AJ_smelly perhaps (1 % 3) $ choose [ AJ_huge, AJ_large, AJ_small, AJ_tiny ] perhaps (1 % 4) $ choose [ AJ_hairy, AJ_bald ] perhaps (1 % 6) $ choose [ AJ_fast, AJ_slow ] where choose = choice . map (lift . modify . adjective) adj = lift . modify . adjective cave_monster :: RandT (State Monster) () cave_monster = do (color, coladj) <- choice $ map return [ (Red, AJ_red), (Green, AJ_green), (Brown, AJ_brown) ] desc <- generate $ monster_variation (adjective coladj $ noun N_cave_monster) lift $ put $ Monster { monster_desc = desc, monster_body = human_body, monster_glyph = (Glyph color 'm') }