Allure-0.6.2.0: GameDefinition/Content/PlaceKind.hs
-- Copyright (c) 2008--2011 Andres Loeh, 2010--2017 Mikolaj Konarski
-- This file is a part of the computer game Allure of the Stars
-- and is released under the terms of the GNU Affero General Public License.
-- For license and copyright information, see the file LICENSE.
--
-- | Room, hall and passage definitions.
module Content.PlaceKind
( cdefs
) where
import Prelude ()
import Game.LambdaHack.Common.Prelude
import Game.LambdaHack.Common.ContentDef
import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Content.PlaceKind
cdefs :: ContentDef PlaceKind
cdefs = ContentDef
{ getSymbol = psymbol
, getName = pname
, getFreq = pfreq
, validateSingle = validateSinglePlaceKind
, validateAll = validateAllPlaceKind
, content = contentFromList $
[rect, rectWindows, glasshouse, pulpit, ruin, collapsed, collapsed2, collapsed3, collapsed4, collapsed5, collapsed6, collapsed7, pillar, pillar2, pillar3, pillar4, colonnade, colonnade2, colonnade3, colonnade4, colonnade5, colonnade6, lampPost, lampPost2, lampPost3, lampPost4, treeShade, fogClump, fogClump2, smokeClump, smokeClump2FGround, bushClump, staircase, staircase2, staircase3, staircase4, staircase5, staircase6, staircase7, staircase8, staircase9, staircase10, staircase11, staircase12, staircase13, staircase14, staircase15, staircase16, staircase17, staircaseOutdoor, staircaseGated, escapeUp, escapeUp2, escapeUp3, escapeUp4, escapeUp5, escapeDown, escapeDown2, escapeDown3, escapeDown4, escapeDown5, escapeOutdoorDown]
++ map makeStaircaseUp lstaircase
++ map makeStaircaseDown lstaircase
-- Allure-specific
++ [staircaseLift, escapeSpaceshipDown, escapeSpaceshipDown2, escapeSpaceshipDown3, escapeSpaceshipDown4, escapeSpaceshipDown5, colonnadeWide, oval, ovalFloor, ovalSquare, maze, maze2, maze3, mazeBig, mazeBig2, mazeBig3, cells, cells2, cells3, cells4, cells5, cells6, cells7]
}
rect, rectWindows, glasshouse, pulpit, ruin, collapsed, collapsed2, collapsed3, collapsed4, collapsed5, collapsed6, collapsed7, pillar, pillar2, pillar3, pillar4, colonnade, colonnade2, colonnade3, colonnade4, colonnade5, colonnade6, lampPost, lampPost2, lampPost3, lampPost4, treeShade, fogClump, fogClump2, smokeClump, smokeClump2FGround, bushClump, staircase, staircase2, staircase3, staircase4, staircase5, staircase6, staircase7, staircase8, staircase9, staircase10, staircase11, staircase12, staircase13, staircase14, staircase15, staircase16, staircase17, staircaseOutdoor, staircaseGated, escapeUp, escapeUp2, escapeUp3, escapeUp4, escapeUp5, escapeDown, escapeDown2, escapeDown3, escapeDown4, escapeDown5, escapeOutdoorDown :: PlaceKind
-- Allure-specific
staircaseLift, escapeSpaceshipDown, escapeSpaceshipDown2, escapeSpaceshipDown3, escapeSpaceshipDown4, escapeSpaceshipDown5, colonnadeWide, oval, ovalFloor, ovalSquare, maze, maze2, maze3, mazeBig, mazeBig2, mazeBig3, cells, cells2, cells3, cells4, cells5, cells6, cells7 :: PlaceKind
lstaircase :: [PlaceKind]
lstaircase = [staircase, staircase2, staircase3, staircase4, staircase5, staircase6, staircase7, staircase8, staircase9, staircase10, staircase11, staircase12, staircase13, staircase14, staircase15, staircase16, staircase17, staircaseOutdoor, staircaseGated]
-- Allure-specific
++ [staircaseLift]
-- The dots below are @Char.chr 183@, as defined in @TileKind.floorSymbol@.
rect = PlaceKind -- Valid for any nonempty area, hence low frequency.
{ psymbol = 'r'
, pname = "room"
, pfreq = [ ("rogue", 100), ("arena", 40), ("laboratory", 40)
, ("zoo", 7) ]
, prarity = [(1, 10), (10, 8)]
, pcover = CStretch
, pfence = FWall
, ptopLeft = ["·"]
, poverride = []
}
rectWindows = PlaceKind
{ psymbol = 'w'
, pname = "room"
, pfreq = [("empty", 10), ("park", 7)]
, prarity = [(1, 10), (10, 8)]
, pcover = CStretch
, pfence = FNone
, ptopLeft = [ "#%"
, "%·"
]
, poverride = [('%', "rectWindowsOver_%_Lit")]
-- for now I need to specify 'Lit' or I'd be randomly getting lit and dark
-- tiles, until ooverride is extended to take night/dark into account
}
glasshouse = PlaceKind
{ psymbol = 'g'
, pname = "glasshouse"
, pfreq = [("arena", 40), ("shootout", 8), ("zoo", 12), ("ambush", 7)]
, prarity = [(1, 10), (10, 8)]
, pcover = CStretch
, pfence = FNone
, ptopLeft = [ "%%"
, "%·"
]
, poverride = [('%', "glasshouseOver_%_Lit")]
}
pulpit = PlaceKind
{ psymbol = 'p'
, pname = "pulpit"
, pfreq = [("arena", 10), ("zoo", 30)]
, prarity = [(1, 10), (10, 8)]
, pcover = CMirror
, pfence = FGround
, ptopLeft = [ "%%·"
, "%··"
, "··O"
]
, poverride = [('%', "glasshouseOver_%_Lit"), ('O', "pulpit")]
-- except for floor, this will all be lit, regardless of night/dark; OK
}
ruin = PlaceKind
{ psymbol = 'R'
, pname = "ruin"
, pfreq = [("battle", 33), ("noise", 50)]
, prarity = [(1, 10), (10, 20)]
, pcover = CStretch
, pfence = FWall
, ptopLeft = ["X"]
, poverride = []
}
collapsed = PlaceKind -- in a dark cave, they have little lights --- that's OK
{ psymbol = 'c'
, pname = "collapsed cavern"
, pfreq = [("noise", 1)]
, prarity = [(1, 10), (10, 10)]
, pcover = CStretch
, pfence = FNone
, ptopLeft = [ "#"
]
, poverride = [('#', "doorlessWallOver_#")]
}
collapsed2 = collapsed
{ pfreq = [("noise", 100), ("battle", 20)]
, ptopLeft = [ "X#"
, "##"
]
}
collapsed3 = collapsed
{ pfreq = [("noise", 200), ("battle", 20)]
, ptopLeft = [ "XX#"
, "###"
]
}
collapsed4 = collapsed
{ pfreq = [("noise", 200), ("battle", 20)]
, ptopLeft = [ "XXX#"
, "####"
]
}
collapsed5 = collapsed
{ pfreq = [("noise", 300), ("battle", 50)]
, ptopLeft = [ "XX#"
, "X##"
, "###"
]
}
collapsed6 = collapsed
{ pfreq = [("noise", 400), ("battle", 100)]
, ptopLeft = [ "XXX#"
, "X###"
, "####"
]
}
collapsed7 = collapsed
{ pfreq = [("noise", 400), ("battle", 100)]
, ptopLeft = [ "XXX#"
, "XX##"
, "####"
]
}
pillar = PlaceKind
{ psymbol = 'p'
, pname = "pillar room"
, pfreq = [ ("rogue", 500), ("arena", 1000), ("laboratory", 1000)
, ("empty", 300), ("noise", 1000) ]
, prarity = [(1, 10), (10, 10)]
, pcover = CStretch
, pfence = FWall
-- Larger rooms require support pillars.
, ptopLeft = [ "····"
, "·#··"
, "····"
, "····"
]
, poverride = [('&', "cachable")]
}
pillar2 = pillar
{ ptopLeft = [ "··#·"
, "··#·"
, "##··"
, "····"
]
}
pillar3 = pillar
{ prarity = [(10, 5)]
, ptopLeft = [ "&·#·"
, "··#·"
, "##··"
, "····"
]
}
pillar4 = pillar
{ prarity = [(10, 5)]
, ptopLeft = [ "&#··"
, "#·#·"
, "·##·"
, "····"
]
}
colonnade = PlaceKind
{ psymbol = 'c'
, pname = "colonnade"
, pfreq = [ ("rogue", 30), ("arena", 70), ("laboratory", 40)
, ("empty", 100), ("mine", 10000), ("park", 3000) ]
, prarity = [(1, 3), (10, 3)]
, pcover = CAlternate
, pfence = FFloor
, ptopLeft = [ "#·"
, "·#"
]
, poverride = []
}
colonnade2 = colonnade
{ prarity = [(1, 2), (10, 2)]
, ptopLeft = [ "#·"
, "··"
]
}
colonnade3 = colonnade
{ prarity = [(1, 12), (10, 12)]
, ptopLeft = [ "··#"
, "·#·"
, "#··"
]
}
colonnade4 = colonnade
{ prarity = [(1, 12), (10, 12)]
, ptopLeft = [ "#··"
, "·#·"
, "··#"
]
}
colonnade5 = colonnade
{ prarity = [(1, 7), (10, 7)]
, ptopLeft = [ "#··"
, "··#"
]
}
colonnade6 = colonnade
{ ptopLeft = [ "#·"
, "··"
, "·#"
]
}
lampPost = PlaceKind
{ psymbol = 'l'
, pname = "lamp post"
, pfreq = [("park", 20), ("ambush", 20), ("zoo", 10), ("battle", 10)]
, prarity = [(1, 10), (10, 10)]
, pcover = CVerbatim
, pfence = FNone
, ptopLeft = [ "X·X"
, "·O·"
, "X·X"
]
, poverride = [('O', "lampPostOver_O"), ('·', "floorActorLit")]
}
lampPost2 = lampPost
{ ptopLeft = [ "···"
, "·O·"
, "···"
]
}
lampPost3 = lampPost
{ pfreq = [("park", 3000), ("zoo", 50), ("battle", 110)]
, ptopLeft = [ "XX·XX"
, "X···X"
, "··O··"
, "X···X"
, "XX·XX"
]
}
lampPost4 = lampPost
{ pfreq = [("park", 3000), ("zoo", 50), ("battle", 60)]
, ptopLeft = [ "X···X"
, "·····"
, "··O··"
, "·····"
, "X···X"
]
}
treeShade = PlaceKind
{ psymbol = 't'
, pname = "tree shade"
, pfreq = [("brawl", 300)]
, prarity = [(1, 10), (10, 10)]
, pcover = CMirror
, pfence = FNone
, ptopLeft = [ "··s"
, "sO·"
, "Xs·"
]
, poverride = [ ('O', "treeShadeOver_O_Lit"), ('s', "treeShadeOver_s_Lit")
, ('·', "shaded ground") ]
}
fogClump = PlaceKind
{ psymbol = 'f'
, pname = "foggy patch"
, pfreq = [("shootout", 170)]
, prarity = [(1, 1)]
, pcover = CMirror
, pfence = FNone
, ptopLeft = [ "f;"
, ";f"
, ";f"
]
, poverride = [('f', "fogClumpOver_f_Lit"), (';', "lit fog")]
}
fogClump2 = fogClump
{ pfreq = [("shootout", 400), ("empty", 1500)]
, prarity = [(1, 1)]
, pcover = CMirror
, pfence = FNone
, ptopLeft = [ "Xff"
, "f;f"
, ";;f"
, "XfX"
]
}
smokeClump = PlaceKind
{ psymbol = 's'
, pname = "smoky patch"
, pfreq = [("zoo", 100), ("ambush", 50)]
, prarity = [(1, 1)]
, pcover = CMirror
, pfence = FNone
, ptopLeft = [ "f;"
, ";f"
, ";f"
]
, poverride = [ ('f', "smokeClumpOver_f_Lit"), (';', "lit smoke")
, ('·', "floorActorLit") ]
}
smokeClump2FGround = smokeClump
{ pfreq = [("laboratory", 100), ("zoo", 1000), ("ambush", 500)]
, prarity = [(1, 1)]
, pcover = CMirror
, pfence = FGround
, ptopLeft = [ ";f;"
, "f·f"
, ";·f"
, ";f;"
]
}
bushClump = PlaceKind
{ psymbol = 'b'
, pname = "bushy patch"
, pfreq = [("shootout", 120)]
, prarity = [(1, 1)]
, pcover = CMirror
, pfence = FNone
, ptopLeft = [ "f;"
, ";f"
, ";f"
]
, poverride = [('f', "bushClumpOver_f_Lit"), (';', "bush Lit")]
}
staircase = PlaceKind
{ psymbol = '|'
, pname = "staircase"
, pfreq = [("staircase", 1)]
, prarity = [(1, 1)]
, pcover = CVerbatim
, pfence = FGround
, ptopLeft = [ "<·>"
]
, poverride = [ ('<', "staircase up"), ('>', "staircase down")
, ('I', "signboard") ]
}
staircase2 = staircase
{ pfreq = [("staircase", 1000)]
, pfence = FFloor
, ptopLeft = [ "#·#"
, "···"
, "<·>"
, "···"
, "#·#"
]
}
staircase3 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "#·I·#"
, "·····"
, "·<·>·"
, "·····"
, "#·I·#"
]
}
staircase4 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "#·#·#·#"
, "·······"
, "#·<·>·#"
, "·······"
, "#·#·#·#"
]
}
staircase5 = staircase
{ pfreq = [("staircase", 100)]
, pfence = FGround
, ptopLeft = [ "#·<·>·#"
]
}
staircase6 = staircase
{ pfreq = [("staircase", 100)]
, pfence = FGround
, ptopLeft = [ "#··<·>··#"
]
}
staircase7 = staircase
{ pfreq = [("staircase", 100)]
, pfence = FGround
, ptopLeft = [ "#·I·<·>·I·#"
]
}
staircase8 = staircase
{ pfreq = [("staircase", 1000)]
, pfence = FFloor
, ptopLeft = [ "#·····#"
, "··<·>··"
, "#·····#"
]
}
staircase9 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "#·······#"
, "·#·<·>·#·"
, "#·······#"
]
}
staircase10 = staircase
{ pfreq = [("staircase", 1000)]
, pfence = FFloor
, ptopLeft = [ "·#·····#·"
, "#··<·>··#"
, "·#·····#·"
]
}
staircase11 = staircase
{ pfreq = [("staircase", 10000)]
, pfence = FGround
, ptopLeft = [ "··#·#··"
, "#·····#"
, "··<·>··"
, "#·····#"
, "··#·#··"
]
}
staircase12 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "·····"
, "·<·>·"
, "·····"
]
}
staircase13 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "·······"
, "#·<·>·#"
, "·······"
]
}
staircase14 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "·········"
, "·#·<·>·#·"
, "·········"
]
}
staircase15 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "···········"
, "#·I·<·>·I·#"
, "···········"
]
}
staircase16 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "#·····#"
, "··<·>··"
, "#·····#"
]
}
staircase17 = staircaseLift
{ pfreq = [("staircase lift", 1000)]
, pfence = FWall
, ptopLeft = [ "·#·····#·"
, "#··<·>··#"
, "·#·····#·"
]
}
staircaseOutdoor = staircase
{ pname = "staircase outdoor"
, pfreq = [("staircase outdoor", 1)]
, poverride = [('<', "staircase outdoor up"), ('>', "staircase outdoor down")]
}
staircaseGated = staircase
{ pname = "gated staircase"
, pfreq = [("gated staircase", 1)]
, poverride = [('<', "gated staircase up"), ('>', "gated staircase down")]
}
escapeUp = PlaceKind
{ psymbol = '<'
, pname = "escape up"
, pfreq = [("escape up", 1)]
, prarity = [(1, 1)]
, pcover = CVerbatim
, pfence = FGround
, ptopLeft = [ "<"
]
, poverride = []
}
escapeUp2 = escapeUp
{ pfreq = [("escape up", 1000)]
, pfence = FFloor
, ptopLeft = [ "#·#"
, "·<·"
, "#·#"
]
}
escapeUp3 = escapeUp
{ pfreq = [("escape down", 2000)]
, pcover = CMirror
, pfence = FFloor
, ptopLeft = [ "#··"
, "·<·"
, "#·#"
]
}
escapeUp4 = escapeUp
{ pfreq = [("escape up", 1000)]
, pfence = FWall
, ptopLeft = [ "·#·"
, "#<#"
, "·#·"
]
}
escapeUp5 = escapeUp
{ pfreq = [("escape up", 2000)]
, pcover = CMirror
, pfence = FWall
, ptopLeft = [ "#··"
, "·<·"
, "··#"
]
}
escapeDown = PlaceKind
{ psymbol = '>'
, pname = "escape down"
, pfreq = [("escape down", 1)]
, prarity = [(1, 1)]
, pcover = CVerbatim
, pfence = FGround
, ptopLeft = [ ">"
]
, poverride = []
}
escapeDown2 = escapeDown
{ pfreq = [("escape down", 1000)]
, pfence = FFloor
, ptopLeft = [ "#·#"
, "·>·"
, "#·#"
]
}
escapeDown3 = escapeDown
{ pfreq = [("escape down", 2000)]
, pcover = CMirror
, pfence = FFloor
, ptopLeft = [ "#··"
, "·>·"
, "#·#"
]
}
escapeDown4 = escapeDown
{ pfreq = [("escape down", 1000)]
, pfence = FWall
, ptopLeft = [ "·#·"
, "#>#"
, "·#·"
]
}
escapeDown5 = escapeDown
{ pfreq = [("escape down", 2000)]
, pcover = CMirror
, pfence = FWall
, ptopLeft = [ "#··"
, "·>·"
, "··#"
]
}
escapeOutdoorDown = escapeDown
{ pfreq = [("escape outdoor down", 1)]
, poverride = [('>', "escape outdoor down")]
}
-- * Allure-specific
staircaseLift = staircase
{ pname = "staircase lift"
, pfreq = [("staircase lift", 1)]
, poverride = [ ('<', "staircase lift up"), ('>', "staircase lift down")
, ('I', "signboard") ]
}
escapeSpaceshipDown = escapeDown
{ pfreq = [("escape spaceship down", 1)]
, poverride = [('>', "escape spaceship down")]
}
escapeSpaceshipDown2 = escapeDown2
{ pfreq = [("escape spaceship down", 1000)]
, poverride = [('>', "escape spaceship down")]
}
escapeSpaceshipDown3 = escapeDown3
{ pfreq = [("escape spaceship down", 2000)]
, poverride = [('>', "escape spaceship down")]
}
escapeSpaceshipDown4 = escapeDown4
{ pfreq = [("escape spaceship down", 1000)]
, poverride = [('>', "escape spaceship down")]
}
escapeSpaceshipDown5 = escapeDown5
{ pfreq = [("escape spaceship down", 1000)]
, poverride = [('>', "escape spaceship down")]
}
colonnadeWide = colonnade
{ prarity = [(1, 2), (10, 2)]
, pfence = FWall
, ptopLeft = [ "··"
, "#·"
]
}
oval = PlaceKind
{ psymbol = 'o'
, pname = "oval room"
, pfreq = [ ("rogue", 1000), ("arena", 1000), ("empty", 1000)
, ("zoo", 1000), ("ambush", 1000) ]
, prarity = [(1, 10), (10, 10)]
, pcover = CStretch
, pfence = FWall
, ptopLeft = [ "####·"
, "##···"
, "#····"
, "#····"
, "·····"
]
, poverride = []
}
ovalFloor = oval -- Without outer solid fence, visible from outside·
{ pfreq = [ ("rogue", 10000), ("arena", 10000), ("empty", 10000)
, ("zoo", 10000), ("ambush", 10000) ]
, pfence = FGround
, ptopLeft = [ "XXXX+#"
, "XX###·"
, "X##···"
, "X#····"
, "+#····"
, "#·····"
]
}
ovalSquare = ovalFloor
{ pfreq = [ ("rogue", 3000), ("arena", 3000), ("empty", 3000)
, ("zoo", 3000) , ("ambush", 3000) ]
, ptopLeft = [ "X###+"
, "##···"
, "#····"
, "#····"
, "+····"
]
}
maze = PlaceKind
{ psymbol = 'm'
, pname = "maze"
, pfreq = [("rogue", 20), ("arena", 20), ("empty", 20)]
, prarity = [(1, 10), (10, 10)]
, pcover = CStretch
, pfence = FNone
, ptopLeft = [ "·####"
, "#·#··"
, "##··#"
, "#··#·"
]
, poverride = [('&', "cachable")]
}
maze2 = maze
{ pfreq = [("rogue", 40), ("arena", 40), ("empty", 40)]
, ptopLeft = [ "··####"
, "##·##·"
, "#·#··#"
, "#···#·"
]
}
maze3 = maze
{ pfreq = [("rogue", 70), ("arena", 70), ("empty", 70)]
, ptopLeft = [ "·######"
, "·##·##·"
, "#··#···"
, "#··#··#"
]
}
mazeBig = maze
{ pfreq = [("rogue", 500), ("arena", 500), ("empty", 500)]
, ptopLeft = [ "··####"
, "·#·#··"
, "##&·##"
, "##·##·"
, "#·#··#"
]
}
mazeBig2 = mazeBig
{ ptopLeft = [ "··####"
, "##·##·"
, "#·#&··"
, "#·#··#"
, "#···#·"
]
}
mazeBig3 = mazeBig
{ pfreq = [("rogue", 800), ("arena", 800), ("empty", 800)]
, ptopLeft = [ "·######"
, "#·##·#·"
, "#·#·#··"
, "##·##·#"
, "#··#···"
]
}
cells = PlaceKind
{ psymbol = '#'
, pname = "cells"
, pfreq = [ ("rogue", 20), ("arena", 20), (" laboratory", 20)
, ("empty", 20), ("noise", 20), ("zoo", 200) ]
, prarity = [(1, 10), (10, 10)]
, pcover = CReflect
, pfence = FWall
, ptopLeft = [ "··#"
, "·#·"
, "#··"
]
, poverride = []
}
cells2 = cells -- this one is distinct enough from others
{ pfreq = [ ("rogue", 50), ("arena", 50), (" laboratory", 50)
, ("empty", 50), ("noise", 50), ("zoo", 500) ]
, ptopLeft = [ "··#"
, "··#"
, "##·"
]
}
cells3 = cells
{ ptopLeft = [ "#··"
, "·#·"
, "··#"
]
}
cells4 = cells
{ ptopLeft = [ "··#"
, "·##"
, "#··"
]
}
cells5 = cells
{ ptopLeft = [ "··#"
, "·#·"
, "##·"
]
}
cells6 = cells
{ pfreq = [ ("rogue", 1), ("arena", 2), ("laboratory", 2)
, ("empty", 2), ("noise", 1), ("zoo", 100) ]
, ptopLeft = [ "··#"
, "##·"
]
}
cells7 = cells
{ pfreq = [ ("rogue", 1), ("arena", 2), (" laboratory", 2)
, ("empty", 2), ("noise", 1) ]
, pfence = FFloor
, ptopLeft = [ "#·#"
, "·#·"
]
}
-- * Helper functions
makeStaircaseUp :: PlaceKind -> PlaceKind
makeStaircaseUp s = s
{ psymbol = '<'
, pname = pname s <+> "up"
, pfreq = map (\(t, k) -> (toGroupName $ tshow t <+> "up", k)) $ pfreq s
, poverride = [ ('>', "stair terminal")
, ('<', toGroupName $ pname s <+> "up")
, ('I', "signboard") ]
}
makeStaircaseDown :: PlaceKind -> PlaceKind
makeStaircaseDown s = s
{ psymbol = '>'
, pname = pname s <+> "down"
, pfreq = map (\(t, k) -> (toGroupName $ tshow t <+> "down", k)) $ pfreq s
, poverride = [ ('<', "stair terminal")
, ('>', toGroupName $ pname s <+> "down")
, ('I', "signboard") ]
}