100 lines
2.7 KiB
C#
100 lines
2.7 KiB
C#
/********************************************************************************
|
||
* 文件名: ThreadList.cs
|
||
* 全路径: \Script\Player\AI\ThreadList.cs
|
||
* 创建人: 李嘉
|
||
* 创建时间:2013-11-19
|
||
*
|
||
* 功能说明: Obj仇恨列表
|
||
*
|
||
* 修改记录:
|
||
*********************************************************************************/
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using Games.LogicObj;
|
||
|
||
namespace Games.AI_Logic
|
||
{
|
||
public class ThreatInfo
|
||
{
|
||
public ThreatInfo(Obj_Character obj, int nValue)
|
||
{
|
||
ThreatObj = obj;
|
||
ThreatValue = nValue;
|
||
}
|
||
|
||
// 威胁来源
|
||
public Obj_Character ThreatObj { get; set; }
|
||
|
||
// 威胁值
|
||
public int ThreatValue { get; set; }
|
||
}
|
||
|
||
public class Threat
|
||
{
|
||
private readonly List<ThreatInfo> m_ThreatList;
|
||
|
||
public Threat()
|
||
{
|
||
if (null == m_ThreatList) m_ThreatList = new List<ThreatInfo>();
|
||
}
|
||
|
||
public int GetThreatValue(Obj_Character obj)
|
||
{
|
||
var threatInfo = FindThreadInfo(obj);
|
||
return threatInfo == null ? 0 : threatInfo.ThreatValue;
|
||
}
|
||
|
||
public ThreatInfo FindThreadInfo(Obj_Character obj)
|
||
{
|
||
ThreatInfo result = null;
|
||
if (obj != null)
|
||
result = m_ThreatList.Find(a => a.ThreatObj == obj);
|
||
return result;
|
||
}
|
||
|
||
public Obj_Character FindMaxThreatObj()
|
||
{
|
||
ThreatInfo maxThreat = null;
|
||
for (var i = 0; i < m_ThreatList.Count; ++i)
|
||
if (null == maxThreat || maxThreat.ThreatValue < m_ThreatList[i].ThreatValue)
|
||
maxThreat = m_ThreatList[i];
|
||
return maxThreat == null ? null : maxThreat.ThreatObj;
|
||
}
|
||
|
||
public void AddThreat(Obj_Character obj, int value)
|
||
{
|
||
if (null == obj)
|
||
return;
|
||
var info = FindThreadInfo(obj);
|
||
if (null == info)
|
||
{
|
||
// 负数威胁值不保存,因此不创建
|
||
if (value > 0)
|
||
{
|
||
info = new ThreatInfo(obj, value);
|
||
m_ThreatList.Add(info);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
info.ThreatValue = Math.Max(0, info.ThreatValue + value);
|
||
}
|
||
}
|
||
|
||
public void ResetAllThreat()
|
||
{
|
||
m_ThreatList.Clear();
|
||
}
|
||
|
||
public void ResetThreat(Obj_Character obj)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
var index = m_ThreatList.FindIndex(a => a.ThreatObj == obj);
|
||
if (index >= 0)
|
||
m_ThreatList.RemoveAt(index);
|
||
}
|
||
}
|
||
}
|
||
} |