bool C4MainMenu::ActivateGoals(int32_t iPlayer, bool fDoActivate) { C4FacetSurface fctSymbol; C4Facet fctGF; // goal fulfilled facet if (fDoActivate) { // Menu symbol/init InitRefSym(GfxR->fctMenu.GetPhase(4),LoadResStr("IDS_MENU_CPGOALS"),iPlayer); SetAlignment(C4MN_Align_Left | C4MN_Align_Bottom); SetPermanent(false); fctGF.Set(NULL, C4SymbolSize-::GraphicsResource.fctCaptain.Wdt-2, 2, ::GraphicsResource.fctCaptain.Wdt, ::GraphicsResource.fctCaptain.Hgt); } // determine if the goals are fulfilled - do the calls even if the menu is not to be opened to ensure synchronization C4IDList GoalList, FulfilledGoalList; C4RoundResults::EvaluateGoals(GoalList, FulfilledGoalList, iPlayer); // Add Items if (fDoActivate) { int32_t iNumGoals = GoalList.GetNumberOfIDs(), cnt; C4ID idGoal; C4Def *pDef; for (int32_t i=0; i<iNumGoals; ++i) if ((idGoal = GoalList.GetID(i, &cnt))) if ((pDef = C4Id2Def(idGoal))) { fctSymbol.Create(C4SymbolSize,C4SymbolSize); // 2do: If an object instance is known, draw the object instead? // this would allow us to do dynamic pictures and overlays; e.g. draw the actual, required settlement score // for settlement score goals // Same for pDef->GetName(), pDef->GetDesc() pDef->Draw(fctSymbol); if (FulfilledGoalList.GetIDCount(idGoal)) { fctGF.Surface=fctSymbol.Surface; ::GraphicsResource.fctCaptain.Draw(fctGF); } StdStrBuf Command; Command.Format("Player:Goal:%s", idGoal.ToString()); Add(pDef->GetName(),fctSymbol,Command.getData(),C4MN_Item_NoCount,NULL,""); } // Go back to options menu on close SetCloseCommand("ActivateMenu:Main"); } // Done return true; }
C4GoalDisplay::GoalPicture::GoalPicture(const C4Rect &rcBounds, C4ID idGoal, bool fFulfilled) : idGoal(idGoal), fFulfilled(fFulfilled), C4GUI::Window() { // bounds SetBounds(rcBounds); // can't get specialized desc from object at the moment because of potential script callbacks! StdStrBuf strGoalName, strGoalDesc; /*C4Object *pGoalObj = Game.Objects.FindInternal(idGoal); if (pGoalObj) { pGoalObj->GetInfoString().getData(); } else*/ { // just get desc from def C4Def *pGoalDef = Game.Defs.ID2Def(idGoal); if (pGoalDef) { strGoalName.Copy(pGoalDef->GetName()); strGoalDesc.Copy(pGoalDef->GetDesc()); } } // get tooltip StdStrBuf sToolTip; if (fFulfilled) sToolTip.Format(LoadResStr("IDS_DESC_GOALFULFILLED"), strGoalName.getData(), strGoalDesc.getData()); else sToolTip.Format(LoadResStr("IDS_DESC_GOALNOTFULFILLED"), strGoalName.getData(), strGoalDesc.getData()); SetToolTip(sToolTip.getData()); // create buffered picture of goal definition C4Def *pDrawDef = Game.Defs.ID2Def(idGoal); if (pDrawDef) { Picture.Create(C4PictureSize, C4PictureSize); // get an object instance to draw (optional; may be zero) C4Object *pGoalObj = Game.Objects.FindInternal(idGoal); // draw goal def! pDrawDef->Draw(Picture, false, 0, pGoalObj); } // unfulfilled goal: grey out picture if (!fFulfilled) Picture.Grayscale(30); }
bool C4MainMenu::ActivateRules(int32_t iPlayer) { // Menu symbol/init char Command[256]; C4FacetSurface fctSymbol; InitRefSym(GfxR->fctMenu.GetPhase(5),LoadResStr("IDS_MENU_CPRULES"),iPlayer); SetAlignment(C4MN_Align_Left | C4MN_Align_Bottom); SetPermanent(false); // Items int32_t cnt; C4ID idGoal; C4Def *pDef; for (cnt=0; (idGoal=::Objects.GetListID(C4D_Rule,cnt)); cnt++) if ((pDef=C4Id2Def(idGoal))) { fctSymbol.Create(C4SymbolSize,C4SymbolSize); pDef->Draw(fctSymbol); sprintf(Command, "Player:Rule:%s", idGoal.ToString()); Add(pDef->GetName(),fctSymbol,Command,C4MN_Item_NoCount,NULL,""); } // Go back to options menu on close SetCloseCommand("ActivateMenu:Main"); // Done return true; }