Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

187 lines
4.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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; //辅助的属性
};