The enemy character system has been refactored to provide better separation of concerns between individual enemy data and spawning/encounter logic.
// EnemyCharacterData.cs (BAD)
public class EnemyCharacterData : ScriptableObject
{
// Individual enemy stats
public int maxHealth = 10;
public int attack = 8;
// Spawning logic (WRONG PLACE!)
public int minGroupSize = 1;
public int maxGroupSize = 3;
public BiomeType[] preferredBiomes;
}
// EnemyCharacterData.cs (GOOD)
public class EnemyCharacterData : ScriptableObject
{
// ONLY individual enemy data
public int maxHealth = 10;
public int attack = 8;
public WeaponType preferredWeaponType;
public bool regeneratesHealth;
// etc...
}
// CombatTravelEvent.cs (GOOD)
public class CombatTravelEvent : TravelEvent
{
// ONLY spawning/encounter logic
public int minEnemies = 1;
public int maxEnemies = 3;
public float forestChance = 0.8f;
public EnemyCharacterData[] possibleEnemies;
}
// Same Skeleton Warrior in different contexts:
// Solo boss fight
var bossFight = new CombatTravelEvent {
minEnemies = 1,
maxEnemies = 1,
possibleEnemies = { skeletonWarrior }
};
// Small patrol
var patrol = new CombatTravelEvent {
minEnemies = 2,
maxEnemies = 4,
possibleEnemies = { skeletonWarrior, goblinScout }
};
// Large army encounter
var army = new CombatTravelEvent {
minEnemies = 5,
maxEnemies = 8,
possibleEnemies = { skeletonWarrior, goblinScout, forestTroll }
};
Assets/Scripts/Characters/Enemies/
├── EnemyCharacterData.cs (Base class for enemy stats)
├── SkeletonWarrior.asset (Individual skeleton data)
├── GoblinScout.asset (Individual goblin data)
└── ForestTroll.asset (Individual troll data)
Assets/Scripts/Events/
├── TravelEventTypes.cs (CombatTravelEvent class)
├── SpecificTravelEvents.cs (Specific encounter types)
└── TravelEventSystem.cs (Main event manager)
Assets/Resources/TravelEvents/
├── SkeletonAmbush.asset (1-3 skeletons in forests)
├── GoblinRaid.asset (2-5 goblins on roads)
└── TrollEncounter.asset (1 troll in deep forests)
// Create travel events that reference enemy data:
[CreateAssetMenu(fileName = "Skeleton Ambush", menuName = "RPG/Travel Events/Specific/Skeleton Ambush")]
public class SkeletonAmbushEvent : CombatTravelEvent
{
void OnEnable()
{
eventName = "Skeleton Ambush";
// Encounter-specific settings
minEnemies = 1;
maxEnemies = 3;
forestChance = 0.8f;
roadChance = 0.2f;
// Reference to enemy data (drag from Project window)
possibleEnemies = new EnemyCharacterData[] {
/* Drag SkeletonWarrior.asset here */
};
}
}
// BanditLeader.asset (Individual)
maxHealth = 25, attack = 10, goldReward = 50
// BanditSoldier.asset (Individual)
maxHealth = 15, attack = 8, goldReward = 20
// BanditAmbush.asset (Encounter)
minEnemies = 3, maxEnemies = 5
possibleEnemies = [BanditSoldier, BanditLeader]
forestChance = 0.9f, roadChance = 0.3f
// Same enemies, different encounter intensity:
// Easy Encounter
minEnemies = 1, maxEnemies = 2
// Normal Encounter
minEnemies = 2, maxEnemies = 4
// Hard Encounter
minEnemies = 3, maxEnemies = 6
This separation makes the system much more flexible and maintainable! 🎯