author Marco Costalba Wed, 20 May 2009 10:02:39 +0000 (12:02 +0200) committer Marco Costalba Wed, 20 May 2009 10:02:39 +0000 (12:02 +0200)
Hopefully it is now more clear what's happening here.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>

#include "square.h"

+////
+//// Local definitions
+////
+
+namespace {
+
+  const SquareDelta directionToDelta[] = {
+      DELTA_E, DELTA_W, DELTA_N, DELTA_S, DELTA_NE, DELTA_SW, DELTA_NW, DELTA_SE
+  };
+
+  bool reachable(Square orig, Square dest, SignedDirection dir) {
+
+    SquareDelta delta = directionToDelta[dir];
+    Square from = orig;
+    Square to = from + delta;
+    while (to != dest && square_distance(to, from) == 1 && square_is_ok(to))
+    {
+        from = to;
+        to += delta;
+    }
+    return (to == dest && square_distance(from, to) == 1);
+  }
+
+}
+
+
////
//// Variables
////
@@ -39,25 +65,23 @@ uint8_t SignedDirectionTable;
////

void init_direction_table() {
-  SquareDelta deltas = {
-    DELTA_E, DELTA_W, DELTA_N, DELTA_S, DELTA_NE, DELTA_SW, DELTA_NW, DELTA_SE
-  };
-  for(Square s1 = SQ_A1; s1 <= SQ_H8; s1++)
-    for(Square s2 = SQ_A1; s2 <= SQ_H8; s2++) {
-      DirectionTable[s1][s2] = uint8_t(DIR_NONE);
-      SignedDirectionTable[s1][s2] = uint8_t(SIGNED_DIR_NONE);
-      if(s1 == s2) continue;
-      for(SignedDirection d = SIGNED_DIR_E; d <= SIGNED_DIR_SE; d++) {
-        SquareDelta delta = deltas[d];
-        Square s3, s4;
-        for(s4 = s1 + delta, s3 = s1;
-            square_distance(s4, s3) == 1 && s4 != s2 && square_is_ok(s4);
-            s3 = s4, s4 += delta);
-        if(s4 == s2 && square_distance(s4, s3) == 1) {
-          SignedDirectionTable[s1][s2] = uint8_t(d);
-          DirectionTable[s1][s2] = uint8_t(d/2);
-          break;
-        }
+
+  for (Square s1 = SQ_A1; s1 <= SQ_H8; s1++)
+      for (Square s2 = SQ_A1; s2 <= SQ_H8; s2++)
+      {
+          DirectionTable[s1][s2] = uint8_t(DIR_NONE);
+          SignedDirectionTable[s1][s2] = uint8_t(SIGNED_DIR_NONE);
+          if (s1 == s2)
+              continue;
+
+          for (SignedDirection d = SIGNED_DIR_E; d != SIGNED_DIR_NONE; d++)
+          {
+              if (reachable(s1, s2, d))
+              {
+                  SignedDirectionTable[s1][s2] = uint8_t(d);
+                  DirectionTable[s1][s2] = uint8_t(d / 2);
+                  break;
+              }
+          }
}
-    }
}