Exemple #1
0
bool target_mode(entity *player) {
	if (!LOADED) {
		TARGET_X = player->x;
		TARGET_Y = player->y;
		LOADED = true;
	}

	draw();

	for (int x = player->x - BOUND - 1; x <= player->x + BOUND + 1; ++x) {
		draw_tile(BORDER, 0, x, player->y - BOUND - 1, player->x, player->y);
		draw_tile(BORDER, 0, x, player->y + BOUND + 1, player->x, player->y);
	}
	for (int y = player->y - BOUND - 1; y <= player->y + BOUND + 1; ++y) {
		draw_tile(BORDER, 0, player->x - BOUND - 1, y, player->x, player->y);
		draw_tile(BORDER, 0, player->x + BOUND + 1, y, player->x, player->y);
	}

	bresenham_line(player->x, player->y, TARGET_X, TARGET_Y, __target_cb, player);
	draw_tile(RETICLE, 0, TARGET_X, TARGET_Y, player->x, player->y);

	update_panels();
	doupdate();

	int input = getch();
	switch (input) {
	case 'h':
	case 'l':
	case 'k':
	case 'j':
	case 'y':
	case 'u':
	case 'b':
	case 'n': {
		int tx = 0, ty = 0;
		if (determine_offsets(input, &tx, &ty) && abs(TARGET_X + tx - player->x) <= BOUND && abs(TARGET_Y + ty - player->y) <= BOUND) {
			TARGET_X += tx;
			TARGET_Y += ty;
		}
	} break;
	case 27:
	case '\n':
		LOADED = false;
		break;
	}
	return true;
}
Exemple #2
0
void be_emit_code(FILE *output, const binary_emiter_interface_t *interface)
{
	unsigned offset;

	code_fragment_t *fragment;

	finish_fragment();

	/* determine near/far jumps */
	determine_offsets(interface);

	/* emit code */
	offset = 0;
	for (fragment = first_fragment; fragment != NULL;
	     fragment = fragment->next) {
	    unsigned char *jmpbuffer;
		unsigned nops;

	    /* assure alignment by emitting nops */
	    assert(fragment->offset >= offset);
	    nops = fragment->offset - offset;
	    if (nops > 0) {
			unsigned char *nopbuffer = (unsigned char*)obstack_alloc(&code_fragment_obst, nops);
			interface->create_nops(nopbuffer, nops);
			emit(output, nopbuffer, nops);
			offset = fragment->offset;
			obstack_free(&code_fragment_obst, nopbuffer);
		}

		/* emit the fragment */
		emit(output, fragment->data, fragment->len);
		offset += fragment->len;

		/* emit the jump */
		jmpbuffer = (unsigned char*)obstack_alloc(&code_fragment_obst, fragment->jumpsize_min);
		interface->emit_jump(fragment, jmpbuffer);
		emit(output, jmpbuffer, fragment->jumpsize_min);
		offset += fragment->jumpsize_min;
		obstack_free(&code_fragment_obst, jmpbuffer);
	}
}