using UnityEngine; /// /// Forest Ambush - Bandits attacking from the woods /// High probability in forests, lower on roads /// [CreateAssetMenu(fileName = "Forest Ambush", menuName = "RPG/Travel Events/Specific/Forest Ambush")] public class ForestAmbushEvent : CombatTravelEvent { void OnEnable() { eventName = "Forest Ambush"; eventDescription = "Bandits leap from the undergrowth to ambush your party!"; eventType = EventType.Combat; rarity = EventRarity.Common; // Very likely in forests, unlikely on roads forestChance = 0.95f; plainsChance = 0.3f; mountainChance = 0.6f; roadChance = 0.15f; // Much safer on roads townChance = 0.05f; villageChance = 0.2f; minEnemies = 2; maxEnemies = 4; // TODO: Assign possibleEnemies array with EnemyCharacterData assets // Example: possibleEnemies = new EnemyCharacterData[] { forestBanditAsset, brigandAsset, outlawAsset }; encounterDescriptions = new string[] { "Bandits emerge from behind the trees to surround your party!", "Your party walks into a carefully planned ambush by forest brigands!", "Outlaws drop from the canopy above, weapons drawn!", "A group of bandits blocks the forest path ahead!" }; canOccurMultipleTimes = true; cooldownDays = 0.5f; // Can happen again after half a day } } /// /// Mountain Ambush - More dangerous encounter in treacherous terrain /// [CreateAssetMenu(fileName = "Mountain Ambush", menuName = "RPG/Travel Events/Specific/Mountain Ambush")] public class MountainAmbushEvent : CombatTravelEvent { void OnEnable() { eventName = "Mountain Ambush"; eventDescription = "Mountain bandits use the rocky terrain to their advantage!"; eventType = EventType.Combat; rarity = EventRarity.Common; // Most likely in mountains mountainChance = 0.9f; forestChance = 0.4f; plainsChance = 0.2f; roadChance = 0.1f; townChance = 0.02f; villageChance = 0.1f; minEnemies = 1; maxEnemies = 3; // TODO: Assign possibleEnemies array with EnemyCharacterData assets // Example: possibleEnemies = new EnemyCharacterData[] { mountainBanditAsset, highwaymanAsset, raiderAsset }; encounterDescriptions = new string[] { "Mountain bandits rain arrows down from the cliffs above!", "Your party is caught in a narrow pass by armed raiders!", "Highwaymen emerge from rocky crevices to block your path!", "A rockslide reveals it was a trap - bandits attack!" }; canOccurMultipleTimes = true; cooldownDays = 1f; } } /// /// Traveling Merchant - Friendly trader offering goods /// Much more likely on roads and near settlements /// [CreateAssetMenu(fileName = "Traveling Merchant", menuName = "RPG/Travel Events/Specific/Traveling Merchant")] public class TravelingMerchantEvent : TradingTravelEvent { void OnEnable() { eventName = "Traveling Merchant"; eventDescription = "A friendly merchant offers to trade goods with your party."; eventType = EventType.Trading; rarity = EventRarity.Common; // Very likely on roads and near settlements roadChance = 0.85f; townChance = 0.6f; villageChance = 0.75f; bridgeChance = 0.7f; // Common at crossings ferryChance = 0.6f; // Less likely in wilderness forestChance = 0.25f; mountainChance = 0.15f; plainsChance = 0.4f; lakeChance = 0.3f; riverChance = 0.3f; merchantTypes = new string[] { "Traveling Merchant", "Caravan Trader", "Wandering Peddler", "Road Merchant" }; canHaveRareItems = true; rareItemChance = 0.25f; priceModifier = 1.1f; // Slightly more expensive than town shops encounterDescriptions = new string[] { "A {merchantType} with a pack full of goods approaches your party.", "Your party encounters a {merchantType} resting beside the road.", "A {merchantType} calls out, offering to show you their wares.", "You come across a {merchantType} leading a pack animal loaded with goods." }; canOccurMultipleTimes = true; cooldownDays = 0.25f; // Multiple merchants can be encountered } } /// /// Road Patrol - Guards or soldiers patrolling main roads /// Only occurs on roads, provides safety information /// [CreateAssetMenu(fileName = "Road Patrol", menuName = "RPG/Travel Events/Specific/Road Patrol")] public class RoadPatrolEvent : TravelEvent { [Header("Patrol Event Settings")] public string[] patrolTypes = { "City Guard Patrol", "Royal Guard", "Local Militia" }; public bool providesInformation = true; public bool canRestoreHealth = true; public int healthRestored = 15; void OnEnable() { eventName = "Road Patrol"; eventDescription = "A patrol of guards maintains order on the roads."; eventType = EventType.Social; rarity = EventRarity.Common; // Only on roads and near settlements roadChance = 0.9f; townChance = 0.8f; villageChance = 0.6f; bridgeChance = 0.5f; // Never in wilderness forestChance = 0f; mountainChance = 0f; plainsChance = 0.1f; lakeChance = 0f; riverChance = 0f; oceanChance = 0f; canOccurMultipleTimes = true; cooldownDays = 1f; } public override EventResult ExecuteEvent(TravelEventContext context) { string patrolType = patrolTypes[Random.Range(0, patrolTypes.Length)]; string message = $"Your party encounters a {patrolType} maintaining security on the road."; if (canRestoreHealth && Random.value < 0.4f) { message += $" They provide aid, restoring {healthRestored} health to your party."; return new EventResult(message) { healthChange = healthRestored }; } else if (providesInformation) { string[] infoMessages = { " They warn you about bandit activity ahead.", " They share information about safe camping spots nearby.", " They mention a trading post further down the road.", " They advise taking the main road for safer travel." }; message += infoMessages[Random.Range(0, infoMessages.Length)]; } return new EventResult(message); } } /// /// Hidden Cache - Discovery of abandoned supplies /// More likely off main roads in remote areas /// [CreateAssetMenu(fileName = "Hidden Cache", menuName = "RPG/Travel Events/Specific/Hidden Cache")] public class HiddenCacheEvent : DiscoveryTravelEvent { void OnEnable() { eventName = "Hidden Cache"; eventDescription = "Your party discovers a hidden stash of supplies."; eventType = EventType.Discovery; rarity = EventRarity.Uncommon; // More likely in remote areas forestChance = 0.8f; mountainChance = 0.9f; plainsChance = 0.5f; riverChance = 0.6f; // Less likely on main routes roadChance = 0.2f; townChance = 0.05f; villageChance = 0.1f; minGoldFound = 25; maxGoldFound = 150; canFindItems = true; discoveryDescriptions = new string[] { "Your party discovers a carefully hidden cache containing {amount} gold!", "While exploring off the beaten path, you find an old smuggler's stash with {amount} gold pieces.", "A party member notices disturbed earth that reveals a buried cache worth {amount} gold!", "Behind some rocks, your party uncovers an abandoned supply cache with {amount} gold." }; canOccurMultipleTimes = true; cooldownDays = 2f; // Takes time for new caches to be found } } /// /// Wild Animal Encounter - Non-aggressive animal encounter /// Can be peaceful or turn into combat based on party actions /// [CreateAssetMenu(fileName = "Wild Animal Encounter", menuName = "RPG/Travel Events/Specific/Wild Animal Encounter")] public class WildAnimalEvent : TravelEvent { [Header("Animal Encounter Settings")] public string[] animalTypes = { "Wolf Pack", "Brown Bear", "Wild Boar", "Mountain Lion" }; public float aggressionChance = 0.3f; // Chance the animal attacks void OnEnable() { eventName = "Wild Animal Encounter"; eventDescription = "Your party encounters wild animals."; eventType = EventType.Mystery; rarity = EventRarity.Common; // More likely in natural areas forestChance = 0.9f; mountainChance = 0.8f; plainsChance = 0.6f; riverChance = 0.5f; lakeChance = 0.4f; // Very unlikely near civilization roadChance = 0.2f; townChance = 0.02f; villageChance = 0.1f; canOccurMultipleTimes = true; cooldownDays = 0.5f; } public override EventResult ExecuteEvent(TravelEventContext context) { string animalType = animalTypes[Random.Range(0, animalTypes.Length)]; if (Random.value < aggressionChance) { // Animal attacks return EventResult.SimpleBattle( $"A {animalType} attacks your party!", 1, animalType ); } else { // Peaceful encounter string[] peacefulMessages = { $"Your party spots a {animalType} in the distance. It notices you but moves away peacefully.", $"A {animalType} crosses your path but shows no aggression toward your party.", $"Your party carefully observes a {animalType} before it disappears into the wilderness." }; return new EventResult(peacefulMessages[Random.Range(0, peacefulMessages.Length)]); } } }