StdStrBuf C4ObjectList::GetNameList(C4DefList &rDefs) const { int cpos,idcount; C4ID c_id; C4Def *cdef; StdStrBuf Buf; for (cpos=0; (c_id=GetListID(C4D_All,cpos)); cpos++) if ((cdef=rDefs.ID2Def(c_id))) { idcount=ObjectCount(c_id); if (cpos>0) Buf.Append(", "); Buf.AppendFormat("%dx %s",idcount,cdef->GetName()); } return Buf; }
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); }
void C4Menu::DrawElement(C4TargetFacet &cgo) { // inherited (background) typedef C4GUI::Dialog ParentClass; ParentClass::DrawElement(cgo); // Get selected item id C4ID idSelected; C4MenuItem *pItem; if ((pItem = GetSelectedItem())) idSelected = pItem->id; else idSelected = C4ID::None; C4Def *pDef = C4Id2Def(idSelected); // Get item value int32_t iValue = 0; if (pDef) { if (pItem && pItem->fOwnValue) iValue = pItem->iValue; else iValue = pDef->GetValue(NULL, NO_OWNER); } // Store and clear global clipper // int32_t iX1,iY1,iX2,iY2; // pDraw->GetPrimaryClipper(iX1,iY1,iX2,iY2); // pDraw->SubPrimaryClipper(rcBounds.x, rcBounds.y, rcBounds.x+rcBounds.Wdt-1, rcBounds.y+rcBounds.Hgt-1); C4Facet cgoExtra(cgo.Surface, cgo.TargetX+rcBounds.x+1, cgo.TargetY+rcBounds.y+rcBounds.Hgt-C4MN_SymbolSize-1, rcBounds.Wdt-2, C4MN_SymbolSize); // Draw bar divider if (Extra) { DrawFrame(cgoExtra.Surface, cgoExtra.X-1, cgoExtra.Y-1, cgoExtra.Wdt+1, cgoExtra.Hgt+1); } // Draw specified extra switch (Extra) { case C4MN_Extra_Value: { if (pDef) ::GraphicsResource.fctWealth.DrawValue(cgoExtra,iValue,0,0,C4FCT_Right); } break; } }
void c4_mapgen_handle_set_map_library(C4GroupHandle* group_handle) { ::Definitions.Clear(); C4Def* libmap = new C4Def; libmap->id = C4ID(std::string("Library_Map")); libmap->SetName(libmap->id.ToString()); libmap->Category = C4D_StaticBack; FakeSkeletonLoader loader; if(!libmap->Load(*HANDLE_TO_GROUP(group_handle), loader, C4D_Load_Script, NULL, NULL)) { fprintf(stderr, "Failed to load Library_Map script\n"); delete libmap; } else { ::Definitions.Add(libmap, false); } }
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; }
void C4DefGraphicsAdapt::CompileFunc(StdCompiler *pComp) { bool fCompiler = pComp->isCompiler(); // nothing? if (!fCompiler && !pDefGraphics) return; // definition C4ID id; if (!fCompiler) id = pDefGraphics->pDef->id; pComp->Value(id); // go over two separators ("::"). Expect them if an id was found. if (!pComp->Separator(StdCompiler::SEP_PART2) || !pComp->Separator(StdCompiler::SEP_PART2)) pComp->excCorrupt("DefGraphics: expected \"::\""); // compile name StdStrBuf Name; if (!fCompiler) Name = pDefGraphics->GetName(); pComp->Value(mkDefaultAdapt(mkParAdapt(Name, StdCompiler::RCT_Idtf), "")); // reading: search def-graphics if (fCompiler) { // search definition, throw expection if not found C4Def *pDef = ::Definitions.ID2Def(id); // search def-graphics if (!pDef || !( pDefGraphics = pDef->Graphics.Get(Name.getData()) )) pComp->excCorrupt("DefGraphics: could not find graphics \"%s\" in %s(%s)!", Name.getData(), id.ToString(), pDef ? pDef->GetName() : "def not found"); } }
void C4GraphicsOverlay::Draw(C4TargetFacet &cgo, C4Object *pForObj, int32_t iByPlayer) { assert(!IsPicture()); assert(pForObj); // get target pos float offX, offY; float newzoom; pForObj->GetDrawPosition(cgo, offX, offY, newzoom); ZoomDataStackItem zdsi(newzoom); // special blit mode if (dwBlitMode == C4GFXBLIT_PARENT) (OverlayObj ? static_cast<C4Object*>(OverlayObj) : pForObj)->PrepareDrawing(); else { pDraw->SetBlitMode(dwBlitMode); if (dwClrModulation != 0xffffff) pDraw->ActivateBlitModulation(dwClrModulation); if (pMeshInstance) pMeshInstance->SetFaceOrderingForClrModulation(dwClrModulation); } if (eMode == MODE_Rank) { C4TargetFacet ccgo; ccgo.Set(cgo.Surface, offX+pForObj->Shape.x,offY+pForObj->Shape.y,pForObj->Shape.Wdt,pForObj->Shape.Hgt, cgo.TargetX, cgo.TargetY); DrawRankSymbol(ccgo, OverlayObj); } // drawing specific object? else if (OverlayObj) { // TODO: Shouldn't have called PrepareDrawing/set ClrModulation here, since // OverlayObj drawing will do it on its own. if (eMode == MODE_ObjectPicture) { C4Facet fctTarget; fctTarget.Set(cgo.Surface, offX+pForObj->Shape.x, offY+pForObj->Shape.y, pForObj->Shape.Wdt, pForObj->Shape.Hgt); OverlayObj->DrawPicture(fctTarget, false, &C4DrawTransform(Transform, fctTarget.X+float(fctTarget.Wdt)/2, fctTarget.Y+float(fctTarget.Hgt)/2)); } else { // Draw specified object at target pos of this object; offset by transform. OverlayObj->Draw(cgo, iByPlayer, C4Object::ODM_Overlay, offX + Transform.GetXOffset(), offY + Transform.GetYOffset()); OverlayObj->DrawTopFace(cgo, iByPlayer, C4Object::ODM_Overlay, offX + Transform.GetXOffset(), offY + Transform.GetYOffset()); } } else if (eMode == MODE_ExtraGraphics) { // draw self with specified gfx if (pSourceGfx) { C4DefGraphics *pPrevGfx = pForObj->GetGraphics(); C4DrawTransform *pPrevTrf = pForObj->pDrawTransform; C4DrawTransform trf; if (pPrevTrf) { trf = *pPrevTrf; trf *= Transform; } else { trf = Transform; } pForObj->SetGraphics(pSourceGfx, true); pForObj->pDrawTransform = &trf; pForObj->Draw(cgo, iByPlayer, C4Object::ODM_BaseOnly); pForObj->DrawTopFace(cgo, iByPlayer, C4Object::ODM_BaseOnly); pForObj->SetGraphics(pPrevGfx, true); pForObj->pDrawTransform = pPrevTrf; } } else if(eMode == MODE_Picture || eMode == MODE_IngamePicture) { float twdt, thgt; if (fZoomToShape) { twdt = pForObj->Shape.Wdt; thgt = pForObj->Shape.Hgt; } else { twdt = pSourceGfx->pDef->Shape.Wdt; thgt = pSourceGfx->pDef->Shape.Hgt; } C4TargetFacet ccgo; ccgo.Set(cgo.Surface, offX-twdt/2, offY-thgt/2, twdt, thgt, cgo.TargetX, cgo.TargetY); C4DrawTransform trf(Transform, offX, offY); // Don't set pForObj because we don't draw the picture of pForObj, but the picture of another definition on top of pForObj: pSourceGfx->Draw(ccgo, pForObj->Color, NULL, iPhase, 0, &trf); } else { // no object specified: Draw from fctBlit // update by object color if (fctBlit.Surface) fctBlit.Surface->SetClr(pForObj->Color); if (!pMeshInstance) { // draw there C4DrawTransform trf(Transform, offX, offY); if (fZoomToShape) { float fZoom = std::min(pForObj->Shape.Wdt / std::max(fctBlit.Wdt, 1.0f), pForObj->Shape.Hgt / std::max(fctBlit.Hgt, 1.0f)); trf.ScaleAt(fZoom, fZoom, offX, offY); } fctBlit.DrawT(cgo.Surface, offX - fctBlit.Wdt/2 + fctBlit.TargetX, offY - fctBlit.Hgt/2 + fctBlit.TargetY, iPhase, 0, &trf); } else { C4Def *pDef = pSourceGfx->pDef; // draw there C4DrawTransform trf(Transform, offX, offY); if (fZoomToShape) { float fZoom = std::min((float)pForObj->Shape.Wdt / std::max(pDef->Shape.Wdt, 1), (float)pForObj->Shape.Hgt / std::max(pDef->Shape.Hgt, 1)); trf.ScaleAt(fZoom, fZoom, offX, offY); } C4Value value; pDef->GetProperty(P_MeshTransformation, &value); StdMeshMatrix matrix; if (C4ValueToMatrix(value, &matrix)) pDraw->SetMeshTransform(&matrix); pDraw->RenderMesh(*pMeshInstance, cgo.Surface, offX - pDef->Shape.Wdt/2.0, offY - pDef->Shape.Hgt/2.0, pDef->Shape.Wdt, pDef->Shape.Hgt, pForObj->Color, &trf); pDraw->SetMeshTransform(NULL); } } // cleanup if (dwBlitMode == C4GFXBLIT_PARENT) (OverlayObj ? static_cast<C4Object*>(OverlayObj) : pForObj)->FinishedDrawing(); else { pDraw->ResetBlitMode(); pDraw->DeactivateBlitModulation(); } }
void C4GraphicsOverlay::UpdateFacet() { // special: Nothing to update for object and pSourceGfx may be NULL // If there will ever be something to init here, UpdateFacet() will also need to be called when objects have been loaded if (eMode == MODE_Object) return; // otherwise, source graphics must be specified if (!pSourceGfx) return; C4Def *pDef = pSourceGfx->pDef; assert(pDef); fZoomToShape = false; // Clear old mesh instance, if any delete pMeshInstance; pMeshInstance = NULL; // update by mode switch (eMode) { case MODE_None: break; case MODE_Base: // def base graphics if (pSourceGfx->Type == C4DefGraphics::TYPE_Bitmap) fctBlit.Set(pSourceGfx->GetBitmap(), 0, 0, pDef->Shape.Wdt, pDef->Shape.Hgt, pDef->Shape.x+pDef->Shape.Wdt/2, pDef->Shape.y+pDef->Shape.Hgt/2); else if (pSourceGfx->Type == C4DefGraphics::TYPE_Mesh) pMeshInstance = new StdMeshInstance(*pSourceGfx->Mesh, 1.0f); break; case MODE_Action: // graphics of specified action { // Clear old facet fctBlit.Default(); // Ensure there is actually an action set if (!Action[0]) return; C4Value v; pDef->GetProperty(P_ActMap, &v); C4PropList *actmap = v.getPropList(); if (!actmap) return; actmap->GetPropertyByS(::Strings.RegString(Action), &v); C4PropList *action = v.getPropList(); if (!action) return; if (pSourceGfx->Type == C4DefGraphics::TYPE_Bitmap) { fctBlit.Set(pSourceGfx->GetBitmap(), action->GetPropertyInt(P_X), action->GetPropertyInt(P_Y), action->GetPropertyInt(P_Wdt), action->GetPropertyInt(P_Hgt)); // FIXME: fctBlit.TargetX has to be set here } else if (pSourceGfx->Type == C4DefGraphics::TYPE_Mesh) { C4String* AnimationName = action->GetPropertyStr(P_Animation); if (!AnimationName) return; pMeshInstance = new StdMeshInstance(*pSourceGfx->Mesh, 1.0f); const StdMeshAnimation* Animation = pSourceGfx->Mesh->GetSkeleton().GetAnimationByName(AnimationName->GetData()); if (!Animation) return; pMeshInstance->PlayAnimation(*Animation, 0, NULL, new C4ValueProviderRef<int32_t>(iPhase, ftofix(Animation->Length / action->GetPropertyInt(P_Length))), new C4ValueProviderConst(itofix(1)), true); } break; } case MODE_ObjectPicture: // ingame picture of object // calculated at runtime break; case MODE_IngamePicture: case MODE_Picture: // def picture fZoomToShape = true; // drawn at runtime break; case MODE_ExtraGraphics: // like ColorByOwner-sfc // calculated at runtime break; case MODE_Rank: // drawn at runtime break; case MODE_Object: // TODO break; } }
void C4ConsoleQtDefinitionListModel::ReInit() { // Re-fill definition model with all loaded definitions matching condition // (TODO: Add conditional lists) root = std::make_unique<C4ConsoleQtDefinitionListModel::DefListNode>(); int32_t index = 0; C4Def *def; while ((def = ::Definitions.GetDef(index++))) { // Ignore hidden defs if (def->HideInCreator) continue; // Build path leading to this definition DefListNode *node_parent = root.get(); StdCopyStrBuf fn(def->Filename), fn2; StdCopyStrBuf fn_full; fn.ReplaceChar(AltDirectorySeparator, DirectorySeparator); for (;;) { bool is_parent_folder = fn.SplitAtChar(DirectorySeparator, &fn2); if (fn_full.getLength()) { fn_full.AppendChar(DirectorySeparator); } fn_full.Append(fn); if (!is_parent_folder || WildcardMatch(C4CFN_DefFiles, fn.getData())) // ignore non-.ocd-folders (except for final definition) { // Find if path is already there RemoveExtension(&fn); DefListNode *node_child = nullptr; for (auto &test_node_child : node_parent->items) if (test_node_child->filename == fn) { node_child = &*test_node_child; break; } // If not, create it if (!node_child) { node_parent->items.emplace_back((node_child = new DefListNode())); node_child->idx = node_parent->items.size() - 1; node_child->parent = node_parent; const char *localized_name = ::Definitions.GetLocalizedGroupFolderName(fn_full.getData()); node_child->name.Copy(localized_name ? localized_name : fn.getData()); node_child->filename.Copy(fn); } // And fill in node if this is not a parent folder if (!is_parent_folder) { node_child->def = def; const char *def_name = def->GetName(); if (def_name && *def_name) node_child->name.Copy(def_name); break; } else { // Parent folder: Next path segment node_parent = node_child; } } fn = fn2; } } // Descend into singleton root classes. I.e. if all elements are children of Objects/Items, move the root in there. DefListNode *new_root = root.get(); while (new_root->items.size() == 1 && !new_root->items[0]->def) { std::unique_ptr<DefListNode> tmp(new_root->items[0].release()); root.reset(tmp.release()); new_root = root.get(); } root->parent = nullptr; // Copy group path names into definitions for later lookup by script QStringList group_names; DefListNode *node = root.get(); while (node) { if (node->def) { node->def->ConsoleGroupPath.Copy(group_names.join('/').toUtf8()); } // Walk over tree. Remember groups in group_names string list. if (!node->items.empty()) { if (node != root.get()) group_names.append(node->name.getData()); node = node->items[0].get(); } else { int32_t idx = node->idx + 1; while ((node = node->parent)) { if (node->items.size() > idx) { node = node->items[idx].get(); break; } if (group_names.size()) group_names.pop_back(); idx = node->idx + 1; } } } // Sort everything by display name (recursively) root->SortByName(); // Model reset to invalidate all indexes beginResetModel(); endResetModel(); }