EnemyCharacterData.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. using UnityEngine;
  2. [CreateAssetMenu(fileName = "New Enemy", menuName = "RPG/Characters/Enemy")]
  3. [System.Serializable]
  4. public class EnemyCharacterData : ScriptableObject
  5. {
  6. [Header("Basic Info")]
  7. public string enemyName = "New Enemy";
  8. [TextArea(2, 4)]
  9. public string description = "A fearsome enemy";
  10. public Sprite enemySprite;
  11. [Header("Core Stats")]
  12. [Range(1, 100)]
  13. public int maxHealth = 10;
  14. [Range(1, 30)]
  15. public int attack = 8;
  16. [Range(1, 30)]
  17. public int constitution = 5;
  18. [Range(1, 30)]
  19. public int dexterity = 3;
  20. [Range(1, 30)]
  21. public int wisdom = 2;
  22. [Header("Combat Modifiers")]
  23. [Range(-10, 10)]
  24. public int initModifier = -2;
  25. [Range(-10, 10)]
  26. public int damageModifier = 0;
  27. [Range(-10, 10)]
  28. public int spellModifier = 0;
  29. [Range(1, 50)]
  30. public int movementSpeed = 10;
  31. [Range(1, 30)]
  32. public int armorClass = 6;
  33. [Header("Weapon Configuration")]
  34. public WeaponItem preferredWeapon; // Assign a WeaponItem asset
  35. [Header("AI Behavior")]
  36. [Range(0f, 1f)]
  37. public float aggressiveness = 0.7f; // How likely to attack vs defend
  38. [Range(1, 10)]
  39. public int threatLevel = 1; // Used for encounter balancing
  40. [Header("Rewards")]
  41. [Range(0, 1000)]
  42. public int goldReward = 10;
  43. [Range(0, 500)]
  44. public int experienceReward = 25;
  45. public DropTable dropTable; // For item drops
  46. [Header("Visual Settings")]
  47. public Material enemyMaterial;
  48. public GameObject enemyModel; // 3D model prefab
  49. [Range(0.5f, 3f)]
  50. public float modelScale = 1f;
  51. [Header("Special Abilities")]
  52. public bool canCastSpells = false;
  53. public bool hasRangedAttack = false;
  54. public bool canFly = false;
  55. public bool regeneratesHealth = false;
  56. [Range(0, 10)]
  57. public int healthRegenPerTurn = 0;
  58. /// <summary>
  59. /// Creates a complete enemy character script class from this data
  60. /// </summary>
  61. public string GenerateCharacterScript()
  62. {
  63. string className = enemyName.Replace(" ", "") + "Character";
  64. string weaponCreationCode = GenerateWeaponCreationCode();
  65. return $@"using UnityEngine;
  66. /// <summary>
  67. /// Auto-generated enemy character: {enemyName}
  68. /// {description}
  69. /// Generated from EnemyCharacterData
  70. /// </summary>
  71. public class {className} : Character
  72. {{
  73. [Header(""{enemyName} Configuration"")]
  74. public WeaponItem preferredWeapon; // Assign weapon item asset in inspector
  75. protected override void InitializeStats()
  76. {{
  77. // Basic Stats
  78. MaxHealth = {maxHealth};
  79. CurrentHealth = MaxHealth;
  80. Attack = {attack};
  81. Constitution = {constitution};
  82. Dexterity = {dexterity};
  83. Wisdom = {wisdom};
  84. // Combat Modifiers
  85. InitModifier = {initModifier};
  86. DamageModifier = {damageModifier};
  87. SpellModifier = {spellModifier};
  88. MovementSpeed = {movementSpeed};
  89. ArmorClass = {armorClass};
  90. // Special Abilities
  91. // TODO: Implement special abilities based on data
  92. // Can Cast Spells: {canCastSpells.ToString().ToLower()}
  93. // Has Ranged Attack: {hasRangedAttack.ToString().ToLower()}
  94. // Can Fly: {canFly.ToString().ToLower()}
  95. // Regenerates Health: {regeneratesHealth.ToString().ToLower()}
  96. // Health Regen Per Turn: {healthRegenPerTurn}
  97. }}
  98. public override Character Spawn(int count)
  99. {{
  100. name = ""{enemyName}"";
  101. CharacterName = ""{enemyName}"";
  102. if (count > 1)
  103. {{
  104. name += "" "" + count;
  105. CharacterName += "" "" + count;
  106. }}
  107. return this;
  108. }}
  109. public override Weapon GetWeapon()
  110. {{
  111. // Return null to trigger direct weapon creation from WeaponItem
  112. return CreateDirectWeapon();
  113. }}
  114. protected override Weapon CreateDirectWeapon()
  115. {{
  116. {weaponCreationCode}
  117. }}
  118. /// <summary>
  119. /// Gets the reward data for defeating this enemy
  120. /// </summary>
  121. public (int gold, int experience) GetRewards()
  122. {{
  123. return ({goldReward}, {experienceReward});
  124. }}
  125. /// <summary>
  126. /// Gets the threat level for encounter balancing
  127. /// </summary>
  128. public int GetThreatLevel()
  129. {{
  130. return {threatLevel};
  131. }}
  132. }}";
  133. }
  134. private string GenerateWeaponCreationCode()
  135. {
  136. return $@" // Create weapon from WeaponItem asset
  137. if (preferredWeapon != null)
  138. {{
  139. spawnedWeapon = preferredWeapon.CreateWeaponInstance(this.transform);
  140. if (spawnedWeapon != null)
  141. {{
  142. spawnedWeapon.SetWielder(this);
  143. return spawnedWeapon;
  144. }}
  145. }}
  146. // Fallback: Create basic sword if no weapon item assigned
  147. GameObject weaponObject = new GameObject(""Basic Weapon"");
  148. weaponObject.transform.SetParent(this.transform, false);
  149. spawnedWeapon = weaponObject.AddComponent<SimpleSword>();
  150. spawnedWeapon.SetWielder(this);
  151. return spawnedWeapon;";
  152. }
  153. }
  154. [System.Serializable]
  155. public class DropTable
  156. {
  157. [System.Serializable]
  158. public class DropItem
  159. {
  160. public string itemName;
  161. [Range(0f, 1f)]
  162. public float dropChance;
  163. [Range(1, 10)]
  164. public int maxQuantity = 1;
  165. }
  166. public DropItem[] possibleDrops;
  167. }