using UnityEngine;
using System.Collections;
///
/// Simple UI manager for displaying travel event messages
/// Integrates with your existing UI system to show event popups
///
public class TravelEventUI : MonoBehaviour
{
[Header("Event UI Settings")]
public bool useDebugUI = true; // Use simple debug UI for now
public float messageDisplayTime = 4f;
public KeyCode dismissKey = KeyCode.Space;
[Header("Event Message Queue")]
public int maxQueuedMessages = 5;
// Internal state
private System.Collections.Generic.Queue messageQueue = new System.Collections.Generic.Queue();
private bool isShowingMessage = false;
private EventMessage currentMessage;
private float messageTimer = 0f;
// UI Elements (for future implementation)
private Canvas eventCanvas;
private UnityEngine.UI.Text eventText;
private UnityEngine.UI.Button dismissButton;
[System.Serializable]
private class EventMessage
{
public string message;
public EventType eventType;
public float displayTime;
public bool requiresPlayerInput;
public EventMessage(string msg, EventType type, float time = 4f, bool requiresInput = false)
{
message = msg;
eventType = type;
displayTime = time;
requiresPlayerInput = requiresInput;
}
}
void Start()
{
SetupEventUI();
}
void Update()
{
HandleEventDisplay();
HandleInput();
}
///
/// Show a travel event message to the player
///
public void ShowEventMessage(string message, EventType eventType = EventType.Discovery, bool requiresInput = false)
{
if (string.IsNullOrEmpty(message)) return;
var eventMessage = new EventMessage(message, eventType, messageDisplayTime, requiresInput);
if (messageQueue.Count >= maxQueuedMessages)
{
Debug.LogWarning("โ ๏ธ Event message queue full, discarding oldest message");
messageQueue.Dequeue();
}
messageQueue.Enqueue(eventMessage);
Debug.Log($"๐ Queued event message: {message}");
}
///
/// Show an event result with appropriate formatting
///
public void ShowEventResult(EventResult result)
{
if (result == null || !result.eventOccurred) return;
string message = result.resultMessage;
// Add resource change information to the message
if (result.goldChange != 0 || result.healthChange != 0 || result.foodChange != 0)
{
message += "\n\nEffects:";
if (result.goldChange > 0) message += $"\n๐ฐ +{result.goldChange} Gold";
if (result.goldChange < 0) message += $"\n๐ฐ {result.goldChange} Gold";
if (result.healthChange > 0) message += $"\nโค๏ธ +{result.healthChange} Health";
if (result.healthChange < 0) message += $"\nโค๏ธ {result.healthChange} Health";
if (result.foodChange > 0) message += $"\n๐ +{result.foodChange} Food";
if (result.foodChange < 0) message += $"\n๐ {result.foodChange} Food";
}
// Determine event type based on result
EventType eventType = EventType.Discovery;
if (result.startBattle) eventType = EventType.Combat;
else if (result.openTrading) eventType = EventType.Trading;
else if (result.healthChange < 0) eventType = EventType.Hazard;
else if (result.healthChange > 0) eventType = EventType.Rest;
bool requiresInput = result.shouldStopTravel || result.startBattle || result.openTrading;
ShowEventMessage(message, eventType, requiresInput);
}
private void SetupEventUI()
{
if (useDebugUI)
{
// For now, we'll use the debug console
Debug.Log("๐ฅ๏ธ Travel Event UI initialized (Debug Mode)");
return;
}
// TODO: Set up proper UI elements
// This would create or find UI canvas, text elements, buttons, etc.
// For integration with your existing UI system
}
private void HandleEventDisplay()
{
// Start showing next message if not currently showing one
if (!isShowingMessage && messageQueue.Count > 0)
{
currentMessage = messageQueue.Dequeue();
isShowingMessage = true;
messageTimer = 0f;
DisplayCurrentMessage();
}
// Handle message timing
if (isShowingMessage && currentMessage != null)
{
messageTimer += Time.deltaTime;
// Auto-dismiss if time expires and no input required
if (!currentMessage.requiresPlayerInput && messageTimer >= currentMessage.displayTime)
{
DismissCurrentMessage();
}
}
}
private void HandleInput()
{
if (!isShowingMessage || currentMessage == null) return;
// Handle dismiss input
if (Input.GetKeyDown(dismissKey))
{
DismissCurrentMessage();
}
// Handle other event-specific inputs
if (currentMessage.requiresPlayerInput)
{
// TODO: Handle specific event choices (Accept/Decline trade, etc.)
}
}
private void DisplayCurrentMessage()
{
if (currentMessage == null) return;
if (useDebugUI)
{
string prefix = GetEventTypePrefix(currentMessage.eventType);
Debug.Log($"{prefix} {currentMessage.message}");
if (currentMessage.requiresPlayerInput)
{
Debug.Log($"๐ก Press {dismissKey} to continue...");
}
}
else
{
// TODO: Display in proper UI
// Set text content, show panel, animate, etc.
}
}
private void DismissCurrentMessage()
{
if (currentMessage == null) return;
Debug.Log($"โ
Event message dismissed: {currentMessage.eventType}");
currentMessage = null;
isShowingMessage = false;
messageTimer = 0f;
if (!useDebugUI)
{
// TODO: Hide UI elements, animate out, etc.
}
}
private string GetEventTypePrefix(EventType eventType)
{
return eventType switch
{
EventType.Combat => "โ๏ธ COMBAT:",
EventType.Trading => "๐ TRADING:",
EventType.Discovery => "๐ DISCOVERY:",
EventType.Social => "๐ฅ ENCOUNTER:",
EventType.Hazard => "โ ๏ธ HAZARD:",
EventType.Rest => "๐๏ธ REST:",
EventType.Mystery => "โ MYSTERY:",
_ => "๐ EVENT:"
};
}
///
/// Clear all queued messages
///
public void ClearMessages()
{
messageQueue.Clear();
if (isShowingMessage)
{
DismissCurrentMessage();
}
Debug.Log("๐งน Event message queue cleared");
}
///
/// Check if the UI is currently showing a message that requires input
///
public bool IsWaitingForInput()
{
return isShowingMessage && currentMessage != null && currentMessage.requiresPlayerInput;
}
///
/// Get the number of queued messages
///
public int GetQueuedMessageCount()
{
return messageQueue.Count;
}
void OnGUI()
{
if (!useDebugUI || !isShowingMessage || currentMessage == null) return;
// Simple on-screen display for debugging
GUIStyle style = new GUIStyle(GUI.skin.box);
style.fontSize = 16;
style.wordWrap = true;
style.alignment = TextAnchor.MiddleCenter;
// Background box
float boxWidth = Screen.width * 0.6f;
float boxHeight = Screen.height * 0.3f;
float boxX = (Screen.width - boxWidth) * 0.5f;
float boxY = (Screen.height - boxHeight) * 0.5f;
GUI.Box(new Rect(boxX, boxY, boxWidth, boxHeight), "", style);
// Event message
GUIStyle textStyle = new GUIStyle(GUI.skin.label);
textStyle.fontSize = 14;
textStyle.wordWrap = true;
textStyle.alignment = TextAnchor.MiddleCenter;
textStyle.normal.textColor = Color.white;
string displayText = currentMessage.message;
if (currentMessage.requiresPlayerInput)
{
displayText += $"\n\n[Press {dismissKey} to continue]";
}
else
{
float timeLeft = currentMessage.displayTime - messageTimer;
displayText += $"\n\n(Auto-dismiss in {timeLeft:F1}s)";
}
GUI.Label(new Rect(boxX + 10, boxY + 10, boxWidth - 20, boxHeight - 20), displayText, textStyle);
}
}