| 99 | self.move_mouse(move_x, move_y, shooting_state) |
| 100 | |
| 101 | def predict_target_position(self, target_x, target_y, current_time): |
| 102 | # First target |
| 103 | if self.prev_time is None: |
| 104 | self.prev_time = current_time |
| 105 | self.prev_x = target_x |
| 106 | self.prev_y = target_y |
| 107 | self.prev_velocity_x = 0 |
| 108 | self.prev_velocity_y = 0 |
| 109 | return target_x, target_y |
| 110 | |
| 111 | # Next target? |
| 112 | max_jump = max(self.screen_width, self.screen_height) * 0.3 # 30% |
| 113 | if abs(target_x - self.prev_x) > max_jump or abs(target_y - self.prev_y) > max_jump: |
| 114 | self.prev_x, self.prev_y = target_x, target_y |
| 115 | self.prev_velocity_x = 0 |
| 116 | self.prev_velocity_y = 0 |
| 117 | self.prev_time = current_time |
| 118 | return target_x, target_y |
| 119 | |
| 120 | delta_time = current_time - self.prev_time |
| 121 | |
| 122 | if delta_time <= 0: |
| 123 | delta_time = 1e-3 |
| 124 | |
| 125 | velocity_x = (target_x - self.prev_x) / delta_time |
| 126 | velocity_y = (target_y - self.prev_y) / delta_time |
| 127 | acceleration_x = (velocity_x - self.prev_velocity_x) / delta_time |
| 128 | acceleration_y = (velocity_y - self.prev_velocity_y) / delta_time |
| 129 | |
| 130 | prediction_interval = delta_time * self.prediction_interval |
| 131 | current_distance = math.sqrt((target_x - self.prev_x)**2 + (target_y - self.prev_y)**2) |
| 132 | proximity_factor = max(0.1, min(1, 1 / (current_distance + 1))) |
| 133 | |
| 134 | speed_correction = 1 + (abs(current_distance - (self.prev_distance or 0)) / self.max_distance) * self.speed_correction_factor if self.prev_distance is not None else 1.0 |
| 135 | |
| 136 | predicted_x = target_x + velocity_x * prediction_interval * proximity_factor * speed_correction + 0.5 * acceleration_x * (prediction_interval ** 2) * proximity_factor * speed_correction |
| 137 | predicted_y = target_y + velocity_y * prediction_interval * proximity_factor * speed_correction + 0.5 * acceleration_y * (prediction_interval ** 2) * proximity_factor * speed_correction |
| 138 | |
| 139 | self.prev_x, self.prev_y = target_x, target_y |
| 140 | self.prev_velocity_x, self.prev_velocity_y = velocity_x, velocity_y |
| 141 | self.prev_time = current_time |
| 142 | self.prev_distance = current_distance |
| 143 | |
| 144 | return predicted_x, predicted_y |
| 145 | |
| 146 | def calculate_speed_multiplier(self, target_x, target_y, distance): |
| 147 | if any(map(math.isnan, (target_x, target_y))) or self.section_size_x == 0: |