1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-26 22:57:00 +02:00
This commit is contained in:
Ivan Savenko 2013-03-14 20:44:00 +00:00
parent ff1c224a97
commit c4c592b773
14 changed files with 67 additions and 63 deletions

View File

@ -977,7 +977,7 @@ void VCAI::makeTurn()
boost::shared_lock<boost::shared_mutex> gsLock(cb->getGsMutex()); boost::shared_lock<boost::shared_mutex> gsLock(cb->getGsMutex());
setThreadName("VCAI::makeTurn"); setThreadName("VCAI::makeTurn");
BNLOG("Player %d starting turn", playerID); BNLOG("Player %d starting turn", static_cast<int>(playerID.getNum()));
INDENT; INDENT;
switch(cb->getDate(Date::DAY_OF_WEEK)) switch(cb->getDate(Date::DAY_OF_WEEK))
@ -2051,7 +2051,7 @@ HeroPtr VCAI::primaryHero() const
void VCAI::endTurn() void VCAI::endTurn()
{ {
tlog4 << "Player " << playerID << " ends turn\n"; tlog4 << "Player " << static_cast<int>(playerID.getNum()) << " ends turn\n";
if(!status.haveTurn()) if(!status.haveTurn())
{ {
tlog1 << "Not having turn at the end of turn???\n"; tlog1 << "Not having turn at the end of turn???\n";
@ -2062,7 +2062,7 @@ void VCAI::endTurn()
cb->endTurn(); cb->endTurn();
} while(status.haveTurn()); //for some reasons, our request may fail -> stop requesting end of turn only after we've received a confirmation that it's over } while(status.haveTurn()); //for some reasons, our request may fail -> stop requesting end of turn only after we've received a confirmation that it's over
tlog4 << "Player " << playerID << " ended turn\n"; tlog4 << "Player " << static_cast<int>(playerID.getNum()) << " ended turn\n";
} }
bool VCAI::fulfillsGoal (CGoal &goal, CGoal &mainGoal) bool VCAI::fulfillsGoal (CGoal &goal, CGoal &mainGoal)

View File

@ -152,6 +152,10 @@ CHeroWindow::CHeroWindow(const CGHeroInstance *hero):
secSkillImages.push_back(new CAnimImage("SECSKILL", 0, 0, r.x, r.y)); secSkillImages.push_back(new CAnimImage("SECSKILL", 0, 0, r.x, r.y));
} }
//dismiss / quest log
new CTextBox(CGI->generaltexth->jktexts[8], Rect(370, 430, 65, 35), 0, FONT_SMALL, TOPLEFT, Colors::WHITE);
new CTextBox(CGI->generaltexth->jktexts[9], Rect(510, 430, 65, 35), 0, FONT_SMALL, TOPLEFT, Colors::WHITE);
//////////////////////////////////////////////////////////////////////////??????????????? //////////////////////////////////////////////////////////////////////////???????????????
//primary skills & exp and mana //primary skills & exp and mana
@ -338,10 +342,6 @@ void CHeroWindow::showAll(SDL_Surface * to)
printAtMiddleLoc(CGI->generaltexth->jktexts[3], 193, 99, FONT_SMALL, Colors::YELLOW, to); printAtMiddleLoc(CGI->generaltexth->jktexts[3], 193, 99, FONT_SMALL, Colors::YELLOW, to);
printAtMiddleLoc(CGI->generaltexth->jktexts[4], 262, 99, FONT_SMALL, Colors::YELLOW, to); printAtMiddleLoc(CGI->generaltexth->jktexts[4], 262, 99, FONT_SMALL, Colors::YELLOW, to);
//dismiss / quest log
printAtMiddleWBLoc(CGI->generaltexth->jktexts[8], 388, 455, FONT_SMALL, 50, Colors::WHITE, to);
printAtMiddleWBLoc(CGI->generaltexth->jktexts[9], 534, 455, FONT_SMALL, 50, Colors::WHITE, to);
//printing primary skills' amounts //printing primary skills' amounts
for(int m=0; m<4; ++m) for(int m=0; m<4; ++m)
{ {

View File

@ -201,6 +201,7 @@ void CSoundHandler::initSpellsSounds(const std::vector< ConstTransitivePtr<CSpel
// Plays a sound, and return its channel so we can fade it out later // Plays a sound, and return its channel so we can fade it out later
int CSoundHandler::playSound(soundBase::soundID soundID, int repeats) int CSoundHandler::playSound(soundBase::soundID soundID, int repeats)
{ {
assert(soundID < soundBase::sound_after_last);
if (!initialized) if (!initialized)
return -1; return -1;

View File

@ -1029,6 +1029,7 @@ public:
invalid=0, invalid=0,
sound_todo=1, // temp entry until code is fixed sound_todo=1, // temp entry until code is fixed
VCMI_SOUND_LIST VCMI_SOUND_LIST
sound_after_last
}; };
#undef VCMI_SOUND_NAME #undef VCMI_SOUND_NAME
#undef VCMI_SOUND_FILE #undef VCMI_SOUND_FILE

View File

@ -373,7 +373,7 @@ void CClient::newGame( CConnection *con, StartInfo *si )
else else
sensibleAILimit--; sensibleAILimit--;
playerint[color] = static_cast<CGameInterface*>(CDynLibHandler::getNewAI(AItoGive)); playerint[color] = static_cast<CGameInterface*>(CDynLibHandler::getNewAI(AItoGive));
tlog1 << "Player " << color << " will be lead by " << AItoGive << std::endl; tlog1 << "Player " << static_cast<int>(color.getNum()) << " will be lead by " << AItoGive << std::endl;
} }
else else
{ {

View File

@ -3657,9 +3657,11 @@ CTavernWindow::CTavernWindow(const CGObjectInstance *TavernObj):
h1 = new HeroPortrait(selected,0,72,299,h[0]); h1 = new HeroPortrait(selected,0,72,299,h[0]);
h2 = new HeroPortrait(selected,1,162,299,h[1]); h2 = new HeroPortrait(selected,1,162,299,h[1]);
if(h[0])
selected = 0; selected = 0;
else if (!h[0])
selected = 1;
if (!h[0] && !h[1])
selected = -1; selected = -1;
oldSelected = -1; oldSelected = -1;
@ -3675,23 +3677,23 @@ CTavernWindow::CTavernWindow(const CGObjectInstance *TavernObj):
if(LOCPLINT->cb->getResourceAmount(Res::GOLD) < 2500) //not enough gold if(LOCPLINT->cb->getResourceAmount(Res::GOLD) < 2500) //not enough gold
{ {
recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[0]; //Cannot afford a Hero recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[0]; //Cannot afford a Hero
recruit->block(2); recruit->block(true);
} }
else if(LOCPLINT->cb->howManyHeroes(false) >= 8) else if(LOCPLINT->cb->howManyHeroes(false) >= 8)
{ {
recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[1]; //Cannot recruit. You already have %d Heroes. recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[1]; //Cannot recruit. You already have %d Heroes.
boost::algorithm::replace_first(recruit->hoverTexts[0],"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes())); boost::algorithm::replace_first(recruit->hoverTexts[0],"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes()));
recruit->block(2); recruit->block(true);
} }
else if(LOCPLINT->castleInt && LOCPLINT->castleInt->town->visitingHero) else if(LOCPLINT->castleInt && LOCPLINT->castleInt->town->visitingHero)
{ {
recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[2]; //Cannot recruit. You already have a Hero in this town. recruit->hoverTexts[0] = CGI->generaltexth->tavernInfo[2]; //Cannot recruit. You already have a Hero in this town.
recruit->block(2); recruit->block(true);
} }
else else
{ {
if(!h[0]) if(selected == -1)
recruit->block(1); recruit->block(true);
} }
CCS->videoh->open("TAVERN.BIK"); CCS->videoh->open("TAVERN.BIK");
@ -5394,7 +5396,7 @@ void CUniversityWindow::CItem::clickRight(tribool down, bool previousState)
if(down) if(down)
{ {
CRClickPopup::createAndPush(CGI->generaltexth->skillInfoTexts[ID][0], CRClickPopup::createAndPush(CGI->generaltexth->skillInfoTexts[ID][0],
new CComponent(CComponent::secskill, ID, 0)); new CComponent(CComponent::secskill, ID, 1));
} }
} }

View File

@ -56,12 +56,10 @@ MacroString::MacroString(const std::string &format)
} }
} }
} }
while (!start_pos == std::string::npos); while (start_pos != std::string::npos);
//no more macros //no more macros
items.push_back(Item(Item::STRING,format.substr(end_pos))); items.push_back(Item(Item::STRING,format.substr(end_pos)));
} }
std::string MacroString::build(const GetValue& getValue) const std::string MacroString::build(const GetValue& getValue) const

View File

@ -646,7 +646,7 @@ void CCreatureHandler::loadStackExperience(CCreature * creature, const JsonNode
{ {
BOOST_FOREACH (const JsonNode &exp, input.Vector()) BOOST_FOREACH (const JsonNode &exp, input.Vector())
{ {
auto bonus = JsonUtils::parseBonus (exp["bonus"]); // FIXME: memory leak? Only copies of bonus is added to creature auto bonus = JsonUtils::parseBonus (exp["bonus"]);
bonus->source = Bonus::STACK_EXPERIENCE; bonus->source = Bonus::STACK_EXPERIENCE;
bonus->duration = Bonus::PERMANENT; bonus->duration = Bonus::PERMANENT;
const JsonVector &values = exp["values"].Vector(); const JsonVector &values = exp["values"].Vector();
@ -679,6 +679,7 @@ void CCreatureHandler::loadStackExperience(CCreature * creature, const JsonNode
++lowerLimit; ++lowerLimit;
} }
} }
delete bonus;
} }
} }

View File

@ -2293,13 +2293,12 @@ void CGTownInstance::removeCapitols (PlayerColor owner) const
int CGTownInstance::getBoatType() const int CGTownInstance::getBoatType() const
{ {
const CCreature *c = VLC->creh->creatures[town->creatures.front().front()]; switch (VLC->townh->factions[town->typeID].alignment)
if (c->isGood()) {
return 1; case EAlignment::EVIL : return 0;
else if (c->isEvil()) case EAlignment::GOOD : return 1;
return 0; case EAlignment::NEUTRAL : return 2;
else //neutral }
return 2;
} }
int CGTownInstance::getMarketEfficiency() const int CGTownInstance::getMarketEfficiency() const
@ -4877,7 +4876,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
{ {
bool visited = h->hasBonusFrom(Bonus::OBJECT,ID); bool visited = h->hasBonusFrom(Bonus::OBJECT,ID);
int messageID=0; int messageID=0;
int bonusMove = 0, sound = -1; int bonusMove = 0;
ui32 descr_id = 0; ui32 descr_id = 0;
InfoWindow iw; InfoWindow iw;
iw.player = h->tempOwner; iw.player = h->tempOwner;
@ -4894,14 +4893,14 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
{ {
case Obj::BUOY: case Obj::BUOY:
messageID = 21; messageID = 21;
sound = soundBase::MORALE; iw.soundID = soundBase::MORALE;
gbonus.bonus.type = Bonus::MORALE; gbonus.bonus.type = Bonus::MORALE;
gbonus.bonus.val = +1; gbonus.bonus.val = +1;
descr_id = 94; descr_id = 94;
break; break;
case Obj::SWAN_POND: case Obj::SWAN_POND:
messageID = 29; messageID = 29;
sound = soundBase::LUCK; iw.soundID = soundBase::LUCK;
gbonus.bonus.type = Bonus::LUCK; gbonus.bonus.type = Bonus::LUCK;
gbonus.bonus.val = 2; gbonus.bonus.val = 2;
descr_id = 67; descr_id = 67;
@ -4909,14 +4908,14 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case Obj::FAERIE_RING: case Obj::FAERIE_RING:
messageID = 49; messageID = 49;
sound = soundBase::LUCK; iw.soundID = soundBase::LUCK;
gbonus.bonus.type = Bonus::LUCK; gbonus.bonus.type = Bonus::LUCK;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
descr_id = 71; descr_id = 71;
break; break;
case Obj::FOUNTAIN_OF_FORTUNE: case Obj::FOUNTAIN_OF_FORTUNE:
messageID = 55; messageID = 55;
sound = soundBase::LUCK; iw.soundID = soundBase::LUCK;
gbonus.bonus.type = Bonus::LUCK; gbonus.bonus.type = Bonus::LUCK;
gbonus.bonus.val = rand()%5 - 1; gbonus.bonus.val = rand()%5 - 1;
descr_id = 69; descr_id = 69;
@ -4924,7 +4923,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case Obj::IDOL_OF_FORTUNE: case Obj::IDOL_OF_FORTUNE:
messageID = 62; messageID = 62;
sound = soundBase::experience; iw.soundID = soundBase::experience;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
descr_id = 68; descr_id = 68;
@ -4942,13 +4941,13 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case Obj::MERMAID: case Obj::MERMAID:
messageID = 83; messageID = 83;
sound = soundBase::LUCK; iw.soundID = soundBase::LUCK;
gbonus.bonus.type = Bonus::LUCK; gbonus.bonus.type = Bonus::LUCK;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
descr_id = 72; descr_id = 72;
break; break;
case Obj::RALLY_FLAG: case Obj::RALLY_FLAG:
sound = soundBase::MORALE; iw.soundID = soundBase::MORALE;
messageID = 111; messageID = 111;
gbonus.bonus.type = Bonus::MORALE; gbonus.bonus.type = Bonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -4961,6 +4960,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
bonusMove = 400; bonusMove = 400;
break; break;
case Obj::OASIS: case Obj::OASIS:
iw.soundID = soundBase::MORALE;
messageID = 95; messageID = 95;
gbonus.bonus.type = Bonus::MORALE; gbonus.bonus.type = Bonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -4983,7 +4983,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
} }
break; break;
case Obj::WATERING_HOLE: case Obj::WATERING_HOLE:
sound = soundBase::MORALE; iw.soundID = soundBase::MORALE;
messageID = 166; messageID = 166;
gbonus.bonus.type = Bonus::MORALE; gbonus.bonus.type = Bonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -4991,7 +4991,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
bonusMove = 400; bonusMove = 400;
break; break;
case Obj::FOUNTAIN_OF_YOUTH: case Obj::FOUNTAIN_OF_YOUTH:
sound = soundBase::MORALE; iw.soundID = soundBase::MORALE;
messageID = 57; messageID = 57;
gbonus.bonus.type = Bonus::MORALE; gbonus.bonus.type = Bonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -4999,7 +4999,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
bonusMove = 400; bonusMove = 400;
break; break;
case Obj::STABLES: case Obj::STABLES:
sound = soundBase::STORE; iw.soundID = soundBase::STORE;
bool someUpgradeDone = false; bool someUpgradeDone = false;
for (TSlots::const_iterator i = h->Slots().begin(); i != h->Slots().end(); ++i) for (TSlots::const_iterator i = h->Slots().begin(); i != h->Slots().end(); ++i)
@ -5056,7 +5056,6 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
cb->setMovePoints(&smp); cb->setMovePoints(&smp);
} }
} }
iw.soundID = sound;
iw.text.addTxt(MetaString::ADVOB_TXT,messageID); iw.text.addTxt(MetaString::ADVOB_TXT,messageID);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
} }
@ -5689,7 +5688,7 @@ ui8 CGGarrison::getPassableness() const
void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
{ {
int sound; int sound = soundBase::sound_todo;
int txtid; int txtid;
switch(ID) switch(ID)

View File

@ -133,9 +133,9 @@ void JsonNode::setType(JsonType Type)
break; case DATA_NULL: break; case DATA_NULL:
break; case DATA_BOOL: data.Bool = false; break; case DATA_BOOL: data.Bool = false;
break; case DATA_FLOAT: data.Float = 0; break; case DATA_FLOAT: data.Float = 0;
break; case DATA_STRING: data.String = new std::string; break; case DATA_STRING: data.String = new std::string();
break; case DATA_VECTOR: data.Vector = new JsonVector; break; case DATA_VECTOR: data.Vector = new JsonVector();
break; case DATA_STRUCT: data.Struct = new JsonMap; break; case DATA_STRUCT: data.Struct = new JsonMap();
} }
} }

View File

@ -1108,7 +1108,7 @@ struct NewTurn : public CPackForClient //101
std::set<Hero> heroes; //updates movement and mana points std::set<Hero> heroes; //updates movement and mana points
//std::vector<SetResources> res;//resource list //std::vector<SetResources> res;//resource list
std::map<PlayerColor, TResources> res; //player ID => resource value[res_id] std::map<PlayerColor, TResources> res; //player ID => resource value[res_id]
std::vector<SetAvailableCreatures> cres;//creatures to be placed in towns std::map<ObjectInstanceID, SetAvailableCreatures> cres;//creatures to be placed in towns
ui32 day; ui32 day;
bool resetBuilded; bool resetBuilded;
ui8 specialWeek; //weekType ui8 specialWeek; //weekType

View File

@ -933,8 +933,8 @@ DLL_LINKAGE void NewTurn::applyGs( CGameState *gs )
gs->getPlayer(i->first)->resources = i->second; gs->getPlayer(i->first)->resources = i->second;
} }
BOOST_FOREACH(SetAvailableCreatures h, cres) //set available creatures in towns BOOST_FOREACH(auto creatureSet, cres) //set available creatures in towns
h.applyGs(gs); creatureSet.second.applyGs(gs);
gs->globalEffects.popBonuses(Bonus::OneDay); //works for children -> all game objs gs->globalEffects.popBonuses(Bonus::OneDay); //works for children -> all game objs
if(gs->getDate(Date::DAY_OF_WEEK) == 1) //new week if(gs->getDate(Date::DAY_OF_WEEK) == 1) //new week

View File

@ -1300,13 +1300,10 @@ void CGameHandler::newTurn()
} }
} }
} }
// townID, creatureID, amount
std::map<ObjectInstanceID, std::map<si32, si32> > newCreas;//creatures that needs to be added by town events
BOOST_FOREACH(CGTownInstance *t, gs->map->towns) BOOST_FOREACH(CGTownInstance *t, gs->map->towns)
{ {
PlayerColor player = t->tempOwner; PlayerColor player = t->tempOwner;
handleTownEvents(t, n, newCreas); handleTownEvents(t, n);
if(newWeek) //first day of week if(newWeek) //first day of week
{ {
if(t->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON)) if(t->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON))
@ -1316,9 +1313,13 @@ void CGameHandler::newTurn()
if (t->hasBuilt(BuildingID::TREASURY, ETownType::RAMPART) && player < PlayerColor::PLAYER_LIMIT) if (t->hasBuilt(BuildingID::TREASURY, ETownType::RAMPART) && player < PlayerColor::PLAYER_LIMIT)
n.res[player][Res::GOLD] += hadGold[player]/10; //give 10% of starting gold n.res[player][Res::GOLD] += hadGold[player]/10; //give 10% of starting gold
SetAvailableCreatures sac; if (!vstd::contains(n.cres, t->id))
sac.tid = t->id; {
sac.creatures = t->creatures; n.cres[t->id].tid = t->id;
n.cres[t->id].creatures = t->creatures;
}
auto & sac = n.cres[t->id];
for (int k=0; k < GameConstants::CREATURES_PER_TOWN; k++) //creature growths for (int k=0; k < GameConstants::CREATURES_PER_TOWN; k++) //creature growths
{ {
if(t->creatureDwellingLevel(k) >= 0)//there is dwelling (k-level) if(t->creatureDwellingLevel(k) >= 0)//there is dwelling (k-level)
@ -1349,12 +1350,6 @@ void CGameHandler::newTurn()
} }
} }
} }
//add creatures from town events
if (vstd::contains(newCreas, t->id))
for(auto i=newCreas[t->id].begin() ; i!=newCreas[t->id].end(); i++)
sac.creatures[i->first].first += i->second;
n.cres.push_back(sac);
} }
if(!firstTurn && player < PlayerColor::PLAYER_LIMIT)//not the first day and town not neutral if(!firstTurn && player < PlayerColor::PLAYER_LIMIT)//not the first day and town not neutral
{ {
@ -4765,7 +4760,7 @@ void CGameHandler::handleTimeEvents()
sendAndApply(&ume); sendAndApply(&ume);
} }
void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n, std::map<ObjectInstanceID, std::map<si32, si32> > &newCreas) void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n)
{ {
town->events.sort(evntCmp); town->events.sort(evntCmp);
while(town->events.size() && town->events.front().firstOccurence == gs->day) while(town->events.size() && town->events.front().firstOccurence == gs->day)
@ -4807,11 +4802,18 @@ void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n, std::map<
} }
} }
if (!ev.creatures.empty() && !vstd::contains(n.cres, town->id))
{
n.cres[town->id].tid = town->id;
n.cres[town->id].creatures = town->creatures;
}
auto & sac = n.cres[town->id];
for(si32 i=0;i<ev.creatures.size();i++) //creature growths for(si32 i=0;i<ev.creatures.size();i++) //creature growths
{ {
if(town->creatureDwellingLevel(i) >= 0 && ev.creatures[i])//there is dwelling if(town->creatureDwellingLevel(i) >= 0 && ev.creatures[i])//there is dwelling
{ {
newCreas[town->id][i] += ev.creatures[i]; sac.creatures[i].first += ev.creatures[i];
iw.components.push_back(Component(Component::CREATURE, iw.components.push_back(Component(Component::CREATURE,
town->creatures[i].second.back(), ev.creatures[i], 0)); town->creatures[i].second.back(), ev.creatures[i], 0));
} }

View File

@ -230,7 +230,7 @@ public:
void save(const std::string &fname); void save(const std::string &fname);
void close(); void close();
void handleTimeEvents(); void handleTimeEvents();
void handleTownEvents(CGTownInstance *town, NewTurn &n, std::map<ObjectInstanceID, std::map<si32, si32> > &newCreas); void handleTownEvents(CGTownInstance *town, NewTurn &n);
bool complain(const std::string &problem); //sends message to all clients, prints on the logs and return true bool complain(const std::string &problem); //sends message to all clients, prints on the logs and return true
void objectVisited( const CGObjectInstance * obj, const CGHeroInstance * h ); void objectVisited( const CGObjectInstance * obj, const CGHeroInstance * h );
void engageIntoBattle( PlayerColor player ); void engageIntoBattle( PlayerColor player );