You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

426 lines
12 KiB

using IVDataFormat;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Numerics;
using Spine;
using Spine.Unity;
using static CreatureBase;
using AnimationState = Spine.AnimationState;
using Vector2 = UnityEngine.Vector2;
using Vector3 = UnityEngine.Vector3;
public class IVSummon : MonoBehaviour
{
private const string ECheckAttack = "AttackDamage";
private const string ECheckAttackState = "CheckAttackState";
private const string ECheckSkillState = "CheckSkillState";
private const string ECheckDamageState = "CheckDamageState";
private const string ECheckCeremonyState = "CheckCeremonyState";
private const string ECheckWarp_outState = "CheckPOutState";
private const string ECheckWarp_inState = "CheckPInState";
[SerializeField]
private AudioSource asNormalAttack;
[SerializeField]
protected eState animState = eState.idle;
protected ParticleSystem ptcMuzzle;
protected BattleMgr battleMgr;
protected AnimationState anState;
protected SkeletonAnimation skAnim;
protected Vector3 v3TargetPos;
public bool IsInit { get; private set; }
private Transform trfslefParent;
protected const float F_SearchTime = 0.1f;
protected bool bAttackable = false;
protected bool bFrontRight = true;
protected bool bFriendly = true;
protected bool isSummon = false;
protected int iCrtRate = 0;
protected int iTargetIndex = 0;
protected int idnumber;
protected float fCrtDam = dConst.RateMaxFloat;
protected float fMov = dConst.RateMaxFloat;
protected float fSpd = dConst.RateMaxFloat;
protected float fSearchTick = 0f;
protected float fAttackTick = 0f;
protected float fAttackTime = 0.3f;
protected float fTargetDistance = 9999f;
protected float fRange = 8f;
protected float fMovCalc = 10f;
protected float summonTime = 0f;
protected float fCrtDamCalc = dConst.RateMaxFloat;
protected int iCrtRateCalc = 0;
protected BigInteger biAtk = 0L;
private void OnEnable()
{
ChangeState(eState.warp_in);
}
public void SetInit(BattleMgr btmgr)
{
battleMgr = btmgr;
if (!IsInit)
{
trfslefParent = transform.parent;
skAnim = GetComponent<SkeletonAnimation>();
anState = skAnim.AnimationState;
anState.Event += HandleAnimEvent;
if(transform.childCount > 0)
ptcMuzzle = transform.Find("Muzzle").GetComponent<ParticleSystem>();
IsInit = true;
}
}
public void SetStatus(BigInteger biatk, float fcrtdam,int crtrate , float smtime, Vector3 summonPos, int idnum, float attckInterval = 0.3f)
{
transform.position = summonPos + (Vector3)Random.insideUnitCircle.normalized * 3f;
trfslefParent.localScale = Global.V3_1XRev;
isSummon = true;
skAnim.enabled = true;
biAtk = biatk;
fCrtDam = fcrtdam;
iCrtRateCalc = crtrate;
summonTime = smtime;
gameObject.SetActive(true);
anState.Event += HandleAnimEvent;
idnumber = idnum;
fAttackTime = attckInterval;
}
public void SearchTarget()
{
fSearchTick = 0f;
iTargetIndex = battleMgr.GetTargetIndex(bFriendly, transform);
if (iTargetIndex < 0)
{
ChangeState(eState.idle);
}
else
{
v3TargetPos = battleMgr.GetTargetPos(bFriendly, iTargetIndex);
fTargetDistance = BattleMgr.SCalcDistance(transform.position, v3TargetPos);
if (fTargetDistance <= fRange)
{
skAnim.timeScale = 2.0f;
CheckAttack();
}
else
{
ChangeState(eState.move);
}
}
}
protected virtual float MoveToTarget()
{
Vector3 v3framepos;
ChangeFront();
v3framepos = Vector3.MoveTowards(transform.position, v3TargetPos, fMovCalc * Time.deltaTime);
v3framepos.z = v3framepos.y * 0.1f;
transform.position = v3framepos;
fTargetDistance = Vector3.Distance(v3framepos, v3TargetPos);
return fTargetDistance;
}
public virtual void CheckAttack()
{
// ���� ����(���� �ӵ� ������ ���� �ð� �����).
if (bAttackable)
{
if(ptcMuzzle != null)
ptcMuzzle.Play();
ChangeFront();
ChangeState(eState.attack);
}
else
{
ChangeState(eState.idle);
}
}
protected void HandleAnimEvent(TrackEntry trackEntry, Spine.Event e)
{
if (e.Data.Name.Equals(ECheckAttack))
AttackDamage();
else if (e.Data.Name.Equals(ECheckAttackState))
CheckAttackState();
else if (e.Data.Name.Equals(ECheckDamageState))
CheckDamageState();
else if (e.Data.Name.Equals(ECheckSkillState))
CheckSkillState();
else if (e.Data.Name.Equals(ECheckCeremonyState))
CheckCeremonyState();
else if (e.Data.Name.Equals(ECheckWarp_outState))
CheckWarp_outState();
else if (e.Data.Name.Equals(ECheckWarp_inState))
CheckWarp_inState();
}
public void ChangeState(eState changestate)
{
if (changestate == animState && changestate != eState.attack && changestate != eState.skill)
return;
animState = changestate;
switch (animState)
{
case eState.idle:
anState.SetAnimation(0, "idle", true);
break;
case eState.move:
anState.SetAnimation(0, "move", true);
break;
case eState.attack:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack", false);
break;
case eState.attack2:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack2", false);
break;
case eState.die:
anState.SetAnimation(0, "die", false);
break;
case eState.skill:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack", false);
break;
case eState.ceremony:
anState.SetAnimation(0, "ceremony", false);
break;
case eState.warp_in:
anState.SetAnimation(0, "warp_in", false);
break;
case eState.warp_out:
anState.SetAnimation(0, "warp_out", false);
break;
case eState.rush:
anState.SetAnimation(0, "rush", false);
break;
case eState.damage:
anState.SetAnimation(0, "damage", false);
break;
}
}
public void ChangeStateForce(eState changestate)
{
if (anState == null)
return;
animState = changestate;
switch (animState)
{
case eState.idle:
anState.SetAnimation(0, "idle", true);
break;
case eState.move:
anState.SetAnimation(0, "move", true);
break;
case eState.attack:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack", false);
break;
case eState.attack2:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack2", false);
break;
case eState.die:
anState.SetAnimation(0, "die", false);
break;
case eState.skill:
bAttackable = false;
fAttackTick = 0f;
anState.SetAnimation(0, "attack", false);
break;
case eState.ceremony:
anState.SetAnimation(0, "ceremony", false);
break;
case eState.warp_in:
anState.SetAnimation(0, "warp_in", false);
break;
case eState.warp_out:
skAnim.timeScale = 1.0f;
anState.SetAnimation(0, "warp_out", false);
break;
case eState.rush:
anState.SetAnimation(0, "rush", false);
break;
case eState.damage:
anState.SetAnimation(0, "damage", false);
break;
}
}
protected virtual void ChangeFront()
{
if (bFrontRight)
{
if (transform.position.x > v3TargetPos.x)
{
bFrontRight = false;
transform.localScale = Vector3.one;
}
}
else
{
if (transform.position.x < v3TargetPos.x)
{
bFrontRight = true;
transform.localScale = Global.oneRev;
}
}
}
public void ForceUnSummon()
{
summonTime = -1f;
}
private void Update()
{
if (summonTime > 0)
summonTime -= Time.deltaTime;
if (summonTime < 0)
{
isSummon = false;
summonTime = 0f;
if (!isSummon)
ChangeStateForce(eState.warp_out);
}
if (isSummon)
{
switch (animState)
{
case eState.idle:
// attack time.
if (fAttackTick < fAttackTime)
{
fAttackTick += Time.deltaTime;
if (fAttackTick >= fAttackTime)
bAttackable = true;
}
// re-search target time.
if (fSearchTick < F_SearchTime)
{
fSearchTick += Time.deltaTime;
if (fSearchTick >= F_SearchTime)
SearchTarget();
}
// move.
if (animState == eState.idle && fTargetDistance <= fRange && biAtk != 0)
CheckAttack();
break;
case eState.move:
// attack time.
if (fAttackTick < fAttackTime)
{
fAttackTick += Time.deltaTime;
if (fAttackTick >= fAttackTime)
bAttackable = true;
}
// re-search target time.
if (fSearchTick < F_SearchTime)
{
fSearchTick += Time.deltaTime;
if (fSearchTick >= F_SearchTime)
SearchTarget();
}
// move.
if (animState == eState.move && MoveToTarget() <= fRange && biAtk != 0)
{
CheckAttack();
}
break;
}
}
}
public void AttackDamage()
{
if (SoundMgr.EfcOn && asNormalAttack != null)
asNormalAttack.Play();
if (bFriendly)
battleMgr.DamageToEnemy(iTargetIndex, biAtk, fCrtDamCalc, iCrtRateCalc, idnumber);
else
battleMgr.DamageToFriendly(biAtk, fCrtDamCalc, iCrtRateCalc);
}
// ���� �ִϸ��̼� ������ ������.
public void CheckAttackState()
{
skAnim.timeScale = 1.0f;
SearchTarget();
}
// ��ų �ִϸ��̼� ������ ������.
public void CheckSkillState()
{
SearchTarget();
}
// ���ع��� �ִϸ��̼� ������ ������.
public void CheckDamageState()
{
ChangeState(eState.idle);
}
// ��� �ִϸ��̼� ������ ������.
public void CheckDieState()
{
}
// �����Ӵ� �ִϸ��̼� ������ ������.
public void CheckCeremonyState()
{
ChangeState(eState.idle);
}
public void CheckWarp_outState()
{
gameObject.SetActive(false);
}
public void CheckWarp_inState()
{
ChangeState(eState.idle);
SearchTarget();
}
}