@Dancing Hoskuld enjoy your holidays! It won't be that soon that a decision is made about this, so take all the time you need. 

No one said anything about new civic strategy text within two weeks@raxo2222 I'm doing that while I wait the two weeks.
Your text files are now bit outdated - I cleaned up random question marks in meantime.
I don't feel like looking at the python code for the civic screen just yet.Looks nice, @Toffer90 in civic screen strategy text is black and is hard to read, is it possible to change its color to white?
I see, it's an issue specific for low resolutions.By the way unlock tech covers category and upkeep info a bit - unlock tech could be somewhere bit lower.
I don't feel like looking at the python code for the civic screen just yet.
DH is working on some extensive changes for it atm, and I'm keeping clear of it for now to avoid complications.
At this exact moment none and what I have done can be redone. I went down a wrong path.@Dancing Hoskuld what changes to civic screen are you doing?
BuildingTypes eLoopBuilding;
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
if ((GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic) || GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCivic)))
{
CvWString szBuilding;
HERE --------> szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_UNLOCKS_BUILDING").c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst);
bFirst = false;
}
}
}
}
bFirst = true;
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
if (!GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic(eCivic))
{
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
bool bObsolete = false;
CivicTypes eCurCivic = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivics((CivicOptionTypes)GC.getCivicInfo(eCivic).getCivicOptionType());
if (GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCurCivic))
{
bObsolete = true;
}
else if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCurCivic) && !GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic))
{
bObsolete = true;
for (int iJ = 0; iJ < GC.getNumCivicInfos(); iJ++)
{
if (iJ != eCurCivic && iJ != eCivic)
{
if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics((CivicTypes)iJ))
{
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic((CivicTypes)iJ))
{
bObsolete = false;
break;
}
}
}
}
}
if (bObsolete)
{
CvWString szBuilding;
HERE -----------------> szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BLOCKS_BUILDING").c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst);
bFirst = false;
}
}
}
}
}
}
Now I wonder if this Disallows.... meant to appear in all civics, that doesn't support given building.It's in CvGameTextMgr.cpp at line 18157:
Code:BuildingTypes eLoopBuilding; bFirst = true; for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI) { if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer()) { eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI); } else { eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex(); } if (eLoopBuilding != NO_BUILDING) { if (GC.getGameINLINE().canEverConstruct(eLoopBuilding)) { if ((GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic) || GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCivic))) { CvWString szBuilding; HERE szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_UNLOCKS_BUILDING").c_str()); szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription()); setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst); bFirst = false; } } } }
It seems like we don't have active DLL modders for now.
Well the first thing to figure out is what is or is not an object. You will get 17 different answers to that on any given project with about 3 different ones per person. Settle on a Data Model and that will usually reduce it to 3-5 different answers. If you can agree on three data models one each for data storage, program use and user use, you can usually get to an agreement. The biggest problem in Civ is that they use the same data model for everything which means there is a lot of overhead and you have to make the model fit what you want to do.I'm training to be one but that takes time, especially with an object-oriented language like C++.
It helps a little that I have a background in R and Visual Basic, but I'm still not comfortable to work and compile stuff in c++ just yet.
I might want to help except that as a player I find it enormously useful to see this line!I think "Disables construction of".... line can be removed from game altogether - it just clutters space in later civics.
It happens with buildings, that are unlocked by default civics, but doesn't happen with buildings unlocked by later civics.
Spoiler :
This must be DLL/Python stuff - I couldn't find XML source of it.
I noticed some religious buildings and national/world wonders locked behind civics.
Then it should be fixed, so it shows for rest for civics, not just when building uses default civics as prereq.I might want to help except that as a player I find it enormously useful to see this line!
bFirst = true;
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
if (!GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic(eCivic))
{
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
bool bObsolete = false;
CivicTypes eCurCivic = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivics((CivicOptionTypes)GC.getCivicInfo(eCivic).getCivicOptionType());
if (GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCurCivic))
{
bObsolete = true;
}
else if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCurCivic) && !GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic))
{
bObsolete = true;
for (int iJ = 0; iJ < GC.getNumCivicInfos(); iJ++)
{
if (iJ != eCurCivic && iJ != eCivic)
{
if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics((CivicTypes)iJ))
{
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic((CivicTypes)iJ))
{
bObsolete = false;
break;
}
}
}
}
}
if (bObsolete)
{
CvWString szBuilding;
HERE -----------------> szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BLOCKS_BUILDING").c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst);
bFirst = false;
}
}
}
}
}
}
@pepper2000 The SMAC description also states that "The happy life is thought to be one of excellence; now an excellent life requires exertion, and does not consist of amusement. If Eudaimonia, or happiness, is activity in accordance with excellence, it is reasonable that it should in accordance with the highest excellence; and this will be that of the best thing in us."