C4GameOverDlg::C4GameOverDlg() : C4GUI::Dialog( (C4GUI::GetScreenWdt() < 800) ? (C4GUI::GetScreenWdt()-10) : Min<int32_t>(C4GUI::GetScreenWdt()-150, 800), (C4GUI::GetScreenHgt() < 600) ? (C4GUI::GetScreenHgt()-10) : Min<int32_t>(C4GUI::GetScreenHgt()-150, 600), LoadResStr("IDS_TEXT_EVALUATION"), false), pNetResultLabel(NULL), fIsNetDone(false), fHasNextMissionButton(false) { is_shown = true; // assume dlg will be shown, soon UpdateOwnPos(); // indents / sizes int32_t iDefBtnHeight = 32; int32_t iIndentX1=10; int32_t iIndentY1=6, iIndentY2=0; // main screen components C4GUI::ComponentAligner caMain(GetClientRect(), 0,iIndentY1,true); int32_t iMainTextWidth = caMain.GetWidth() - 6*iIndentX1; caMain.GetFromBottom(iIndentY2); // lower button-area C4GUI::ComponentAligner caBottom(caMain.GetFromBottom(iDefBtnHeight+iIndentY1*2), iIndentX1,0); int32_t iBottomButtonSize = caBottom.GetInnerWidth(); iBottomButtonSize = Min<int32_t>(iBottomButtonSize/2-2*iIndentX1, C4GUI::GetRes()->CaptionFont.GetTextWidth("Quit it, baby! And some.")*2); // goal display const C4IDList &rGoals = Game.RoundResults.GetGoals(); const C4IDList &rFulfilledGoals = Game.RoundResults.GetFulfilledGoals(); if (rGoals.GetNumberOfIDs()) { C4GoalDisplay *pGoalDisplay = new C4GoalDisplay(caMain.GetFromTop(C4GUI_IconExHgt)); pGoalDisplay->SetGoals(rGoals, rFulfilledGoals, C4GUI_IconExHgt); AddElement(pGoalDisplay); // goal display may have resized itself; adjust component aligner caMain.ExpandTop(C4GUI_IconExHgt - pGoalDisplay->GetBounds().Hgt); } // league/network result, present or pending fIsNetDone = false; bool fHasNetResult = Game.RoundResults.HasNetResult(); const char *szNetResult = NULL; if (Game.Parameters.isLeague() || fHasNetResult) { if (fHasNetResult) szNetResult = Game.RoundResults.GetNetResultString(); else szNetResult = LoadResStr("IDS_TEXT_LEAGUEWAITINGFOREVALUATIO"); pNetResultLabel = new C4GUI::Label("", caMain.GetFromTop(C4GUI::GetRes()->TextFont.GetLineHeight()*2, iMainTextWidth), ACenter, C4GUI_Caption2FontClr, NULL, false, false, true); AddElement(pNetResultLabel); // only add label - contents and fIsNetDone will be set in next update } else { // otherwise, network is always done fIsNetDone = true; } // extra evaluation string area const char *szCustomEvaluationStrings = Game.RoundResults.GetCustomEvaluationStrings(); if (szCustomEvaluationStrings && *szCustomEvaluationStrings) { int32_t iMaxHgt = caMain.GetInnerHeight() / 3; // max 1/3rd of height for extra data C4GUI::MultilineLabel *pCustomStrings = new C4GUI::MultilineLabel(caMain.GetFromTop(0 /* resized later*/, iMainTextWidth), 0,0, " ", true, true); pCustomStrings->AddLine(szCustomEvaluationStrings, &C4GUI::GetRes()->TextFont, C4GUI_MessageFontClr, true, false, NULL); C4Rect rcCustomStringBounds = pCustomStrings->GetBounds(); if (rcCustomStringBounds.Hgt > iMaxHgt) { // Buffer too large: Use a scrollbox instead delete pCustomStrings; rcCustomStringBounds.Hgt = iMaxHgt; C4GUI::TextWindow *pCustomStringsWin = new C4GUI::TextWindow(rcCustomStringBounds, 0,0,0, 0,0," ",true, NULL,0, true); pCustomStringsWin->SetDecoration(false, false, NULL, false); pCustomStringsWin->AddTextLine(szCustomEvaluationStrings, &C4GUI::GetRes()->TextFont, C4GUI_MessageFontClr, true, false, NULL); caMain.ExpandTop(-iMaxHgt); AddElement(pCustomStringsWin); } else { // buffer size OK: Reserve required space caMain.ExpandTop(-rcCustomStringBounds.Hgt); AddElement(pCustomStrings); } } // player list area C4GUI::ComponentAligner caPlayerArea(caMain.GetAll(), iIndentX1,0); iPlrListCount = 1; bool fSepTeamLists = false; if (Game.Teams.GetTeamCount() == 2 && !Game.Teams.IsAutoGenerateTeams()) { // exactly two predefined teams: Use two player list boxes; one for each team iPlrListCount = 2; fSepTeamLists = true; } ppPlayerLists = new C4PlayerInfoListBox *[iPlrListCount]; for (int32_t i=0; i<iPlrListCount; ++i) { ppPlayerLists[i] = new C4PlayerInfoListBox(caPlayerArea.GetGridCell(i,iPlrListCount,0,1), C4PlayerInfoListBox::PILBM_Evaluation, fSepTeamLists ? Game.Teams.GetTeamByIndex(i)->GetID() : 0); /*if (fSepTeamLists) not necessary and popping up on too much area ppPlayerLists[i]->SetToolTip(FormatString(LoadResStr("IDS_DESC_TEAM"), Game.Teams.GetTeamByIndex(i)->GetName()).getData()); else ppPlayerLists[i]->SetToolTip(LoadResStr("IDS_DESC_LISTOFPLAYERSWHOPARTICIPA"));*/ //ppPlayerLists[i]->SetCustomFont(&Game.GraphicsResource.FontTooltip, 0xff000000); - display black on white? ppPlayerLists[i]->SetSelectionDiabled(true); ppPlayerLists[i]->SetDecoration(false, NULL, true, false); AddElement(ppPlayerLists[i]); } // add buttons C4GUI::CallbackButton<C4GameOverDlg> *btnExit; pBtnExit = btnExit = new C4GUI::CallbackButton<C4GameOverDlg>(LoadResStr("IDS_BTN_ENDROUND"), caBottom.GetGridCell(0,2, 0,1, iBottomButtonSize, -1, true), &C4GameOverDlg::OnExitBtn); btnExit->SetToolTip(LoadResStr("IDS_DESC_ENDTHEROUND")); AddElement(btnExit); C4GUI::CallbackButton<C4GameOverDlg> *btnContinue; pBtnContinue = btnContinue = new C4GUI::CallbackButton<C4GameOverDlg>(LoadResStr("IDS_BTN_CONTINUEGAME"), caBottom.GetGridCell(1,2, 0,1, iBottomButtonSize, -1, true), &C4GameOverDlg::OnContinueBtn); btnContinue->SetToolTip(LoadResStr("IDS_DESC_CONTINUETHEROUNDWITHNOFUR")); AddElement(btnContinue); // convert continue button to "next mission" button if available if (Game.NextMission) { // not available for regular replay and network clients, obviously // it is available for films though, so you can create cinematics for adventures if (Game.Control.isCtrlHost() || (Game.C4S.Head.Film == 2)) { fHasNextMissionButton = true; btnContinue->SetText(Game.NextMissionText.getData()); btnContinue->SetToolTip(Game.NextMissionDesc.getData()); } } // updates pSec1Timer = new C4Sec1TimerCallback<C4GameOverDlg>(this); Update(); // initial focus on quit button if visible, so space/enter/low gamepad buttons quit fIsQuitBtnVisible = fIsNetDone || !Game.Network.isHost(); if (fIsQuitBtnVisible) SetFocus(btnExit, false); }
C4StartupMainDlg::C4StartupMainDlg() : C4StartupDlg(NULL) // create w/o title; it is drawn in custom draw proc { // ctor fFirstShown = true; // screen calculations int iButtonPadding = 2; int iButtonHeight = C4GUI_BigButtonHgt; C4GUI::ComponentAligner caMain(rcBounds, 0, 0, true); C4GUI::ComponentAligner caRightPanel(caMain.GetFromLeft(rcBounds.Wdt * 2 / 5), rcBounds.Wdt / 26, 40 + rcBounds.Hgt / 5); C4GUI::ComponentAligner caButtons(caRightPanel.GetAll(), 0, iButtonPadding); //infobox C4GUI::TextWindow* instructionsWindow; C4Rect rcInstructionsWindow = C4Rect(rcBounds.Wdt / 2, rcBounds.Hgt / 11, rcBounds.Wdt * 5 / 16, rcBounds.Hgt * 5 / 12); AddElement(instructionsWindow = new C4GUI::TextWindow(rcInstructionsWindow, 0, 0, 0, 100, 4096, " ", false, NULL, 0, true)); instructionsWindow->SetDecoration(true, true, &C4Startup::Get()->Graphics.sfctBookScroll, true); instructionsWindow->UpdateHeight(); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS1")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); // instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS2")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS3")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS4")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); instructionsWindow->AddTextLine(FormatString(LoadResStr("GAME_INSTRUCTIONS5")).getData(), &C4Startup::Get()->Graphics.BookFont, 4294967295U, false, false); // main menu buttons C4GUI::CallbackButton<C4StartupMainDlg> *btn; AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_BTN_LOCALGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnStartBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_STARTGAME")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); pStartButton = btn; // AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_QUESTIONNAIRE"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnQuestionnaireBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); // btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_SURVEY"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnSurveyBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); // AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_BTN_NETWORKGAME"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnNetJoinBtn)); // btn->SetToolTip(LoadResStr("IDS_DLGTIP_NETWORKGAME")); // btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_PLAYERSELECTION"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnPlayerSelectionBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_PLAYERSELECTION")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_OPTIONS"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnOptionsBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_OPTIONS")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_ABOUT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnAboutBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_ABOUT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); AddElement(btn = new C4GUI::CallbackButton<C4StartupMainDlg>(LoadResStr("IDS_DLG_EXIT"), caButtons.GetFromTop(iButtonHeight), &C4StartupMainDlg::OnExitBtn)); btn->SetToolTip(LoadResStr("IDS_DLGTIP_EXIT")); btn->SetCustomGraphics(&C4Startup::Get()->Graphics.barMainButtons, &C4Startup::Get()->Graphics.barMainButtonsDown); // list of selected players AddElement(pParticipantsLbl = new C4GUI::Label("test", GetClientRect().Wdt * 39 / 40, GetClientRect().Hgt * 9 / 10, ARight, 0xffffffff, &::GraphicsResource.TitleFont, false)); pParticipantsLbl->SetToolTip(LoadResStr("IDS_DLGTIP_SELECTEDPLAYERS")); // player selection shortcut - to be made optional UpdateParticipants(); pParticipantsLbl->SetContextHandler(new C4GUI::CBContextHandler<C4StartupMainDlg>(this, &C4StartupMainDlg::OnPlayerSelContext)); // key bindings C4CustomKey::CodeList keys; keys.push_back(C4KeyCodeEx(K_DOWN)); keys.push_back(C4KeyCodeEx(K_RIGHT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx(KEY_Gamepad(0, KEY_JOY_Down))); // right will be done by Dialog already } pKeyDown = new C4KeyBinding(keys, "StartupMainCtrlNext", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>(*this, false, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_UP)); keys.push_back(C4KeyCodeEx(K_LEFT)); if (Config.Controls.GamepadGuiControl) { keys.push_back(C4KeyCodeEx(KEY_Gamepad(0, KEY_JOY_Up))); // left will be done by Dialog already } pKeyUp = new C4KeyBinding(keys, "StartupMainCtrlPrev", KEYSCOPE_Gui, new C4GUI::DlgKeyCBEx<C4StartupMainDlg, bool>(*this, true, &C4StartupMainDlg::KeyAdvanceFocus), C4CustomKey::PRIO_CtrlOverride); keys.clear(); keys.push_back(C4KeyCodeEx(K_RETURN)); pKeyEnter = new C4KeyBinding(keys, "StartupMainOK", KEYSCOPE_Gui, new C4GUI::DlgKeyCB<C4StartupMainDlg>(*this, &C4StartupMainDlg::KeyEnterDown, &C4StartupMainDlg::KeyEnterUp), C4CustomKey::PRIO_CtrlOverride); }