more levels
This commit is contained in:
23
app/Model.hs
23
app/Model.hs
@@ -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
|
||||
|
Reference in New Issue
Block a user