Hooks
static bool BeforeCvGame_doControl(CvGame* self, ControlTypes eControl);static void AfterCvGame_doControl(CvGame* self, ControlTypes eControl);static void ReplaceCvGame_doControl(void (*original)(CvGame*, ControlTypes), CvGame* self, ControlTypes eControl);CivRegisterBefore<CivHooks::CvGame_doControl>(host, &BeforeCvGame_doControl);CivRegisterAfter<CivHooks::CvGame_doControl>(host, &AfterCvGame_doControl);CivRegisterReplace<CivHooks::CvGame_doControl>(host, &ReplaceCvGame_doControl);
Code
3318void CvGame::doControl(ControlTypes eControl)3319{3320 if(!canDoControl(eControl))3321 {3322 return;3323 }33243325 switch(eControl)3326 {3327 case CONTROL_CENTERONSELECTION:3328 GC.GetEngineUserInterface()->lookAtSelectionPlot();3329 break;33303331 case CONTROL_SELECTYUNITTYPE:3332 {3333 auto_ptr<ICvUnit1> pHeadSelectedUnit(GC.GetEngineUserInterface()->GetHeadSelectedUnit());3334 if(pHeadSelectedUnit.get() != NULL)3335 {3336 GC.GetEngineUserInterface()->selectGroup(pHeadSelectedUnit.get(), false, true, false);3337 }3338 }3339 break;33403341 case CONTROL_SELECTYUNITALL:3342 {3343 auto_ptr<ICvUnit1> pHeadSelectedUnit(GC.GetEngineUserInterface()->GetHeadSelectedUnit());3344 if(pHeadSelectedUnit.get() != NULL)3345 {3346 GC.GetEngineUserInterface()->selectGroup(pHeadSelectedUnit.get(), false, false, true);3347 }3348 }3349 break;33503351 case CONTROL_SELECT_HEALTHY:3352 {3353 auto_ptr<ICvUnit1> pHeadSelectedUnit(GC.GetEngineUserInterface()->GetHeadSelectedUnit());3354 CvUnit* pkHeadSelectedUnit = GC.UnwrapUnitPointer(pHeadSelectedUnit.get());3355 GC.GetEngineUserInterface()->ClearSelectionList();3356 if(pkHeadSelectedUnit != NULL)3357 {3358 CvPlot* pHeadPlot = pkHeadSelectedUnit->plot();3359 std::vector<CvUnit*> plotUnits;3360 getPlotUnits(pHeadPlot, plotUnits);3361 for(int iI = 0; iI < (int) plotUnits.size(); iI++)3362 {3363 CvUnit* pUnit = plotUnits[iI];33643365 if(pUnit->getOwner() == getActivePlayer())3366 {3367 if(!GET_PLAYER(pUnit->getOwner()).isSimultaneousTurns() || getTurnSlice() - pUnit->getLastMoveTurn() > GC.getMIN_TIMER_UNIT_DOUBLE_MOVES())3368 {3369 if(pUnit->IsHurt())3370 {3371 auto_ptr<ICvUnit1> pDllUnit = GC.WrapUnitPointer(pUnit);3372 GC.GetEngineUserInterface()->InsertIntoSelectionList(pDllUnit.get(), true, false, true, true, true);3373 }3374 }3375 }3376 }3377 }3378 }3379 break;33803381 case CONTROL_SELECTCITY:3382 if(GC.GetEngineUserInterface()->isCityScreenUp())3383 {3384 cycleCities();3385 }3386 else3387 {3388 GC.GetEngineUserInterface()->selectLookAtCity();3389 }3390 GC.GetEngineUserInterface()->lookAtSelectionPlot();3391 break;33923393 case CONTROL_SELECTCAPITAL:3394 {3395 CvCity* pCapitalCity = GET_PLAYER(getActivePlayer()).getCapitalCity();3396 if(pCapitalCity != NULL)3397 {3398 auto_ptr<ICvCity1> pDllCapitalCity = GC.WrapCityPointer(pCapitalCity);3399 GC.GetEngineUserInterface()->selectCity(pDllCapitalCity.get());3400 }3401 GC.GetEngineUserInterface()->lookAtSelectionPlot();3402 }3403 break;34043405 case CONTROL_NEXTCITY:3406 if(GC.GetEngineUserInterface()->isCitySelection())3407 {3408 cycleCities(true, !(GC.GetEngineUserInterface()->isCityScreenUp()));3409 }3410 else3411 {3412 GC.GetEngineUserInterface()->selectLookAtCity(true);3413 }3414 GC.GetEngineUserInterface()->lookAtSelectionPlot();3415 break;34163417 case CONTROL_PREVCITY:3418 if(GC.GetEngineUserInterface()->isCitySelection())3419 {3420 cycleCities(false, !(GC.GetEngineUserInterface()->isCityScreenUp()));3421 }3422 else3423 {3424 GC.GetEngineUserInterface()->selectLookAtCity(true);3425 }3426 GC.GetEngineUserInterface()->lookAtSelectionPlot();3427 break;34283429 case CONTROL_NEXTUNIT:3430 {3431 auto_ptr<ICvPlot1> pSelectionPlot(GC.GetEngineUserInterface()->getSelectionPlot());3432 CvPlot* pkSelectionPlot = GC.UnwrapPlotPointer(pSelectionPlot.get());3433 if(pkSelectionPlot != NULL)3434 {3435 cyclePlotUnits(pkSelectionPlot);3436 }3437 break;3438 }34393440 case CONTROL_PREVUNIT:3441 {3442 auto_ptr<ICvPlot1> pSelectionPlot(GC.GetEngineUserInterface()->getSelectionPlot());3443 CvPlot* pkSelectionPlot = GC.UnwrapPlotPointer(pSelectionPlot.get());3444 if(pkSelectionPlot != NULL)3445 {3446 cyclePlotUnits(pkSelectionPlot, false);3447 }3448 break;3449 }34503451 case CONTROL_CYCLEUNIT:3452 case CONTROL_CYCLEUNIT_ALT:3453 cycleUnits(true);3454 break;34553456 case CONTROL_CYCLEWORKER:3457 cycleUnits(true, true, true);3458 break;34593460 case CONTROL_LASTUNIT:3461 {3462 ICvUserInterface2* UI = GC.GetEngineUserInterface();3463 auto_ptr<ICvUnit1> pUnit(UI->getLastSelectedUnit());34643465 if(pUnit.get() != NULL)3466 {3467 UI->selectUnit(pUnit.get(), true);3468 UI->lookAtSelectionPlot();3469 }3470 else3471 {3472 cycleUnits(true, false);3473 }34743475 UI->setLastSelectedUnit(NULL);3476 }3477 break;34783479 case CONTROL_ENDTURN:3480 case CONTROL_ENDTURN_ALT:3481 if(GC.GetEngineUserInterface()->canEndTurn() && gDLL->allAICivsProcessedThisTurn() && allUnitAIProcessed())3482 {3483 CvPlayerAI& kActivePlayer = GET_PLAYER(getActivePlayer());3484 if (!isNetworkMultiPlayer() && kActivePlayer.isHuman() && GC.GetPostTurnAutosaves())3485 {3486#if defined(CIV_HOST_API)3487 if (CivHostSavingAllowed())3488#endif3489 gDLL->AutoSave(false, true);3490 }34913492#if !defined(NO_ACHIEVEMENTS)3493 kActivePlayer.GetPlayerAchievements().EndTurn();3494#endif3495 gDLL->sendTurnComplete();3496#if !defined(NO_ACHIEVEMENTS)3497 CvAchievementUnlocker::EndTurn();3498#endif3499 GC.GetEngineUserInterface()->setInterfaceMode(INTERFACEMODE_SELECTION);3500 }3501 break;35023503 case CONTROL_FORCEENDTURN:3504 {3505 EndTurnBlockingTypes eBlock = GET_PLAYER(getActivePlayer()).GetEndTurnBlockingType();3506 if(gDLL->allAICivsProcessedThisTurn() && allUnitAIProcessed() && (eBlock == NO_ENDTURN_BLOCKING_TYPE || eBlock == ENDTURN_BLOCKING_UNITS))3507 {3508#if !defined(NO_ACHIEVEMENTS)3509 CvPlayerAI& kActivePlayer = GET_PLAYER(getActivePlayer());3510 kActivePlayer.GetPlayerAchievements().EndTurn();3511#endif3512 gDLL->sendTurnComplete();3513#if !defined(NO_ACHIEVEMENTS)3514 CvAchievementUnlocker::EndTurn();3515#endif3516 SetForceEndingTurn(true);3517 GC.GetEngineUserInterface()->setInterfaceMode(INTERFACEMODE_SELECTION);3518 }3519 break;3520 }35213522 case CONTROL_AUTOMOVES:3523 gDLL->sendAutoMoves();3524 break;35253526 case CONTROL_PING:3527 GC.GetEngineUserInterface()->setInterfaceMode(INTERFACEMODE_PING);3528 break;35293530 case CONTROL_YIELDS:3531 GC.GetEngineUserInterface()->toggleYieldVisibleMode();3532 break;35333534 case CONTROL_RESOURCE_ALL:3535 GC.GetEngineUserInterface()->toggleResourceVisibleMode();3536 break;35373538 case CONTROL_UNIT_ICONS:3539 break;35403541 case CONTROL_SCORES:3542 break;35433544 case CONTROL_LOAD_GAME:3545 gDLL->LoadGame();3546 break;35473548 case CONTROL_OPTIONS_SCREEN:3549 gDLL->GameplayOpenOptionsScreen();3550 break;35513552 case CONTROL_RETIRE:3553 if(!isGameMultiPlayer() || countHumanPlayersAlive() == 1)3554 {3555 setGameState(GAMESTATE_OVER);3556 GC.GetEngineUserInterface()->setDirty(Soundtrack_DIRTY_BIT, true);3557 }3558 else3559 {3560 if(isNetworkMultiPlayer())3561 {3562 GC.GetEngineUserInterface()->exitingToMainMenu();3563 }3564 }3565 break;35663567 case CONTROL_SAVE_GROUP:3568#if defined(CIV_HOST_API)3569 if (CivHostSavingAllowed())3570#endif3571 gDLL->SaveGame(SAVEGAME_GROUP);3572 break;35733574 case CONTROL_SAVE_NORMAL:3575#if defined(CIV_HOST_API)3576 if (CivHostSavingAllowed())3577#endif3578 gDLL->SaveGame(SAVEGAME_NORMAL);3579 break;35803581 case CONTROL_QUICK_SAVE:3582 if(!(isNetworkMultiPlayer())) // SP only!3583 {3584#if defined(CIV_HOST_API)3585 if (CivHostSavingAllowed())3586#endif3587 gDLL->QuickSave();3588 }3589 break;35903591 case CONTROL_QUICK_LOAD:3592 if(!(isNetworkMultiPlayer())) // SP only!3593 {3594 gDLL->QuickLoad();3595 }3596 break;35973598 case CONTROL_CIVILOPEDIA:3599 gDLL->GameplaySearchForPediaEntry("OPEN_VIA_HOTKEY");3600 break;36013602 case CONTROL_POLICIES_SCREEN:3603 {3604 CvPopupInfo kPopup(BUTTONPOPUP_CHOOSEPOLICY, getActivePlayer());3605 kPopup.iData1 = 1;3606 GC.GetEngineUserInterface()->AddPopup(kPopup);3607 }3608 break;36093610 case CONTROL_FOREIGN_SCREEN:3611 {3612 CvPopupInfo kPopup(BUTTONPOPUP_DIPLOMATIC_OVERVIEW, getActivePlayer());3613 kPopup.iData1 = 1;3614 GC.GetEngineUserInterface()->AddPopup(kPopup);3615 }3616 break;36173618 case CONTROL_MILITARY_SCREEN:3619 {3620 CvPopupInfo kPopup(BUTTONPOPUP_MILITARY_OVERVIEW, getActivePlayer());3621 kPopup.iData1 = 1;3622 GC.GetEngineUserInterface()->AddPopup(kPopup);3623 }3624 break;36253626 case CONTROL_TECH_CHOOSER:3627 {3628 CvPopupInfo kPopup(BUTTONPOPUP_TECH_TREE, getActivePlayer());36293630 // If the popup queue is empty, just show the tech tree, don't queue it up - otherwise, if we, say, go into the Pedia from here, it'll end up BEHIND the tech tree3631 if(!GC.GetEngineUserInterface()->IsPopupQueueEmpty())3632 kPopup.iData1 = 1;36333634 GC.GetEngineUserInterface()->AddPopup(kPopup);3635 }3636 break;36373638 case CONTROL_TURN_LOG:3639 {3640 CvPopupInfo kPopup(BUTTONPOPUP_NOTIFICATION_LOG, getActivePlayer());3641 kPopup.iData1 = 1;3642 GC.GetEngineUserInterface()->AddPopup(kPopup);3643 }3644 break;36453646 case CONTROL_DOMESTIC_SCREEN:3647 {3648 CvPopupInfo kPopup(BUTTONPOPUP_ECONOMIC_OVERVIEW, getActivePlayer());3649 kPopup.iData1 = 1;3650 GC.GetEngineUserInterface()->AddPopup(kPopup);3651 }3652 break;36533654 case CONTROL_VICTORY_SCREEN:3655 {3656 CvPopupInfo kPopup(BUTTONPOPUP_VICTORY_INFO, getActivePlayer());3657 kPopup.iData1 = 1;;3658 GC.GetEngineUserInterface()->AddPopup(kPopup);3659 }3660 break;36613662 case CONTROL_INFO:3663 {3664 CvPopupInfo kPopup(BUTTONPOPUP_DEMOGRAPHICS, getActivePlayer());3665 kPopup.iData1 = 1;3666 GC.GetEngineUserInterface()->AddPopup(kPopup);3667 }3668 break;36693670 case CONTROL_ADVISOR_COUNSEL:3671 {3672 CvPopupInfo kPopup(BUTTONPOPUP_ADVISOR_COUNSEL);3673 kPopup.iData1 = 1;3674 GC.GetEngineUserInterface()->AddPopup(kPopup);3675 }3676 break;36773678 case CONTROL_ESPIONAGE_OVERVIEW:3679 {3680 CvPopupInfo kPopup(BUTTONPOPUP_ESPIONAGE_OVERVIEW, getActivePlayer());3681 kPopup.iData1 = 1;3682 GC.GetEngineUserInterface()->AddPopup(kPopup);3683 }3684 break;36853686 case CONTROL_RELIGION_OVERVIEW:3687 {3688 CvPopupInfo kPopup(BUTTONPOPUP_RELIGION_OVERVIEW, getActivePlayer());3689 kPopup.iData1 = 1;3690 GC.GetEngineUserInterface()->AddPopup(kPopup);3691 }3692 break;36933694 case CONTROL_RESTART_GAME:3695 {3696 gDLL->RestartGame();3697 }3698 break;36993700 default:3701 CvAssertMsg(false, "eControl did not match any valid options");3702 break;3703 }3704}