~rabbits/noton

517d2e190172c0ea351aa37a74372c6b4c982de3 — neauoire 3 years ago b5c0cbb
Dont overlap nodes
1 files changed, 29 insertions(+), 22 deletions(-)

M noton.c
M noton.c => noton.c +29 -22
@@ 37,7 37,7 @@ typedef struct Wire {
} Wire;

typedef struct Gate {
	int id, active, polarity, value, inlen, outlen;
	int id, active, polarity, value, locked, inlen, outlen;
	Point2d pos;
	GateType type;
	Wire *inputs[PORTMAX], *outputs[PORTMAX];


@@ 98,6 98,16 @@ playnote(int val, int z)
}

Gate*
findgateid(Arena* a, int id)
{
	if(id < 0 || id >= GATEMAX)
		return NULL;
	if(!&a->gates[id] || !a->gates[id].active)
		return NULL;
	return &a->gates[id];
}

Gate*
availgate(Arena* a)
{
	int i;


@@ 133,12 143,6 @@ findgateat(Arena* a, Point2d pos)
	return NULL;
}

Gate*
findgateid(Arena* a, int id)
{
	return id >= 0 && &a->gates[id] ? &a->gates[id] : NULL;
}

int
getpolarity(Gate* g)
{


@@ 185,21 189,18 @@ bang(Gate* g, int depth)
}

void
destroy(void)
destroy(Arena* a)
{
	/*
	int i;
	if(arena.gates_len <= 22)
	for(i = GATEMAX - 1; i >= 0; --i) {
		if(!a->gates[i].active)
			continue;
		if(a->gates[i].locked)
			continue;
		a->gates[i].active = 0;
		return;
	arena.gates[arena.gates_len - 1].active = 0;
	for(i = 0; i < arena.wires_len; i++) {
		if(arena.wires[i].a == arena.gates_len - 1)
			arena.wires[i].active = 0;
		if(arena.wires[i].b == arena.gates_len - 1)
			arena.wires[i].active = 0;
	}
	arena.gates_len--;
	*/
	printf("Nothing to erase\n");
}

/* Wiring */


@@ 420,15 421,20 @@ void
setup(void)
{
	int i;
	Gate *gtrue, *gfalse;
	for(i = 0; i < 8; ++i) {
		arena.inputs[i] = addgate(&arena, INPUT, 0, Pt2d(i % 2 == 0 ? 26 : 20, 30 + i * 6));
		arena.inputs[i]->locked = 1;
	}
	for(i = 0; i < 12; ++i) {
		arena.outputs[i] = addgate(&arena, OUTPUT, 0, Pt2d(WIDTH - (i % 2 == 0 ? 46 : 40), 30 + i * 6));
		arena.outputs[i]->locked = 1;
		arena.outputs[i]->value = i;
	}
	addgate(&arena, INPUT, 0, Pt2d((10 % 2 == 0 ? 26 : 20), 30 + 10 * 6));
	addgate(&arena, INPUT, 1, Pt2d((11 % 2 == 0 ? 26 : 20), 30 + 11 * 6));
	gfalse = addgate(&arena, INPUT, 0, Pt2d((10 % 2 == 0 ? 26 : 20), 30 + 10 * 6));
	gfalse->locked = 1;
	gtrue = addgate(&arena, INPUT, 1, Pt2d((11 % 2 == 0 ? 26 : 20), 30 + 11 * 6));
	gtrue->locked = 1;
}

/* options */


@@ 485,7 491,8 @@ domouse(SDL_Event* event, Brush* b)
		        (event->motion.x - (PAD * ZOOM)) / ZOOM,
		        (event->motion.y - (PAD * ZOOM)) / ZOOM);
		if(event->button.button == SDL_BUTTON_RIGHT) {
			addgate(&arena, XOR, -1, b->pos);
			if(!findgateat(&arena, b->pos))
				addgate(&arena, XOR, -1, b->pos);
			redraw(pixels, b);
			break;
		}


@@ 510,7 517,7 @@ dokey(SDL_Event* event, Brush* b)
		break;
	case SDLK_BACKSPACE:
		/* TODO */
		destroy();
		destroy(&arena);
		redraw(pixels, b);
		break;
	}