46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
"""Character movement control for isometric games.
|
|
|
|
Handles click-to-move navigation with human-like patterns.
|
|
"""
|
|
|
|
from typing import Tuple, Optional
|
|
import logging
|
|
import time
|
|
|
|
import numpy as np
|
|
|
|
from engine.input.mouse import MouseController
|
|
from engine.input.humanize import Humanizer
|
|
from engine.navigation.pathfinder import Waypoint, WaypointGraph
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MovementController:
|
|
"""Controls character movement via click-to-move."""
|
|
|
|
def __init__(self, mouse: MouseController, humanizer: Humanizer):
|
|
self.mouse = mouse
|
|
self.humanizer = humanizer
|
|
self.waypoints = WaypointGraph()
|
|
|
|
def click_to_move(self, x: int, y: int) -> None:
|
|
"""Click a screen position to move there."""
|
|
jx, jy = self.humanizer.jitter_position(x, y)
|
|
self.mouse.move_to(jx, jy)
|
|
self.humanizer.wait()
|
|
self.mouse.click()
|
|
|
|
def navigate_waypoints(self, start: str, goal: str) -> bool:
|
|
"""Navigate between named waypoints."""
|
|
path = self.waypoints.find_path(start, goal)
|
|
if not path:
|
|
logger.warning(f"No path from {start} to {goal}")
|
|
return False
|
|
|
|
for waypoint in path[1:]: # Skip start
|
|
self.click_to_move(waypoint.screen_x, waypoint.screen_y)
|
|
# Wait for movement (game-specific timing)
|
|
time.sleep(self.humanizer.reaction_delay() + 0.5)
|
|
|
|
return True
|