// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2020-09-02
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using UnityEngine;
namespace G
{
public class AI_General : MonoBehaviour
{
private Animation _myAnimation;
private Collider _myCollider;
private int maxhp;
public int hp;
private float power;
private int defence;
private int dash;
private float runspeed;
private float atkspeed;
private float distance_cha;
private float hp_length;
private float fb;
private bool life = true;
private bool call;
private bool disable;
private float delay_invicibility;
private float delay_call;
private Vector3 rndpos;
private Vector3 directionVector;
private Vector3 behitdir;
private Transform cha1;
private Transform g_hp;
private Transform c_weapon;
private Transform c_spweapon;
private Transform sp_selweapon;
private bool attack_start;
private bool superarmor;
private bool showme;
private int generalmovestat;
private int grade;
private int atkcount;
private int damage;
private short unique = -1;
private bool efattach;
public AudioClip snd_attack;
public Transform ef_weapon;
public Transform[] sp_weapon = new Transform[2];
public Transform direction_arrow;
private Vector3 efpos;
private Vector3 arrowTargetVector;
private Vector3 arrowRotVector;
private Quaternion efrot;
private GameCamera script_cam;
private void Awake()
{
_myAnimation = base.GetComponent();
_myCollider = base.GetComponent();
_myAnimation["move"].speed = 0.5f;
_myAnimation["down"].speed = 0.2f;
_myAnimation["dead_general"].speed = 0.2f;
_myAnimation["idle"].speed = 0.25f;
_myAnimation["down"].layer = 4;
_myAnimation["dead_general"].layer = 4;
_myAnimation["m_attack1"].layer = 1;
_myAnimation["m_attack1_i"].layer = 1;
}
private void Start()
{
cha1 = GameObject.FindWithTag("Player").transform;
InvokeRepeating(nameof(SetRndPosition), 0.1f, 1f);
_myAnimation.Play("idle");
HPgaugeSet();
script_cam = Camera.main.GetComponent();
}
public void Set_stat(int _power, int _defence, int _mhp, int _hp, int _dash, float _speed, float _atkspeed, int _grade, short _unique, bool _efattach)
{
grade = _grade;
unique = _unique;
efattach = _efattach;
if (unique == -1)
{
atkcount = -1;
}
sp_selweapon = sp_weapon[(int)(unique * 0.2f)];
atkspeed = _atkspeed;
_myAnimation["m_attack1"].speed = atkspeed;
_myAnimation["m_attack1_i"].speed = atkspeed;
power = 1f + _power * 0.5f;
defence = 1 + _defence;
maxhp = _mhp;
hp = _hp;
if (hp > maxhp)
{
hp = maxhp;
}
runspeed = _speed;
dash = _dash;
_myAnimation["move"].speed = runspeed;
}
public void CallGeneral()
{
script_cam.LookTarget(transform, 30, 2f);
}
public void SetRndPosition()
{
rndpos = Random.onUnitSphere * 0.2f + cha1.position + cha1.forward * 0.3f;
rndpos.y = 0f;
distance_cha = Vector3.Distance(transform.position, cha1.position);
if (distance_cha > 0.35f)
{
_myAnimation.CrossFade("move");
showme = true;
}
else
{
_myCollider.enabled = true;
_myAnimation.CrossFade("idle");
showme = false;
}
Vector3 position = transform.position;
if (Mathf.Abs(position.x) > 2.6f)
{
fb = Mathf.Abs(position.x) / position.x;
position.x = fb * 2.6f;
base.transform.position = new Vector3(position.x, position.y, position.z);
}
if (Mathf.Abs(position.z) > 2.5f)
{
fb = Mathf.Abs(position.z) / position.z;
base.transform.position = new Vector3(position.x, position.y, fb * 2.5f);
}
}
public void Damaged(Vector3 _damageVector)
{
if (superarmor || !life)
{
return;
}
damage = (int)_damageVector.y;
_damageVector[1] = 0f;
_myAnimation.Stop();
this.GetComponent().AddForce(_damageVector * 60f);
damage = Mathf.Max(1, damage - defence);
hp -= damage;
_myCollider.enabled = false;
delay_invicibility = 3.5f;
superarmor = true;
HPgaugeSet();
if (hp <= 0)
{
delay_invicibility = 0f;
_myAnimation.Play("dead_general");
life = false;
CancelInvoke();
showme = false;
if (c_weapon != null)
{
c_weapon.gameObject.SetActive(false);
c_weapon.transform.position = Vector3.up * 24f;
}
g_hp.gameObject.SetActive(false);
hp = 1;
}
else if (!call)
{
_myAnimation.Play("down");
}
}
public void HPgaugeSet()
{
hp_length = (1f - hp / (float)maxhp) * 0.25f;
}
public void HPfull()
{
hp = maxhp;
HPgaugeSet();
InvokeRepeating("SetRndPosition", 0f, 1f);
disable = false;
life = true;
superarmor = false;
Vector3 position = cha1.position;
float x = position.x;
base.transform.position = new Vector3(x, 0f, position.z);
_myAnimation.Play("idle");
_myCollider.enabled = true;
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.layer == GameLayer.UnitLayer)
{
AttackOn(other.transform.position);
_myCollider.enabled = false;
}
}
public void AttackOn(Vector3 _enemypos)
{
if (!life || showme || call)
{
_myCollider.enabled = false;
}
else if (!attack_start)
{
if (unique >= 0)
{
atkcount = (atkcount + 1) % (5 - grade);
}
directionVector = _enemypos - transform.position;
_myAnimation.Play("m_attack1");
var attack_i = _myAnimation.PlayQueued("m_attack1_i");
attack_i.layer = 1;
attack_i.speed = atkspeed;
attack_start = true;
transform.rotation = Quaternion.LookRotation(directionVector);
}
}
private void Update()
{
if (disable)
{
return;
}
if (!life)
{
delay_invicibility += Time.deltaTime;
if (delay_invicibility > 2f)
{
delay_invicibility = 0f;
transform.position += Vector3.up * 14f;
_myAnimation.Stop();
disable = true;
}
return;
}
if (superarmor)
{
delay_invicibility -= Time.deltaTime;
if (delay_invicibility < 0f)
{
delay_invicibility = 0f;
superarmor = false;
_myCollider.enabled = true;
}
}
if (call)
{
delay_call += Time.deltaTime;
if (delay_call > 3f)
{
delay_call = 0f;
call = false;
}
}
if (_myAnimation.IsPlaying("down"))
{
attack_start = true;
}
else if (_myAnimation.IsPlaying("m_attack1_i"))
{
if (generalmovestat == 2)
{
return;
}
generalmovestat = 2;
if (atkcount != 0)
{
Vector3 myPos = transform.position;
Vector3 wpPos = ef_weapon.localPosition;
Vector3 a = myPos + Vector3.up * wpPos.y;
Vector3 forward = transform.forward;
Vector3 a2 = a + forward * wpPos.z;
Vector3 right = transform.right;
efpos = a2 + right * wpPos.x;
Vector3 wpEA = ef_weapon.eulerAngles;
Vector3 myEA = transform.eulerAngles;
efrot = Quaternion.Euler(wpEA.x, wpEA.y + myEA.y, wpEA.z);
if (c_weapon == null)
{
c_weapon = Object.Instantiate(ef_weapon, efpos, efrot);
if (efattach)
{
c_weapon.parent = transform;
}
c_weapon.gameObject.SetActive(true);
c_weapon.GetComponent().mass = power;
}
else
{
c_weapon.position = efpos;
c_weapon.rotation = efrot;
c_weapon.gameObject.SetActive(true);
}
}
else
{
Vector3 myPos = transform.position;
Vector3 wpPos = sp_selweapon.localPosition;
Vector3 a3 = myPos + Vector3.up * wpPos.y;
Vector3 myForward = transform.forward;
Vector3 a4 = a3 + myForward * wpPos.z;
Vector3 myRight = transform.right;
efpos = a4 + myRight * wpPos.x;
Vector3 wpEA = sp_selweapon.eulerAngles;
Vector3 myEA = transform.eulerAngles;
efrot = Quaternion.Euler(wpEA.x, wpEA.y + myEA.y, wpEA.z);
if (c_spweapon == null)
{
c_spweapon = Object.Instantiate(sp_selweapon, efpos, efrot);
c_spweapon.gameObject.SetActive(true);
c_spweapon.GetComponent().mass = power;
}
else
{
c_spweapon.position = efpos;
c_spweapon.rotation = efrot;
c_spweapon.gameObject.SetActive(true);
}
}
}
else if (_myAnimation.IsPlaying("m_attack1"))
{
if (generalmovestat != 1)
{
generalmovestat = 1;
this.GetComponent().AddForce(directionVector * dash);
if (atkcount == 0)
{
delay_invicibility = 1.5f;
superarmor = true;
}
}
}
else if (_myAnimation.IsPlaying("move"))
{
if (generalmovestat != 0)
{
_myCollider.enabled = true;
generalmovestat = 0;
}
attack_start = false;
directionVector = cha1.position - transform.position;
if (directionVector != Vector3.zero)
{
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(directionVector), Time.deltaTime * 5f);
}
transform.position += transform.forward * Time.deltaTime * (runspeed - 0.1f);
}
else if (_myAnimation.IsPlaying("idle"))
{
if (generalmovestat != 0)
{
_myCollider.enabled = true;
generalmovestat = 0;
}
attack_start = false;
directionVector = rndpos - transform.position;
if (directionVector != Vector3.zero)
{
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(directionVector), Time.deltaTime * 2f);
}
transform.position += transform.forward * Time.deltaTime * 0.1f;
}
}
}
}