static void m2_swipe_nearby_items(short player_index) { object_data *object; object_data *player_object; player_data *player= get_player_data(player_index); short next_object; polygon_data *polygon; short *neighbor_indexes; short i; player_object= get_object_data(get_monster_data(player->monster_index)->object_index); polygon= get_polygon_data(player_object->polygon); neighbor_indexes= get_map_indexes(polygon->first_neighbor_index, polygon->neighbor_count); // Skip this step if neighbor indexes were not found if (!neighbor_indexes) return; for (i=0;i<polygon->neighbor_count;++i) { polygon_data *neighboring_polygon= get_polygon_data(*neighbor_indexes++); if (POLYGON_IS_DETACHED(neighboring_polygon)) continue; next_object= neighboring_polygon->first_object; while(next_object != NONE) { object= get_object_data(next_object); if (GET_OBJECT_OWNER(object)==_object_is_item && !OBJECT_IS_INVISIBLE(object)) { if (guess_distance2d((world_point2d *) &player->location, (world_point2d *) &object->location)<=MAXIMUM_ARM_REACH) { world_distance radius, height; get_monster_dimensions(player->monster_index, &radius, &height); if (object->location.z >= player->location.z - MAXIMUM_ARM_REACH && object->location.z <= player->location.z + height && test_item_retrieval(player_object->polygon, &player_object->location, &object->location)) { if(get_item(player_index, next_object)) { /* Start the search again.. */ next_object= neighboring_polygon->first_object; continue; } } } } next_object= object->next_object; } } }
static boolean line_is_within_range( short monster_index, short line_index, world_distance range) { world_point3d monster_origin= get_object_data(get_monster_data(monster_index)->object_index)->location; world_point3d line_origin; world_distance radius, height; world_distance dx, dy, dz; calculate_line_midpoint(line_index, &line_origin); get_monster_dimensions(monster_index, &radius, &height); monster_origin.z+= height>>1; dx= monster_origin.x-line_origin.x; dy= monster_origin.y-line_origin.y; dz= 2*(monster_origin.z-line_origin.z); /* dz is weighted */ return isqrt(dx*dx + dy*dy + dz*dz)<range ? TRUE : FALSE; }
static void a1_swipe_nearby_items(short player_index) { object_data *object; object_data *player_object; player_data *player = get_player_data(player_index); short next_object; polygon_data *polygon; short *neighbor_indexes; short i; player_object = get_object_data(get_monster_data(player->monster_index)->object_index); polygon= get_polygon_data(player_object->polygon); neighbor_indexes= get_map_indexes(polygon->first_neighbor_index, polygon->neighbor_count); // Skip this step if neighbor indexes were not found if (!neighbor_indexes) return; for (i=0;i<polygon->neighbor_count;++i) { struct polygon_data *neighboring_polygon= get_polygon_data(*neighbor_indexes++); /* LP change: since precalculate_map_indexes() and its associated routine intersecting_flood_proc() appear to have some bugs in them, I will instead search the neighbors of each indexed polygon. Starting the search from -1 is a kludge designed to include a search for the current polygon. */ polygon_data *source_polygon = neighboring_polygon; for (int ngbr_indx = -1; ngbr_indx<source_polygon->vertex_count; ngbr_indx++) { if (ngbr_indx >= 0) { // Be sure to check on whether there is a valid polygon on the other side auto adjacent_index = source_polygon->adjacent_polygon_indexes[ngbr_indx]; if (adjacent_index == NONE) continue; neighboring_polygon = get_polygon_data(adjacent_index); } else neighboring_polygon = source_polygon; if (!POLYGON_IS_DETACHED(neighboring_polygon)) { next_object= neighboring_polygon->first_object; while(next_object != NONE) { object= get_object_data(next_object); if (GET_OBJECT_OWNER(object)==_object_is_item && !OBJECT_IS_INVISIBLE(object)) { if (guess_distance2d((world_point2d *) &player->location, (world_point2d *) &object->location)<=MAXIMUM_ARM_REACH) { world_distance radius, height; get_monster_dimensions(player->monster_index, &radius, &height); if (object->location.z >= player->location.z - MAXIMUM_ARM_REACH && object->location.z <= player->location.z + height && test_item_retrieval(player_object->polygon, &player_object->location, &object->location)) { if(get_item(player_index, next_object)) { /* Start the search again.. */ next_object= neighboring_polygon->first_object; continue; } } } } next_object= object->next_object; } } // LP addition: end of that kludgy search loop } } }