/** ** Research upgrade. ** ** @return true when finished. */ /* virtual */ void COrder_Research::Execute(CUnit &unit) { const CUpgrade &upgrade = this->GetUpgrade(); const CUnitType &type = *unit.Type; //Wyrmgus start // UnitShowAnimation(unit, type.Animations->Research ? type.Animations->Research : type.Animations->Still); UnitShowAnimation(unit, unit.GetAnimations()->Research ? unit.GetAnimations()->Research : unit.GetAnimations()->Still); //Wyrmgus end if (unit.Wait) { unit.Wait--; return ; } #if 0 if (unit.Anim.Unbreakable) { return ; } #endif //Wyrmgus start // CPlayer &player = *unit.Player; CPlayer &player = Players[this->Player]; // player.UpgradeTimers.Upgrades[upgrade.ID] += std::max(1, player.SpeedResearch / SPEEDUP_FACTOR); player.UpgradeTimers.Upgrades[upgrade.ID] += std::max(1, (player.SpeedResearch + unit.Variable[TIMEEFFICIENCYBONUS_INDEX].Value + unit.Variable[RESEARCHSPEEDBONUS_INDEX].Value) / SPEEDUP_FACTOR); //Wyrmgus end if (player.UpgradeTimers.Upgrades[upgrade.ID] >= upgrade.Costs[TimeCost]) { if (upgrade.Name.empty()) { //Wyrmgus start // player.Notify(NotifyGreen, unit.tilePos, _("%s: research complete"), type.Name.c_str()); player.Notify(NotifyGreen, unit.tilePos, unit.MapLayer->ID, _("%s: research complete"), type.GetDefaultName(player).c_str()); //Wyrmgus end } else { player.Notify(NotifyGreen, unit.tilePos, unit.MapLayer->ID, _("%s: research complete"), upgrade.Name.c_str()); } if (&player == ThisPlayer) { //Wyrmgus start // CSound *sound = GameSounds.ResearchComplete[player.Race].Sound; CSound *sound = GameSounds.ResearchComplete[unit.Player->Race].Sound; //Wyrmgus end if (sound) { PlayGameSound(sound, MaxSampleVolume); } } if (player.AiEnabled) { AiResearchComplete(unit, &upgrade); } UpgradeAcquire(player, &upgrade); this->Finished = true; return ; } unit.Wait = CYCLES_PER_SECOND / 6; }
/** ** Research upgrade. ** ** @return true when finished. */ /* virtual */ void COrder_Research::Execute(CUnit &unit) { const CUpgrade &upgrade = this->GetUpgrade(); const CUnitType &type = *unit.Type; UnitShowAnimation(unit, type.Animations->Research ? type.Animations->Research : type.Animations->Still); if (unit.Wait) { unit.Wait--; return ; } #if 0 if (unit.Anim.Unbreakable) { return ; } #endif CPlayer &player = *unit.Player; player.UpgradeTimers.Upgrades[upgrade.ID] += std::max(1, player.SpeedResearch / SPEEDUP_FACTOR); if (player.UpgradeTimers.Upgrades[upgrade.ID] >= upgrade.Costs[TimeCost]) { if (upgrade.Name.empty()) { player.Notify(NotifyGreen, unit.tilePos, _("%s: research complete"), type.Name.c_str()); } else { player.Notify(NotifyGreen, unit.tilePos, _("%s: research complete"), upgrade.Name.c_str()); } if (&player == ThisPlayer) { CSound *sound = GameSounds.ResearchComplete[player.Race].Sound; if (sound) { PlayGameSound(sound, MaxSampleVolume); } } if (player.AiEnabled) { AiResearchComplete(unit, &upgrade); } UpgradeAcquire(player, &upgrade); this->Finished = true; return ; } unit.Wait = CYCLES_PER_SECOND / 6; }
/** ** Unit researches! ** ** @param unit Pointer of researching unit. */ global void HandleActionResearch(Unit* unit) { const Upgrade* upgrade; if( !unit->SubAction ) { // first entry upgrade=unit->Data.Research.Upgrade=unit->Orders[0].Arg1; #if 0 // FIXME: I want to support both, but with network we need this check // but if want combined upgrades this is worse // // Check if an other building has already started? // if( unit->Player->UpgradeTimers.Upgrades[upgrade-Upgrades] ) { DebugLevel0Fn("Two researches running\n"); PlayerAddCosts(unit->Player,upgrade->Costs); unit->Reset=unit->Wait=1; unit->Orders[0].Action=UnitActionStill; unit->SubAction=0; if( IsOnlySelected(unit) ) { MustRedraw|=RedrawInfoPanel; } return; } #endif unit->SubAction=1; } else { upgrade=unit->Data.Research.Upgrade; } unit->Player->UpgradeTimers.Upgrades[upgrade-Upgrades]+=SpeedResearch; if( unit->Player->UpgradeTimers.Upgrades[upgrade-Upgrades] >=upgrade->Costs[TimeCost] ) { NotifyPlayer(unit->Player,NotifyGreen,unit->X,unit->Y, "%s: complete",unit->Type->Name); if( unit->Player->Ai ) { AiResearchComplete(unit,upgrade); } UpgradeAcquire(unit->Player,upgrade); unit->Reset=unit->Wait=1; unit->Orders[0].Action=UnitActionStill; unit->SubAction=0; // Upgrade can change all UpdateButtonPanel(); MustRedraw|=RedrawPanels; return; } if( IsOnlySelected(unit) ) { MustRedraw|=RedrawInfoPanel; } unit->Reset=1; unit->Wait=CYCLES_PER_SECOND/6; // FIXME: should be animations here? }
/** ** 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); }