187 lines
4.4 KiB
C
187 lines
4.4 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
/************************************************************************/
|
|||
|
|
/*
|
|||
|
|
/* 属性的评分器,用于评价一个属性集的分数,保留装备等
|
|||
|
|
/* 比如内功攻击 1点 评分为2分,外功攻击一点评分为2.5分,根据这个算出一个属性集或者属性的分数
|
|||
|
|
/************************************************************************/
|
|||
|
|
|
|||
|
|
class CAttrEval
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
CAttrEval()
|
|||
|
|
{
|
|||
|
|
reset();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//辅助的计算器,用于一些辅助的评估,比如宠物的技能,id不是bufftype
|
|||
|
|
typedef struct AuxEvalValue
|
|||
|
|
{
|
|||
|
|
int nId; //ID
|
|||
|
|
float fScore; //该ID的分数
|
|||
|
|
} AUXEVALVALUE,*PAUXEVALVALUE;
|
|||
|
|
|
|||
|
|
/* 重置属性计算器 */
|
|||
|
|
inline void reset(){ memset(m_AttrValues, 0, sizeof(m_AttrValues)); m_auxValue.clear(); }
|
|||
|
|
|
|||
|
|
|
|||
|
|
//将一个属性初始化到评分器里
|
|||
|
|
CAttrEval& operator << (const tagGameAttribute &attr)
|
|||
|
|
{
|
|||
|
|
if(attr.type <0 || attr.type >= GameAttributeCount)
|
|||
|
|
{
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
if(AttrNeedCalc[attr.type] == false)
|
|||
|
|
{
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
m_AttrValues[attr.type].fValue = attr.value.fValue;
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//初始化评分器,每个属性一点占多少分,比如一点外功攻击2分
|
|||
|
|
CAttrEval& operator <<(const CAttrCalc &attrCalc)
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
GAMEATTR attr;
|
|||
|
|
for ( i=1; i<GameAttributeCount; ++i )
|
|||
|
|
{
|
|||
|
|
attr.type = (BYTE)i;
|
|||
|
|
attr.value = attrCalc.m_AttrValues[i];
|
|||
|
|
if(attr.value.nValue !=0)
|
|||
|
|
{
|
|||
|
|
this->operator << (attr);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//将另外一个评分器的数据放到本评分器里
|
|||
|
|
CAttrEval& operator <<(const CAttrEval &eval)
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
|
|||
|
|
for ( i=1; i<GameAttributeCount; ++i )
|
|||
|
|
{
|
|||
|
|
if(eval.m_AttrValues[i].nValue !=0)
|
|||
|
|
{
|
|||
|
|
m_AttrValues[i].fValue = eval.m_AttrValues[i].fValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 添加辅助的参数,添加这个主要用于一些技能ID等产生的评价的数值
|
|||
|
|
* Param int nId:id,比如技能的id
|
|||
|
|
* Param float score:该参数的分数
|
|||
|
|
* @Return void:
|
|||
|
|
*/
|
|||
|
|
void AddAuxEvalParam(int nId, float score)
|
|||
|
|
{
|
|||
|
|
//如果已经存在的话
|
|||
|
|
if( score ==0.0) return ;
|
|||
|
|
for(INT_PTR i=0; i< m_auxValue.count(); i++ )
|
|||
|
|
{
|
|||
|
|
if(m_auxValue[i].nId == nId)
|
|||
|
|
{
|
|||
|
|
m_auxValue[i].fScore = score;
|
|||
|
|
return ;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AUXEVALVALUE data;
|
|||
|
|
data.nId = nId;
|
|||
|
|
data.fScore = score;
|
|||
|
|
m_auxValue.add(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments:获取辅助参数上的得分
|
|||
|
|
* Param int nId:辅助参数的id,比如技能的ID
|
|||
|
|
* Param float fValue:辅助参数上的得分
|
|||
|
|
* @Return float:返回该项得分
|
|||
|
|
*/
|
|||
|
|
float GetAuxScore(int nId, float fValue=1.0)
|
|||
|
|
{
|
|||
|
|
for(INT_PTR i=0; i< m_auxValue.count(); i++ )
|
|||
|
|
{
|
|||
|
|
if(m_auxValue[i].nId == nId)
|
|||
|
|
{
|
|||
|
|
return m_auxValue[i].fScore * fValue ;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 0.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取一个属性的评分分数
|
|||
|
|
float GetOneAttrScore(GAMEATTR attr)
|
|||
|
|
{
|
|||
|
|
INT_PTR nType= attr.type;
|
|||
|
|
if(nType <1 || nType >=GameAttributeCount) return 0.0; //溢出
|
|||
|
|
|
|||
|
|
switch(AttrDataTypes[nType])
|
|||
|
|
{
|
|||
|
|
case adSmall://有符号1字节类型
|
|||
|
|
case adShort:
|
|||
|
|
case adInt: //有符号4字节类型
|
|||
|
|
return (float)(attr.value.nValue * m_AttrValues[nType].fValue);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case adUSmall://无符号1字节类型,无符号2字节类型
|
|||
|
|
case adUShort:
|
|||
|
|
case adUInt://无符号4字节类型
|
|||
|
|
return (float)(attr.value.uValue * m_AttrValues[nType].fValue);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case adFloat://单精度浮点类型值
|
|||
|
|
return (float)(attr.value.fValue * m_AttrValues[nType].fValue);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return 0.0;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取一个属性集的评分分数
|
|||
|
|
float GetAttrSetScore( CAttrCalc &attrCalc )
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
//GAMEATTR attr;
|
|||
|
|
float fScore =0.0; //分数
|
|||
|
|
for ( i=1; i<GameAttributeCount; ++i )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if( attrCalc.m_AttrValues[i].nValue !=0 )
|
|||
|
|
{
|
|||
|
|
switch(AttrDataTypes[i])
|
|||
|
|
{
|
|||
|
|
case adSmall://有符号1字节类型
|
|||
|
|
case adShort:
|
|||
|
|
case adInt: //有符号4字节类型
|
|||
|
|
fScore += fabs((float)(attrCalc.m_AttrValues[i].nValue * m_AttrValues[i].fValue));
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case adUSmall://无符号1字节类型,无符号2字节类型
|
|||
|
|
case adUShort:
|
|||
|
|
case adUInt://无符号4字节类型
|
|||
|
|
fScore += fabs((float)(attrCalc.m_AttrValues[i].uValue * m_AttrValues[i].fValue));
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case adFloat://单精度浮点类型值
|
|||
|
|
fScore += fabs((float)(attrCalc.m_AttrValues[i].fValue * m_AttrValues[i].fValue));
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return fScore;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
GAMEATTRVALUE m_AttrValues[GameAttributeCount]; //属性集定义
|
|||
|
|
CVector<AUXEVALVALUE> m_auxValue; //辅助的属性
|
|||
|
|
};
|