static bool test_item_retrieval(short polygon_index1, world_point3d *location1, world_point3d *location2) { bool valid_retrieval= true; auto polygon_index = polygon_index1; do { auto line_index= find_line_crossed_leaving_polygon(polygon_index, (world_point2d *) location1, (world_point2d *) location2); if (line_index!=NONE) { polygon_index= find_adjacent_polygon(polygon_index, line_index); if (LINE_IS_SOLID(get_line_data(line_index))) valid_retrieval= false; if (polygon_index!=NONE) { polygon_data *polygon= get_polygon_data(polygon_index); if (polygon->type==_polygon_is_platform) { platform_data *platform= get_platform_data(polygon->permutation); if (PLATFORM_IS_MOVING(platform)) valid_retrieval= false; } } } else { polygon_index= NONE; } } while (polygon_index!=NONE && valid_retrieval); return valid_retrieval; }
static short find_action_key_target( short player_index, world_distance range, short *target_type) { struct player_data *player= get_player_data(player_index); short current_polygon= player->camera_polygon_index; world_point2d destination; boolean done= FALSE; short itemhit, line_index; struct polygon_data *polygon; /* Should we use this one, the physics one, or the object one? */ ray_to_line_segment((world_point2d *) &player->location, &destination, player->facing, range); // dprintf("#%d(#%d,#%d) --> (#%d,#%d) (#%d along #%d)", current_polygon, player->location.x, player->location.y, destination.x, destination.y, range, player->facing); itemhit= NONE; while (!done) { line_index= find_line_crossed_leaving_polygon(current_polygon, (world_point2d *) &player->location, &destination); if (line_index==NONE) { done= TRUE; } else { struct line_data *line; short original_polygon; line= get_line_data(line_index); original_polygon= current_polygon; current_polygon= find_adjacent_polygon(current_polygon, line_index); // dprintf("leaving polygon #%d through line #%d to polygon #%d", original_polygon, line_index, current_polygon); if (current_polygon!=NONE) { polygon= get_polygon_data(current_polygon); /* We hit a platform */ if (polygon->type==_polygon_is_platform && line_is_within_range(player->monster_index, line_index, MAXIMUM_PLATFORM_ACTIVATION_RANGE) && platform_is_legal_player_target(polygon->permutation)) { // dprintf("found platform #%d in %p", polygon->permutation, polygon); itemhit= polygon->permutation; *target_type= _target_is_platform; done= TRUE; } } else { done= TRUE; } /* Slammed a wall */ if (line_is_within_range(player->monster_index, line_index, MAXIMUM_CONTROL_ACTIVATION_RANGE)) { if (line_side_has_control_panel(line_index, original_polygon, &itemhit)) { if (switch_can_be_toggled(itemhit, TRUE)) { *target_type= _target_is_control_panel; done= TRUE; } else { itemhit= NONE; } } } } } return itemhit; }