using UnityEngine; [CreateAssetMenu(fileName = "New Enemy", menuName = "RPG/Characters/Enemy")] [System.Serializable] public class EnemyCharacterData : ScriptableObject { [Header("Basic Info")] public string enemyName = "New Enemy"; [TextArea(2, 4)] public string description = "A fearsome enemy"; public Sprite enemySprite; [Header("Core Stats")] [Range(1, 100)] public int maxHealth = 10; [Range(1, 30)] public int attack = 8; [Range(1, 30)] public int constitution = 5; [Range(1, 30)] public int dexterity = 3; [Range(1, 30)] public int wisdom = 2; [Header("Combat Modifiers")] [Range(-10, 10)] public int initModifier = -2; [Range(-10, 10)] public int damageModifier = 0; [Range(-10, 10)] public int spellModifier = 0; [Range(1, 50)] public int movementSpeed = 10; [Range(1, 30)] public int armorClass = 6; [Header("Weapon Configuration")] public WeaponItem preferredWeapon; // Assign a WeaponItem asset [Header("AI Behavior")] [Range(0f, 1f)] public float aggressiveness = 0.7f; // How likely to attack vs defend [Range(1, 10)] public int threatLevel = 1; // Used for encounter balancing [Header("Rewards")] [Range(0, 1000)] public int goldReward = 10; [Range(0, 500)] public int experienceReward = 25; public DropTable dropTable; // For item drops [Header("Visual Settings")] public Material enemyMaterial; public GameObject enemyModel; // 3D model prefab [Range(0.5f, 3f)] public float modelScale = 1f; [Header("Special Abilities")] public bool canCastSpells = false; public bool hasRangedAttack = false; public bool canFly = false; public bool regeneratesHealth = false; [Range(0, 10)] public int healthRegenPerTurn = 0; /// /// Creates a complete enemy character script class from this data /// public string GenerateCharacterScript() { string className = enemyName.Replace(" ", "") + "Character"; string weaponCreationCode = GenerateWeaponCreationCode(); return $@"using UnityEngine; /// /// Auto-generated enemy character: {enemyName} /// {description} /// Generated from EnemyCharacterData /// public class {className} : Character {{ [Header(""{enemyName} Configuration"")] public WeaponItem preferredWeapon; // Assign weapon item asset in inspector protected override void InitializeStats() {{ // Basic Stats MaxHealth = {maxHealth}; CurrentHealth = MaxHealth; Attack = {attack}; Constitution = {constitution}; Dexterity = {dexterity}; Wisdom = {wisdom}; // Combat Modifiers InitModifier = {initModifier}; DamageModifier = {damageModifier}; SpellModifier = {spellModifier}; MovementSpeed = {movementSpeed}; ArmorClass = {armorClass}; // Special Abilities // TODO: Implement special abilities based on data // Can Cast Spells: {canCastSpells.ToString().ToLower()} // Has Ranged Attack: {hasRangedAttack.ToString().ToLower()} // Can Fly: {canFly.ToString().ToLower()} // Regenerates Health: {regeneratesHealth.ToString().ToLower()} // Health Regen Per Turn: {healthRegenPerTurn} }} public override Character Spawn(int count) {{ name = ""{enemyName}""; CharacterName = ""{enemyName}""; if (count > 1) {{ name += "" "" + count; CharacterName += "" "" + count; }} return this; }} public override Weapon GetWeapon() {{ // Return null to trigger direct weapon creation from WeaponItem return CreateDirectWeapon(); }} protected override Weapon CreateDirectWeapon() {{ {weaponCreationCode} }} /// /// Gets the reward data for defeating this enemy /// public (int gold, int experience) GetRewards() {{ return ({goldReward}, {experienceReward}); }} /// /// Gets the threat level for encounter balancing /// public int GetThreatLevel() {{ return {threatLevel}; }} }}"; } private string GenerateWeaponCreationCode() { return $@" // Create weapon from WeaponItem asset if (preferredWeapon != null) {{ spawnedWeapon = preferredWeapon.CreateWeaponInstance(this.transform); if (spawnedWeapon != null) {{ spawnedWeapon.SetWielder(this); return spawnedWeapon; }} }} // Fallback: Create basic sword if no weapon item assigned GameObject weaponObject = new GameObject(""Basic Weapon""); weaponObject.transform.SetParent(this.transform, false); spawnedWeapon = weaponObject.AddComponent(); spawnedWeapon.SetWielder(this); return spawnedWeapon;"; } } [System.Serializable] public class DropTable { [System.Serializable] public class DropItem { public string itemName; [Range(0f, 1f)] public float dropChance; [Range(1, 10)] public int maxQuantity = 1; } public DropItem[] possibleDrops; }