82
84
connections[p->getId()].push_back
83
85
(p->snewMedalArmy.connect(sigc::mem_fun(this, &Game::newMedalArmy)));
84
86
connections[p->getId()].push_back
85
(p->srecruitingHero.connect
88
(hero_offers_service, &sigc::signal<bool, Player *,
89
Hero *, City *, int>::emit), p)));
87
(p->srecruitingHero.connect(sigc::mem_fun(this, &Game::recruitHero)));
90
89
connections[p->getId()].push_back
91
90
(p->streachery.connect
94
93
(stack_considers_treachery,
95
94
&sigc::signal<bool, Player *, Stack *, Player *, Vector<int> >::emit), p)));
95
connections[p->getId()].push_back
96
(p->hero_arrives_with_allies.connect
98
(hero_arrives, &sigc::signal<void, int>::emit)));
502
// the parameter is currently not used (=0), but may be used for more detailed
503
// descriptions later on
504
531
void Game::stackUpdate(Stack* s)
507
534
s = Playerlist::getActiveplayer()->getActivestack();
536
//FIXME: if player is not to be observed, bail now
510
smallmap->center_view(s->getPos(), true);
538
smallmap->center_view_on_tile(s->getPos(), true);
514
542
update_stack_info();
515
543
update_control_panel();
518
// s is currently unused, but can later be filled with reasonable data
519
void Game::stackDied(Stack* s)
521
unselect_active_stack();
523
update_control_panel();
545
// sleep for a specified amount of time
546
SDL_Delay(Configuration::s_displaySpeedDelay);
527
549
Army::Stat Game::newLevelArmy(Army* a)
529
551
// don't show a dialog if computer or enemy's armies advance
530
if ((a->getPlayer()->getType() != Player::HUMAN) ||
531
(a->getPlayer() != Playerlist::getInstance()->getActiveplayer()))
552
if ((a->getOwner()->getType() != Player::HUMAN) ||
553
(a->getOwner() != Playerlist::getInstance()->getActiveplayer()))
532
554
return Army::STRENGTH;
534
556
return army_gains_level.emit(a);
696
void Game::invading_city(City* city)
716
void Game::invading_city(City* city, int gold)
698
Playerlist *plist = Playerlist::getInstance();
699
Player *player = plist->getActiveplayer();
702
// See if this is the last city for that player, and alter the
703
// diplomatic scores.
704
if (Citylist::getInstance()->countCities(city->getPlayer()) == 1)
706
if (city->getPlayer()->getDiplomaticRank() <
707
player->getDiplomaticRank())
708
player->deteriorateDiplomaticRelationship (2);
709
else if (city->getPlayer()->getDiplomaticRank() >
710
player->getDiplomaticRank())
711
player->improveDiplomaticRelationship (2, city->getPlayer());
715
// if the attacked city isn't neutral, loot some gold
716
if (city->getPlayer() != plist->getNeutral())
717
looting_city (city, gold);
718
Player *player = Playerlist::getInstance()->getActiveplayer();
720
if (player->getType() == Player::HUMAN)
722
723
CityDefeatedAction a = city_defeated.emit(city, gold);
991
997
return d_gameScenario->saveGame(file);
997
* what are the chances of a hero showing up?
999
* 1 in 6 if you have enough gold, where "enough gold" is...
1001
* ... 1500 if the player already has a hero, then: 1500 is generally
1002
* enough to buy all the heroes. I forget the exact distribution of
1003
* hero prices but memory says from 1000 to 1500. (But, if you don't
1004
* have 1500 gold, and the price is less, you still get the offer...
1005
* So, calculate price, compare to available gold, then decided whether
1006
* or not to offer...)
1008
* ...500 if all your heroes are dead: then prices are cut by about
1011
void Game::maybeRecruitHero (Player *p)
1014
Playerlist *plist = Playerlist::getInstance();
1015
int gold_needed = 0;
1016
if (Citylist::getInstance()->countCities(p) == 0)
1018
//give the player a hero if it's the first round.
1019
//otherwise we get a hero based on chance
1020
//a hero costs a random number of gold pieces
1021
if (d_gameScenario->getRound() == 0)
1025
bool exists = false;
1026
Stacklist *stacklist = p->getStacklist();
1027
for (Stacklist::iterator it = stacklist->begin();
1028
it != stacklist->end(); it++)
1029
if ((*it)->hasHero())
1032
gold_needed = (rand() % 500) + 1000;
1033
if (exists == false)
1037
//we set the chance of some hero recruitment to, ehm, 10 percent
1038
if (((((rand() % 6) == 0) && (gold_needed < p->getGold()))
1039
|| gold_needed == 0)
1040
&& (p != plist->getNeutral()))
1042
const Armysetlist* al = Armysetlist::getInstance();
1043
int num = rand() % d_herotemplates[p->getId()].size();
1044
Hero *templateHero = d_herotemplates[p->getId()][num];
1045
const Army *heroType = al->getArmy (p->getArmyset(),
1046
templateHero->getType());
1047
Hero* newhero = new Hero(*heroType, templateHero->getName(), p);
1048
newhero->setGender(Army::Gender(templateHero->getGender()));
1049
if (gold_needed == 0)
1050
city = Citylist::getInstance()->getFirstCity(p);
1053
std::vector<City*> cities;
1054
Citylist* cl = Citylist::getInstance();
1055
for (Citylist::iterator it = cl->begin(); it != cl->end(); ++it)
1056
if (!(*it).isBurnt() && (*it).getPlayer() == p)
1057
cities.push_back(&(*it));
1060
city = cities[rand() % cities.size()];
1063
bool accepted = p->recruitHero(newhero, city, gold_needed);
1066
History_HeroEmerges *item = new History_HeroEmerges();
1067
item->fillData(newhero, city);
1068
p->getHistorylist()->push_back(item);
1070
newhero->setPlayer(p);
1073
GameMap::getInstance()->addArmy(city, newhero);
1074
/* now maybe add a few allies */
1075
if (gold_needed > 1300)
1077
else if (gold_needed > 1000)
1079
else if (gold_needed > 800)
1084
if (alliesCount > 0)
1086
const Army *army = Reward_Allies::randomArmyAlly();
1089
Reward_Allies::addAllies(p, city->getPos(), army,alliesCount);
1090
if (p->getType() == Player::HUMAN)
1091
hero_arrives.emit(alliesCount);
1094
if (gold_needed == 0)
1096
// Initially give the first hero the player's standard.
1097
std::string name = p->getName() + " " + _("Standard");
1098
Item *battle_standard = new Item (name, true, p);
1099
battle_standard->setBonus(Item::ADD1STACK);
1100
newhero->addToBackpack(battle_standard, 0);
1102
p->withdrawGold(gold_needed);
1103
p->supdatingStack.emit(0);
1112
Game::loadHeroTemplates()
1114
FILE *fileptr = fopen (File::getMiscFile("heronames").c_str(), "r");
1121
size_t bytesread = 0;
1123
const Armysetlist* al = Armysetlist::getInstance();
1124
const Army* herotype;
1126
// list all the army types that are heroes.
1127
std::vector<const Army*> heroes;
1128
Player *p = Playerlist::getInstance()->getNeutral();
1129
for (unsigned int j = 0; j < al->getSize(p->getArmyset()); j++)
1131
const Army *a = al->getArmy (p->getArmyset(), j);
1133
heroes.push_back(a);
1136
if (fileptr == NULL)
1138
while ((read = getline (&line, &len, fileptr)) != -1)
1141
retval = sscanf (line, "%d%d%n", &side, &gender, &bytesread);
1147
while (isspace(line[bytesread]) && line[bytesread] != '\0')
1149
tmp = strchr (&line[bytesread], '\n');
1152
if (strlen (&line[bytesread]) == 0)
1157
if (side < 0 || side > (int) MAX_PLAYERS)
1163
herotype = heroes[rand() % heroes.size()];
1164
Hero *newhero = new Hero (*herotype, "", NULL);
1166
newhero->setGender(Hero::MALE);
1168
newhero->setGender(Hero::FEMALE);
1169
newhero->setName (&line[bytesread]);
1170
d_herotemplates[side].push_back (newhero);
1178
bool Game::init_turn_for_player(Player* p)
1000
void Game::init_turn_for_player(Player* p)
1180
1002
Playerlist* pl = Playerlist::getInstance();
1181
// FIXME: Currently this function only checks for a human player. You
1182
// can also have it check for e.g. escape key pressed to interrupt
1183
// an AI-only game to save/quit.
1004
if (GameScenario::s_hidden_map && p->getType() == Player::HUMAN)
1009
next_player_turn.emit(p, d_gameScenario->getRound() + 1);
1185
1010
center_view_on_city();
1186
if (Playerlist::isFinished())
1187
return true; //closing game window while the computer is moving
1189
next_player_turn.emit(p, d_gameScenario->getRound() + 1);
1190
1011
if (p->getType() == Player::HUMAN)
1192
1013
unlock_inputs();
1195
1015
update_sidebar_stats();
1196
1016
update_stack_info();
1197
1017
update_control_panel();
1199
QuestsManager::getInstance()->nextTurn(p);
1201
maybeRecruitHero(p);
1203
if (d_gameScenario->getRound() == 0)
1205
Citylist *clist = Citylist::getInstance();
1206
city_visited.emit(clist->getFirstCity(p));
1019
//if (d_gameScenario->getRound() == 0)
1021
//Citylist *clist = Citylist::getInstance();
1022
//city_visited.emit(clist->getFirstCity(p));
1209
1025
// update the diplomacy icon if we've received a proposal
1210
1026
bool proposal_received = false;
1267
1058
void Game::on_fight_started(Fight &fight)
1269
Player* pd = (*(fight.getDefenders().begin()))->getPlayer();
1270
Player* pa = (*(fight.getAttackers().begin()))->getPlayer();
1061
Player* pd = fight.getDefenders().front()->getOwner();
1062
Player* pa = fight.getAttackers().front()->getOwner();
1271
1063
if ((pa->getType() == Player::HUMAN || pd->getType() == Player::HUMAN) ||
1272
1064
(pa->getType() != Player::HUMAN && pd->getType() != Player::HUMAN
1273
1065
&& pd != Playerlist::getInstance()->getNeutral()))
1276
if (Playerlist::getActiveplayer()->getType() != Player::HUMAN &&
1277
GameScenario::s_hidden_map == true)
1068
//short circuit the battle sequence
1069
if (pa->getType() != Player::HUMAN && pd->getType() != Player::HUMAN &&
1070
GameScenario::s_hidden_map == true)
1282
//short circuit the battle sequence
1283
fight.battle(GameScenario::s_intense_combat);
1074
return; //short circuit the battle sequence
1077
//FIXME: zoom the map here if we're attacking an observable human,
1078
//from an unobservable computer player
1286
1079
bigmap->setFighting(true);
1287
1080
bigmap->draw();
1288
fight_started.emit(fight, GameScenario::s_intense_combat);
1081
fight_started.emit(fight);
1289
1082
bigmap->setFighting(false);
1290
1083
bigmap->draw();