shithub: orca

Download patch

ref: 3946701d85b15315ec07198b32f6fee2a98f2d29
parent: 990b9ec63cd2c9726f84f2f24d764ffc83f54e93
author: cancel <[email protected]>
date: Wed Nov 28 12:57:55 EST 2018

Add 'U'

--- a/sim.c
+++ b/sim.c
@@ -266,6 +266,7 @@
   _('J', 'j', jump)                                                            \
   _('M', 'm', modulo)                                                          \
   _('O', 'o', offset)                                                          \
+  _('U', 'u', uturn)                                                           \
   _('X', 'x', teleport)
 
 ORCA_DECLARE_OPERATORS(ORCA_SOLO_OPERATORS, ORCA_DUAL_OPERATORS)
@@ -401,6 +402,45 @@
   POKE(1, 0, PEEK(read_y, read_x));
   STUN(0, 1);
 END_PHASE
+
+#define UTURN_DIRS(_)                                                          \
+  _(-1, 0, 'N')                                                                \
+  _(0, -1, 'W')                                                                \
+  _(0, 1, 'E')                                                                 \
+  _(1, 0, 'S')
+
+BEGIN_DUAL_PHASE_0(uturn)
+  REALIZE_DUAL;
+  BEGIN_DUAL_PORTS
+#define X(_d_y, _d_x, _d_glyph) PORT(_d_y, _d_x, IN | OUT | HASTE | NONLOCKING);
+    UTURN_DIRS(X)
+#undef X
+  END_PORTS
+END_PHASE
+BEGIN_DUAL_PHASE_1(uturn)
+#define X(_d_y, _d_x, _d_glyph)                                                \
+  {                                                                            \
+    Glyph g = PEEK(_d_y, _d_x);                                                \
+    switch (g) {                                                               \
+    case 'N':                                                                  \
+    case 'n':                                                                  \
+    case 'E':                                                                  \
+    case 'e':                                                                  \
+    case 'S':                                                                  \
+    case 's':                                                                  \
+    case 'W':                                                                  \
+    case 'w':                                                                  \
+    case 'Z':                                                                  \
+    case 'z':                                                                  \
+      POKE(_d_y, _d_x, _d_glyph);                                              \
+      STUN(_d_y, _d_x);                                                        \
+    }                                                                          \
+  }
+  UTURN_DIRS(X)
+#undef X
+END_PHASE
+
+#undef UTURN_DIRS
 
 BEGIN_DUAL_PHASE_0(teleport)
   REALIZE_DUAL;