da mettere in config.h (dove vuoi ma mettilo bene)
C++:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
extern boost::unordered_map <int,int> g_map_level_cap_by_map;
#endif
da mettere in config.cpp (occhio alle indicazione della posizione in cui mettere le line)
C++:
//alle prime righe del file , magari alla fine degli include
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
boost::unordered_map <int,int> g_map_level_cap_by_map;
#endif
//cerca questo punto del codice e modificalo in questo modo
//ps , spero che sia cosi anche da te... io uso i file martysama
//il metodo in cui trovi questo codice si chiama config_init
// LOCALE_SERVICE
LocaleService_LoadLocaleStringFile();
LocaleService_TransferDefaultSetting();
LocaleService_LoadEmpireTextConvertTables();
// END_OF_LOCALE_SERVICE
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
if(!LoadLevelCapToExpIntoMap())
exit(1);
#endif
std::string st_cmdFileName("CMD");
//questa parte puoi mettera dove vuoi (non in mezzo a altri metodi però..) anche a fine file va bene
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
static bool LoadLevelCapToExpIntoMap()
{
const char* clevelCapFilename = "locale/germany/map/map_level_cap.conf";
FILE* pFile = fopen(clevelCapFilename,"r");
if(!pFile)
{
fprinf(stderr, "CAN NOT FIND FILE [%s]\n",clevelCapFilename);
return false;
}
char buffer[100] = "\0";
char szMapIndex[20] = "\0";
char szLevelCap[20] = "\0";
int iLine = 0;
while(fgets(buffer,sizeof(buffer),pFile))
{
iLine++;
two_arguments(buffer , szMapIndex , sizeof(szMapIndex) , szLevelCap,sizeof(szLevelCap));
if(szMapIndex[0] == '\0' || szLevelCap[0] == '\0')
{
fprintf(stderr, "Error during file loading [%s] at line [%d]!!\n",clevelCapFilename,iLine);
fclose(pFile);
return false;
}
else
{
int iMapIndex =0 , iLevelCap = 0;
str_to_number(iMapIndex,szMapIndex);
str_to_number(iLevelCap,szLevelCap);
g_map_level_cap_by_map.insert(std::make_pair(iMapIndex,iLevelCap));
}
}
fprintf(stdout,"LOAD LEVEL CAP MAP CONFIG :: COUNT OF CAP [%d]\n",g_map_level_cap_by_map.size());
return true;
}
#endif
da mettere in char_manager.h
dove ti pare basta che sia nella classe CHARACTER_MANAGER sotto public member
Codice:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
bool IsTheRightLevelForExp( LPCHARACTER ch );
#endif
da mettere in char_manager.cpp
anche questo dove vuoi (ma non nel bel mezzo di un altro metodo) anche se io per questione di ordine lo metterei tra un metodo e un altro della classe CHARACTER_MANAGER , ma in ogni caso anche a fine file andrà bene...
C++:
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
bool CHARACTER_MANAGER::IsTheRightLevelForExp( LPCHARACTER ch )
{
if(!ch)
return false;
itertype(g_map_level_cap_by_map) it = g_map_level_cap_by_map.find(ch->GetMapIndex());
if(g_map_level_cap_by_map.end() == it)
return true;
return (it->second >= ch->GetLevel());
}
#endif
infine... in char_battle.cpp trovi il metodo
C++:
static void GiveExp(LPCHARACTER from, LPCHARACTER to, int iExp)
subito dopo (all'inizio del metodo) ci va il nostro nuovo check , quindi il risultato finale sarà
C++:
static void GiveExp(LPCHARACTER from, LPCHARACTER to, int iExp)
{
#ifdef __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
if(!CHARACTER_MANAGER::instance().IsTheRightLevelForExp(to))
return;
#endif
ovviamente poi c'è da aggiungere
#define __ENABLE_LEVEL_CAP_TO_EXP_INTO_MAP__
dove generalmente metti i define dei system che installi...
in genere si usa service.h che trovi in common...
dai un bel clean prima di ricompilare
