using UnityEngine;
using System;
using System.Collections.Generic;
using Core.Utilities;
using KTGMGemClient;
using TowerDefense.Agents;
using TowerDefense.Agents.Data;
using TowerDefense.Nodes;
namespace TowerDefense.Level
{
///
/// A Wave is a TimedBehaviour, that uses the RepeatingTimer to spawn enemies
/// PVE(无尽模式)使用
///
public class EndlessWave : TimedBehaviour
{
///
/// 当前的Wave可以刷新出来的agent类型.
///
public List AgentConfigurationList;
///
/// 兵线id,从左☞右依次为1~5,Inspector面板设置的
///
public int WaveLineId;
///
/// 本赛道对应的刷怪配置数据
///
private EndlessPortConfig waveData;
///
/// 已经生成的敌人数量
///
private int spawnedEnemies;
///
/// The RepeatingTimer used to spawn enemies
///
protected RepeatingTimer spawnTimer;
///
/// The event that is fired when a Wave is completed
/// 波次完成事件
///
public event Action WaveCompleted;
///
/// 有新的敌人生成
///
public event Action SpawnNewAgent;
///
/// 怪出生开始节点
///
public Node StartingNode;
///
/// 当前的兵线是否已经停止.
///
protected bool isWaveStoped = false;
///
/// 怪物刷新速度的缩放.
///
protected float spawnTimeScale = 1.0f;
///
/// 怪物移动速度的缩放
///
protected float monsterMoveScale = 1.0f;
///
/// 当前兵线的状态
///
public EndlessWaveLineState LineState { get; set; } = EndlessWaveLineState.Wait;
///
/// 开始新的一波
///
public virtual void StartWave(EndlessPortConfig data)
{
LineState = EndlessWaveLineState.Spawning;
waveData = data;
isWaveStoped = false;
spawnedEnemies = 0;
SpawnCurrent();
spawnTimer = new RepeatingTimer(data.Config.interval / 1000f, SpawnCurrent);
StartTimer(spawnTimer);
}
///
/// 停止当前的兵线出兵
///
public void StopWave()
{
StopTimer(spawnTimer);
isWaveStoped = true;
}
public void PauseWave()
{
PauseTimer(spawnTimer);
}
public void RestartWave()
{
if (spawnTimer != null)
StartTimer(spawnTimer);
}
protected virtual void SpawnCurrent()
{
if (isWaveStoped) return;
if (!TrySetupNextSpawn())
{
spawnedEnemies = waveData.Config.amount;
StopWave();
SafelyBroadcastWaveCompletedEvent();
}
else
{
++spawnedEnemies;
if (SpawnNewAgent != null)
SpawnNewAgent();
if (spawnedEnemies >= waveData.Config.amount)
{
StopWave();
SafelyBroadcastWaveCompletedEvent();
}
}
}
///
/// 生成agent
///
/// Agent
protected virtual void SpawnAgent()
{
endless_enemy enemyData = waveData.EnemyDataList[waveData.Config.enemy_id > 0 ? 0 : spawnedEnemies];
int index = GetIndexByResId(enemyData.resource);
// 木属性小怪需要同时生成两个,先这么写吧(WTF)
bool isDouble = enemyData.resource == 103;
Poolable agentPoolable = Poolable.TryGetPoolable(AgentConfigurationList[index].agentPrefab.gameObject);
Agent newAgent = agentPoolable.GetComponent();
newAgent.EnemyData = enemyData;
newAgent.transform.position = StartingNode.transform.position;
if (isDouble)
{
Vector3 pos = newAgent.transform.position;
pos.x -= 2f;
newAgent.transform.position = pos;
}
newAgent.transform.rotation = StartingNode.transform.rotation;
newAgent.SetNode(StartingNode, WaveLineId - 1);
newAgent.opponentAgent = false;
newAgent.Initialize();
// 最终血量 = 基础血量 * 血量增幅,速度和金币都是一个公式
float hp = waveData.Config.b_hp * enemyData.hp_rate;
float speed = waveData.Config.b_speed * enemyData.speed_rate;
int gold = waveData.Config.b_coin * enemyData.coin_rate;
newAgent.SetAgentData(hp, speed, gold);
// todo 这里先填1级后面需要修改
newAgent.healthBar.SetHealthLevel(1);
// 加入Manager统一管理.
AgentInsManager.instance.addAgent(newAgent);
if (isDouble)
{
Poolable agentPoolable2 = Poolable.TryGetPoolable(AgentConfigurationList[index].agentPrefab.gameObject);
Agent doubleAgent = agentPoolable2.GetComponent();
doubleAgent.EnemyData = enemyData;
doubleAgent.transform.position = StartingNode.transform.position;
Vector3 pos = doubleAgent.transform.position;
pos.x += 2f;
doubleAgent.transform.position = pos;
doubleAgent.transform.rotation = StartingNode.transform.rotation;
doubleAgent.SetNode(StartingNode, WaveLineId - 1);
doubleAgent.opponentAgent = false;
doubleAgent.Initialize();
doubleAgent.SetAgentData(hp, speed, gold);
doubleAgent.healthBar.SetHealthLevel(1);
AgentInsManager.instance.addAgent(doubleAgent);
}
}
///
/// 从Tower的AttributeId获取到怪物的数据
///
///
///
protected List GetMonsterDataFromAttributeId(int id)
{
geminfo tgem = new geminfo();
if (JsonDataCenter.gemInfoDic.TryGetValue(id, out tgem))
return tgem.summon;
else
{
Debug.Log("找不到对应ID的Gem:" + id);
return null;
}
}
///
/// 尝试去生成下一波怪
///
/// true if there is another spawn instruction, false if not
protected bool TrySetupNextSpawn()
{
if (spawnedEnemies >= waveData.Config.amount) return false;
SpawnAgent();
return true;
}
///
/// 暂时先这么处理
///
/// endless_enemy表的资源id
/// 所有可选的agent列表的索引
private int GetIndexByResId(int resId)
{
return resId - 100;
}
///
/// Launch the WaveCompleted event
///
protected void SafelyBroadcastWaveCompletedEvent()
{
LineState = EndlessWaveLineState.SpawnCompleted;
if (WaveCompleted != null)
WaveCompleted();
}
}
}