Creature.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. using UnityEngine.UI;
  7. public class Creature : MonoBehaviour {
  8. [SerializeField] Sprite creatureImage;
  9. [SerializeField] bool humanControlled;
  10. private int init;
  11. private int dex = 0;
  12. private int creatureHealth;
  13. private List<IAction> actions = new List<IAction>();
  14. internal int CurrentHealth { get; set; }
  15. internal int MaxHealth { get; set; }
  16. Weapon weapon;
  17. int health;
  18. private CanvasGroup canvasGroup;
  19. private RectTransform rectTransform;
  20. private Vector3Int currentPos;
  21. internal IAction GetFirstAction() {
  22. return firstAction;
  23. }
  24. private IAction firstAction;
  25. private IAction secondAction;
  26. public GameObject InitPanelGameObject { set; get; }
  27. internal int movementRate;
  28. public int Dex { get => dex; set => dex = value; }
  29. public int Init { get => init; set => init = value; }
  30. public int CreatureHealth { get => creatureHealth; set => creatureHealth = value; }
  31. public bool IsCreatureAlive { get; set; }
  32. public Vector3Int CurrentPos { get => currentPos; set => currentPos = value; }
  33. private void Start() {
  34. canvasGroup = GetComponent<CanvasGroup>();
  35. rectTransform = GetComponent<RectTransform>();
  36. }
  37. public int GetInit() {
  38. return Init;
  39. }
  40. internal bool HasSecondAction() {
  41. return secondAction != null;
  42. }
  43. public void RollInit() {
  44. Init = Random.Range(0, 100 - dex);
  45. }
  46. public Sprite GetSprite() {
  47. return creatureImage;
  48. }
  49. public bool IsHumanControlled() {
  50. return humanControlled;
  51. }
  52. public void SetFirstAction(IAction action) {
  53. firstAction = action;
  54. }
  55. public void SetSecondAction(IAction action) {
  56. secondAction = action;
  57. }
  58. internal List<Creature> EnemiesInSquareNextToCreature(Creature creature, List<Creature> combatants) {
  59. List<Creature> enemiesClose = new List<Creature>();
  60. foreach (Creature c in combatants) {
  61. Vector3 distance = c.CurrentPos - creature.CurrentPos;
  62. if (c.name != creature.name && distance.x <= 1 && distance.x >= -1 && distance.y <= 1 && distance.y >= -1) {
  63. enemiesClose.Add(c);
  64. }
  65. }
  66. return enemiesClose;
  67. }
  68. internal void SetPositionInGrid(Vector3Int vector3Int) {
  69. CurrentPos = vector3Int;
  70. }
  71. public bool HasFirstAction() {
  72. return firstAction != null;
  73. }
  74. internal Creature FindClosestEnemy(Creature creature, List<Creature> combatants) {
  75. Creature closestEnemy = null;
  76. float minDist = Mathf.Infinity;
  77. List<Creature> enemies = combatants.FindAll(p => p.IsHumanControlled() != creature.IsHumanControlled());
  78. foreach (Creature e in enemies) {
  79. float dist = Vector3.Distance(e.CurrentPos, creature.CurrentPos);
  80. if (dist < minDist) {
  81. closestEnemy = e;
  82. minDist = dist;
  83. }
  84. }
  85. Debug.Log("Closest enemy is " + closestEnemy.name);
  86. return closestEnemy;
  87. }
  88. public void Death() {
  89. IsCreatureAlive = false;
  90. }
  91. public void TakeDamage(int damage) {
  92. CurrentHealth -= damage;
  93. if (CurrentHealth <= 0) {
  94. Death();
  95. }
  96. InitPanelGameObject.GetComponent<InitCreaturePanelScript>().UpdateHealthBar(MaxHealth / CurrentHealth);
  97. }
  98. }