using UnityEngine; using System.Collections.Generic; using System; /// /// Core quest data - follows same pattern as WeaponItem and ArmorItem for easy creation /// [CreateAssetMenu(fileName = "New Quest", menuName = "RPG/Quests/Quest")] [System.Serializable] public class Quest : ScriptableObject { [Header("Basic Information")] public string questTitle; [TextArea(3, 6)] public string questDescription; public QuestType questType; public QuestDifficulty difficulty; [Header("Quest Goals")] public List goals = new List(); [Header("Time Limits")] public int timeLimitDays = 7; [Tooltip("Additional hours beyond the days")] public int timeLimitHours = 0; [Header("Location")] public string targetAreaName = "Forest Clearing"; public Vector2Int targetMapPosition = Vector2Int.zero; [Tooltip("How far from target position is acceptable (in map tiles)")] public float completionRadius = 2f; [Header("Rewards")] public int goldReward = 50; public int silverReward = 0; public int copperReward = 0; public int renownReward = 10; public List itemRewards = new List(); [Header("Failure Penalties")] public int renownPenalty = 5; public bool canFail = true; [Header("Requirements")] public int minimumLevel = 1; public int minimumRenown = 0; public List prerequisiteQuests = new List(); // Compatibility properties for UI public string description => questDescription; public string targetLocationName => targetAreaName; public float targetLocationX => targetMapPosition.x; public float targetLocationY => targetMapPosition.y; public float timeLimit => GetTotalTimeLimitHours(); public List objectives => goals; [Header("Quest Generation")] [Tooltip("Tags used for random quest generation")] public string[] questTags = new string[] { "combat", "rescue", "retrieval" }; /// /// Calculate travel time from current position to quest location /// public float CalculateTravelTime(Vector2Int currentPosition, float travelSpeed = 1f) { float distance = Vector2Int.Distance(currentPosition, targetMapPosition); return distance / travelSpeed; // Returns time in game hours } /// /// Check if quest can be completed at given position /// public bool CanCompleteAtPosition(Vector2Int position) { float distance = Vector2Int.Distance(position, targetMapPosition); return distance <= completionRadius; } /// /// Get total time limit in hours /// public float GetTotalTimeLimitHours() { return (timeLimitDays * 24f) + timeLimitHours; } /// /// Create a runtime instance of this quest /// public ActiveQuest CreateActiveQuest() { return new ActiveQuest(this); } } [System.Serializable] public class QuestGoal { public string description; public QuestGoalType goalType; public string targetName; // Enemy type, item name, NPC name, etc. public int targetCount = 1; public int currentProgress = 0; public bool isHidden = false; // For surprise objectives public bool isOptional = false; public bool IsCompleted => currentProgress >= targetCount; public float ProgressPercent => targetCount > 0 ? (float)currentProgress / targetCount : 0f; // Compatibility property for UI public int targetAmount => targetCount; } public enum QuestType { Combat, // Kill enemies Rescue, // Save someone Retrieval, // Get items/artifacts Delivery, // Transport items Exploration, // Discover locations Escort // Protect someone } public enum QuestDifficulty { Easy, Normal, Hard, Legendary } public enum QuestGoalType { KillEnemies, CollectItems, RescuePerson, ReachLocation, SurviveTime, DefeatBoss, DeliverItem } [System.Serializable] public class QuestReward { public QuestRewardType type; public int amount; public string itemName; public UnityEngine.Object item; // For actual item references } public enum QuestRewardType { Gold, Silver, Copper, Renown, Item, Experience }