// 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 .
#ifndef RY_SBRICK_SHEET_H
#define RY_SBRICK_SHEET_H
#include "client_sheets.h"
#include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h"
#include "game_share/brick_types.h"
#include "game_share/skills.h"
#include "game_share/brick_families.h"
#include "game_share/rm_family.h"
#include "game_share/crafting_tool_type.h"
#include "entity_sheet.h"
#include "game_share/action_nature.h"
#include "game_share/people.h"
#include "game_share/fame.h"
#include "game_share/resistance_type.h"
// ***************************************************************************
#define SBRICK_MAX_MANDATORY 12
#define SBRICK_MAX_OPTIONAL 32
#define SBRICK_MAX_PARAMETER 4
#define SBRICK_MAX_CREDIT 12
// ***************************************************************************
// The max number of different MP required for a faber sentence. This applies for ItemPart MPs, and Formula MPs
#define MAX_FABER_REQ_MP 5
// ***************************************************************************
/**
* New Sabrina Brick Sheet def.
* \author Lionel Berenguier
* \author Nevrax France
* \date 2003
*/
class CSBrickSheet : public CEntitySheet
{
public:
// MaxProperties in Sheet
enum {MaxProperties= 20};
// A property of a brick
struct CProperty
{
// The whole param in georges.
std::string Text;
// translated at runTime with CSBrickManager to PropId/Value (not serialised)
uint PropId;
float Value;
float Value2;
CProperty()
{
PropId=0;
Value= 0.f;
Value2=0.f;
}
void serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
f.serial(Text);
}
};
// The Faber plan For Craft mandatories.
struct CFaberPlan
{
CFaberPlan()
{
NbItemBuilt= 0;
ToolType = TOOL_TYPE::Unknown;
}
// ItemPartMP: a request for MPs that can build required item part
struct CItemPartMP
{
// If a filter is Unknown, then all Mps matchs
RM_FABER_TYPE::TRMFType FaberTypeFilter;
uint32 Quantity;
CItemPartMP()
{
FaberTypeFilter = RM_FABER_TYPE::Unknown;
Quantity = 0;
}
void serial (NLMISC::IStream &s) throw(NLMISC::EStream)
{
s.serialEnum(FaberTypeFilter);
s.serial(Quantity);
}
};
// FormulaMP: a specific MP (or can be any item) that the faber requires in addition to CItemPartMPs
struct CFormulaMP
{
NLMISC::CSheetId ItemRequired;
uint32 Quantity;
void serial (NLMISC::IStream &s) throw(NLMISC::EStream)
{
s.serial(ItemRequired);
s.serial(Quantity);
}
CFormulaMP()
{
Quantity = 0;
}
};
// Faber
NLMISC::CSheetId ItemBuilt;
std::vector ItemPartMps;
std::vector FormulaMps;
TOOL_TYPE::TCraftingToolType ToolType;
uint32 NbItemBuilt;
void serial (NLMISC::IStream &s) throw(NLMISC::EStream)
{
s.serial(ItemBuilt);
s.serialCont(ItemPartMps);
s.serialCont(FormulaMps);
s.serialEnum(ToolType);
s.serial(NbItemBuilt);
}
};
// a serializable Skill (special for serial)
class CSkillSerial
{
public:
SKILLS::ESkills Skill;
void serial(NLMISC::IStream &f)
{
f.serialEnum(Skill);
};
CSkillSerial() : Skill(SKILLS::unknown) {}
CSkillSerial(SKILLS::ESkills e) : Skill(e) {}
CSkillSerial &operator=(SKILLS::ESkills e)
{
Skill= e;
return *this;
}
operator SKILLS::ESkills() const {return Skill;}
};
// For progression
class CSkillValue
{
public:
SKILLS::ESkills Skill;
uint32 Value;
CSkillValue()
{
Skill = SKILLS::unknown;
Value = 0;
}
void serial(NLMISC::IStream &f)
{
f.serialEnum(Skill);
f.serial(Value);
}
};
public:
// For Combat only, this array may be >1. One of the skills match for combat
// guaranteed to be at least of size 1, with Unknown skill
std::vector UsedSkills;
BRICK_FAMILIES::TBrickFamily BrickFamily;
uint8 IndexInFamily;
uint8 Level;
NLMISC::TSStringId IdIcon;
NLMISC::TSStringId IdIconBack;
NLMISC::TSStringId IdIconOver;
NLMISC::TSStringId IdIconOver2;
NLMISC::CRGBA IconColor;
NLMISC::CRGBA IconBackColor;
NLMISC::CRGBA IconOverColor;
NLMISC::CRGBA IconOver2Color;
sint32 SabrinaCost;
float SabrinaRelativeCost;
// Brick Properties
std::vector Properties;
std::vector MandatoryFamilies;
std::vector OptionalFamilies;
std::vector ParameterFamilies;
std::vector CreditFamilies;
// Forbidden Brick KeyWords.
NLMISC::TSStringId IdForbiddenDef;
NLMISC::TSStringId IdForbiddenExclude;
// The Faber Repair/Refine/Create plan
CFaberPlan FaberPlan;
/// Min/Max Casting Time (1/10sec), and range
uint8 MinCastTime;
uint8 MaxCastTime;
/// Min/Max Range (in meters)
uint8 MinRange;
uint8 MaxRange;
// Brick flags required (0 by default)
uint64 BrickRequiredFlags;
// The SkillPoint Cost
uint32 SPCost;
// The Action Nature
ACTNATURE::TActionNature ActionNature;
// For Progression, the required skill
std::vector RequiredSkills;
// For Progression, the required Bricks
std::vector RequiredBricks;
// true if a phrase containing this brick can be cyclic
bool AvoidCyclic;
// if true this brick can't be used when no item in hands
bool UsableWithEmptyHands;
// Brick civilisation restriction
EGSPD::CPeople::TPeople CivRestriction;
// faction to check if min fame value != 0
uint32 FactionIndex;
// min fame value to learn this brick
sint32 MinFameValue;
// Magic Only: The Domain of this spell (ie The resistance type)
RESISTANCE_TYPE::TResistanceType MagicResistType;
public:
// true if the brick is a Root, according to BrickFamily
bool isRoot() const;
// true if the brick is a Credit, according to BrickFamily
bool isCredit() const;
// true if the brick is a Mandatory, according to BrickFamily
bool isMandatory() const;
// true if the brick is a Optional, according to BrickFamily
bool isOptional() const;
// true if the brick is a Parameter, according to BrickFamily
bool isParameter() const;
// return the brick type, according to BrickFamily
BRICK_TYPE::EBrickType getBrickType() const {return BRICK_FAMILIES::brickType(BrickFamily);}
// true if the brick is Combat Brick, according to BrickFamily
bool isCombat() const;
// true if the brick is Magic Brick, according to BrickFamily
bool isMagic() const;
// true if the brick is Faber Brick, according to BrickFamily
bool isFaber() const;
// true if the brick is Harvest Brick, according to BrickFamily
bool isHarvest() const;
// true if the brick is Forage Prospection Brick, according to BrickFamily
bool isForageProspection() const;
// true if the brick is Forage Extraction Brick, according to BrickFamily
bool isForageExtraction() const;
// true if the brick is SpecialPower Brick, according to BrickFamily
bool isSpecialPower() const;
// true if the brick is Enchantment Brick, according to BrickFamily
bool isProcEnchantment() const;
// true if must display the level index
bool mustDisplayLevel() const;
public:
CSBrickSheet ()
{
UsedSkills.push_back(SKILLS::unknown);
Type = SBRICK;
BrickFamily = BRICK_FAMILIES::Unknown;
IndexInFamily = 0;
Level = 0;
IdIcon = 0;
IdIconBack = 0;
IdIconOver = 0;
IdIconOver2 =0;
IconColor= NLMISC::CRGBA::White;
IconBackColor= NLMISC::CRGBA::White;
IconOverColor= NLMISC::CRGBA::White;
IconOver2Color= NLMISC::CRGBA::White;
SabrinaCost= 0;
SabrinaRelativeCost = 0.0f;
IdForbiddenDef = 0;
IdForbiddenExclude = 0;
MinCastTime= 10;
MaxCastTime= 100;
MinRange= 1;
MaxRange= 10;
BrickRequiredFlags= 0;
SPCost= 0;
AvoidCyclic= false;
UsableWithEmptyHands = true;
FactionIndex = CStaticFames::INVALID_FACTION_INDEX;
MinFameValue = NO_FAME;
ActionNature= ACTNATURE::UNKNOWN;
CivRestriction= EGSPD::CPeople::Common;
MagicResistType= RESISTANCE_TYPE::None;
}
std::string getIcon() const { return ClientSheetsStrings.get(IdIcon); }
std::string getIconBack() const { return ClientSheetsStrings.get(IdIconBack); }
std::string getIconOver() const { return ClientSheetsStrings.get(IdIconOver); }
std::string getIconOver2() const { return ClientSheetsStrings.get(IdIconOver2); }
std::string getForbiddenDef() const { return ClientSheetsStrings.get(IdForbiddenDef); }
std::string getForbiddenExclude() const { return ClientSheetsStrings.get(IdForbiddenExclude); }
// Works For all brick but combat. combat may have more than one Skill
SKILLS::ESkills getSkill() const {return UsedSkills[0];}
// Georges Std build implementation
virtual void build (const NLGEORGES::UFormElm &root);
virtual void serial (NLMISC::IStream &s) throw(NLMISC::EStream)
{
std::string sTmp;
s.serialCont(UsedSkills);
s.serialEnum(BrickFamily);
s.serial (IndexInFamily);
s.serial (Level);
s.serial (sTmp);
ClientSheetsStrings.serial(s, IdIcon);
ClientSheetsStrings.serial(s, IdIconBack);
ClientSheetsStrings.serial(s, IdIconOver);
ClientSheetsStrings.serial(s, IdIconOver2);
s.serial (IconColor);
s.serial (IconBackColor);
s.serial (IconOverColor);
s.serial (IconOver2Color);
s.serial (SabrinaCost);
s.serial (SabrinaRelativeCost);
s.serialCont (MandatoryFamilies);
s.serialCont (OptionalFamilies);
s.serialCont (ParameterFamilies);
s.serialCont (CreditFamilies);
ClientSheetsStrings.serial(s, IdForbiddenDef);
ClientSheetsStrings.serial(s, IdForbiddenExclude);
s.serial (FaberPlan);
s.serialCont(Properties);
s.serial(MinCastTime);
s.serial(MaxCastTime);
s.serial(MinRange);
s.serial(MaxRange);
s.serial(BrickRequiredFlags);
s.serial(SPCost);
s.serialEnum(ActionNature);
s.serialCont(RequiredSkills);
s.serialCont(RequiredBricks);
s.serial(AvoidCyclic);
s.serial(UsableWithEmptyHands);
s.serialEnum(CivRestriction);
s.serial(FactionIndex);
s.serial(MinFameValue);
s.serialEnum(MagicResistType);
}
};
#endif // NL_SBRICK_SHEET_H
/* End of sbrick_sheet.h */