PO/Assets/Scripts/Enemy/Enemy.cs

220 lines
6.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
[SerializeField] private Image enemyStepIcon;
[SerializeField] private Text enemyStepIconText;
[SerializeField] private List<Sprite> allStepImageIcons = new List<Sprite>();
public EnemyConfig enemyConfig;
[SerializeField] private Text enemyName;
[SerializeField] private Text enemyMaxHp;
[SerializeField] private Text enemyHp;
[SerializeField] private Slider enemyHealthbar;
[SerializeField] private Image marker;
[SerializeField] private Button buttonInEnemy;
[SerializeField] public int currentPosition;
[Header("For checking. dont touch this")]
[SerializeField] int phaseAttack = 0;
public List<UnityEvent> attackLoop = new List<UnityEvent>();
[SerializeField] private int hp;
[SerializeField] private int localarmor;
[SerializeField] private Image armorIcon;
[SerializeField] private Text armorText;
public List<string> effectsName = new List<string>();
public List<int> effectsTurns = new List<int>();
public List<int> effectsDamage = new List<int>();
[HideInInspector] public List<GameObject> effectsLink = new List<GameObject>();
private void Start()
{
NewInformation();
UpdateNextStepIconAndText();
}
public void onClick()
{
DeckManager.main.ActionInEnemy(this);
}
public void ChangeHp(int damage)
{
if (damage < 0)
{
hp -= damage;
}
else
{
AddArmor(-damage);
if (localarmor < 0)
{
hp -= Mathf.Abs(localarmor);
AddArmor(-localarmor);
}
}
if (hp <= 0)
{
Death();
}
else if (hp > enemyConfig.enemyCharacteristics.maxHp)
{
hp = enemyConfig.enemyCharacteristics.maxHp;
}
enemyHp.text = hp.ToString();
enemyHealthbar.value = hp;
}
public void AddArmor(int value)
{
localarmor += value;
ReupdateArmorIconAndText();
}
public void NewInformation()
{
Image _image = buttonInEnemy.image;
_image.sprite = enemyConfig.enemyCharacteristics.sprite;
var _character = enemyConfig.enemyCharacteristics;
enemyName.text = _character.name;
enemyMaxHp.text = _character.maxHp.ToString();
enemyHp.text = _character.maxHp.ToString();
enemyHealthbar.maxValue = _character.maxHp;
enemyHealthbar.value = _character.maxHp;
hp = _character.maxHp;
AddArmor(_character.armor);
}
public void ReupdateArmorIconAndText()
{
if (localarmor <= 0)
{
armorIcon.enabled = false;
armorText.text = "";
}
else
{
armorIcon.enabled = true;
armorText.text = localarmor.ToString();
}
}
public void Death()
{
Image _image = buttonInEnemy.image;
_image.sprite = null;
Session.main.EnemyDeath(gameObject);
}
public void EffectsBy()
{
for (int i = 0; i < effectsName.Count; i++)
{
for (int j = 0; j < effectsLink.Count; j++)
{
effectsLink.RemoveAt(j);
}
effectsLink.Clear();
if(effectsTurns[i] == 0)
{
effectsName.Remove(effectsName[i]);
effectsTurns.Remove(effectsTurns[i]);
effectsDamage.Remove(effectsDamage[i]);
}
else if(effectsName[i] == "poison")
{
LibraryEffects.main.Poison(gameObject, effectsDamage[i]);
effectsTurns[i] -= 1;
}
}
}
public void UpdateNextStepIconAndText()
{
int _phase = phaseAttack % attackLoop.Count;
//Пока всего две фазы атаки пойдет, но надо переписать
//А вот это тем более
switch(attackLoop[_phase].GetPersistentMethodName(0))
{
case "Attack":
enemyStepIcon.sprite = allStepImageIcons[0];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.damage.ToString();
break;
case "HealingSelf":
enemyStepIcon.sprite = allStepImageIcons[1];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.selfHealing.ToString();
break;
case "HealingAlly":
enemyStepIcon.sprite = allStepImageIcons[2];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.allyHealing.ToString();
break;
case "HealingAll":
enemyStepIcon.sprite = allStepImageIcons[3];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.allHealing.ToString();
break;
case "AddArmorSelf":
enemyStepIcon.sprite = allStepImageIcons[4];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.addArmorSelf.ToString();
break;
case "AddArmorAlly":
enemyStepIcon.sprite = allStepImageIcons[4];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.addArmorAlly.ToString();
break;
case "AddArmorAll":
enemyStepIcon.sprite = allStepImageIcons[4];
enemyStepIconText.text = enemyConfig.enemyCharacteristics.addArmorAll.ToString();
break;
}
}
public void Turn()
{
int _phase = phaseAttack % attackLoop.Count;
attackLoop[_phase]?.Invoke();
phaseAttack++;
UpdateNextStepIconAndText();
}
public int CheckHp()
{
return hp;
}
public int CheckArmor()
{
return localarmor;
}
public void OnMarker()
{
marker.enabled = true;
}
public void OffMarker()
{
marker.enabled = false;
}
public bool CheckMarker()
{
return marker.enabled;
}
}