more levels

This commit is contained in:
2024-12-08 16:36:16 -08:00
parent 6012831267
commit e28a3f5b07
23 changed files with 799 additions and 23 deletions

View File

@@ -85,20 +85,21 @@ isWall world (Location n y x) =
type Movement = (Int, Int)
moveBlock ::
World ->
Map Location (Char, Box) ->
Map Location (Int, Char, Maybe Location) ->
Location ->
Movement ->
World {- ^ world -} ->
Map Location (Char, Box) {- ^ location cache -} ->
Map Location (Int, Char, Maybe Location) {- ^ accumulated changes -} ->
Location {- ^ source location -} ->
Movement {- ^ movement direction -} ->
Rational {- ^ offset -} ->
Maybe (Map Char (Maybe Location))
-- moving into a wall, not possible
-- moving a wall, not possible
moveBlock world _ _ loc _ _
| isWall world loc = Nothing
-- move introduced a loop, trim off the tail and report success
moveBlock _ _ visited loc _ _
-- XXX: ensure update is consistent to support flipped levels
| Just (n,_,_) <- Map.lookup loc visited
= Just (Map.fromList [(c,l) | (a,c,l) <- Map.elems visited, a >= n])
@@ -126,7 +127,7 @@ moveBlock' ::
Movement ->
Char ->
Box ->
Set Location ->
Set Char ->
Rational {- ^ offset -} ->
Maybe (Map Char (Maybe Location))
moveBlock' world locMap visited loc loc' dir name box enters offset =
@@ -138,16 +139,16 @@ moveBlock' world locMap visited loc loc' dir name box enters offset =
moveInto =
do (n,b) <- Map.lookup loc' locMap
(locI, offset') <- enterLoc world n b dir offset
if Set.member locI enters then
do epsilon <- findEpsilon world (locName locI)
if Set.member (locName loc') enters then
do epsilon <- findEpsilon world (locName loc')
moveEpsilon epsilon
else
moveBlock' world locMap visited loc locI dir name box (Set.insert locI enters) offset'
moveBlock' world locMap visited loc locI dir name box (Set.insert (locName loc') enters) offset'
moveEpsilon epsilon =
do let eBox = boxIx world epsilon
(locI, offset') <- enterLoc world epsilon eBox dir offset
moveBlock' world locMap visited loc locI dir name box (Set.insert locI enters) offset'
moveBlock' world locMap visited loc locI dir name box enters offset'
moveToEat =
do let dir' = invert dir