Pol  Revision:cb584c9
uoskills.cpp
Go to the documentation of this file.
1 
7 #include "uoskills.h"
8 
9 #include <stddef.h>
10 
11 #include "../clib/cfgelem.h"
12 #include "../plib/pkg.h"
13 #include "globals/uvars.h"
14 #include "mobile/attribute.h"
15 #include "skillid.h"
16 
17 namespace Pol
18 {
19 namespace Core
20 {
21 const UOSkill& GetUOSkill( unsigned skillid )
22 {
23  if ( skillid < gamestate.uo_skills.size() )
24  return gamestate.uo_skills[skillid];
25  else
26  throw std::runtime_error( "Bad UO Skill ID" );
27 }
28 
30  : inited( true ),
31  skillid( strtoul( elem.rest(), nullptr, 10 ) ),
32  attributename( elem.remove_string( "Attribute", "" ) ),
33  pAttr( nullptr ),
34  pkg( pkg )
35 {
36  if ( skillid >= 500 )
37  elem.throw_error( "SkillID must be < 500" );
38 
39  if ( !attributename.empty() )
40  {
41  bool required = false;
42  if ( attributename[0] == '+' )
43  {
44  required = true;
45  attributename = attributename.substr( 1, std::string::npos );
46  }
48  if ( !pAttr )
49  {
50  if ( required )
51  {
52  elem.throw_error( "Attribute " + attributename + " not found." );
53  }
54  else
55  {
56  elem.warn( "Attribute " + attributename + " not found." );
57  }
58  }
59  }
60 }
62  : inited( false ), skillid( 0 ), attributename( "" ), pAttr( nullptr ), pkg( nullptr )
63 {
64 }
65 
66 size_t UOSkill::estimateSize() const
67 {
68  return sizeof( UOSkill ) + attributename.capacity();
69 }
70 
72 {
73  UOSkill uoskill( pkg, elem );
74 
75  if ( uoskill.skillid >= gamestate.uo_skills.size() )
76  gamestate.uo_skills.resize( uoskill.skillid + 1 );
77 
78  if ( gamestate.uo_skills[uoskill.skillid].inited )
79  {
80  elem.throw_error( "UOSkill " + fmt::FormatInt( uoskill.skillid ).str() +
81  " already defined by " + gamestate.uo_skills[uoskill.skillid].pkg->desc() );
82  }
83 
84  gamestate.uo_skills[uoskill.skillid] = uoskill;
85 }
86 
88 {
90  Plib::load_packaged_cfgs( "uoskills.cfg", "Skill", load_skill_entry );
91 }
92 
94 {
95  gamestate.uo_skills.clear();
96 }
97 } // namespace Core
98 } // namespace Pol
std::string attributename
Definition: uoskills.h:37
void load_packaged_cfgs(const char *cfgname, const char *taglist, void(*loadentry)(const Package *, Clib::ConfigElem &))
Definition: pkg.cpp:454
unsigned skillid
Definition: uoskills.h:36
const Mobile::Attribute * pAttr
Definition: uoskills.h:38
void load_skill_entry(const Plib::Package *pkg, Clib::ConfigElem &elem)
Definition: uoskills.cpp:71
void clean_skills()
Definition: uoskills.cpp:93
std::vector< UOSkill > uo_skills
Definition: uvars.h:239
void warn(const std::string &errmsg) const
Definition: cfgfile.cpp:298
const Plib::Package * pkg
Definition: uoskills.h:40
POL_NORETURN void throw_error(const std::string &errmsg) const
Definition: cfgfile.cpp:285
const UOSkill & GetUOSkill(unsigned skillid)
Definition: uoskills.cpp:21
GameState gamestate
Definition: uvars.cpp:74
size_t estimateSize() const
Definition: uoskills.cpp:66
void load_uoskills_cfg()
Definition: uoskills.cpp:87
Definition: berror.cpp:12
static Attribute * FindAttribute(const std::string &str)
Definition: attribute.cpp:22