//================================================================
//
// Copyright (C) 2017 Team Saluka
// All Rights Reserved
//
// Author:小妖精Balous
//
//================================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Saruka
{
/// <summary>
/// 技能系統(tǒng)
/// </summary>
public class SkillSystem
{
/// <summary>
/// 擁有本技能系統(tǒng)的生物
/// </summary>
Creature owner;
/// <summary>
/// 是否進入后搖
/// </summary>
bool isAfterComplete;
/// <summary>
/// 技能集合
/// </summary>
public Skill[] skillList;
/// <summary>
/// 構(gòu)造器
/// </summary>
/// <param name="owner">擁有本技能系統(tǒng)的生物</param>
public SkillSystem(Creature _owner)
{
owner = _owner;
}
/// <summary>
/// 正在施放的技能
/// </summary>
public Skill skillOnCasting
{
private set;
get;
}
/// <summary>
/// 取消正在施放的技能
/// </summary>
public void CancelSkill()
{
if (skillOnCasting != null)
{
skillOnCasting.Exit(owner);
//技能開始冷卻
skillOnCasting.coldDownTime = skillOnCasting.totalColdDownTime;
skillOnCasting = null;
}
}
/// <summary>
/// 施放技能
/// </summary>
/// <param name="index">要施放的技能在技能集合中的索引</param>
/// <param name="force">是否強制施放</param>
public void CastSkill(int index, bool isForce = false)
{
//判斷生物是否處于打斷狀態(tài)
if (owner.interrupt > 0) return;
//判斷冷卻時間
if (skillList[index].coldDownTime > 0) return;
//判斷魔法值是否足夠
if (owner.mana < skillList[index].manaCost) return;
//判斷是否有技能在施放中
if (skillOnCasting != null)
{
if (isForce)
{
skillOnCasting.Exit(owner);
//技能開始冷卻
skillOnCasting.coldDownTime = skillOnCasting.totalColdDownTime;
}
else return;
}
skillOnCasting = skillList[index];
//消耗魔法值
owner.mana -= skillOnCasting.manaCost;
//記錄技能施放時間
skillOnCasting.castingTime = skillOnCasting.totalCastingTime;
//初始化后搖
isAfterComplete = false;
skillOnCasting.afterCompleteTime = skillOnCasting.totalAfterCompleteTime;
//調(diào)用Enter
skillOnCasting.Enter(owner);
}
/// <summary>
/// 刷新技能狀態(tài),在Update中調(diào)用
/// </summary>
public void Refresh()
{
//刷新技能冷卻時間
if (skillList != null) foreach (Skill skill in skillList) skill.coldDownTime -= Time.deltaTime;
//如果有技能正在施放
if (skillOnCasting != null)
{
//如果技能被打斷
if (owner.interrupt > 0)
{
skillOnCasting.Exit(owner);
//技能開始冷卻
skillOnCasting.coldDownTime = skillOnCasting.totalColdDownTime;
skillOnCasting = null;
return;
}
//如果沒有進入后搖
if (!isAfterComplete)
{
//刷新技能施放時間
skillOnCasting.castingTime -= Time.deltaTime;
//如果技能施放完畢
if (skillOnCasting.castingTime <= 0.0f)
{
skillOnCasting.Complete(owner);
isAfterComplete = true;
}
//如果技能沒有施放完畢
else skillOnCasting.Execute(owner);
}
//如果進入后搖
if (isAfterComplete)
{
//刷新后搖時間
skillOnCasting.afterCompleteTime -= Time.deltaTime;
//如果后搖結(jié)束
if (skillOnCasting.afterCompleteTime <= 0.0f)
{
skillOnCasting.Exit(owner);
//技能開始冷卻
skillOnCasting.coldDownTime = skillOnCasting.totalColdDownTime;
skillOnCasting = null;
}
//如果后搖沒有結(jié)束
else skillOnCasting.AfterComplete(owner);
}
}
}
}
/// <summary>
/// 技能
/// </summary>
public abstract class Skill
{
public Skill() { }
public Skill(int _level, float _totalColdDownTime, float _totalCastingTime, float _totalAfterCompleteTime, int _manaCost)
{
level = _level;
totalColdDownTime = _totalColdDownTime;
totalCastingTime = _totalCastingTime;
totalAfterCompleteTime = _totalAfterCompleteTime;
manaCost = _manaCost;
}
/// <summary>
/// 技能等級
/// </summary>
public int level;
/// <summary>
/// 全部冷卻時間
/// </summary>
public float totalColdDownTime;
/// <summary>
/// 當前冷卻時間
/// </summary>
public float coldDownTime
{
set
{
if (value < 0.0f) _coldDownTime = 0.0f;
else if (value > totalColdDownTime) _coldDownTime = totalColdDownTime;
else _coldDownTime = value;
}
get{ return _coldDownTime; }
}
private float _coldDownTime;
/// <summary>
/// 當前后搖時間
/// </summary>
public float afterCompleteTime
{
set;
get;
}
/// <summary>
/// 全部后搖時間
/// </summary>
public float totalAfterCompleteTime = 0;
/// <summary>
/// 魔法值消耗
/// </summary>
public int manaCost;
/// <summary>
/// 全部施放時間
/// </summary>
public float totalCastingTime;
/// <summary>
/// 當前施放時間
/// </summary>
public float castingTime
{
set;
get;
}
public virtual void Enter(Creature owner) { }
public virtual void Execute(Creature owner) { }
public abstract void Complete(Creature owner);
public virtual void AfterComplete(Creature owner) { }
public virtual void Exit(Creature owner) { }
}
}
浙公網(wǎng)安備 33010602011771號