/** ** Man vs Machine whith Humans on a Team */ static void GameTypeManTeamVsMachine(void) { int i; int j; for (i = 0; i < PlayerMax - 1; ++i) { if (Players[i].Type != PlayerPerson && Players[i].Type != PlayerComputer) { continue; } for (j = 0; j < PlayerMax - 1; ++j) { if (i != j) { if (Players[i].Type == Players[j].Type) { CommandDiplomacy(i, DiplomacyAllied, j); Players[i].SharedVision |= (1 << j); } else { CommandDiplomacy(i, DiplomacyEnemy, j); } } } if (Players[i].Type == PlayerPerson) { Players[i].Team = 2; } else { Players[i].Team = 1; } } }
/** ** Send command: Diplomacy changed. ** ** @param player Player which changes his state. ** @param state New diplomacy state. ** @param opponent Opponent. */ void SendCommandDiplomacy(int player, int state, int opponent) { if (!IsNetworkGame()) { switch (state) { case DiplomacyNeutral: CommandLog("diplomacy", NoUnitP, 0, player, opponent, NoUnitP, "neutral", -1); break; case DiplomacyAllied: CommandLog("diplomacy", NoUnitP, 0, player, opponent, NoUnitP, "allied", -1); break; case DiplomacyEnemy: CommandLog("diplomacy", NoUnitP, 0, player, opponent, NoUnitP, "enemy", -1); break; case DiplomacyCrazy: CommandLog("diplomacy", NoUnitP, 0, player, opponent, NoUnitP, "crazy", -1); break; } CommandDiplomacy(player, state, opponent); } else { NetworkSendExtendedCommand(ExtendedMessageDiplomacy, -1, player, state, opponent, 0); } }
/** ** Execute an extended command (from network). ** ** @param type Network extended message type ** @param status Bit 7 of message type ** @param arg1 Messe argument 1 ** @param arg2 Messe argument 2 ** @param arg3 Messe argument 3 ** @param arg4 Messe argument 4 */ void ExecExtendedCommand(unsigned char type, int status, unsigned char arg1, unsigned short arg2, unsigned short arg3, unsigned short arg4) { // Note: destroyed units are handled by the action routines. switch (type) { case ExtendedMessageDiplomacy: { const char *diplomacyName = GetDiplomacyName(_diplomacy_(arg3)); CommandLog("diplomacy", NoUnitP, 0, arg2, arg4, NoUnitP, diplomacyName, -1); CommandDiplomacy(arg2, arg3, arg4); break; } case ExtendedMessageSharedVision: if (arg3 == 0) { CommandLog("shared-vision", NoUnitP, 0, arg2, arg4, NoUnitP, "0", -1); } else { CommandLog("shared-vision", NoUnitP, 0, arg2, arg4, NoUnitP, "1", -1); } CommandSharedVision(arg2, arg3 ? true : false, arg4); break; //Wyrmgus start case ExtendedMessageSetFaction: { //FIXME: should add log for faction change here Players[arg2].SetFaction(PlayerRaces.Factions[Players[arg2].Race][arg3]); break; } //Wyrmgus end default: DebugPrint("Unknown extended message %u/%s %u %u %u %u\n" _C_ type _C_ status ? "flush" : "-" _C_ arg1 _C_ arg2 _C_ arg3 _C_ arg4); break; } }
/** ** Free for all */ static void GameTypeFreeForAll(void) { int i; int j; for (i = 0; i < PlayerMax - 1; ++i) { for (j = 0; j < PlayerMax - 1; ++j) { if (i != j) { CommandDiplomacy(i, DiplomacyEnemy, j); } } } }
/** ** Left vs Right */ static void GameTypeLeftVsRight(void) { int i; int j; int left; int middle; middle = Map.Info.MapWidth / 2; for (i = 0; i < PlayerMax - 1; ++i) { left = Players[i].StartX <= middle; for (j = 0; j < PlayerMax - 1; ++j) { if (i != j) { if ((left && Players[j].StartX <= middle) || (!left && Players[j].StartX > middle)) { CommandDiplomacy(i, DiplomacyAllied, j); Players[i].SharedVision |= (1 << j); } else { CommandDiplomacy(i, DiplomacyEnemy, j); } } } } }
/** ** Top vs Bottom */ static void GameTypeTopVsBottom(void) { int i; int j; int top; int middle; middle = Map.Info.MapHeight / 2; for (i = 0; i < PlayerMax - 1; ++i) { top = Players[i].StartY <= middle; for (j = 0; j < PlayerMax - 1; ++j) { if (i != j) { if ((top && Players[j].StartY <= middle) || (!top && Players[j].StartY > middle)) { CommandDiplomacy(i, DiplomacyAllied, j); Players[i].SharedVision |= (1 << j); } else { CommandDiplomacy(i, DiplomacyEnemy, j); } } } } }
/** ** Game main loop. ** ** Unit actions. ** Missile actions. ** Players (AI). ** Cyclic events (color cycle,...) ** Display update. ** Input/Network/Sound. */ void GameMainLoop() { const EventCallback *old_callbacks; InitGameCallbacks(); old_callbacks = GetCallbacks(); SetCallbacks(&GameCallbacks); SetVideoSync(); GameCursor = UI.Point.Cursor; //Wyrmgus start GameEstablishing = false; //Wyrmgus end GameRunning = true; CParticleManager::init(); #ifdef REALVIDEO RealVideoSyncSpeed = VideoSyncSpeed; #endif CclCommand("if (GameStarting ~= nil) then GameStarting() end"); MultiPlayerReplayEachCycle(); //Wyrmgus start if (GameCycle == 0) { // so that these don't trigger when loading a saved game if (CurrentCampaign != NULL) { for (int i = 0; i < NumPlayers; ++i) { if (Players[i].Type != PlayerNobody && Players[i].Race != 0 && Players[i].Faction != -1) { if (CurrentCampaign->StartDate.year) { CCivilization *civilization = PlayerRaces.Civilizations[Players[i].Race]; CFaction *faction = PlayerRaces.Factions[Players[i].Race][Players[i].Faction]; for (std::map<std::string, std::map<CDate, bool>>::iterator iterator = civilization->HistoricalUpgrades.begin(); iterator != civilization->HistoricalUpgrades.end(); ++iterator) { int upgrade_id = UpgradeIdByIdent(iterator->first); if (upgrade_id == -1) { fprintf(stderr, "Upgrade \"%s\" doesn't exist.\n", iterator->first.c_str()); continue; } for (std::map<CDate, bool>::reverse_iterator second_iterator = iterator->second.rbegin(); second_iterator != iterator->second.rend(); ++second_iterator) { if (second_iterator->first.year == 0 || CurrentCampaign->StartDate >= second_iterator->first) { if (second_iterator->second && UpgradeIdentAllowed(Players[i], iterator->first.c_str()) != 'R') { UpgradeAcquire(Players[i], AllUpgrades[upgrade_id]); } else if (!second_iterator->second) { break; } } } } for (std::map<std::string, std::map<CDate, bool>>::iterator iterator = faction->HistoricalUpgrades.begin(); iterator != faction->HistoricalUpgrades.end(); ++iterator) { int upgrade_id = UpgradeIdByIdent(iterator->first); if (upgrade_id == -1) { fprintf(stderr, "Upgrade \"%s\" doesn't exist.\n", iterator->first.c_str()); continue; } for (std::map<CDate, bool>::reverse_iterator second_iterator = iterator->second.rbegin(); second_iterator != iterator->second.rend(); ++second_iterator) { if (second_iterator->first.year == 0 || CurrentCampaign->StartDate >= second_iterator->first) { if (second_iterator->second && UpgradeIdentAllowed(Players[i], iterator->first.c_str()) != 'R') { UpgradeAcquire(Players[i], AllUpgrades[upgrade_id]); } else if (!second_iterator->second) { break; } } } } for (std::map<std::pair<int, CFaction *>, int>::iterator iterator = faction->HistoricalDiplomacyStates.begin(); iterator != faction->HistoricalDiplomacyStates.end(); ++iterator) { //set the appropriate historical diplomacy states to other factions if (iterator->second == 0 || CurrentCampaign->StartDate.year >= iterator->first.first) { CPlayer *diplomacy_state_player = GetFactionPlayer(iterator->first.second); if (diplomacy_state_player) { CommandDiplomacy(i, iterator->second, diplomacy_state_player->Index); CommandDiplomacy(diplomacy_state_player->Index, iterator->second, i); if (iterator->second == DiplomacyAllied) { CommandSharedVision(i, true, diplomacy_state_player->Index); CommandSharedVision(diplomacy_state_player->Index, true, i); } } } } for (std::map<std::pair<CDate, int>, int>::iterator iterator = faction->HistoricalResources.begin(); iterator != faction->HistoricalResources.end(); ++iterator) { //set the appropriate historical resource quantities if (iterator->second == 0 || CurrentCampaign->StartDate >= iterator->first.first) { Players[i].SetResource(iterator->first.second, iterator->second); } } } } } if (CurrentCampaign->StartEffects) { CurrentCampaign->StartEffects->pushPreamble(); CurrentCampaign->StartEffects->run(); } } //if the person player has no faction, bring up the faction choice interface if (!GrandStrategy && ThisPlayer && ThisPlayer->Faction == -1) { char buf[256]; snprintf(buf, sizeof(buf), "if (ChooseFaction ~= nil) then ChooseFaction(\"%s\", \"%s\") end", ThisPlayer->Race != -1 ? PlayerRaces.Name[ThisPlayer->Race].c_str() : "", ""); CclCommand(buf); } if (!IsNetworkGame() && ThisPlayer && CurrentCustomHero != NULL) { Vec2i resPos; FindNearestDrop(*CurrentCustomHero->Type, ThisPlayer->StartPos, resPos, LookingW, ThisPlayer->StartMapLayer); CUnit *custom_hero = MakeUnitAndPlace(resPos, *CurrentCustomHero->Type, ThisPlayer, ThisPlayer->StartMapLayer); custom_hero->SetCharacter(CurrentCustomHero->Ident, true); } if (CurrentQuest != NULL && CurrentQuest->IntroductionDialogue != NULL) { CurrentQuest->IntroductionDialogue->Call(ThisPlayer->Index); } } //Wyrmgus end SingleGameLoop(); // // Game over // if (GameResult == GameExit) { Exit(0); return; } #ifdef REALVIDEO if (FastForwardCycle > GameCycle) { VideoSyncSpeed = RealVideoSyncSpeed; } #endif NetworkQuitGame(); EndReplayLog(); GameCycle = 0;//???? CParticleManager::exit(); FlagRevealMap = 0; ReplayRevealMap = 0; GamePaused = false; GodMode = false; SetCallbacks(old_callbacks); }