bump :: ARef -> Dir4 -> Game k Level ()
bump self dir = do
    l        <- access (loc <# aref self)
    occupier <- listToMaybe . living (\a -> a ^. loc == move4 dir l) <$> level
    blocked  <- access (ix (move4 dir l) <# solid)
    case occupier of
        Just mon -> self `meleeAttack` mon
        Nothing -> do
            when blocked $ self `activate` move4 dir l
            loc <# aref self != if blocked then l else move4 dir l
bump :: ARef -> Dir4 -> Game k Level ()
bump self dir = do
    l        <- access (loc <# aref self)
    occupier <- listToMaybe . living (\a -> a ^. loc == move4 dir l) <$> level
    blocked  <- access (ix (move4 dir l) <# solid)
    case occupier of
        Just mon -> self `meleeAttack` mon
        Nothing -> do
            when blocked $ self `activate` move4 dir l
            loc <# aref self != if blocked then l else move4 dir l
bump self dir = do
    l        <- access (loc <# aref self)
    occupier <- listToMaybe . living (\a -> a ^. loc == move4 dir l) <$> level
    blocked  <- access (ix (move4 dir l) <# solid)
    case occupier of
        Just mon -> self `meleeAttack` mon
        Nothing -> do
            when blocked $ self `activate` move4 dir l
            loc <# aref self != if blocked then l else move4 dir l