void pf_move_to_mouse_position() { int x, y, clicked_x, clicked_y; int tries; if (!pf_get_mouse_position(mouse_x, mouse_y, &clicked_x, &clicked_y)) return; x = clicked_x; y = clicked_y; if (pf_find_path(x, y)) return; for (x= clicked_x-3, tries= 0; x <= clicked_x+3 && tries < 4 ; x++) { for (y= clicked_y-3; y <= clicked_y+3 && tries < 4; y++) { if (x == clicked_x && y == clicked_y) continue; pf_dst_tile = pf_get_tile(x, y); if (pf_dst_tile && pf_dst_tile->z > 0) { if (pf_find_path(x, y)) return; tries++; } } } }
int main(void){ int i; ExactPosition start, goal; Map* map; MapContainer mc; BellmanFord* bf_state; bf_state = malloc(sizeof(BellmanFord)); /* Build a map */ map_heap_container = &mc; map = map_heap_alloc(MAP_MAX_WIDTH, MAP_MAX_HEIGHT); mc.accu = map; for(i = 0; i <= 10; ++i) { map_set_field(map, 12, i, FIELD_WALL); } start.x = 5.3; start.y = 5.1; goal.x = 17.1; goal.y = 6.1; printf("Starting search\n"); pf_find_path(start, goal, bf_state); assert(bf_state->init_v != -1); printf("Found path:\n"); i = 0; while (bf_state->init_v != -1) { ExactPosition buf; buf = bf_v2pos(bf_state, bf_state->init_v); printf("-> (%.1f, %.1f)", buf.x, buf.y); bf_state->init_v = bf_state->succ[bf_state->init_v]; assert(++i < 30); } printf("\n\tEVALUATE BY HAND!\n"); free(bf_state); map_heap_container = NULL; map_heap_free(map); free_printbuf(); return 0; }
/* * Handler for clicks into minimap. Coordinates are given as window pixels with origin at bottom-left corner */ static int minimap_walkto(int mx, int my) { float fmx = mx, fmy = my; actor *me; if ( (me = get_our_actor ()) == NULL) return 0; rotate_click_coords(&fmx,&fmy); fmx = me->x_tile_pos - minimap_tiles_distance + minimap_tiles_distance * 2 * fmx/float_minimap_size; fmy = me->y_tile_pos - minimap_tiles_distance + minimap_tiles_distance * 2 * fmy/float_minimap_size; /* Do path finding */ if (pf_find_path(fmx, fmy)) { return 1; } return 0; }