65 C4MapFolderData::MapPic::MapPic(
const FLOAT_RECT &rcfBounds,
const C4Facet &rfct) :
C4GUI::Picture(
C4Rect(rcfBounds), false), rcfBounds(rcfBounds)
72 void C4MapFolderData::MapPic::MouseInput(
C4GUI::CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY,
DWORD dwKeyParam)
75 Parent::MouseInput(rMouse, iButton, iX, iY, dwKeyParam);
93 fCoordinatesAdjusted =
false;
94 fctBackgroundPicture.
Clear();
95 pScenarioFolder =
nullptr;
96 pSelectedEntry =
nullptr;
97 pSelectionInfoBox =
nullptr;
98 rcScenInfoArea.
Set(0,0,0,0);
100 fUseFullscreenMap=
false;
102 for (i=0; i<iScenCount; ++i)
delete ppScenList[i];
104 delete [] ppScenList; ppScenList=
nullptr;
105 for (i=0; i<iAccessGfxCount; ++i)
delete ppAccessGfxList[i];
107 delete [] ppAccessGfxList; ppAccessGfxList=
nullptr;
133 for (i=0; i<iScenCount; ++i)
136 Scenario *pScen = ppScenList[i];
137 pScen->pScenEntry = pScenLoaderFolder->
FindEntryByName(pScen->sFilename.getData());
138 pScen->pBtn =
nullptr;
139 pScen->sTitle.Replace(
"TITLE", pScen->pScenEntry ? pScen->pScenEntry->GetName().getData() :
"<c ff0000>ERROR</c>" );
147 (
float) pScen->rcOverlayPos.x, (
float) pScen->rcOverlayPos.y,
148 (
float) pScen->rcOverlayPos.
Wdt, (
float) pScen->rcOverlayPos.Hgt,
151 fctDump.
Wdt, fctDump.
Hgt);
152 fSuccess = fctDump.
Surface->
SavePNG(pScen->sBaseImage.getData(),
true,
false,
false);
155 DebugLogF(R
"(C4MapFolderData::Load(%s): Could not dump graphic "%s")", hGroup.GetName(), pScen->sBaseImage.getData());
159 if (pScen->sBaseImage.getLength()>0)
if (!pScen->fctBase.Load(hGroup, pScen->sBaseImage.getData(),
C4FCT_Full,
C4FCT_Full,
false, 0))
161 DebugLogF(R
"(C4MapFolderData::Load(%s): Could not load base graphic "%s")", hGroup.GetName(), pScen->sBaseImage.getData());
164 if (pScen->sOverlayImage.getLength()>0)
if (!pScen->fctOverlay.Load(hGroup, pScen->sOverlayImage.getData(),
C4FCT_Full,
C4FCT_Full,
false, 0))
166 DebugLogF(R
"(C4MapFolderData::Load(%s): Could not load graphic "%s")", hGroup.GetName(), pScen->sOverlayImage.getData());
170 for (i=0; i<iAccessGfxCount; ++i)
172 AccessGfx *pGfx= ppAccessGfxList[i];
173 if (pGfx->sOverlayImage.getLength()>0)
if (!pGfx->fctOverlay.Load(hGroup, pGfx->sOverlayImage.getData(),
C4FCT_Full,
C4FCT_Full,
false, 0))
175 DebugLogF(R
"(C4MapFolderData::Load(%s): Could not load graphic "%s")", hGroup.GetName(), pGfx->sOverlayImage.getData());
180 pScenarioFolder = pScenLoaderFolder;
192 int32_t iOldScenCount = iScenCount;
196 while (iOldScenCount--)
delete ppScenList[iOldScenCount];
197 delete [] ppScenList;
200 ppScenList =
new Scenario *[iScenCount];
201 memset(ppScenList, 0,
sizeof(Scenario *)*iScenCount);
204 ppScenList =
nullptr;
212 int32_t iOldAccesGfxCount = iAccessGfxCount;
216 while (iOldAccesGfxCount--)
delete ppAccessGfxList[iOldAccesGfxCount];
217 delete [] ppAccessGfxList;
220 ppAccessGfxList =
new AccessGfx *[iAccessGfxCount];
221 memset(ppAccessGfxList, 0,
sizeof(AccessGfx *)*iAccessGfxCount);
224 ppAccessGfxList =
nullptr;
233 void C4MapFolderData::ConvertFacet2ScreenCoord(
const C4Rect &rc,
FLOAT_RECT *pfrc,
float fBGZoomX,
float fBGZoomY,
int iOffX,
int iOffY)
235 pfrc->
left = (fBGZoomX * rc.
x) + iOffX;
236 pfrc->
top = (fBGZoomY * rc.
y) + iOffY;
241 void C4MapFolderData::ConvertFacet2ScreenCoord(int32_t *piValue,
float fBGZoom,
int iOff)
243 *piValue = int32_t(floorf(fBGZoom * *piValue + 0.5f)) + iOff;
246 void C4MapFolderData::ConvertFacet2ScreenCoord(
C4Rect &rcMapArea,
bool fAspect)
248 if (!fctBackgroundPicture.
Wdt || !fctBackgroundPicture.
Hgt)
return;
250 float fBGZoomX = 1.0f, fBGZoomY = 1.0f;
int iOffX=0, iOffY=0;
253 if (fctBackgroundPicture.
Wdt * rcMapArea.
Hgt > rcMapArea.
Wdt * fctBackgroundPicture.
Hgt)
256 fBGZoomX = fBGZoomY = (float) rcMapArea.
Wdt / fctBackgroundPicture.
Wdt;
257 iOffY = std::max<int>(0, (
int)(rcMapArea.
Hgt - (fBGZoomX * fctBackgroundPicture.
Hgt)))/2;
262 fBGZoomX = fBGZoomY = (float) rcMapArea.
Hgt / fctBackgroundPicture.
Hgt;
263 iOffX = std::max<int>(0, (
int)(rcMapArea.
Wdt - (fBGZoomY * fctBackgroundPicture.
Wdt)))/2;
269 fBGZoomX = (float) rcMapArea.
Wdt / fctBackgroundPicture.
Wdt;;
270 fBGZoomY = (
float) rcMapArea.
Hgt / fctBackgroundPicture.
Hgt;;
272 iOffX -= rcMapArea.
x; iOffY -= rcMapArea.
y;
273 C4Rect rcBG; rcBG.
Set(0,0,fctBackgroundPicture.
Wdt, fctBackgroundPicture.
Hgt);
274 ConvertFacet2ScreenCoord(rcBG, &rcfBG, fBGZoomX, fBGZoomY, iOffX, iOffY);
276 if (!rcScenInfoArea.
Wdt)
277 rcScenInfoArea.
Set((int32_t)(fctBackgroundPicture.
Wdt*2/3), (int32_t)(fctBackgroundPicture.
Hgt/16), (int32_t)(fctBackgroundPicture.
Wdt/3), (int32_t)(fctBackgroundPicture.
Hgt*7/8));
280 ConvertFacet2ScreenCoord(rcScenInfoArea, &rcfScenInfoArea, fBGZoomX, fBGZoomY, iOffX, iOffY);
281 rcScenInfoArea.
x = (int32_t) rcfScenInfoArea.
left; rcScenInfoArea.
y = (int32_t) rcfScenInfoArea.
top;
282 rcScenInfoArea.
Wdt = (int32_t) (rcfScenInfoArea.
right - rcfScenInfoArea.
left);
283 rcScenInfoArea.
Hgt = (int32_t) (rcfScenInfoArea.
bottom - rcfScenInfoArea.
top);
285 for (i=0; i<iScenCount; ++i)
287 Scenario *pScen = ppScenList[i];
288 ConvertFacet2ScreenCoord(pScen->rcOverlayPos, &(pScen->rcfOverlayPos), fBGZoomX, fBGZoomY, iOffX, iOffY);
290 ConvertFacet2ScreenCoord(&(pScen->iTitleFontSize), fBGZoomY, 0);
292 ConvertFacet2ScreenCoord(&(pScen->iTitleOffX), fBGZoomX, 0);
293 ConvertFacet2ScreenCoord(&(pScen->iTitleOffY), fBGZoomY, 0);
295 for (i=0; i<iAccessGfxCount; ++i) ConvertFacet2ScreenCoord(ppAccessGfxList[i]->rcOverlayPos, &(ppAccessGfxList[i]->rcfOverlayPos), fBGZoomX, fBGZoomY, iOffX, iOffY);
297 fCoordinatesAdjusted =
true;
302 this->pMainDlg = pMainDlg;
305 if (!fCoordinatesAdjusted)
307 if (!fUseFullscreenMap)
313 ConvertFacet2ScreenCoord(rcMapRect,
false);
319 if (!fUseFullscreenMap)
320 rContainer.
AddElement(
new MapPic(rcfBG, fctBackgroundPicture));
327 for (i=0; i<iAccessGfxCount; ++i)
329 AccessGfx *pGfx = ppAccessGfxList[i];
330 const char *szPassword = pGfx->sPassword.getData();
334 rContainer.
AddElement(
new MapPic(pGfx->rcfOverlayPos, pGfx->fctOverlay));
339 for (i=0; i<iScenCount; ++i)
341 Scenario *pScen = ppScenList[i];
342 if (pScen->pScenEntry && !pScen->pScenEntry->HasMissionAccess())
350 ppScenList[i]->pBtn = pBtn;
351 if (pScen->pScenEntry)
353 if (pScen->sTitle.getLength()>0)
355 pBtn->
SetText(pScen->sTitle.getData());
356 pBtn->SetTextColors(pScen->dwTitleInactClr, pScen->dwTitleActClr);
357 pBtn->SetTextPos(pScen->iTitleOffX, pScen->iTitleOffY, pScen->byTitleAlign);
358 CStdFont *pUseFont;
float fFontZoom=1.0f;
359 if (pScen->fTitleBookFont)
363 if (Inside<float>(fFontZoom, 0.8f, 1.25f)) fFontZoom = 1.0f;
364 pBtn->SetTextFont(pUseFont, fFontZoom);
367 if (!pBtnFirst) pBtnFirst = pBtn;
382 for (i=0; i<iScenCount; ++i)
383 if (pEl == ppScenList[i]->pBtn)
385 if (i == iScenCount)
return;
387 pSelectedEntry = ppScenList[i]->pScenEntry;
392 pSelectedEntry =
nullptr;
421 Entry **ppCheck = &(pParent->pFirst);
422 while (*ppCheck !=
this)
424 ppCheck = &(*ppCheck)->
pNext;
434 if (fBaseLoaded && (fExLoaded || !fLoadEx))
return true;
447 if (psFilename) this->sFilename.Copy(*psFilename);
449 if (!Group.
Open(sFilename.getData()))
return false;
452 bool fNameLoaded=
false, fIconLoaded=
false;
455 fNameLoaded = fIconLoaded =
true;
461 char *szBuf = sName.GrabPointer();
465 if (!LoadCustomPre(Group))
482 for (
int y=0; y<fctTemp.
Hgt; ++y)
483 for (
int x=0; x<fctTemp.
Wdt; ++x)
487 if (Inside<uint8_t>(dwPix & 0xff, 0xb8, 0xff))
488 if (Inside<uint8_t>((dwPix>>0x08) & 0xff, 0x00, 0x0f))
489 if (Inside<uint8_t>((dwPix>>0x10) & 0xff, 0xb8, 0xff))
496 fctTemp.
Draw(fctIcon.Surface, (fctIcon.Wdt-fctTemp.
Wdt)/2, (fctIcon.Hgt-fctTemp.
Hgt)/2);
502 if (!LoadCustom(Group, fNameLoaded, fIconLoaded))
return false;
506 if (fLoadEx && !fExLoaded)
534 const char *szChildFilename;
535 for (; (szChildFilename = **pIter); ++*pIter)
546 return !!szChildFilename;
552 const char *szFilename = sFilename.
getData();
553 if (!szFilename || !*szFilename)
return nullptr;
563 if (std::strncmp(szFilename, modsDirectoryPrefix, std::strlen(modsDirectoryPrefix) - 1) == 0)
577 if (!szNewName || !*szNewName)
return false;
578 if (
SEqual(szNewName, sName.getData()))
return true;
583 if (!*fn)
return false;
584 const char *szExt = GetDefaultExtension();
608 sFilename.Copy(fullfn);
614 if (!Grp.
Open(fullfn))
626 if (!SetTitleInGroup(Grp, szNewName))
return false;
635 sName.Copy(szNewName);
649 sNameByFile.
Take(szBuf);
678 if (!C4S.Head.SaveGame && !C4S.Head.Replay)
685 ParameterDefs.Load(rGrp, &ScenarioLangStringTable);
688 const C4ScenarioParameterDefs *deflists[] = { pParent ? pParent->GetAchievementDefs() :
nullptr, &ParameterDefs };
689 for (
auto deflist : deflists)
691 if (!deflist)
continue;
693 while ((def = deflist->GetParameterDefByIndex(idx++)))
703 sAchievementFilename.
Replace(
"*", achievement_gfx);
710 if (pParent && (parent_achv_gfx = pParent->GetAchievementGfx())) fct = parent_achv_gfx->
FindByName(achievement_gfx);
714 fctAchievements[nAchievements].
Set((
const C4Facet &)*fct);
717 if (val>1) fctAchievements[nAchievements].X += fctAchievements[nAchievements].Wdt * (val-1);
720 if (opt) sAchievementDescriptions[nAchievements] = opt->
Description;
737 iIconIndex = C4S.Head.Icon;
738 fctIcon.Set(
C4Startup::Get()->Graphics.fctScenSelIcons.GetSection(C4S.Head.Icon));
742 sName = C4S.Head.Title;
744 if (!C4S.Head.SaveGame && !C4S.Head.Replay)
745 iDifficulty = C4S.Head.Difficulty;
749 iMinPlrCount = C4S.GetMinPlayer();
756 if (idx < 0 || idx >= nAchievements)
return false;
757 *out_facet = fctAchievements[idx];
758 *out_description = sAchievementDescriptions[idx].getData();
773 if (!pDlg)
return false;
775 if (!HasMissionAccess())
795 int32_t iMaxPlrCount = C4S.Head.MaxPlayer;
796 if (C4S.Head.SaveGame)
800 iMaxPlrCount = std::max<int32_t>(iMinPlrCount, iMaxPlrCount);
803 if (C4S.Head.C4XVer[0] != C4XVER1 || C4S.Head.C4XVer[1] != C4XVER2)
806 sErrOut.
Format(
LoadResStr(
"IDS_MSG_SAVEGAMEVERSIONMISMATCH"), C4S.Head.C4XVer[0], C4S.Head.C4XVer[1]);
812 if ((iPlrCount < iMinPlrCount))
829 if (iPlrCount > iMaxPlrCount)
831 sErrOut.
Format(
LoadResStr(
"IDS_MSG_TOOMANYPLAYERS"), (
int) C4S.Head.MaxPlayer);
855 if (pMapData)
delete pMapData;
874 if (fS1 != fS2)
return fS1-fS2;
879 if (!pEntry2->GetFolderIndex())
return -1;
880 int32_t iDiff = pEntry1->
GetFolderIndex() - pEntry2->GetFolderIndex();
881 if (iDiff)
return iDiff;
886 int32_t iDiff = pEntry1->
GetIconIndex() - pEntry2->GetIconIndex();
887 if (iDiff)
return iDiff;
893 if (!pEntry2->GetDifficulty())
return -1;
894 int32_t iDiff = pEntry1->
GetDifficulty() - pEntry2->GetDifficulty();
895 if (iDiff)
return iDiff;
904 for (
Entry *i = pFirst; i; i = i->
pNext) ++iCount;
913 Entry **ppEntries =
new Entry *[i = iCount = GetEntryCount()], **ppI, *pI=pFirst, **ppIThis;
914 for (ppI = ppEntries; i--; pI = pI->
pNext) *ppI++ = pI;
917 for (ppI = ppEntries; iCount--; ppIThis = &((*ppIThis)->pNext)) *ppIThis = *ppI++;
925 Folder *pDelFolder =
this, *pCheckFolder;
930 while ((pChild = pDelFolder->
pFirst))
933 pDelFolder = pCheckFolder;
939 if (pDelFolder ==
this)
break;
941 pDelFolder = (pCheckFolder = pDelFolder)->pParent;
950 if (fContentsLoaded && !fReload)
return true;
952 if (pMapData) {
delete pMapData; pMapData =
nullptr; }
954 if (!psFilename) psFilename = &this->sFilename;
else this->sFilename = *psFilename;
956 if (!DoLoadContents(pLoader, pFromGrp, *psFilename, fLoadEx))
return false;
965 for (
Entry *pEntry = pFirst; pEntry; pEntry = pEntry->
GetNext())
1007 fctIcon.Set(
C4Startup::Get()->Graphics.fctScenSelIcons.GetSection(iIconIndex));
1010 iFolderIndex = C4F.Head.Index;
1027 if (!Group.
Open(sFilename.
getData()))
return false;
1031 AchievementDefs.Load(Group, &FolderLangStringTable);
1032 AchievementGfx.Init(Group);
1035 const char *szSearchMask; int32_t iEntryCount=0;
1036 for (szSearchMask = szC4CFN_ScenarioFiles; szSearchMask;)
1041 if (szSearchMask == szC4CFN_ScenarioFiles)
1044 szSearchMask =
nullptr;
1050 for (szSearchMask = szC4CFN_ScenarioFiles; szSearchMask;)
1056 if (!pLoader->
DoProcessCallback(iLoadCount, iEntryCount, ChildFilename))
return false;
1057 sChildFilename.
Ref(ChildFilename);
1063 if (!pNewEntry->
Load(&Group, &sChildFilename, fLoadEx))
1072 if (szSearchMask == szC4CFN_ScenarioFiles)
1075 szSearchMask =
nullptr;
1081 if (!pMapData->Load(Group,
this))
1089 fContentsLoaded =
true;
1105 iFolderIndex = C4F.Head.Index;
1115 if (sFilename.
getData() && sFilename[0])
1119 int32_t iCountLoaded=0, iCountTotal=0;
1120 NameList::iterator it;
1121 for (it = contents.begin(); it != contents.end(); ++it)
1125 const char *szChildFilename;
1126 for (; (szChildFilename = *DirIter); ++DirIter)
1128 if (!*szChildFilename || *
GetFilename(szChildFilename)==
'.')
continue;
1133 if (!pLoader->
DoProcessCallback(iCountLoaded, iCountTotal,
nullptr))
return false;
1136 std::set<std::string> names;
1137 const char *szChildFilename;
1138 for (it = contents.begin(); it != contents.end(); ++it)
1141 for (
DirectoryIterator DirIter(it->c_str()); (szChildFilename = *DirIter); ++DirIter)
1143 StdStrBuf sChildFilename(szChildFilename);
1146 if (!pLoader->
DoProcessCallback(iCountLoaded, iCountTotal, szChildFilename))
return false;
1149 if (names.find(szChildFilename) != names.end())
continue;
1150 names.insert(szChildFilename);
1156 if (!pNewEntry->
Load(
nullptr, &sChildFilename, fLoadEx))
1158 DebugLogF(R
"(Error loading entry "%s" in Folder "%s"!)", szChildFilename, it->c_str());
1166 fContentsLoaded =
true;
1172 contents.emplace_back(szPath);
1179 iLoading(0), iProgress(0), iMaxProgress(0), fAbortThis(false), fAbortPrevious(false)
1185 if (pRootFolder)
delete pRootFolder;
1188 bool C4ScenarioListLoader::BeginActivity(
bool fAbortPrevious)
1191 if (iLoading && fAbortPrevious)
1192 this->fAbortPrevious =
true;
1196 iProgress = iMaxProgress = 0;
1197 current_load_info.
Clear();
1202 void C4ScenarioListLoader::EndActivity()
1209 fAbortPrevious =
false;
1210 iProgress = iMaxProgress = 0;
1211 current_load_info.
Clear();
1216 fAbortThis = fAbortPrevious;
1222 this->iProgress = iProgress;
1223 this->iMaxProgress = iMaxProgress;
1224 this->current_load_info.Copy(current_load_info);
1241 if (!BeginActivity(
true))
return false;
1242 if (pRootFolder) {
delete pRootFolder; pRootFolder =
nullptr; }
1243 pCurrFolder = pRootFolder =
new RegularFolder(
this,
nullptr);
1246 for(
const auto & iter :
Reloc)
1247 pRootFolder->
Merge(iter.strBuf.getData());
1248 bool fSuccess = pRootFolder->
LoadContents(
this,
nullptr, &sRootFolder,
false,
false);
1256 if (!pRootFolder || !pSpecifiedFolder)
return false;
1258 if (!BeginActivity(
true))
return false;
1259 pCurrFolder = pSpecifiedFolder;
1260 bool fSuccess = pCurrFolder->
LoadContents(
this,
nullptr,
nullptr,
false, fReload);
1268 if (!pRootFolder || !pEntry)
return false;
1270 if (!BeginActivity(
false))
return false;
1271 bool fSuccess = pEntry->
Load(
nullptr,
nullptr,
true);
1279 if (!pRootFolder || !pCurrFolder)
return false;
1281 if (pCurrFolder == pRootFolder)
return false;
1289 if (!pRootFolder || !pCurrFolder)
return false;
1291 return Load(pCurrFolder,
true);
1311 : pIcon(nullptr), pNameLabel(nullptr), pScenListEntry(pForEntry)
1313 assert(pScenListEntry);
1316 bool fEnabled = pScenListEntry->
CanOpen(sIgnore, bIgnore) && !pScenListEntry->
IsGrayed();
1318 int32_t iHeight = rUseFont.
GetLineHeight() + 2 * IconLabelSpacing;
1326 C4Facet fct;
const char *desc;
1335 ppAchievements[i] =
nullptr;
1342 for (
auto & ppAchievement : ppAchievements)
if (ppAchievement)
AddElement(ppAchievement);
1358 ParentClass::UpdateOwnPos();
1361 for (
auto & ppAchievement : ppAchievements)
if (ppAchievement)
1372 BaseClass::MouseInput(rMouse, iButton, iX, iY, dwKeyParam);
1380 if (!pScenListEntry)
return false;
1381 const char *szName = pScenListEntry->GetName().getData();
1382 return szName && (toupper(*szName) == toupper(c[0]));
1403 pNameLabel->SetText(GetEntry()->GetName().getData());
1424 int32_t iButtonWidth,iCaptionFontHgt;
1440 pScenSelStyleTabular->
AddSheet(
nullptr);
1452 const char *labelText =
LoadResStr(
"IDS_DLG_SEARCH");
1453 int32_t width = 100;
1458 searchLabel->SetToolTip(
LoadResStr(
"IDS_DLGTIP_SEARCHLIST"));
1474 pSheetBook->
AddElement(pScenSelProgressLabel);
1476 pSheetBook->
AddElement(pScenSelProgressInfoLabel);
1480 const int32_t AvailWidth = bounds.
Wdt;
1481 const int32_t AvailHeight = 2 * bounds.
Hgt / 5;
1539 if (pScenLoader)
delete pScenLoader;
1560 UpdateAchievements();
1562 fIsInitialLoading =
true;
1567 fIsInitialLoading =
false;
1579 pScenLoader =
nullptr;
1592 void C4StartupScenSelDlg::UpdateList()
1597 pScenSelStyleTabular->
SelectSheet(ShowStyle_Book,
false);
1601 pfctBackground =
nullptr;
1607 while ((pEl = pScenSelList->
GetFirst()))
delete pEl;
1610 if (!pScenLoader)
return;
1629 pScenSelStyleTabular->
SelectSheet(ShowStyle_Map,
false);
1637 if (pEnt->IsHidden())
continue;
1641 if (pEnt == pOldSelection) pScenSelList->
SelectEntry(pEntItem,
false);
1643 else if (pEnt == pOldSelection)
1645 pOldSelection =
nullptr;
1662 void C4StartupScenSelDlg::ResortFolder()
1665 if (!pScenLoader || pScenLoader->
IsLoading())
return;
1667 if (!pFolder)
return;
1672 void C4StartupScenSelDlg::UpdateSelection()
1680 SetOpenButtonDefaultText();
1712 SetOpenButtonDefaultText();
1726 pSelectionOptions->
Update();
1739 rcSelBounds.
Hgt = ymax - options_hgt - rcSelBounds.
y;
1741 rcSelBounds.
y = ymax - options_hgt;
1742 rcSelBounds.
Hgt = options_hgt;
1743 pSelectionOptions->
SetBounds(rcSelBounds);
1750 rcSelBounds.
Hgt = ymax - rcSelBounds.
y;
1767 return pSel ? pSel->GetEntry() :
nullptr;
1773 if (!pStartScen)
return false;
1801 if (!pScenLoader)
return false;
1803 bool fSuccess = pScenLoader->
Load(pNewFolder,
false);
1806 if (!pMapData)
SetFocus(pScenSelList,
false);
1815 if (!pSel)
return false;
1818 bool CanHide =
false;
1819 if (!pSel->
CanOpen(sError, CanHide))
1832 return pSel->
Start();
1839 if (pScenLoader && pScenLoader->
FolderBack())
1847 if (pScenLoader && pScenLoader->
IsLoading())
return false;
1859 if (pScenLoader && !pScenLoader->
IsLoading())
1868 void C4StartupScenSelDlg::SetOpenButtonDefaultText()
1877 if (pMapData)
return false;
1882 if (!pSel)
return false;
1889 if (pMapData)
return false;
1894 if (!pSel)
return false;
1931 const char *szPass = rsCheatCode.
getPtr(1);
1932 if (szPass && *szPass)
1942 const char *szPass = rsCheatCode.
getPtr(0);
1943 if (szPass && *szPass)
1953 void C4StartupScenSelDlg::FocusScenList()
1961 if (!pMapData || !pEl)
return;
1964 pSel2 = GetSelectedEntry();
1965 if (pSel && pSel==pSel2)
1987 pRenameEdit = pNewRenameEdit;
1992 if (pRenameEdit) pRenameEdit->
Abort();
1995 void C4StartupScenSelDlg::UpdateAchievements()
1998 Achievements.
Clear();
2005 if (!PlayerGrp.
Open(szPlayerFilename))
continue;
2007 if (!nfo.
Load(PlayerGrp))
continue;
2014 if (pSelectionOptions) pSelectionOptions->
Update();
#define C4CFN_GenericGroupFiles
#define C4CFN_ScenarioParameterDefs
#define C4CFN_AnyScriptStringTbl
#define C4CFN_ScenarioTitle
#define C4CFN_ScriptStringTbl
#define C4CFN_MapFolderBG
#define C4CFN_Achievements
#define C4CFN_ScenarioIcon
#define C4CFN_ScenarioDesc
#define C4CFN_ScenarioCore
#define C4CFN_ScenarioFiles
#define C4CFN_MapFolderData
#define C4CFN_FolderFiles
C4Application Application
C4GraphicsResource GraphicsResource
bool C4Group_MoveItem(const char *source, const char *target, bool no_sorting)
bool C4Group_DeleteItem(const char *item_name, bool do_recycle)
bool C4Group_TestIgnore(const char *filename)
bool C4Group_IsGroup(const char *filename)
#define C4GUI_Caption2FontClr
const char * LoadResStrNoAmp(const char *id)
const char * LoadResStr(const char *id)
bool DebugLogF(const char *strMessage ...)
const int32_t C4MC_Button_LeftDown
void CompileFunc(C4Real &rValue, StdCompiler *pComp)
int EntrySortFunc(const void *pEl1, const void *pEl2)
const uint32_t ClrScenarioItemXtra
bool DirContainsScenarios(const char *szDir)
const uint32_t ClrScenarioItem
const uint32_t ClrScenarioItemDisabled
const int32_t C4StartupScenSel_DefaultIcon_WinFolder
const int32_t C4StartupScenSel_DefaultIcon_OldIconBG
const int32_t C4StartupScenSel_TitlePictureWdt
const int32_t C4StartupScenSel_DefaultIcon_Folder
const int32_t C4StartupScenSel_TitlePicturePadding
const int32_t C4StartupScenSel_TitlePictureHgt
const int32_t C4StartupScenSel_TitleOverlayMargin
const int32_t C4StartupScenSel_DefaultIcon_SavegamesFolder
const int32_t C4StartupScenSel_MaxAchievements
bool SEqual2(const char *szStr1, const char *szStr2)
bool SIsModule(const char *szList, const char *szString, int *ipIndex, bool fCaseSensitive)
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
bool SRemoveModules(char *szList, const char *szModules, bool fCaseSensitive)
int SModuleCount(const char *szList)
bool SAddModules(char *szList, const char *szModules, bool fCaseSensitive)
const char * SSearchNoCase(const char *szString, const char *szIndex)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
bool SEqual(const char *szStr1, const char *szStr2)
bool Inside(T ival, U lbound, V rbound)
size_t SLen(const char *sptr)
StdPtrAdapt< T > mkPtrAdaptNoNull(T *&rpObj)
StdArrayAdapt< T, M > mkArrayAdaptMap(T *pArray, int iSize, M &&map)
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
StdNamingCountAdapt< int_t > mkNamingCountAdapt(int_t &iCount, const char *szName)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool DirectoryExists(const char *szFilename)
char * GetExtension(char *szFilename)
bool WildcardMatch(const char *szWildcard, const char *szString)
bool ItemIdentical(const char *szFilename1, const char *szFilename2)
void MakeFilenameFromTitle(char *szTitle)
char * GetFilename(char *szPath)
void RemoveExtension(char *szFilename)
bool FileExists(const char *szFileName)
bool ItemExists(const char *szItemName)
C4FacetSurface * FindByName(const char *name) const
void OpenGame(const char *scenario=nullptr)
bool Load(C4Group &hGroup, const char *szFilename, const char *szLanguage=nullptr)
const char * GetData() const
bool GetLanguageString(const char *szLanguage, StdStrBuf &rTarget)
char Participants[CFG_MaxString+1]
char LanguageEx[CFG_MaxString+1]
char Language[CFG_MaxString+1]
char ModsDataPath[CFG_MaxString+1]
char MissionAccess[CFG_MaxString+1]
const char * AtUserDataPath(const char *filename)
int32_t HideMsgStartDedicated
int32_t AlphabeticalSorting
static bool SelectDefinitions(C4GUI::Screen *pOnScreen, StdStrBuf *pSelection)
bool Blit(C4Surface *sfcSource, float fx, float fy, float fwdt, float fhgt, C4Surface *sfcTarget, float tx, float ty, float twdt, float thgt, bool fSrcColKey=false, const C4BltTransform *pTransform=nullptr)
C4Facet GetPhase(int iPhaseX=0, int iPhaseY=0)
void Draw(C4Facet &cgo, bool fAspect=true, int32_t iPhaseX=0, int32_t iPhaseY=0, bool fTransparent=true)
bool Load(C4Group &hGroup, const char *szName, int iWdt, int iHgt, bool fNoErrIfNotFound, int iFlags)
bool Create(int iWdt, int iHgt, int iWdt2=C4FCT_Full, int iHgt2=C4FCT_Full)
void Set(const C4Facet &cpy)
bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
int32_t GetHeight() const
bool GetFromRight(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetFromTop(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void GetAll(C4Rect &rcOut)
bool GetFromBottom(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void AddElement(Element *pChild)
void SetVisibility(bool fToValue) override
void SetFocus(Control *pCtrl, bool fByMouse)
void UpdateSize() override
virtual void SetVisibility(bool fToValue)
virtual Screen * GetScreen()
C4Rect GetContainedClientRect()
void SetBounds(const C4Rect &rcNewBound)
void SetToolTip(const char *szNewTooltip, bool is_immediate=false)
void ClientPos2ScreenPos(int32_t &riX, int32_t &riY)
void DrawBackground(C4TargetFacet &cgo, C4Facet &rFromFct)
void SetText(const char *szToText, bool fAllowHotkey=true)
void SetAutosize(bool fToVal)
Element * GetSelectedItem()
bool InsertElement(Element *pChild, Element *pInsertBefore, int32_t iIndent=0)
void SetSelectionDblClickFn(BaseCallbackHandler *pToHandler)
void SetSelectionChangeCallbackFn(BaseCallbackHandler *pToHandler)
void SelectFirstEntry(bool fByUser)
void SetDecoration(bool fDrawBG, ScrollBarFacets *pToGfx, bool fAutoScroll, bool fDrawBorder=false)
void SelectNone(bool fByUser)
int32_t GetMarginTop() override
void SelectEntry(Element *pNewSel, bool fByUser)
void SetFacet(const C4Facet &fct)
bool ShowRemoveDlg(Dialog *pDlg)
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
Sheet * AddSheet(const char *szTitle, int32_t icoTitle=Ico_None)
void SelectSheet(int32_t iIndex, bool fByUser)
Sheet * GetSheet(int32_t iIndex)
void SetSheetMargin(int32_t iMargin)
void SetGfx(C4Facet *pafctBack, C4Facet *pafctClip, C4Facet *pafctIcons, CStdFont *paSheetCaptionFont, bool fResizeByAspect)
void SetDecoration(bool fDrawBG, bool fDrawFrame, ScrollBarFacets *pToGfx, bool fAutoScroll)
void SetPicture(const C4Facet &rNewPic)
void ClearText(bool fDoUpdate)
void AddTextLine(const char *szText, CStdFont *pFont, DWORD dwClr, bool fDoUpdate, bool fMakeReadableOnBlack, CStdFont *pCaptionFont=nullptr)
C4Rect & GetClientRect() override
class C4ScenarioParameters & StartupScenarioParameters
char DefinitionFilenames[20 *_MAX_PATH_LEN]
void SetParameters(C4ScenarioParameterDefs *param_defs, C4ScenarioParameters *params)
CStdFont & GetFontByHeight(int32_t iHgt, float *pfZoom=nullptr)
C4AchievementGraphics Achievements
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
const char * GetName() const
StdStrBuf GetFullName() const
int PreCacheEntries(const char *search_pattern, bool cache_previous=false)
bool Add(const char *filename, const char *entry_name)
bool OpenAsChild(C4Group *mother, const char *entry_name, bool is_exclusive=false, bool do_create=false)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
void ResetSearch(bool reload_contents=false)
bool Delete(const char *files, bool recursive=false)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
bool Open(const char *group_name, bool do_create=false)
void ReplaceStrings(StdStrBuf &rBuf)
static bool LoadComponentHost(C4ComponentHost *host, C4Group &hGroup, const char *szFilename, const char *szLanguage)
bool Load(C4Group &hGroup, C4ScenarioListLoader::Folder *pScenLoaderFolder)
void CompileFunc(StdCompiler *pComp)
C4GUI::TextWindow * GetSelectionInfoBox() const
void OnButtonScenario(C4GUI::Control *pEl)
C4ScenarioListLoader::Entry * GetSelectedEntry() const
void CreateGUIElements(C4StartupScenSelDlg *pMainDlg, C4GUI::Window &rContainer)
void SetPassword(const char *szToPassword)
bool Load(C4Group &hGroup)
C4ScenarioParameters Achievements
int32_t GetMiddleX() const
int32_t GetBottom() const
int32_t GetMiddleY() const
void Set(int32_t iX, int32_t iY, int32_t iWdt, int32_t iHgt)
bool GetModules(StdStrBuf *psOutModules) const
C4SDefinitions Definitions
Entry(class C4ScenarioListLoader *pLoader, class Folder *pParent)
virtual Folder * GetIsFolder()
virtual bool CanOpen(StdStrBuf &sError, bool &CanHide)
virtual C4ScenarioParameterDefs * GetParameterDefs()
class Folder * GetParent() const
const StdStrBuf & GetEntryFilename() const
const C4Facet & GetTitlePicture() const
virtual bool GetAchievement(int32_t idx, C4Facet *out_facet, const char **out_description)
virtual StdStrBuf GetOpenTooltip()=0
bool Load(C4Group *pFromGrp, const StdStrBuf *psFilename, bool fLoadEx)
virtual StdStrBuf GetOpenText()=0
bool RenameTo(const char *szNewName)
virtual bool SetTitleInGroup(C4Group &rGrp, const char *szNewTitle)
virtual C4ScenarioParameters * GetParameters()
const StdStrBuf & GetAuthor() const
const C4Facet & GetIconFacet() const
const StdStrBuf & GetDesc() const
static Entry * CreateEntryForFile(const StdStrBuf &sFilename, C4ScenarioListLoader *pLoader, Folder *pParent)
const StdStrBuf & GetName() const
const StdStrBuf & GetVersion() const
virtual StdStrBuf GetTypeName()=0
bool LoadContents(C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf *psFilename, bool fLoadEx, bool fReload)
Folder * GetIsFolder() override
StdStrBuf GetOpenText() override
uint32_t GetEntryCount() const
Entry * FindEntryByName(const char *szFilename) const
bool LoadCustomPre(C4Group &rGrp) override
StdStrBuf GetOpenTooltip() override
C4MapFolderData * GetMapData() const
bool LoadCustom(C4Group &rGrp, bool fNameLoaded, bool fIconLoaded) override
~RegularFolder() override
bool DoLoadContents(C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf &sFilename, bool fLoadEx) override
void Merge(const char *szPath)
bool LoadCustom(C4Group &rGrp, bool fNameLoaded, bool fIconLoaded) override
bool CanOpen(StdStrBuf &sError, bool &CanHide) override
bool LoadCustomPre(C4Group &rGrp) override
StdStrBuf GetOpenTooltip() override
bool GetAchievement(int32_t idx, C4Facet *out_facet, const char **out_description) override
C4ScenarioParameters * GetParameters() override
StdStrBuf GetOpenText() override
const C4Scenario & GetC4S() const
bool DoLoadContents(C4ScenarioListLoader *pLoader, C4Group *pFromGrp, const StdStrBuf &sFilename, bool fLoadEx) override
bool LoadCustom(C4Group &rGrp, bool fNameLoaded, bool fIconLoaded) override
Folder * GetRootFolder() const
Entry * GetFirstEntry() const
C4ScenarioListLoader(const C4ScenarioParameters &Achievements)
bool DoProcessCallback(int32_t iProgress, int32_t iMaxProgress, const char *current_load_info)
bool Load(const StdStrBuf &sRootFolder)
int32_t GetProgressPercent() const
Folder * GetCurrFolder() const
const char * GetProgressInfo() const
bool LoadExtended(Entry *pEntry)
const char * GetID() const
const Option * GetOptionByValue(int32_t val) const
bool IsAchievement() const
const char * GetAchievement() const
int32_t GetDefault() const
static StdStrBuf AddFilename2ID(const char *filename, const char *id)
void Merge(const C4ScenarioParameters &other)
C4FacetID fctScenSelIcons
C4FacetID fctOptionsTabClip
C4FacetID fctOptionsIcons
CStdFont & GetBlackFontByHeight(int32_t iHgt, float *pfZoom)
class C4StartupDlg * SwitchDialog(DialogID eToDlg, bool fFade=true, const char *szSubDialog=nullptr)
C4StartupGraphics Graphics
bool CheckNameHotkey(const char *c) override
C4ScenarioListLoader::Entry * GetEntry() const
C4GUI::RenameEdit::RenameResult DoRenaming(RenameParams par, const char *szNewName)
void MouseInput(C4GUI::CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
void UpdateOwnPos() override
ScenListItem(C4GUI::ListBox *pForListBox, C4ScenarioListLoader::Entry *pForEntry, C4GUI::Element *pInsertBeforeElement=nullptr)
void AbortRenaming(RenameParams par)
void DeleteConfirm(ScenListItem *pSel)
static C4StartupScenSelDlg * pInstance
void StartRenaming(C4GUI::RenameEdit *pNewRenameEdit)
void DrawElement(C4TargetFacet &cgo) override
bool DoBack(bool fAllowClose)
void OnClosed(bool fOK) override
void OnSelChange(class C4GUI::Element *pEl)
~C4StartupScenSelDlg() override
friend class ScenListItem
void KeyCheat2(const StdStrBuf &rsCheatCode)
bool IsNetworkStart() const
C4StartupScenSelDlg(bool fNetwork)
bool StartScenario(C4ScenarioListLoader::Scenario *pStartScen)
void SetBackground(C4Facet *pNewBG)
void OnSelDblClick(class C4GUI::Element *pEl)
C4GUI::Edit::InputResult OnSearchBarEnter(C4GUI::Edit *edt, bool fPasting, bool fPastingMore)
void OnNextBtn(C4GUI::Control *btn)
void OnBackBtn(C4GUI::Control *btn)
void OnLeagueOptionChanged() override
void OnButtonScenario(C4GUI::Control *pEl)
bool OpenFolder(C4ScenarioListLoader::Folder *pNewFolder)
bool SetPixDw(int iX, int iY, DWORD dwCol)
DWORD GetPixDw(int iX, int iY, bool fApplyModulation)
bool SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha=true, bool fSaveOverlayOnly=false)
int GetLineHeight() const
bool GetTextExtent(const char *szText, int32_t &rsx, int32_t &rsy, bool fCheckMarkup=true)
void Value(const T &rStruct)
virtual bool isDeserializer()
bool ScheduleProcs(int iTimeout=1000/36)
int Replace(const char *szOld, const char *szNew, size_t iStartSearch=0)
void Ref(const char *pnData)
const char * getData() const
const char * getPtr(size_t i) const
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void GUISound(const char *szSound)
StdCopyStrBuf Description