using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
namespace YLBattle
{
///
/// 战场中,主逻辑推进....
///
public partial class BattleField : IBattleInnerOper
{
///
/// 本次战斗详细上下文数据
///
private BattleParam mBattleParam = null;
///
/// 战斗是否已经结束
///
private bool isBattleFinish = false;
///
/// 获取当前战场上下文环境信息
///
/// 上下文环境信息
public BattleParam Env()
{
return this.mBattleParam;
}
#region 战场状态驱动
///
/// 当前执行策略
///
private Policy mCurrentPolicy = null;
///
/// 战斗准备策略
///
private Policy mReadyPolicy = null;
///
/// 战斗停止策略
///
private Policy mStopPolicy = null;
///
/// 战斗入场策略
///
private Policy mArrivalPolicy = null;
///
/// 战斗离场策略
///
private Policy mLeavePolicy = null;
///
/// 战斗策略
///
private Policy mFightingPolicy = null;
///
/// 战前策略
///
private Policy mPrewarPolicy = null;
///
/// 战斗胜利策略
///
private Policy mVictoryPolicy = null;
///
/// 战斗失败策略
///
private Policy mFailedPolicy = null;
///
/// 超时策略
///
private Policy mTimeoutPolicy = null;
#endregion
#region 分支策略 定义:可受主策略单向操纵, 不受游戏暂停影响
///
/// 当前分支策略
///
private Policy mSubPolicy = null;
///
/// 战斗开始动画策略
///
private Policy mWarningPolicy = null;
///
/// 战斗开始动画策略
///
private Policy mCriticalPolicy = null;
///
/// 波次出现,Boss出场动画策略
///
private Policy mBossPolicy = null;
///
/// 释放技能
///
private Policy mSkillPolicy = null;
///
/// 释放技能
///
private Policy mBossSkillPolicy = null;
#endregion
///
/// 初始化
///
/// 上下文环境信息
public void Initialize(BattleParam param)
{
this.isBattleFinish = false;
this.mBattleParam = param;
this.mCurrentPolicy = null;
this.mSubPolicy = null;
// 初始化策略
this.mReadyPolicy = new PolicyReady(this.mBattleParam);
this.mStopPolicy = new PolicyStop(this.mBattleParam);
this.mArrivalPolicy = new PolicyArrival(this.mBattleParam);
this.mLeavePolicy = new PolicyLeave(this.mBattleParam);
this.mFightingPolicy = new PolicyFighting(this.mBattleParam);
this.mVictoryPolicy = new PolicyVictory(this.mBattleParam);
this.mFailedPolicy = new PolicyFailed(this.mBattleParam);
this.mTimeoutPolicy = new PolicyTimeout(this.mBattleParam);
this.mPrewarPolicy = new PolicyPrewar(this.mBattleParam);
this.mWarningPolicy = new PolicyWarning(this.mBattleParam);
this.mCriticalPolicy = new PolicyCritical(this.mBattleParam);
this.mBossPolicy = new PolicyBoss(this.mBattleParam);
this.mSkillPolicy = new PolicySkillTip(this.mBattleParam);
this.mBossSkillPolicy = new PolicyBossSkill(this.mBattleParam);
this.ChangeFieldPolicy(EBattleStaus.EBATTLE_STATUS_READY, null);
}
///
/// 周期调度
///
/// 战场策略当前调度状态
public EBattleUpdateStatus OnUpdate(long longNow)
{
if (null == this.mCurrentPolicy)
{
return EBattleUpdateStatus.Complete;
}
// 分支策略调度
if (null != this.mSubPolicy)
{
this.mSubPolicy.OnUpdate(longNow);
if (this.mSubPolicy.IsComplete())
{
this.ChangeFieldSubPolicy(EBattleStaus.EBATTLE_STATUS_NONE, null);
}
}
// 策略调度
this.mCurrentPolicy.OnUpdate(longNow);
return EBattleUpdateStatus.Continue;
}
#region 策略驱动
///
/// 更改战场子策略
///
/// 状态标识
/// 传递参数
public void ChangeFieldSubPolicy(EBattleStaus substatus, object param)
{
if (null != this.mSubPolicy && substatus != this.mSubPolicy.Type())
{
this.mSubPolicy.OnLeave();
}
switch (substatus)
{
case EBattleStaus.EBATTLE_STATUS_WARNING:
this.mSubPolicy = this.mWarningPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_CRITICAL:
this.mSubPolicy = this.mCriticalPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_BOSS:
this.mSubPolicy = this.mBossPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_SKILL:
this.mSubPolicy = this.mSkillPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_BOSSSKILL:
this.mSubPolicy = this.mBossSkillPolicy;
break;
default:
this.mSubPolicy = null;
break;
}
if (null != this.mSubPolicy)
{
this.mSubPolicy.OnEnter(param);
}
}
///
/// 更改当前战场策略
///
/// 状态标识
/// 传递参数
public void ChangeFieldPolicy(EBattleStaus status, object param)
{
if (null != this.mCurrentPolicy && status != this.mCurrentPolicy.Type())
{
this.mCurrentPolicy.OnLeave();
}
switch (status)
{
case EBattleStaus.EBATTLE_STATUS_STOP:
this.mCurrentPolicy = this.mStopPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_READY:
this.mCurrentPolicy = this.mReadyPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_LEAVE:
this.mCurrentPolicy = this.mLeavePolicy;
break;
case EBattleStaus.EBATTLE_STATUS_PREWAR:
this.mCurrentPolicy = this.mPrewarPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_FIGHTING:
this.mCurrentPolicy = this.mFightingPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_ARRIVAL:
this.mCurrentPolicy = this.mArrivalPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_VICTORY:
this.mCurrentPolicy = this.mVictoryPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_FAILED:
this.mCurrentPolicy = this.mFailedPolicy;
break;
case EBattleStaus.EBATTLE_STATUS_TIMEOUT:
this.mCurrentPolicy = this.mTimeoutPolicy;
break;
default:
this.mCurrentPolicy = null;
break;
}
if (null != this.mCurrentPolicy)
{
this.mCurrentPolicy.OnEnter(param);
}
}
///
/// 获取当前战场策略
///
/// 当前策略类型
public Policy CurrentPoilcy()
{
return this.mCurrentPolicy;
}
///
/// 获取当前子策略
///
/// 当前子策略
public Policy CurrentSubPolicy()
{
return this.mSubPolicy;
}
#endregion
}
}