using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
///
/// Editor tool for creating sample quests - follows same pattern as CreateSampleItems
///
public class QuestCreatorHelper
{
#if UNITY_EDITOR
[MenuItem("RPG/Create Sample Quests")]
public static void CreateSampleQuests()
{
CreateCombatQuests();
CreateRescueQuests();
CreateRetrievalQuests();
CreateExplorationQuests();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log("✅ Sample quests created in Resources/Quests folder!");
}
private static void CreateCombatQuests()
{
EnsureFolderExists("Assets/Resources/Quests/Combat");
// Easy Combat Quest
var banditCamp = ScriptableObject.CreateInstance();
banditCamp.questTitle = "Clear the Bandit Camp";
banditCamp.questDescription = "Bandits have been attacking merchants on the main road. Their camp has been spotted in the nearby forest. Clear them out and make the roads safe for trade.";
banditCamp.questType = QuestType.Combat;
banditCamp.difficulty = QuestDifficulty.Easy;
banditCamp.timeLimitDays = 5;
banditCamp.targetAreaName = "Darkwood Forest";
banditCamp.targetMapPosition = new Vector2Int(45, 60);
banditCamp.goldReward = 75;
banditCamp.renownReward = 10;
banditCamp.renownPenalty = 5;
banditCamp.questTags = new string[] { "combat", "bandits", "forest", "easy" };
banditCamp.goals.Add(new QuestGoal
{
description = "Defeat 3 Bandits",
goalType = QuestGoalType.KillEnemies,
targetName = "Bandit",
targetCount = 3
});
banditCamp.goals.Add(new QuestGoal
{
description = "Defeat the Bandit Leader",
goalType = QuestGoalType.DefeatBoss,
targetName = "Bandit Chief",
targetCount = 1
});
AssetDatabase.CreateAsset(banditCamp, "Assets/Resources/Quests/Combat/ClearBanditCamp.asset");
// Hard Combat Quest
var orcRaid = ScriptableObject.CreateInstance();
orcRaid.questTitle = "Orc Warband Threat";
orcRaid.questDescription = "A large orc warband has been spotted moving toward the village. They must be stopped before they reach the settlement and cause havoc.";
orcRaid.questType = QuestType.Combat;
orcRaid.difficulty = QuestDifficulty.Hard;
orcRaid.timeLimitDays = 3;
orcRaid.timeLimitHours = 12;
orcRaid.targetAreaName = "Ironback Mountains";
orcRaid.targetMapPosition = new Vector2Int(80, 30);
orcRaid.goldReward = 200;
orcRaid.renownReward = 25;
orcRaid.renownPenalty = 15;
orcRaid.minimumRenown = 15;
orcRaid.questTags = new string[] { "combat", "orcs", "mountains", "hard" };
orcRaid.goals.Add(new QuestGoal
{
description = "Defeat 8 Orc Warriors",
goalType = QuestGoalType.KillEnemies,
targetName = "Orc Warrior",
targetCount = 8
});
orcRaid.goals.Add(new QuestGoal
{
description = "Defeat the Orc Warchief",
goalType = QuestGoalType.DefeatBoss,
targetName = "Orc Warchief",
targetCount = 1
});
AssetDatabase.CreateAsset(orcRaid, "Assets/Resources/Quests/Combat/OrcWarbandThreat.asset");
}
private static void CreateRescueQuests()
{
EnsureFolderExists("Assets/Resources/Quests/Rescue");
// Missing Merchant
var missingMerchant = ScriptableObject.CreateInstance();
missingMerchant.questTitle = "Missing Merchant";
missingMerchant.questDescription = "Merchant Harold departed for the next town three days ago but never arrived. His family fears the worst. Find him and bring him home safely.";
missingMerchant.questType = QuestType.Rescue;
missingMerchant.difficulty = QuestDifficulty.Normal;
missingMerchant.timeLimitDays = 7;
missingMerchant.targetAreaName = "Whispering Hills";
missingMerchant.targetMapPosition = new Vector2Int(65, 45);
missingMerchant.goldReward = 120;
missingMerchant.renownReward = 15;
missingMerchant.renownPenalty = 10;
missingMerchant.questTags = new string[] { "rescue", "merchant", "hills", "normal" };
missingMerchant.goals.Add(new QuestGoal
{
description = "Find Merchant Harold",
goalType = QuestGoalType.RescuePerson,
targetName = "Harold",
targetCount = 1
});
missingMerchant.goals.Add(new QuestGoal
{
description = "Escort Harold to safety",
goalType = QuestGoalType.ReachLocation,
targetName = "Safe Location",
targetCount = 1
});
AssetDatabase.CreateAsset(missingMerchant, "Assets/Resources/Quests/Rescue/MissingMerchant.asset");
// Kidnapped Noble
var kidnappedNoble = ScriptableObject.CreateInstance();
kidnappedNoble.questTitle = "The Baron's Daughter";
kidnappedNoble.questDescription = "Lady Elara, the Baron's daughter, has been kidnapped by cultists. Time is running short - rescue her before the dark ritual begins at midnight.";
kidnappedNoble.questType = QuestType.Rescue;
kidnappedNoble.difficulty = QuestDifficulty.Hard;
kidnappedNoble.timeLimitDays = 2;
kidnappedNoble.targetAreaName = "Cursed Ruins";
kidnappedNoble.targetMapPosition = new Vector2Int(25, 75);
kidnappedNoble.goldReward = 300;
kidnappedNoble.renownReward = 30;
kidnappedNoble.renownPenalty = 20;
kidnappedNoble.minimumRenown = 20;
kidnappedNoble.questTags = new string[] { "rescue", "noble", "cultists", "urgent" };
kidnappedNoble.goals.Add(new QuestGoal
{
description = "Infiltrate the cultist stronghold",
goalType = QuestGoalType.ReachLocation,
targetName = "Cultist Hideout",
targetCount = 1
});
kidnappedNoble.goals.Add(new QuestGoal
{
description = "Defeat the Cult Leader",
goalType = QuestGoalType.DefeatBoss,
targetName = "Cult Leader",
targetCount = 1
});
kidnappedNoble.goals.Add(new QuestGoal
{
description = "Rescue Lady Elara",
goalType = QuestGoalType.RescuePerson,
targetName = "Lady Elara",
targetCount = 1
});
AssetDatabase.CreateAsset(kidnappedNoble, "Assets/Resources/Quests/Rescue/BaronsDaughter.asset");
}
private static void CreateRetrievalQuests()
{
EnsureFolderExists("Assets/Resources/Quests/Retrieval");
// Stolen Goods
var stolenGoods = ScriptableObject.CreateInstance();
stolenGoods.questTitle = "Recover the Stolen Shipment";
stolenGoods.questDescription = "Thieves made off with a valuable shipment of goods bound for the capital. Track them down and recover the stolen merchandise before they can sell it off.";
stolenGoods.questType = QuestType.Retrieval;
stolenGoods.difficulty = QuestDifficulty.Normal;
stolenGoods.timeLimitDays = 4;
stolenGoods.targetAreaName = "Smuggler's Cove";
stolenGoods.targetMapPosition = new Vector2Int(90, 20);
stolenGoods.goldReward = 150;
stolenGoods.renownReward = 12;
stolenGoods.renownPenalty = 8;
stolenGoods.questTags = new string[] { "retrieval", "thieves", "shipment", "normal" };
stolenGoods.goals.Add(new QuestGoal
{
description = "Recover the stolen goods",
goalType = QuestGoalType.CollectItems,
targetName = "Stolen Shipment",
targetCount = 3
});
stolenGoods.goals.Add(new QuestGoal
{
description = "Defeat the Thief Leader (Optional)",
goalType = QuestGoalType.DefeatBoss,
targetName = "Thief Captain",
targetCount = 1,
isOptional = true
});
AssetDatabase.CreateAsset(stolenGoods, "Assets/Resources/Quests/Retrieval/StolenShipment.asset");
// Ancient Artifact
var ancientArtifact = ScriptableObject.CreateInstance();
ancientArtifact.questTitle = "The Lost Grimoire";
ancientArtifact.questDescription = "An ancient grimoire containing powerful spells has been lost in the depths of the old ruins. Retrieve it before it falls into the wrong hands.";
ancientArtifact.questType = QuestType.Retrieval;
ancientArtifact.difficulty = QuestDifficulty.Legendary;
ancientArtifact.timeLimitDays = 10;
ancientArtifact.targetAreaName = "Ancient Ruins";
ancientArtifact.targetMapPosition = new Vector2Int(15, 85);
ancientArtifact.goldReward = 500;
ancientArtifact.renownReward = 50;
ancientArtifact.renownPenalty = 25;
ancientArtifact.minimumRenown = 40;
ancientArtifact.itemRewards = new List { "Magical Staff", "Enchanted Robes" };
ancientArtifact.questTags = new string[] { "retrieval", "artifact", "ruins", "legendary" };
ancientArtifact.goals.Add(new QuestGoal
{
description = "Navigate the ancient ruins",
goalType = QuestGoalType.ReachLocation,
targetName = "Inner Sanctum",
targetCount = 1
});
ancientArtifact.goals.Add(new QuestGoal
{
description = "Defeat the Guardian Construct",
goalType = QuestGoalType.DefeatBoss,
targetName = "Stone Guardian",
targetCount = 1
});
ancientArtifact.goals.Add(new QuestGoal
{
description = "Retrieve the Lost Grimoire",
goalType = QuestGoalType.CollectItems,
targetName = "Ancient Grimoire",
targetCount = 1
});
AssetDatabase.CreateAsset(ancientArtifact, "Assets/Resources/Quests/Retrieval/LostGrimoire.asset");
}
private static void CreateExplorationQuests()
{
EnsureFolderExists("Assets/Resources/Quests/Exploration");
// Map the Region
var mapRegion = ScriptableObject.CreateInstance();
mapRegion.questTitle = "Survey the Northern Territories";
mapRegion.questDescription = "The northern territories remain largely unmapped. Explore the region and report back with your findings to help future expeditions.";
mapRegion.questType = QuestType.Exploration;
mapRegion.difficulty = QuestDifficulty.Easy;
mapRegion.timeLimitDays = 14;
mapRegion.targetAreaName = "Northern Wilderness";
mapRegion.targetMapPosition = new Vector2Int(50, 90);
mapRegion.goldReward = 80;
mapRegion.renownReward = 8;
mapRegion.renownPenalty = 3;
mapRegion.questTags = new string[] { "exploration", "survey", "wilderness", "easy" };
mapRegion.goals.Add(new QuestGoal
{
description = "Explore 5 different locations",
goalType = QuestGoalType.ReachLocation,
targetName = "Exploration Point",
targetCount = 5
});
mapRegion.goals.Add(new QuestGoal
{
description = "Survive for 7 days in the wilderness",
goalType = QuestGoalType.SurviveTime,
targetName = "Wilderness",
targetCount = 7
});
AssetDatabase.CreateAsset(mapRegion, "Assets/Resources/Quests/Exploration/SurveyNorthern.asset");
}
private static void EnsureFolderExists(string path)
{
string[] folders = path.Split('/');
string currentPath = "";
for (int i = 0; i < folders.Length; i++)
{
if (i == 0)
{
currentPath = folders[i];
continue;
}
string parentPath = currentPath;
currentPath += "/" + folders[i];
if (!AssetDatabase.IsValidFolder(currentPath))
{
AssetDatabase.CreateFolder(parentPath, folders[i]);
}
}
}
#endif
}