Browse Source

Merge pull request #30 from npisanti/master

U is now the uclid operator
master
Nicola Pisanti 6 years ago
committed by GitHub
parent
commit
d1de810c75
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 45
      sim.c

45
sim.c

@ -240,7 +240,7 @@ static void oper_poke_and_stun(Glyph* restrict gbuffer, Mark* restrict mbuffer,
_('R', random) \ _('R', random) \
_('S', movement) \ _('S', movement) \
_('T', track) \ _('T', track) \
_('U', uturn) \ _('U', uclid) \
_('V', variable) \ _('V', variable) \
_('W', movement) \ _('W', movement) \
_('X', teleport) \ _('X', teleport) \
@ -682,34 +682,23 @@ BEGIN_OPERATOR(track)
POKE(1, 0, PEEK(0, read_val_x)); POKE(1, 0, PEEK(0, read_val_x));
END_OPERATOR END_OPERATOR
static Isz const uturn_data[] = { // optimized starting from from
// clang-format off // https://www.computermusicdesign.com/simplest-euclidean-rhythm-algorithm-explained/
-1, 0, (Isz)'N', BEGIN_OPERATOR(uclid)
0, -1, (Isz)'W',
0, 1, (Isz)'E',
1, 0, (Isz)'S',
// clang-format on
};
enum {
Uturn_per = 3,
Uturn_loop_limit = Uturn_per * 4,
};
BEGIN_OPERATOR(uturn)
LOWERCASE_REQUIRES_BANG; LOWERCASE_REQUIRES_BANG;
for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) { PORT(0, -1, IN | PARAM);
PORT(uturn_data[i + 0], uturn_data[i + 1], IN | OUT | PARAM | NONLOCKING); PORT(0, 1, IN);
} PORT(1, 0, OUT);
for (Usz i = 0; i < Uturn_loop_limit; i += Uturn_per) { Glyph left = PEEK(0, -1);
Isz dy = uturn_data[i + 0]; Usz steps = 1;
Isz dx = uturn_data[i + 1]; if (left != '.' && left != '*')
Glyph g = PEEK(dy, dx); steps = index_of(left);
switch (g) { Usz max = index_of(PEEK(0, 1));
case MOVEMENT_CASES: if (max == 0)
POKE(dy, dx, (Glyph)uturn_data[i + 2]); max = 8;
} Usz bucket = (steps * (Tick_number + max - 1)) % max + steps;
} Glyph g = (bucket >= max) ? '*' : '.';
POKE(1, 0, g);
END_OPERATOR END_OPERATOR
BEGIN_OPERATOR(variable) BEGIN_OPERATOR(variable)

Loading…
Cancel
Save