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; }
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); } }