@@ -60,12 +60,12 @@ mkLevel _difficulty = do
6060
6161add_room (center_x, center_y) geo level_width level_height = do
6262 size <- randomRIO (5,15)
63− let x_min = max 0 (center_x - size)
64− x_max = min level_width (center_x + size)
65− y_min = max 0 (center_y - size)
66− y_max = min level_height (center_y + size)
67− let room = [((x,y), EmptySpace) | x <- [x_min..x_max], y <- [y_min..y_max]]
68− return $ accum (\_ v -> v) geo room
63+ let x_min = max 1 (center_x - size)
64+ x_max = min (level_width - 1) (center_x + size)
65+ y_min = max 1 (center_y - size)
66+ y_max = min (level_height - 1) (center_y + size)
67+ let room = [((x,y), EmptySpace) | x <- [x_min..x_max - 1], y <- [y_min..y_max - 1]]
68+ return (geo // room)
6969
7070image_for_geo EmptySpace = char (def_attr `with_back_color` green) ' '
7171image_for_geo Rock = char (def_attr `with_fore_color` white) 'X'
@@ -96,10 +96,12 @@ move_dude dx dy = do
9696 vty <- ask
9797 world <- get
9898 let Dude x y = dude world
99− (w, h) <- gets (snd . bounds . geo . level)
100− put $ world { dude = Dude (min (w - 2) $ max 1 (x + dx))
101− (min (h - 2) $ max 1 (y + dy))
102− }
99+ let x' = x + dx
100+ y' = y + dy
101+ -- this is only valid because the level generation assures the border is always Rock
102+ case geo (level world) ! (x',y') of
103+ EmptySpace -> put $ world { dude = Dude x' y' }
104+ _ -> return ()
103105
104106view :: Game ()
105107view = do