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.
 
 
 
 
 
 

115 lines
3.2 KiB

using System.Collections.Generic;
using Entitas;
using Sog;
namespace CoreGame.Render
{
public enum WaveSpawnState
{
None = 0,
TryStart = 1,
Spawning = 2,
Spawned = 3,
End = 4,
}
public enum LevelSpawnState
{
None = 0,
Start = 1,
Spawning = 2,
End = 3,
Stop = 2,
}
public class WaveParam
{
// 大波次
// public LevelWaveGroupConfigData waveData;
public ChapterBattleStageDesc waveData;
public Fixed64 accTime = 0;
public Fixed64 jumpTimeSpanAcc = 0; // 跳时间的累计值
public int jumpIdx;
public int[] spawnedIdx; // 小波次内的索引
public int lastSpawnCount; // 小波次数量总和
public Fixed64[] newRuleTimeSpanAcc; // 新规则增量
public WaveSpawnState state;
public List<int> eids;
}
[Combat]
public class LevelWaveComponent : IComponent, IReset
{
public Dictionary<int, int> lifeEid2WaveIdx;
public List<WaveParam> waveParams;
public LevelSpawnState state;
public float totalTime;
public int battleId;
internal float totalTimeAcc;
internal int curStageId;
public bool CanStart(int predictedIdx)
{
if (predictedIdx < 0 || predictedIdx >= waveParams.Count)
return false;
if (predictedIdx == 0)
return true;
var waveData = waveParams[predictedIdx].waveData;
var lastParam = waveParams[predictedIdx - 1];
if (waveData.stageStartType == WaveBeginType.AllWaveEntDeath)
return lifeEid2WaveIdx.Count == 0 && lastParam.state == WaveSpawnState.Spawned;
// if (waveData.stageStartType == WaveBeginType.LastWaveEnd &&
// lastParam.state == WaveSpawnState.End)
// {
// if (lastParam.waveData.mWaveEndType == WaveEndType.WaveMonsterDead)
// return lastParam.eids.Count == 0;
// return true;
// }
if (waveData.stageStartType == WaveBeginType.TimeCountOrWaveMonsterDead)
{
// 到达时间
if (lastParam.state == WaveSpawnState.End)
return true;
// 怪物生成完毕,且全死
if (lastParam.state == WaveSpawnState.Spawned)
return lastParam.eids.Count == 0;
}
return false;
}
public void RemoveLifeEnt(int eid)
{
if (lifeEid2WaveIdx.Remove(eid, out var waveIdx))
{
waveParams[waveIdx].eids.Remove(eid);
}
}
public void AddLifeEnt(int eid, int waveIdx)
{
if (!lifeEid2WaveIdx.TryAdd(eid, waveIdx))
return;
waveParams[waveIdx].eids.Add(eid);
}
public void Reset()
{
totalTimeAcc = 0;
DictionaryPool<int, int>.Push(ref lifeEid2WaveIdx);
for (int i = 0; i < waveParams.Count; i++)
{
ListPool<int>.Push(ref waveParams[i].eids);
}
ListPool<WaveParam>.Push(ref waveParams);
}
}
}