// 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 "item_fx_sheet.h"
#include "nel/georges/u_form_elm.h"
//*******************************************************************************************
CItemFXSheet::CItemFXSheet()
{
_Trail = 0;
TrailMinSliceTime = 0.05f;
TrailMaxSliceTime = 0.05f;
ImpactFXDelay = 0.f;
_AdvantageFX = 0;
_AttackFX = 0;
AttackFXRot.set(0.f, 0.f, 0.f);
}
//*******************************************************************************************
void CItemFXSheet::build(const NLGEORGES::UFormElm &item, const std::string &prefix)
{
std::string trail;
item.getValueByName(trail, (prefix + "Trail").c_str());
_Trail = ClientSheetsStrings.add(trail);
item.getValueByName(TrailMinSliceTime, (prefix + "TrailMinSliceTime").c_str());
item.getValueByName(TrailMaxSliceTime, (prefix + "TrailMaxSliceTime").c_str());
std::string advantageFX;
item.getValueByName(advantageFX, (prefix + "AdvantageFX").c_str());
_AdvantageFX = ClientSheetsStrings.add(advantageFX);
std::string attackFX;
item.getValueByName(attackFX, (prefix + "AttackFX").c_str());
_AttackFX = ClientSheetsStrings.add(attackFX);
item.getValueByName(AttackFXOffset.x, (prefix + "AttackFXOffset.X").c_str());
item.getValueByName(AttackFXOffset.y, (prefix + "AttackFXOffset.Y").c_str());
item.getValueByName(AttackFXOffset.z, (prefix + "AttackFXOffset.Z").c_str());
item.getValueByName(AttackFXRot.x, (prefix + "AttackFXRot.X").c_str());
item.getValueByName(AttackFXRot.y, (prefix + "AttackFXRot.Y").c_str());
item.getValueByName(AttackFXRot.z, (prefix + "AttackFXRot.Z").c_str());
item.getValueByName(ImpactFXDelay, (prefix + "ImpactFXDelay").c_str());
const NLGEORGES::UFormElm *array = NULL;
if (item.getNodeByName(&array, (prefix + "StaticFXs").c_str()) && array)
{
uint count;
nlverify(array->getArraySize(count));
_StaticFXs.reserve(count);
for(uint k = 0; k < count; ++k)
{
const NLGEORGES::UFormElm *node;
if (array->getArrayNode(&node, k))
{
CStaticFX fx;
fx.build(*node);
_StaticFXs.push_back(fx);
}
}
}
}
//*******************************************************************************************
void CItemFXSheet::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
f.serial(TrailMinSliceTime);
f.serial(TrailMaxSliceTime);
f.serial(AttackFXOffset);
ClientSheetsStrings.serial(f, _Trail);
ClientSheetsStrings.serial(f, _AdvantageFX);
ClientSheetsStrings.serial(f, _AttackFX);
f.serial(AttackFXRot);
f.serial(ImpactFXDelay);
f.serialCont(_StaticFXs);
}
//*******************************************************************************************
const char *CItemFXSheet::getTrail() const
{
return _Trail ? ClientSheetsStrings.get(_Trail) : "";
}
//*******************************************************************************************
const char *CItemFXSheet::getAdvantageFX() const
{
return _AdvantageFX ? ClientSheetsStrings.get(_AdvantageFX) : "";
}
//*******************************************************************************************
const char *CItemFXSheet::getAttackFX() const
{
return _AttackFX ? ClientSheetsStrings.get(_AttackFX) : "";
}
//*******************************************************************************************
void CItemFXSheet::CStaticFX::build(const NLGEORGES::UFormElm &item)
{
std::string name;
std::string bone;
item.getValueByName(name, "Name");
item.getValueByName(bone, "Bone");
Name = ClientSheetsStrings.add(name);
Bone = ClientSheetsStrings.add(bone);
item.getValueByName(Offset.x, "OffsetX");
item.getValueByName(Offset.y, "OffsetY");
item.getValueByName(Offset.z, "OffsetZ");
}
//*******************************************************************************************
void CItemFXSheet::CStaticFX::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
ClientSheetsStrings.serial(f, Name);
ClientSheetsStrings.serial(f, Bone);
f.serial(Offset);
}
//*******************************************************************************************
const char *CItemFXSheet::getStaticFXName(uint index) const
{
nlassert(index < _StaticFXs.size());
return _StaticFXs[index].Name ? ClientSheetsStrings.get(_StaticFXs[index].Name) : "";
}
//*******************************************************************************************
const char *CItemFXSheet::getStaticFXBone(uint index) const
{
nlassert(index < _StaticFXs.size());
return _StaticFXs[index].Bone ? ClientSheetsStrings.get(_StaticFXs[index].Bone) : "";
}
//*******************************************************************************************
const NLMISC::CVector &CItemFXSheet::getStaticFXOffset(uint index) const
{
nlassert(index < _StaticFXs.size());
return _StaticFXs[index].Offset;
}