diff --git a/config/bankconfig.txt b/config/bankconfig.txt index f31424dc1..b41658bd9 100644 --- a/config/bankconfig.txt +++ b/config/bankconfig.txt @@ -85,3 +85,4 @@ Grotto 1 30% 3 Harpy 0 3 Beholder 3 Harpy 3 Beholder 200 20 1000 0 None 0 0 2 30% 4 Harpy 0 4 Beholder 4 Harpy 4 Beholder 300 25 1000 0 None 0 0 0 0 3000 20 150% 3 30% 5 Harpy 0 5 Beholder 5 Harpy 5 Beholder 400 30 1500 0 None 0 0 0 0 4000 20 200% 4 10% 6 Harpy 0 6 Beholder 6 Harpy 6 Beholder 500 35 2000 0 None 0 0 0 0 5000 20 250% +Pyramid 1 100% 20 Gold Golem 0% 10 Diamond Golem 20 Gold Golem 10 Diamond Golem 786 15000 19 100% diff --git a/hch/CObjectHandler.cpp b/hch/CObjectHandler.cpp index c06950eb3..ff1d1b703 100644 --- a/hch/CObjectHandler.cpp +++ b/hch/CObjectHandler.cpp @@ -46,7 +46,6 @@ extern CLodHandler * bitmaph; extern boost::rand48 ran; std::map > CGKeys::playerKeyMap; std::map > CGMagi::eyelist; -BankConfig CGPyramid::pyramidConfig; ui8 CGObelisk::obeliskCount; //how many obelisks are on map std::map CGObelisk::visited; //map: team_id => how many obelisks has been visited @@ -130,6 +129,54 @@ static void readCreatures(std::istream & is, BankConfig & bc, bool guards) //hel else //given creatures bc.creatures.push_back(guardInfo); } +void CObjectHandler::readConfigLine(std::ifstream &istr, int g) +{ + banksInfo[g].push_back(new BankConfig); + + BankConfig &bc = *banksInfo[g].back(); + std::string buf; + char dump; + //bc.level is of type char and thus we cannot read directly to it; same for some othre variables + istr >> buf; + bc.level = atoi(buf.c_str()); + + istr >> buf; + bc.chance = atoi(buf.c_str()); + + readCreatures(istr, bc, true); + istr >> buf; + bc.upgradeChance = atoi(buf.c_str()); + + for(int b=0; b<3; ++b) + readCreatures(istr, bc, true); + + istr >> bc.combatValue; + bc.resources.resize(RESOURCE_QUANTITY); + + //a dirty trick to make it work if there is no 0 for 0 quantity (like in grotto - last entry) + char buft[52]; + istr.getline(buft, 50, '\t'); + for(int h=0; h<7; ++h) + { + istr.getline(buft, 50, '\t'); + if(buft[0] == '\0') + bc.resources[h] = 0; + else + bc.resources[h] = SDL_atoi(buft); + } + readCreatures(istr, bc, false); + + bc.artifacts.resize(4); + for(int b=0; b<4; ++b) + { + istr >> bc.artifacts[b]; + } + + istr >> bc.value; + istr >> bc.rewardDifficulty; + istr >> buf; + bc.easiest = atoi(buf.c_str()); +} void CObjectHandler::loadObjects() { @@ -164,8 +211,6 @@ void CObjectHandler::loadObjects() tlog5 << "\t\tDone loading resource prices!\n"; } - - std::ifstream istr; istr.open(DATA_DIR "/config/bankconfig.txt", std::ios_base::binary); if(!istr.is_open()) @@ -191,53 +236,15 @@ void CObjectHandler::loadObjects() for(int i=0; i<4; ++i) //reading levels { - banksInfo[g].push_back(new BankConfig); - - BankConfig &bc = *banksInfo[g].back(); - std::string buf; - char dump; - //bc.level is of type char and thus we cannot read directly to it; same for some othre variables - istr >> buf; - bc.level = atoi(buf.c_str()); - - istr >> buf; - bc.chance = atoi(buf.c_str()); - - readCreatures(istr, bc, true); - istr >> buf; - bc.upgradeChance = atoi(buf.c_str()); - - for(int b=0; b<3; ++b) - readCreatures(istr, bc, true); - - istr >> bc.combatValue; - bc.resources.resize(RESOURCE_QUANTITY); - - //a dirty trick to make it work if there is no 0 for 0 quantity (like in grotto - last entry) - char buft[52]; - istr.getline(buft, 50, '\t'); - for(int h=0; h<7; ++h) - { - istr.getline(buft, 50, '\t'); - if(buft[0] == '\0') - bc.resources[h] = 0; - else - bc.resources[h] = SDL_atoi(buft); - } - readCreatures(istr, bc, false); - - bc.artifacts.resize(4); - for(int b=0; b<4; ++b) - { - istr >> bc.artifacts[b]; - } - - istr >> bc.value; - istr >> bc.rewardDifficulty; - istr >> buf; - bc.easiest = atoi(buf.c_str()); + readConfigLine(istr,g); } } + //reading name + istr.getline(buffer, MAX_BUF, '\t'); + creBanksNames[21] = std::string(buffer); + while(creBanksNames[21][0] == 10 || creBanksNames[21][0] == 13) + creBanksNames[21].erase(creBanksNames[21].begin()); + readConfigLine(istr,21); //pyramid } int CGObjectInstance::getOwner() const @@ -5863,30 +5870,22 @@ void CBank::endBattle (const CGHeroInstance *h, const BattleResult *result) cons void CGPyramid::initObj() { -//would be nice to do that only once - if (!pyramidConfig.guards.size()) - { - pyramidConfig.level = 1; - pyramidConfig.chance = 100; - pyramidConfig.upgradeChance = 0; - for (int i = 0; i < 2; ++i) - { - pyramidConfig.guards.push_back (std::pair (116, 20)); - pyramidConfig.guards.push_back (std::pair (117, 10)); - } - pyramidConfig.combatValue; //how hard are guards of this level - pyramidConfig.value; //overall value of given things - pyramidConfig.rewardDifficulty; //proportion of reward value to difficulty of guards; how profitable is this creature Bank config - pyramidConfig.easiest; //?!? - } - bc = &pyramidConfig; std::vector available; cb->getAllowedSpells (available, 5); - spell = (available[rand()%available.size()]); + if (available.size()) + { + bc = VLC->objh->banksInfo[21].front(); //TODO: remove hardcoded value? + spell = (available[rand()%available.size()]); + } + else + { + tlog1 <<"No spells available for Pyramid! Object set to empty.\n"; + } + setPropertyDer (17,ran()); //set guards at game start } const std::string & CGPyramid::getHoverText() const { - hoverName = VLC->generaltexth->names[ID]; + hoverName = VLC->objh->creBanksNames[21]; if (bc == NULL) hoverName += " " + VLC->generaltexth->allTexts[352]; else diff --git a/hch/CObjectHandler.h b/hch/CObjectHandler.h index f2e1830f0..bec8219b6 100644 --- a/hch/CObjectHandler.h +++ b/hch/CObjectHandler.h @@ -1079,7 +1079,6 @@ class DLL_EXPORT CBank : public CArmedInstance class DLL_EXPORT CGPyramid : public CBank { public: - static BankConfig pyramidConfig; ui16 spell; void initObj(); @@ -1247,6 +1246,7 @@ public: std::vector resVals; //default values of resources in gold void loadObjects(); + void readConfigLine(std::ifstream &istr, int g); template void serialize(Handler &h, const int version) { diff --git a/lib/map.h b/lib/map.h index 361c0b7dd..db5a3a15e 100644 --- a/lib/map.h +++ b/lib/map.h @@ -342,7 +342,6 @@ struct DLL_EXPORT Mapa : public CMapHeader h & CGTeleport::gates; h & CGKeys::playerKeyMap; h & CGMagi::eyelist; - h & CGPyramid::pyramidConfig; h & CGObelisk::obeliskCount & CGObelisk::visited; h & CGTownInstance::merchantArtifacts; diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 6bf8d7ea7..b2981b7a3 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -625,15 +625,15 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer if(battleResult.data->exp[1] && hero2) changePrimSkill(hero2->id,4,battleResult.data->exp[1]); - if(battleEndCallback && *battleEndCallback) + sendAndApply(&resultsApplied); + + if(battleEndCallback && *battleEndCallback) //TODO: object interaction after level dialog is handled { (*battleEndCallback)(battleResult.data); delete battleEndCallback; battleEndCallback = 0; } - sendAndApply(&resultsApplied); - // Necromancy if applicable. const CGHeroInstance *winnerHero = battleResult.data->winner != 0 ? hero2 : hero1; const CGHeroInstance *loserHero = battleResult.data->winner != 0 ? hero1 : hero2; diff --git a/server/NetPacksServer.cpp b/server/NetPacksServer.cpp index 21331d12e..955c008be 100644 --- a/server/NetPacksServer.cpp +++ b/server/NetPacksServer.cpp @@ -160,7 +160,7 @@ bool TradeOnMarketplace::applyGh( CGameHandler *gh ) case CREATURE_UNDEAD: return gh->transformInUndead(m, hero, r1); case RESOURCE_SKILL: - return gh->buySecSkill(m, hero, r2); + return gh->buySecSkill(m, hero, r2); case CREATURE_EXP: return gh->sacrificeCreatures(m, hero, r1, val); case ARTIFACT_EXP: