From a3f788b6a64bbf89342fec2111eb1e1b478db13f Mon Sep 17 00:00:00 2001
From: Paul Duncan <pabs@pablotron.org>
Date: Sun, 13 Jan 2019 08:27:04 -0500
Subject: add on_{boxes,walls,goals}_{start,end}()

---
 src/libsok/sok-ctx.c | 32 ++++++++++++++++++++++++++++++++
 src/libsok/sok.h     | 35 +++++++++++++++++++++++++++++++----
 2 files changed, 63 insertions(+), 4 deletions(-)

(limited to 'src/libsok')

diff --git a/src/libsok/sok-ctx.c b/src/libsok/sok-ctx.c
index ec36d2a..84fe8ed 100644
--- a/src/libsok/sok-ctx.c
+++ b/src/libsok/sok-ctx.c
@@ -547,6 +547,10 @@ bool sok_ctx_walk(
     }
   }
 
+  if (cbs->on_walls_start && !cbs->on_walls_start(ctx, data)) {
+    return false;
+  }
+
   if (cbs->on_wall) {
     // walk walls
     for (size_t i = 0; i < (ctx->level.size.x * ctx->level.size.y); i++) {
@@ -564,6 +568,14 @@ bool sok_ctx_walk(
     }
   }
 
+  if (cbs->on_walls_end && !cbs->on_walls_end(ctx, data)) {
+    return false;
+  }
+
+  if (cbs->on_goals_start && !cbs->on_goals_start(ctx, data)) {
+    return false;
+  }
+
   if (cbs->on_goal) {
     // walk goals
     for (size_t i = 0; i < ctx->level.num_goals; i++) {
@@ -577,6 +589,14 @@ bool sok_ctx_walk(
     }
   }
 
+  if (cbs->on_goals_end && !cbs->on_goals_end(ctx, data)) {
+    return false;
+  }
+
+  if (cbs->on_boxes_start && !cbs->on_boxes_start(ctx, data)) {
+    return false;
+  }
+
   if (cbs->on_box) {
     // walk boxes
     for (size_t i = 0; i < ctx->level.num_boxes; i++) {
@@ -589,6 +609,14 @@ bool sok_ctx_walk(
     }
   }
 
+  if (cbs->on_boxes_end && !cbs->on_boxes_end(ctx, data)) {
+    return false;
+  }
+
+  if (cbs->on_moves_start && !cbs->on_moves_start(ctx, data)) {
+    return false;
+  }
+
   if (cbs->on_move) {
     // walk moves
     for (size_t i = 0; i < ctx->num_moves; i++) {
@@ -599,6 +627,10 @@ bool sok_ctx_walk(
     }
   }
 
+  if (cbs->on_moves_end && !cbs->on_moves_end(ctx, data)) {
+    return false;
+  }
+
   // return success
   return true;
 }
diff --git a/src/libsok/sok.h b/src/libsok/sok.h
index 4fbae72..1503b5f 100644
--- a/src/libsok/sok.h
+++ b/src/libsok/sok.h
@@ -24,6 +24,15 @@ typedef enum {
   SOK_DIR_LAST,
 } sok_dir_t;
 
+#define SOK_DIR_TO_CHAR(dir) ( \
+  ((dir) == SOK_DIR_RIGHT) ? 'r' : \
+  (((dir) == SOK_DIR_UP) ? 'u' : \
+  ((((dir) == SOK_DIR_LEFT) ? 'l' : \
+  (((((dir) == SOK_DIR_DOWN) ? 'd' : \
+  'X' \
+)))))))
+
+
 #define SOK_DIR_TO_STR(dir) ( \
   ((dir) == SOK_DIR_RIGHT) ? "r" : \
   (((dir) == SOK_DIR_UP) ? "u" : \
@@ -149,6 +158,11 @@ _Bool sok_ctx_undo(sok_ctx_t * const);
 /* context walker */
 /******************/
 
+typedef _Bool (*sok_ctx_walk_step_cb_t)(
+  const sok_ctx_t * const,
+  void * const
+);
+
 typedef _Bool (*sok_ctx_walk_pos_cb_t)(
   const sok_ctx_t * const,
   const sok_pos_t,
@@ -177,11 +191,24 @@ typedef _Bool (*sok_ctx_walk_move_cb_t)(
 );
 
 typedef struct {
-  sok_ctx_walk_pos_cb_t on_size,
-                        on_wall;
-  sok_ctx_walk_tile_cb_t on_home,
-                         on_box;
+  sok_ctx_walk_pos_cb_t on_size;
+
+  sok_ctx_walk_step_cb_t on_walls_start,
+                         on_walls_end;
+  sok_ctx_walk_pos_cb_t on_wall;
+
+  sok_ctx_walk_tile_cb_t on_home;
+
+  sok_ctx_walk_step_cb_t on_boxes_start,
+                         on_boxes_end;
+  sok_ctx_walk_tile_cb_t on_box;
+
+  sok_ctx_walk_step_cb_t on_goals_start,
+                         on_goals_end;
   sok_ctx_walk_goal_cb_t on_goal;
+
+  sok_ctx_walk_step_cb_t on_moves_start,
+                         on_moves_end;
   sok_ctx_walk_move_cb_t on_move;
 } sok_ctx_walk_cbs_t;
 
-- 
cgit v1.2.3