Загоняем монстров в XML

А вернее изгоняем из исходного кода, в принципе "изгоняем монстров из исходного кода" звучит более брутально, да?
На текущий момент у нас есть следующие структурки:

TCreatureParams basicCreatureParams[TP_CREATURE_LAST + 1]=
{
{10,10,10,10,-1}, //human
{5,20,10, 0,-1}, //spider
};
char *creaturesNames[TP_CREATURE_LAST + 1] = {"","Паук-мохнач"};

а также кусок кода при вызова action = get_info (там char *nick = new char[ strlen(creaturesNames[c->Type])*6];URLencoding( convertToUtf8(creaturesNames[c->Type],strlen(creaturesNames[c->Type])).c_str(), nick);)
и две функции в formuls.cpp, это int getTypeAttack(TMazeCreature *from,TMazeCreature *to)
и int getDamageCreature(TMazeCreature *c,int type_attack);

Скорее всего их придется переписать.

Итак начнем.

Для загрузки данных используем собственую разработку TDomTag

Код и синтаксис может не совсем оптимальный, но разные дОмы явно курят в сторонке, однако есть и похожие решения не скажу что это плагиат (тем более не скажу что решения я где-то спер) но хорошии идея приходят в головы сразу нескольким умным людям.
P.S.
Тут и далее, самопиар пронспонсированый чудным разливным пивом Harbult

Шаг первый грузим xml файлик в переменную (загружаем все содержимое в переменную типа std:string>.

#ifdef _WIN32
sprintf(buffer,"%s\\share\\xml\\attacks.xml",config.server_base_dir);
#else
sprintf(buffer,"%s/share/xml/attacks.xml",config.server_base_dir);
#endif
string xml_str;
XMLLoadFromFile(buffer,&xml_str);

Далее "хитрый" ход:
TDomTag *attackDom = XML2DOM(xml_str.c_str();

И придуманая структурки:

typedef struct
{
int id;
string name,rem;
int min,max;
} TAttackType;

vector<TAttackType> attackTypeList;

typedef struct
{
int type;
string name;
TCreatureParams params;
vector<int> attacks;
} TCreatureType;

vector <TCreatureType> creatureTypeList;

Далее - загрузка...
for(int i=0;i<attackDom->Count;i++)
{
TDomTag *b = attackDom->branch[i];
TAttackType a;
a.rem = b->Branch("name")->Char();
a.name = b->name();
a.id = i+1;
a.min = b->Branch("min")->Integer();
a.max = b->Branch("max")->Integer();
attackTypeList.push_back(a);
}

Грузим собственно монстров:
#ifdef _WIN32
sprintf(buffer,"%s\\share\\xml\\creatures.xml",config.server_base_dir);
#else
sprintf(buffer,"%s/share/xml/creatures.xml",config.server_base_dir);
#endif
XMLLoadFromFile(buffer,&xml_str);

Перефразируя одного моего знакомого - до сюда все также...
TDomTag *creaturesDom = XML2DOM(xml_str.c_str();
for(int i=0;i<creaturesDom->Count;i++) {
TDomTag *b = creaturesDom->branch[i];
TCreatureType c;
c.type = b->Branch("type")->Integer();
c.name = b->Branch("name")->Char();
c.params.Stamina = b->Branch("Stamina")->Integer();
c.params.Strength = b->Branch("Strength")->Integer();
c.params.Dexterity = b->Branch("Dexterity")->Integer();
c.params.Intellect = b->Branch("Intellect")->Integer();
for(int j=0;jCount;i++)
{
for(int k=0;k<attackTypeList.size();k++)
if ( attackTypeList[k].name == string(b->Branch("attack")->branch[j]->Branch("type")->Char()))
{
c.attacks.push_back( a.id);
break;
}

}
creatureTypeList.push_back(c);

Complete is done :)
Теперь перепись....
Ах-да все эти функции кидаем в forumls.cpp(быть может потом в loader.cpp которого пока нет)

Получение названия (типа) существа:
string getTypeNameCreature(int type)
{
for(int i=0;i<creatureTypeList.size();i++)
if (creatureTypeList[i].type == type) return creatureTypeList[i].name;
return "";
}

Функция получения базового типа атаки getTypeAttack(TMazeCreature *from,TMazeCreature *to), пока без заморочек (предполагается что существо в состоянии выбрать "правильный" удар, против другого существа)
int getTypeAttack(TMazeCreature *from,TMazeCreature *to)
{
for(int i=0;i<creatureTypeList.size();i++)
if (creatureTypeList[i].type == from->Type)
{
if (creatureTypeList[i].attacks.size()) return creatureTypeList[i].attacks[0];
else return 0;
}

return 0;
}

Ну и частично переписываем getDamageCreature
А именно определение урона по типу атаки:

float k_min_weapon=1.0,k_max_weapon=1.0;
for(int i=0;i<attackTypeList.size();i++)
if (attackTypeList[i].id == type_attack)
{
k_min_weapon = attackTypeList[i].min;
k_max_weapon = attackTypeList[i].max;
break;
}

Вот вроде и все.