diff --git a/sim.c b/sim.c index 42ec0ec..a100446 100644 --- a/sim.c +++ b/sim.c @@ -245,7 +245,7 @@ static void oper_poke_and_stun(Glyph* restrict gbuffer, Mark* restrict mbuffer, _('W', movement) \ _('X', teleport) \ _('Y', yump) \ - _('Z', zig) + _('Z', lerp) #define MOVEMENT_CASES \ 'N' : case 'n' : case 'E' : case 'e' : case 'S' : case 's' : case 'W' \ @@ -747,26 +747,21 @@ BEGIN_OPERATOR(yump) POKE(0, 1, PEEK(0, -1)); END_OPERATOR -BEGIN_OPERATOR(zig) +BEGIN_OPERATOR(lerp) LOWERCASE_REQUIRES_BANG; - Glyph* gline = gbuffer + width * y; - gline[x] = '.'; - if (x + 1 == width) - return; - if (gline[x + 1] == '.') { - gline[x + 1] = This_oper_char; - mbuffer[width * y + x + 1] |= (U8)Mark_flag_sleep; - } else { - Usz n = 256; - if (x < n) - n = x; - for (Usz i = 0; i < n; ++i) { - if (gline[x - i - 1] != '.') { - gline[x - i] = This_oper_char; - break; - } - } - } + PORT(0, -1, IN); + PORT(0, 1, IN); + PORT(1, 0, IN | OUT); + Glyph g = PEEK(0, -1); + Isz rate = 1; + if (g != '.' && g != '*') + rate = (Isz)index_of(g); + Isz target = (Isz)index_of(PEEK(0, 1)); + Isz val = (Isz)index_of(PEEK(1, 0)); + Isz mod = (val <= target - rate) + ? rate + : ((val >= target + rate) ? -rate : target - val); + POKE(1, 0, glyph_of((Usz)(val + mod))); END_OPERATOR //////// Run simulation