added boundary checking for spitOut and friends

This commit is contained in:
opfez 2021-05-28 14:20:08 +02:00
parent 7b29bcb20a
commit 81c350a1f6
2 changed files with 41 additions and 20 deletions

View File

@ -40,31 +40,52 @@ printFactory :: Factory -> [Element] -> IO ()
printFactory f es = mapM_ (print . snd) lines
where lines = putElements es $ indexCharFactory f
-- get tiles safely (boundary checks)
eastTile :: Factory -> Element -> Maybe Tile
eastTile f elem
| length (f !! yPos elem) < xPos elem + 2 = Nothing
| otherwise = Just $ (f !! yPos elem) !! (xPos elem + 1)
southTile :: Factory -> Element -> Maybe Tile
southTile f elem
| length f < yPos elem + 2 = Nothing
| otherwise = Just $ (f !! (yPos elem + 1)) !! xPos elem
westTile :: Factory -> Element -> Maybe Tile
westTile f elem
| xPos elem - 1 < 0 = Nothing
| otherwise = Just $ (f !! yPos elem) !! (xPos elem - 1)
northTile :: Factory -> Element -> Maybe Tile
northTile f elem
| yPos elem - 1 < 0 = Nothing
| otherwise = Just $ (f !! (yPos elem - 1)) !! xPos elem
-- AAAAAAAA
spitOutEast :: Factory -> Element -> Element
spitOutEast f elem
| (f !! yPos elem) !! (xPos elem + 1) == Track East = incXPos elem
| (f !! (yPos elem + 1)) !! xPos elem == Track South = incYPos elem
| (f !! yPos elem) !! (xPos elem - 1) == Track West = decXPos elem
| (f !! (yPos elem - 1)) !! xPos elem == Track North = decYPos elem
| eastTile f elem == Just (Track East) = incXPos elem
| southTile f elem == Just (Track South) = incYPos elem
| westTile f elem == Just (Track West) = decXPos elem
| northTile f elem == Just (Track North) = decYPos elem
spitOutSouth :: Factory -> Element -> Element
spitOutSouth f elem
| (f !! (yPos elem + 1)) !! xPos elem == Track South = incYPos elem
| (f !! yPos elem) !! (xPos elem - 1) == Track West = decXPos elem
| (f !! (yPos elem - 1)) !! xPos elem == Track North = decYPos elem
| (f !! yPos elem) !! (xPos elem + 1) == Track East = incXPos elem
| southTile f elem == Just (Track South) = incYPos elem
| westTile f elem == Just (Track West) = decXPos elem
| northTile f elem == Just (Track North) = decYPos elem
| eastTile f elem == Just (Track East) = incXPos elem
spitOutWest :: Factory -> Element -> Element
spitOutWest f elem
| (f !! yPos elem) !! (xPos elem - 1) == Track West = decXPos elem
| (f !! (yPos elem - 1)) !! xPos elem == Track North = decYPos elem
| (f !! yPos elem) !! (xPos elem + 1) == Track East = incXPos elem
| (f !! (yPos elem + 1)) !! xPos elem == Track South = incYPos elem
| westTile f elem == Just (Track West) = decXPos elem
| northTile f elem == Just (Track North) = decYPos elem
| eastTile f elem == Just (Track East) = incXPos elem
| southTile f elem == Just (Track South) = incYPos elem
spitOutNorth :: Factory -> Element -> Element
spitOutNorth f elem
| (f !! (yPos elem - 1)) !! xPos elem == Track North = decYPos elem
| (f !! yPos elem) !! (xPos elem + 1) == Track East = incXPos elem
| (f !! (yPos elem + 1)) !! xPos elem == Track South = incYPos elem
| (f !! yPos elem) !! (xPos elem - 1) == Track West = decXPos elem
| northTile f elem == Just (Track North) = decYPos elem
| eastTile f elem == Just (Track East) = incXPos elem
| southTile f elem == Just (Track South) = incYPos elem
| westTile f elem == Just (Track West) = decXPos elem

View File

@ -1,4 +1,4 @@
E>?>+ |
^ v v |
^<- v |
^<<< |
E>?>+
^ v v
^<- v
^<<<