@@ -29,6 +29,9 @@ data Level = Level
2929 { start :: (Int, Int)
3030 , end :: (Int, Int)
3131 , geo :: Array (Int, Int) LevelPiece
32+ -- building the geo image is expensive. Cache it. Though VTY should go through greater lengths
33+ -- to avoid the need to cache images.
34+ , geo_image :: Image
3235 }
3336 deriving (Show,Eq)
3437
@@ -47,8 +50,8 @@ main = do
4750 shutdown vty
4851
4952mkLevel _difficulty = do
50− level_width <- randomRIO (40,80)
51− level_height <- randomRIO (40,80)
53+ level_width <- randomRIO (200,300)
54+ level_height <- randomRIO (200,300)
5255 start <- (,) <$> randomRIO (2, level_width-3) <*> randomRIO (2, level_height-3)
5356 end <- (,) <$> randomRIO (2, level_width-3) <*> randomRIO (2, level_height-3)
5457 -- first the base geography: all rocks
@@ -56,7 +59,7 @@ mkLevel _difficulty = do
5659 [((x,y),Rock) | x <- [0..level_width-1], y <- [0..level_height-1]]
5760 -- next the empty spaces that make the rooms
5861 geo <- add_room start base_geo level_width level_height
59− return $ Level start end geo
62+ return $ Level start end geo (build_geo_image geo)
6063
6164add_room (center_x, center_y) geo level_width level_height = do
6265 size <- randomRIO (5,15)
@@ -122,10 +125,16 @@ world = do
122125 the_dude <- gets dude
123126 the_level <- gets level
124127 let dude_image = translate (dude_x the_dude) (dude_y the_dude) (char pieceA '@')
125− (geo_width, geo_height) = snd $ bounds (geo the_level)
126− geo_image = vert_cat [ geo_row | y <- [0..geo_height-1],
127− let geo_row = horiz_cat [ i | x <- [0..geo_width-1],
128− let i = image_for_geo (geo the_level ! (x,y))
129− ]
130− ]
131− return [dude_image, geo_image]
128+ return [dude_image, geo_image the_level]
129+
130+build_geo_image geo =
131+ let (geo_width, geo_height) = snd $ bounds geo
132+ -- seems like a the repeated index operation should be removable. This is not performing random
133+ -- access but (presumably) access in order of index.
134+ in vert_cat [ geo_row
135+ | y <- [0..geo_height-1]
136+ , let geo_row = horiz_cat [ i
137+ | x <- [0..geo_width-1]
138+ , let i = image_for_geo (geo ! (x,y))
139+ ]
140+ ]