// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "attack_id_sheet.h"
//
#include "nel/georges/u_form_elm.h"
//*****************************************************************************************
void CAttackIDSheet::build(const NLGEORGES::UFormElm &item, const std::string &prefix)
{
uint32 attackType = 0;
item.getValueByName(attackType, (prefix + "AttackType").c_str());
Type = (TType) attackType;
switch(Type)
{
case Melee:
// currently no additionnal infos for melee
break;
case Range:
{
std::string rangeWeaponType;
if (item.getValueByName(rangeWeaponType, (prefix + "RangeWeaponType").c_str()))
{
RangeWeaponType = RANGE_WEAPON_TYPE::stringToRangeWeaponType(rangeWeaponType);
}
}
break;
case Magic:
SpellInfo.build(item, prefix);
break;
case Creature:
item.getValueByName(CreatureAttackIndex, (prefix + "CreatureAttackIndex").c_str());
break;
case DamageShield:
item.getValueByName(DamageShieldType, (prefix + "DamageShieldType").c_str());
break;
default:
nlwarning("Bad attack type");
break;
}
}
//*****************************************************************************************
void CAttackIDSheet::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
f.serialEnum(Type);
switch(Type)
{
case Melee:
// currently no additionnal infos for melee
break;
case Range:
f.serialEnum(RangeWeaponType);
break;
case Magic:
f.serial(SpellInfo);
break;
case Creature:
f.serial(CreatureAttackIndex);
break;
case DamageShield:
f.serial(DamageShieldType);
break;
default:
nlwarning("Bad attack type");
break;
}
}
//*****************************************************************************************
void CAttackIDSheet::CSpellInfo::build(const NLGEORGES::UFormElm &item, const std::string &prefix)
{
uint32 spellID = 0;
item.getValueByName(spellID, (prefix + ".SpellID").c_str());
ID = (MAGICFX::TMagicFx) spellID;
uint32 spellMode = 0;
item.getValueByName(spellMode, (prefix + ".SpellMode").c_str());
Mode = (MAGICFX::TSpellMode) spellMode;
}
//*****************************************************************************************
void CAttackIDSheet::CSpellInfo::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
f.serialEnum(Mode);
f.serialEnum(ID);
}
//*****************************************************************************************
bool operator == (const CAttackIDSheet &lhs, const CAttackIDSheet &rhs)
{
if (lhs.Type != rhs.Type) return false;
switch(lhs.Type)
{
case CAttackIDSheet::Melee: return true;
case CAttackIDSheet::Range: return lhs.RangeWeaponType == rhs.RangeWeaponType;
case CAttackIDSheet::Magic: return lhs.SpellInfo == rhs.SpellInfo;
case CAttackIDSheet::Creature: return lhs.CreatureAttackIndex == rhs.CreatureAttackIndex;
case CAttackIDSheet::DamageShield: return lhs.DamageShieldType == rhs.DamageShieldType;
default: return false;
}
}
//*****************************************************************************************
bool operator < (const CAttackIDSheet &lhs, const CAttackIDSheet &rhs)
{
if (lhs.Type != rhs.Type) return lhs.Type < rhs.Type;
switch(lhs.Type)
{
case CAttackIDSheet::Melee: return false;
case CAttackIDSheet::Range: return lhs.RangeWeaponType < rhs.RangeWeaponType;
case CAttackIDSheet::Magic: return lhs.SpellInfo < rhs.SpellInfo;
case CAttackIDSheet::Creature: return lhs.CreatureAttackIndex < rhs.CreatureAttackIndex;
case CAttackIDSheet::DamageShield: return lhs.DamageShieldType < rhs.DamageShieldType;
default: return false;
}
}
//*****************************************************************************************
bool operator == (const CAttackIDSheet::CSpellInfo &lhs, const CAttackIDSheet::CSpellInfo &rhs)
{
return lhs.Mode == rhs.Mode && lhs.ID == rhs.ID;
}
//*****************************************************************************************
bool operator < (const CAttackIDSheet::CSpellInfo &lhs, const CAttackIDSheet::CSpellInfo &rhs)
{
if (lhs.Mode != rhs.Mode) return lhs.Mode < rhs.Mode;
if (lhs.ID != rhs.ID) return lhs.ID < rhs.ID;
return false;
}