Quest.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using System;
  4. /// <summary>
  5. /// Core quest data - follows same pattern as WeaponItem and ArmorItem for easy creation
  6. /// </summary>
  7. [CreateAssetMenu(fileName = "New Quest", menuName = "RPG/Quests/Quest")]
  8. [System.Serializable]
  9. public class Quest : ScriptableObject
  10. {
  11. [Header("Basic Information")]
  12. public string questTitle;
  13. [TextArea(3, 6)]
  14. public string questDescription;
  15. public QuestType questType;
  16. public QuestDifficulty difficulty;
  17. [Header("Quest Goals")]
  18. public List<QuestGoal> goals = new List<QuestGoal>();
  19. [Header("Time Limits")]
  20. public int timeLimitDays = 7;
  21. [Tooltip("Additional hours beyond the days")]
  22. public int timeLimitHours = 0;
  23. [Header("Location")]
  24. public string targetAreaName = "Forest Clearing";
  25. public Vector2Int targetMapPosition = Vector2Int.zero;
  26. [Tooltip("How far from target position is acceptable (in map tiles)")]
  27. public float completionRadius = 2f;
  28. [Header("Rewards")]
  29. public int goldReward = 50;
  30. public int silverReward = 0;
  31. public int copperReward = 0;
  32. public int renownReward = 10;
  33. public List<string> itemRewards = new List<string>();
  34. [Header("Failure Penalties")]
  35. public int renownPenalty = 5;
  36. public bool canFail = true;
  37. [Header("Requirements")]
  38. public int minimumLevel = 1;
  39. public int minimumRenown = 0;
  40. public List<string> prerequisiteQuests = new List<string>();
  41. // Compatibility properties for UI
  42. public string description => questDescription;
  43. public string targetLocationName => targetAreaName;
  44. public float targetLocationX => targetMapPosition.x;
  45. public float targetLocationY => targetMapPosition.y;
  46. public float timeLimit => GetTotalTimeLimitHours();
  47. public List<QuestGoal> objectives => goals;
  48. [Header("Quest Generation")]
  49. [Tooltip("Tags used for random quest generation")]
  50. public string[] questTags = new string[] { "combat", "rescue", "retrieval" };
  51. /// <summary>
  52. /// Calculate travel time from current position to quest location
  53. /// </summary>
  54. public float CalculateTravelTime(Vector2Int currentPosition, float travelSpeed = 1f)
  55. {
  56. float distance = Vector2Int.Distance(currentPosition, targetMapPosition);
  57. return distance / travelSpeed; // Returns time in game hours
  58. }
  59. /// <summary>
  60. /// Check if quest can be completed at given position
  61. /// </summary>
  62. public bool CanCompleteAtPosition(Vector2Int position)
  63. {
  64. float distance = Vector2Int.Distance(position, targetMapPosition);
  65. return distance <= completionRadius;
  66. }
  67. /// <summary>
  68. /// Get total time limit in hours
  69. /// </summary>
  70. public float GetTotalTimeLimitHours()
  71. {
  72. return (timeLimitDays * 24f) + timeLimitHours;
  73. }
  74. /// <summary>
  75. /// Create a runtime instance of this quest
  76. /// </summary>
  77. public ActiveQuest CreateActiveQuest()
  78. {
  79. return new ActiveQuest(this);
  80. }
  81. }
  82. [System.Serializable]
  83. public class QuestGoal
  84. {
  85. public string description;
  86. public QuestGoalType goalType;
  87. public string targetName; // Enemy type, item name, NPC name, etc.
  88. public int targetCount = 1;
  89. public int currentProgress = 0;
  90. public bool isHidden = false; // For surprise objectives
  91. public bool isOptional = false;
  92. public bool IsCompleted => currentProgress >= targetCount;
  93. public float ProgressPercent => targetCount > 0 ? (float)currentProgress / targetCount : 0f;
  94. // Compatibility property for UI
  95. public int targetAmount => targetCount;
  96. }
  97. public enum QuestType
  98. {
  99. Combat, // Kill enemies
  100. Rescue, // Save someone
  101. Retrieval, // Get items/artifacts
  102. Delivery, // Transport items
  103. Exploration, // Discover locations
  104. Escort // Protect someone
  105. }
  106. public enum QuestDifficulty
  107. {
  108. Easy,
  109. Normal,
  110. Hard,
  111. Legendary
  112. }
  113. public enum QuestGoalType
  114. {
  115. KillEnemies,
  116. CollectItems,
  117. RescuePerson,
  118. ReachLocation,
  119. SurviveTime,
  120. DefeatBoss,
  121. DeliverItem
  122. }
  123. [System.Serializable]
  124. public class QuestReward
  125. {
  126. public QuestRewardType type;
  127. public int amount;
  128. public string itemName;
  129. public UnityEngine.Object item; // For actual item references
  130. }
  131. public enum QuestRewardType
  132. {
  133. Gold,
  134. Silver,
  135. Copper,
  136. Renown,
  137. Item,
  138. Experience
  139. }