using UnityEngine;
///
/// Debug helper for the travel system - helps troubleshoot coordinate issues
///
public class TravelSystemDebugger : MonoBehaviour
{
[Header("Debug Settings")]
public bool enableDebugOverlay = true;
public bool showCoordinates = true;
public bool showCameraInfo = true;
public KeyCode toggleKey = KeyCode.F9;
[Header("Visual Debug")]
public Color guiTextColor = Color.yellow;
public int fontSize = 16;
private Camera mapCamera;
private MapMaker2 mapMaker;
private SimpleTeamPlacement teamPlacement;
private TeamTravelSystem travelSystem;
void Start()
{
mapCamera = Camera.main;
mapMaker = FindFirstObjectByType();
teamPlacement = FindFirstObjectByType();
travelSystem = FindFirstObjectByType();
}
void Update()
{
if (Input.GetKeyDown(toggleKey))
{
enableDebugOverlay = !enableDebugOverlay;
Debug.Log($"🔧 Travel System Debug Overlay: {(enableDebugOverlay ? "ENABLED" : "DISABLED")}");
}
// Log mouse clicks for debugging
if (Input.GetMouseButtonDown(0))
{
LogMouseClickInfo();
}
}
void OnGUI()
{
if (!enableDebugOverlay) return;
GUI.color = guiTextColor;
GUIStyle style = new GUIStyle(GUI.skin.label);
style.fontSize = fontSize;
float yPos = 50f;
float lineHeight = 25f;
// Mouse position info
if (showCoordinates)
{
Vector3 mousePos = Input.mousePosition;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Screen Mouse: {mousePos.x:F0}, {mousePos.y:F0}", style);
yPos += lineHeight;
if (mapCamera != null)
{
Vector3 worldPos = GetMouseWorldPosition();
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"World Mouse: {worldPos.x:F2}, {worldPos.y:F2}, {worldPos.z:F2}", style);
yPos += lineHeight;
Vector2Int tilePos = WorldToTilePosition(worldPos);
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Tile Position: {tilePos.x}, {tilePos.y}", style);
yPos += lineHeight;
}
}
// Camera info
if (showCameraInfo && mapCamera != null)
{
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Camera Pos: {mapCamera.transform.position.x:F1}, {mapCamera.transform.position.y:F1}, {mapCamera.transform.position.z:F1}", style);
yPos += lineHeight;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Camera Size: {mapCamera.orthographicSize:F1}", style);
yPos += lineHeight;
}
// System status
yPos += lineHeight;
GUI.Label(new Rect(10, yPos, 400, lineHeight), "=== SYSTEM STATUS ===", style);
yPos += lineHeight;
bool mapMakerOK = mapMaker != null;
bool teamPlacementOK = teamPlacement != null && teamPlacement.IsTeamPlaced();
bool travelSystemOK = travelSystem != null;
GUI.color = mapMakerOK ? Color.green : Color.red;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"MapMaker2: {(mapMakerOK ? "✅ OK" : "❌ Missing")}", style);
yPos += lineHeight;
GUI.color = teamPlacementOK ? Color.green : Color.red;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Team Placement: {(teamPlacementOK ? "✅ OK" : "❌ Missing/Not Placed")}", style);
yPos += lineHeight;
GUI.color = travelSystemOK ? Color.green : Color.red;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Travel System: {(travelSystemOK ? "✅ OK" : "❌ Missing")}", style);
yPos += lineHeight;
if (teamPlacementOK)
{
GUI.color = Color.cyan;
Vector2Int teamPos = teamPlacement.GetTeamPosition();
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Team Position: {teamPos.x}, {teamPos.y}", style);
yPos += lineHeight;
}
if (mapMakerOK && mapMaker.GetMapData() != null)
{
GUI.color = Color.cyan;
var mapData = mapMaker.GetMapData();
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Map Size: {mapData.Width}x{mapData.Height}", style);
yPos += lineHeight;
float tileSize = mapMaker.mapVisualizer?.tileSize ?? 1f;
GUI.Label(new Rect(10, yPos, 400, lineHeight), $"Tile Size: {tileSize}", style);
yPos += lineHeight;
}
GUI.color = Color.white;
}
private void LogMouseClickInfo()
{
Debug.Log("=== MOUSE CLICK DEBUG ===");
Debug.Log($"Screen Position: {Input.mousePosition}");
if (mapCamera != null)
{
Vector3 worldPos = GetMouseWorldPosition();
Debug.Log($"World Position: {worldPos}");
Vector2Int tilePos = WorldToTilePosition(worldPos);
Debug.Log($"Tile Position: {tilePos}");
if (mapMaker?.GetMapData() != null)
{
var mapData = mapMaker.GetMapData();
bool isValid = mapData.IsValidPosition(tilePos.x, tilePos.y);
Debug.Log($"Valid Tile: {isValid}");
if (isValid)
{
var tile = mapData.GetTile(tilePos.x, tilePos.y);
Debug.Log($"Tile Info: {tile.terrainType}, {tile.featureType}");
}
}
}
else
{
Debug.LogWarning("No camera found for world position calculation");
}
Debug.Log("========================");
}
private Vector3 GetMouseWorldPosition()
{
if (mapCamera == null) return Vector3.zero;
Ray ray = mapCamera.ScreenPointToRay(Input.mousePosition);
// Try raycast first
if (Physics.Raycast(ray, out RaycastHit hit, 1000f))
{
return hit.point;
}
// Fallback: use camera plane projection at Z=0 (map level)
Plane mapPlane = new Plane(Vector3.back, Vector3.zero);
if (mapPlane.Raycast(ray, out float distance))
{
return ray.GetPoint(distance);
}
return Vector3.zero;
}
private Vector2Int WorldToTilePosition(Vector3 worldPos)
{
float tileSize = mapMaker?.mapVisualizer?.tileSize ?? 1f;
return new Vector2Int(
Mathf.RoundToInt(worldPos.x / tileSize),
Mathf.RoundToInt(worldPos.y / tileSize)
);
}
}