khanat-opennel-code/code/ryzom/client/src/client_sheets/player_sheet.cpp
2010-05-06 02:08:41 +02:00

248 lines
7.7 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// 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 <http://www.gnu.org/licenses/>.
/////////////
// INCLUDE //
/////////////
#include "stdpch.h" // First include for pre-compiled headers.
// Georges
#include "nel/georges/u_form_elm.h"
// Client.
#include "player_sheet.h"
// Game share
#include "game_share/skills.h"
#include "game_share/skills_build.h"
///////////
// USING //
///////////
using namespace NLGEORGES;
using namespace std;
/////////////
// METHODS //
/////////////
//-----------------------------------------------
// CPlayerSheet :
// Constructor.
//-----------------------------------------------
CPlayerSheet::CPlayerSheet()
{
CharacterScalePos= 1;
Gender=0;
// Initialize the type.
Type = CEntitySheet::CHAR;
}// CPlayerSheet //
//-----------------------------------------------
// build :
// Build the sheet from an external script.
//-----------------------------------------------
void CPlayerSheet::build(const NLGEORGES::UFormElm &item)
{
// Initialize the scale.
Scale = 1.f;
// Player Gender.
if(!item.getValueByName(Gender, "Gender"))
debug("Key 'Gender' not found.");
// Get the skel.
if(!item.getValueByName(SkelFilename, "Skel"))
debug("Key 'Skel' not found.");
// Load the Animation Set Base Name.
if(!item.getValueByName(AnimSetBaseName, "AnimSetBaseName"))
debug("Key 'AnimSetBaseName' not found.");
// Force the CASE in UPPER to not be CASE SENSITIVE.
else
NLMISC::strlwr(AnimSetBaseName);
// Load Lod character name
if(!item.getValueByName(LodCharacterName, "LodCharacterName"))
debug("Key 'LodCharacterName' not found.");
// Load Lod character apparition distance
if(!item.getValueByName(LodCharacterDistance, "LodCharacterDistance"))
debug("Key 'LodCharacterDistance' not found.");
// Get the people of the player.
string people;
if(!item.getValueByName(people, "Peuple"))
{
debug("Key 'Peuple' not found.");
People = EGSPD::CPeople::EndPeople;
}
else
People = EGSPD::CPeople::fromString(people);
// Get the Default Player Face filename.
if(!item.getValueByName(DefaultFace, "DefaultFace"))
debug("Key 'DefaultFace' not found.");
// Get the Default Player Chest filename.
if(!item.getValueByName(DefaultChest, "DefaultChest"))
debug("Key 'DefaultChest' not found.");
// Get the Default Player Legs filename.
if(!item.getValueByName(DefaultLegs, "DefaultLegs"))
debug("Key 'DefaultLegs' not found.");
// Get the Default Player Arms filename.
if(!item.getValueByName(DefaultArms, "DefaultArms"))
debug("Key 'DefaultArms' not found.");
// Get the Default Player Hands filename.
if(!item.getValueByName(DefaultHands, "DefaultHands"))
debug("Key 'DefaultHands' not found.");
// Get the Default Player Feet filename.
if(!item.getValueByName(DefaultFeet, "DefaultFeet"))
debug("Key 'DefaultFeet' not found.");
// Get the Default Player Hair filename.
if(!item.getValueByName(DefaultHair, "DefaultHair"))
debug("Key 'DefaultHair' not found.");
// get carac
if(!item.getValueByName(DefaultHair, "DefaultHair"))
debug("Key 'DefaultHair' not found.");
// NB: lod colors are given with panoply colors for players
// value to scale the "pos" channel of the animation of the player.
if(!item.getValueByName(CharacterScalePos, "CharacterScalePos"))
debug("Key 'CharacterScalePos' not found.");
#define PLAYER_SHEET_EQUIP "Basics.Equipment."
Body.build(PLAYER_SHEET_EQUIP "Body", item);
Legs.build(PLAYER_SHEET_EQUIP "Legs", item);
Arms.build(PLAYER_SHEET_EQUIP "Arms", item);
Hands.build(PLAYER_SHEET_EQUIP "Hands", item);
Feet.build(PLAYER_SHEET_EQUIP "Feet", item);
Head.build(PLAYER_SHEET_EQUIP "Head", item);
Face.build(PLAYER_SHEET_EQUIP "Face", item);
ObjectInRightHand.build(PLAYER_SHEET_EQUIP "ObjectInRightHand", item);
ObjectInLeftHand.build(PLAYER_SHEET_EQUIP "ObjectInLeftHand", item);
Headdress.build(PLAYER_SHEET_EQUIP "Headdress", item);
EarL.build(PLAYER_SHEET_EQUIP "EarL", item);
EarR.build(PLAYER_SHEET_EQUIP "EarR", item);
Neck.build(PLAYER_SHEET_EQUIP "Neck", item);
Shoulders.build(PLAYER_SHEET_EQUIP "Shoulders", item);
Back.build(PLAYER_SHEET_EQUIP "Back", item);
WristL.build(PLAYER_SHEET_EQUIP "WristL", item);
WristR.build(PLAYER_SHEET_EQUIP "WristR", item);
FingerL.build(PLAYER_SHEET_EQUIP "FingerL", item);
FingerR.build(PLAYER_SHEET_EQUIP "FingerR", item);
AnkleR.build(PLAYER_SHEET_EQUIP "AnkleR", item);
AnkleL.build(PLAYER_SHEET_EQUIP "AnkleL", item);
Ammo.build(PLAYER_SHEET_EQUIP "Ammo", item);
// build charac
buildCharac(item);
// load skills
loadSkillsSummaryFromSheet(item, "Basics.", Skills);
}// build //
//-----------------------------------------------
void CPlayerSheet::buildCharac(const NLGEORGES::UFormElm &item)
{
static const char characsBasePath[] = "Basics.Characteristics.";
for(uint k = 0; k < CHARACTERISTICS::NUM_CHARACTERISTICS; ++k)
{
const std::string &characName = CHARACTERISTICS::toString((CHARACTERISTICS::TCharacteristics)k);
std::string characPath = characsBasePath + characName;
if(!item.getValueByName(Characteristics[k], characPath.c_str()))
{
debug("Key " + characName + "not found.");
Characteristics[k] = 0;
}
}
}
//-----------------------------------------------
// serial :
// Serialize player sheet into binary data file.
//-----------------------------------------------
void CPlayerSheet::serial(class NLMISC::IStream &f) throw(NLMISC::EStream)
{
// Serialize class components.
f.serial(SkelFilename);
f.serial(AnimSetBaseName);
f.serial(Scale);
f.serial(LodCharacterName);
f.serial(LodCharacterDistance);
f.serial(CharacterScalePos);
f.serialEnum(People);
f.serial(DefaultFace);
f.serial(DefaultChest);
f.serial(DefaultLegs);
f.serial(DefaultArms);
f.serial(DefaultHands);
f.serial(DefaultFeet);
f.serial(DefaultHair);
f.serial(Gender);
// equipment
f.serial(Body);
f.serial(Legs);
f.serial(Arms);
f.serial(Hands);
f.serial(Feet);
f.serial(Head);
f.serial(Face);
f.serial(ObjectInRightHand);
f.serial(ObjectInLeftHand);
f.serial(Headdress);
f.serial(EarL);
f.serial(EarR);
f.serial(Neck);
f.serial(Shoulders);
f.serial(Back);
f.serial(WristL);
f.serial(WristR);
f.serial(FingerL);
f.serial(FingerR);
f.serial(AnkleL);
f.serial(AnkleR);
f.serial(Ammo);
for(uint k = 0; k < CHARACTERISTICS::NUM_CHARACTERISTICS; ++k)
{
f.serial(Characteristics[k]);
}
f.serialCont(Skills);
}// serial //
//=========================================================================================
void CPlayerSheet::CEquipment::build(const std::string &key,const NLGEORGES::UFormElm &item)
{
// Get the item (or shape) name.
string itemName;
if(!item.getValueByName(itemName, string(key + ".Item").c_str() ))
debug(NLMISC::toString("Key '%s.Item' not found.", key.c_str()));
else
Item = NLMISC::strlwr(itemName);
// Get the color.
if(!item.getValueByName(Color, string(key + ".Color").c_str() ))
debug(NLMISC::toString("Key '%s.Color' not found.", key.c_str()));
}