虽然现在很多游戏都用上手动战斗了,但还是想分享一下之前做过的回合制游戏的战斗数据写法。不同游戏战斗有不同的写法,数据上的需求也会有些差异,下面这个回合制战斗数据包当是借鉴,它满足很多的战斗需求比如:多场战斗连在一起打,合击,群攻,消除buffer,反击等等。
typedef uint8_t CellId;
typedef uint16_t CardId;
typedef uint16_t CAttr;
typedef uint16_t SkillId;
typedef uint16_t BufferId;
typedef uint16_t ComId;
typedef json::value JsonValue;
typedef ByteData ByteValue;
namespace GameBattle
{
struct BackAttack //反击技能被攻击对象
{
CellId cellId; //被攻击对象的站位
bool isAvoid; //是否闪避
CAttr hp; //血量值变化
CAttr energy; //能量值变化
BackAttack();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct ActionObject //作用的对象
{
CellId cellId; //被作用的对象站位
bool isAvoid; //是否闪避
CAttr hp; //血量值变化
CAttr energy; //能量值变化
ComId comId; //可以是技能也可以是bufferId
vector<BackAttack> backAttacks; //反击技能对象
vector<BufferId> deleteBuffers; //消除的buffer
ActionObject();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct SubAttack
{
CellId cellId; //攻击对象站位
bool isCrit; //是否暴击
SkillId skillId; //释放的技能ID
CAttr costEnergy; //释放技能消耗的能量
vector<ActionObject> objs; //作用的对象集合
SubAttack();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct OneAttack
{
vector<SubAttack> attacks; //攻击集合
OneAttack();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct BufferObject
{
CellId cellId; //作用的站位对象
BufferId bufferId; //bufferId
CAttr hp; //变化的血量值
CAttr energy; //变化的能量值
BufferObject();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct OneRound
{
vector<BufferObject> buffers; //每回合初始时的buffer效果
vector<OneAttack> attacks; //每次攻击集合
OneRound();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct BattleCell
{
CellId cellId; //站位ID
CardId cardId; //卡牌ID
CAttr curHp; //当前血量
CAttr maxHp; //最大血量
CAttr curEnergy; //当前能量值
CAttr maxEnergy; //最大能量值
BattleCell();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct OneBattle
{
PlayerId winner; //赢者ID
PlayerId atkId; //攻击者ID
PlayerId atkedId;//被攻击者ID
vector<BattleCell> lineup; //阵型
vector<BufferObject> recovers;//每场战斗后的能量和血量加成效果
vector<OneRound> rounds;//战斗回合集合
OneBattle();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
struct BattleResult
{
string battleId; //每场战斗ID
vector<OneBattle> battles; //每场战斗集合
BattleResult();
void convertToJson(JsonValue& val) const;
void convertFromJson(const JsonValue& val);
void Serialize(ByteValue& val) const;
void DeSerialize(const ByteValue& val);
};
}