From 191cb6279378acfb0bcdf5a0d4ee1f76591c7a11 Mon Sep 17 00:00:00 2001 From: cancel Date: Tue, 27 Nov 2018 17:20:20 +0900 Subject: [PATCH] Add 'G' --- sim.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sim.c b/sim.c index ed2a4ba..9a5084f 100644 --- a/sim.c +++ b/sim.c @@ -135,6 +135,9 @@ static inline void oper_move_relative_or_explode(Gbuffer gbuf, Mbuffer mbuf, gbuffer_poke_relative(gbuffer, height, width, y, x, _delta_y, _delta_x, \ _glyph) #define BECOME(_glyph) gbuffer_poke(gbuffer, height, width, y, x, _glyph) +#define STUN(_delta_y, _delta_x) \ + mbuffer_poke_relative_flags_or(mbuffer, height, width, y, x, _delta_y, \ + _delta_x, Mark_flag_sleep) #define LOCKING Mark_flag_lock #define NONLOCKING Mark_flag_none @@ -153,6 +156,10 @@ static inline void oper_move_relative_or_explode(Gbuffer gbuf, Mbuffer mbuf, if (!Dual_is_active) \ return +#define STOP_IF_NOT_BANGED \ + if (!oper_has_neighboring_bang(gbuffer, height, width, y, x)) \ + return + #define I_PORT(_delta_y, _delta_x, _flags) \ mbuffer_poke_relative_flags_or( \ mbuffer, height, width, y, x, _delta_y, _delta_x, \ @@ -200,6 +207,7 @@ static inline void oper_move_relative_or_explode(Gbuffer gbuf, Mbuffer mbuf, _('W', 'w', west) \ _('Z', 'z', southeast) \ _('A', 'a', add) \ + _('G', 'g', generator) \ _('H', 'h', halt) \ _('I', 'i', increment) \ _('J', 'j', jump) \ @@ -235,6 +243,19 @@ BEGIN_DUAL_PHASE_1(add) POKE(1, 0, glyphs_add(PEEK(0, 1), PEEK(0, 2))); END_PHASE +BEGIN_DUAL_PHASE_0(generator) + REALIZE_DUAL; + BEGIN_DUAL_PORTS + I_PORT(0, 1, LOCKING); + O_PORT(1, 0, NONLOCKING); + END_PORTS +END_PHASE +BEGIN_DUAL_PHASE_1(generator) + STOP_IF_NOT_BANGED; + POKE(1, 0, PEEK(0, 1)); + STUN(0, 1); +END_PHASE + BEGIN_DUAL_PHASE_0(halt) REALIZE_DUAL; BEGIN_DUAL_PORTS