~rabbits/orca-toy

454a771db92457092bca95cd7d527ab0740ec092 — neauoire 2 years ago 9bad27b
Implemented A&B
2 files changed, 67 insertions(+), 22 deletions(-)

M demo.orca
M toy.c
M demo.orca => demo.orca +9 -9
@@ 1,9 1,9 @@
.....................
.S.W...S.............
......E0W............
.E.N...N.............
.....................
..A.1A.A2.1A2........
.....................
.....................
.....................
.........................................
.S.W...S.................................
......E0W................................
.E.N...N.................................
.........................................
..A.1A.A2.1A2.aA1.1AB.zA2................
.........................................
..B.1B.B2.1B2.aB1.1BB.zB2................
.........................................

M toy.c => toy.c +58 -13
@@ 7,22 7,36 @@ typedef struct Grid {
} Grid;

int
error(char *name)
cint(char c)
{
	printf("Error: %s\n", name);
	if(c == '.')
		return 0;
	if(c >= '0' && c <= '9')
		return c - '0';
	if(c >= 'a' && c <= 'z')
		return c - 'a' + 10;
	if(c >= 'A' && c <= 'Z')
		return c - 'A' + 10;
	return 0;
}

void
lock(Grid *g, int x, int y, int b)
char
cchr(int v, int cap)
{
	g->lock[x + (y * g->w)] = b;
	v %= 36;
	v *= v < 0 ? -1 : 1;
	if(v >= 0 && v <= 9)
		return '0' + v;
	if(cap)
		return 'A' + (v - 10);
	return 'a' + (v - 10);
}

int
busy(Grid *g, int x, int y)
error(char *name)
{
	return g->lock[x + (y * g->w)];
	printf("Error: %s\n", name);
	return 0;
}

char


@@ 40,7 54,32 @@ set(Grid *g, int x, int y, char c)
int
getint(Grid *g, int x, int y)
{
	return get(g, x, y) - '0';
	return cint(get(g, x, y));
}

void
setint(Grid *g, int x, int y, int v)
{
	g->data[x + (y * g->w)] = cchr(v, 0);
}

void
lock(Grid *g, int x, int y)
{
	g->lock[x + (y * g->w)] = 1;
}

int
busy(Grid *g, int x, int y)
{
	return g->lock[x + (y * g->w)];
}

int
caps(Grid *g, int x, int y)
{
	char c = get(g, x, y);
	return c >= 'A' && c <= 'Z';
}

void


@@ 59,14 98,20 @@ parse(Grid *g)
		if(busy(g, x, y))
			continue;
		if(c == 'A') {
			set(g, x, y + 1, '0');
			set(g, x, y + 1, cchr(getint(g, x - 1, y) + getint(g, x + 1, y), caps(g, x + 1, y)));
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'B') {
			set(g, x, y + 1, cchr(getint(g, x - 1, y) - getint(g, x + 1, y), caps(g, x + 1, y)));
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'E') {
			if(x == g->w || get(g, x + 1, y) != '.')
				set(g, x, y, '*');
			else {
				set(g, x, y, '.');
				set(g, x + 1, y, 'E');
				lock(g, x + 1, y, 1);
				lock(g, x + 1, y);
			}
		} else if(c == 'N') {
			if(y == 0 || get(g, x, y - 1) != '.')


@@ 74,7 119,7 @@ parse(Grid *g)
			else {
				set(g, x, y, '.');
				set(g, x, y - 1, 'N');
				lock(g, x, y - 1, 1);
				lock(g, x, y - 1);
			}
		} else if(c == 'S') {
			if(y == g->h || get(g, x, y + 1) != '.')


@@ 82,7 127,7 @@ parse(Grid *g)
			else {
				set(g, x, y, '.');
				set(g, x, y + 1, 'S');
				lock(g, x, y + 1, 1);
				lock(g, x, y + 1);
			}
		} else if(c == 'W') {
			if(x == 0 || get(g, x - 1, y) != '.')


@@ 90,7 135,7 @@ parse(Grid *g)
			else {
				set(g, x, y, '.');
				set(g, x - 1, y, 'W');
				lock(g, x - 1, y, 1);
				lock(g, x - 1, y);
			}
		}
	}