Are we not loading module by module, but take a kind of data to load, search for it through all modules, load, take a kind of data to load, search for it through all modules, load, take ...?
class cvInternalGlobals
{
...
BoolExpr* getReplacementCondition();
void setReplacementCondition(BoolExpr* pExpr);
int getReplacementID();
void setReplacementID(int iID);
void resetReplacement();
void updateReplacements();
...
}
Can I ask, which bright mind is the creator of this invention?
Code:class cvInternalGlobals { ... BoolExpr* getReplacementCondition(); void setReplacementCondition(BoolExpr* pExpr); int getReplacementID(); void setReplacementID(int iID); void resetReplacement(); void updateReplacements(); ... }
Well, I can't be sure as I've had no time to study it correctly. But looks like a very ill design.
If it was about the text replacement, this place would maybe not be so bad. But it is about Info Classes loading. At the first glance, those functions looks like they are useless outside this process. If so, it is nothing like a very ugly real world problem. -- Unless we count laziness as one ...Or it could be a very good first design of a very ugly real world problem. In my experience it is often hard to come up with a first solution, but it is always easy to criticise it and come up with a better design later, once the path has been cut through the forest
If it is to do with language text then it may have been trying to keep the internal interface of the old method of loading the text while still providing an improved language support mechanism for getting the text.
<TraitInfo>
<Type>TRAIT_AGGRESSIVE</Type>
<Description>TXT_KEY_TRAIT_AGGRESSIVE</Description>
<ShortDescription>TXT_KEY_TRAIT_AGGRESSIVE_SHORT</ShortDescription>
<Civilopedia>TXT_KEY_TRAIT_AGGRESSIVE_PEDIA</Civilopedia>
<Button>ART/Buttons/Traits/TraitAggressive.dds</Button>
<PromotionLine>PROMOTIONLINE_AGGRESSIVE</PromotionLine>
<iLinePriority>0</iLinePriority>
<bNegativeTrait>0</bNegativeTrait>
<bImpurePromotions>0</bImpurePromotions>
<bImpurePropertyManipulators>1</bImpurePropertyManipulators>
<Flavors>
<Flavor>
<FlavorType>FLAVOR_PRODUCTION</FlavorType>
<iFlavor>1</iFlavor>
</Flavor>
<Flavor>
<FlavorType>FLAVOR_ESPIONAGE</FlavorType>
<iFlavor>-1</iFlavor>
</Flavor>
<Flavor>
<FlavorType>FLAVOR_MILITARY</FlavorType>
<iFlavor>10</iFlavor>
</Flavor>
</Flavors>
<iHealth>0</iHealth>
<iHappiness>0</iHappiness>
<iMaxAnarchy>-1</iMaxAnarchy>
<iUpkeepModifier>0</iUpkeepModifier>
<iLevelExperienceModifier>0</iLevelExperienceModifier>
<iGreatPeopleRateModifier>0</iGreatPeopleRateModifier>
<iGreatGeneralRateModifier>0</iGreatGeneralRateModifier>
<iDomesticGreatGeneralRateModifier>0</iDomesticGreatGeneralRateModifier>
<iMaxGlobalBuildingProductionModifier>0</iMaxGlobalBuildingProductionModifier>
<iMaxTeamBuildingProductionModifier>0</iMaxTeamBuildingProductionModifier>
<iMaxPlayerBuildingProductionModifier>0</iMaxPlayerBuildingProductionModifier>
<!-- Revolution Trait Effects Begin -->
<iRevIdxLocal>0</iRevIdxLocal>
<iRevIdxNational>0</iRevIdxNational>
<iRevIdxHolyCityGood>0</iRevIdxHolyCityGood>
<iRevIdxHolyCityBad>0</iRevIdxHolyCityBad>
<fRevIdxNationalityMod>0</fRevIdxNationalityMod>
<fRevIdxBadReligionMod>0</fRevIdxBadReligionMod>
<fRevIdxGoodReligionMod>0</fRevIdxGoodReligionMod>
<iRevIdxDistanceModifier>0</iRevIdxDistanceModifier>
<bNonStateReligionCommerce>0</bNonStateReligionCommerce>
<bUpgradeAnywhere>0</bUpgradeAnywhere>
<!-- Revolution Trait Effects End -->
<ExtraYieldThresholds/>
<TradeYieldModifiers/>
<CommerceChanges/>
<CommerceModifiers/>
<FreePromotionUnitCombatTypes>
<FreePromotionUnitCombatType>
<PromotionType>PROMOTION_COMBAT1</PromotionType>
<UnitCombatTypes>
<UnitCombatType>UNITCOMBAT_MELEE</UnitCombatType>
<UnitCombatType>UNITCOMBAT_GUN</UnitCombatType>
<UnitCombatType>UNITCOMBAT_HITECH</UnitCombatType>
<UnitCombatType>UNITCOMBAT_ASSAULT_MECH</UnitCombatType>
</UnitCombatTypes>
</FreePromotionUnitCombatType>
<FreePromotionUnitCombatType>
<PromotionType>PROMOTION_AGGRESSIVE</PromotionType>
<UnitCombatTypes>
<UnitCombatType>UNITCOMBAT_MELEE</UnitCombatType>
</UnitCombatTypes>
</FreePromotionUnitCombatType>
</FreePromotionUnitCombatTypes>
<BuildingProductionModifierTypes>
<BuildingProductionModifierType>
<BuildingType>BUILDING_BARRACKS</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GARRISON</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_BIOENHANCEMENT_CENTER</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_SIEGE_WORKSHOP</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_TR_WORKSHOP</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_CANNON_FORGE</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_FLETCHER</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GLADIATOR_SCHOOL</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_AEROSPACE_COMPLEX</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_WARRIOR_HUT</BuildingType>
<iBuildingProductionModifier>25</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MERCENARY_CAMP</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MERCENARY_STABLES</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_SALOON</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_PIRATES_COVE</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MOB_STOREFRONT</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_REBEL_CAMP</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_TERRORISTS_COMPOUND</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_CROSSES</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_STOCKS</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GALLOWS</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GUILLOTINE</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_ELECTRIC_CHAIR</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_LETHAL_INJECTION</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_PUBLIC_STONING</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
</BuildingProductionModifierTypes>
<iAttitudeModifier>-1</iAttitudeModifier>
<iMilitaryProductionModifier>10</iMilitaryProductionModifier>
<PropertyManipulators>
<PropertySource>
<PropertySourceType>PROPERTYSOURCE_CONSTANT</PropertySourceType>
<PropertyType>PROPERTY_CRIME</PropertyType>
<GameObjectType>GAMEOBJECT_CITY</GameObjectType>
<RelationType>RELATION_ASSOCIATED</RelationType>
<iAmountPerTurn>9</iAmountPerTurn>
<Active>
<Greater>
<PropertyType>PROPERTY_CRIME</PropertyType>
<Constant>200</Constant>
</Greater>
</Active>
</PropertySource>
</PropertyManipulators>
</TraitInfo>
<TraitInfo>
<Type>TRAIT_AGGRESSIVE</Type>
<ReplacementID>TRAIT_LS612_AGGRESSIVE</ReplacementID>
<Description>TXT_KEY_TRAIT_AGGRESSIVE</Description>
<ShortDescription>TXT_KEY_TRAIT_AGGRESSIVE_SHORT</ShortDescription>
<Button>ART/Buttons/Traits/TraitAggressive.dds</Button>
<PromotionLine>PROMOTIONLINE_AGGRESSIVE</PromotionLine>
<iLinePriority>0</iLinePriority>
<bNegativeTrait>0</bNegativeTrait>
<bImpurePromotions>0</bImpurePromotions>
<bImpurePropertyManipulators>1</bImpurePropertyManipulators>
<Flavors>
<Flavor>
<FlavorType>FLAVOR_PRODUCTION</FlavorType>
<iFlavor>1</iFlavor>
</Flavor>
<Flavor>
<FlavorType>FLAVOR_ESPIONAGE</FlavorType>
<iFlavor>-1</iFlavor>
</Flavor>
<Flavor>
<FlavorType>FLAVOR_MILITARY</FlavorType>
<iFlavor>10</iFlavor>
</Flavor>
</Flavors>
<iHealth>0</iHealth>
<iHappiness>0</iHappiness>
<iMaxAnarchy>-1</iMaxAnarchy>
<iUpkeepModifier>0</iUpkeepModifier>
<iLevelExperienceModifier>0</iLevelExperienceModifier>
<iGreatPeopleRateModifier>0</iGreatPeopleRateModifier>
<iGreatGeneralRateModifier>0</iGreatGeneralRateModifier>
<iDomesticGreatGeneralRateModifier>0</iDomesticGreatGeneralRateModifier>
<iMaxGlobalBuildingProductionModifier>0</iMaxGlobalBuildingProductionModifier>
<iMaxTeamBuildingProductionModifier>0</iMaxTeamBuildingProductionModifier>
<iMaxPlayerBuildingProductionModifier>0</iMaxPlayerBuildingProductionModifier>
<!-- Revolution Trait Effects Begin -->
<iRevIdxLocal>0</iRevIdxLocal>
<iRevIdxNational>0</iRevIdxNational>
<iRevIdxHolyCityGood>0</iRevIdxHolyCityGood>
<iRevIdxHolyCityBad>0</iRevIdxHolyCityBad>
<fRevIdxNationalityMod>0</fRevIdxNationalityMod>
<fRevIdxBadReligionMod>0</fRevIdxBadReligionMod>
<fRevIdxGoodReligionMod>0</fRevIdxGoodReligionMod>
<iRevIdxDistanceModifier>0</iRevIdxDistanceModifier>
<bNonStateReligionCommerce>0</bNonStateReligionCommerce>
<bUpgradeAnywhere>0</bUpgradeAnywhere>
<!-- Revolution Trait Effects End -->
<ExtraYieldThresholds/>
<TradeYieldModifiers/>
<CommerceChanges/>
<CommerceModifiers/>
<FreePromotionUnitCombatTypes>
<FreePromotionUnitCombatType>
<PromotionType>PROMOTION_COMBAT1</PromotionType>
<UnitCombatTypes>
<UnitCombatType>UNITCOMBAT_MELEE</UnitCombatType>
<UnitCombatType>UNITCOMBAT_GUN</UnitCombatType>
<UnitCombatType>UNITCOMBAT_HITECH</UnitCombatType>
<UnitCombatType>UNITCOMBAT_ASSAULT_MECH</UnitCombatType>
</UnitCombatTypes>
</FreePromotionUnitCombatType>
<FreePromotionUnitCombatType>
<PromotionType>PROMOTION_AGGRESSIVE</PromotionType>
<UnitCombatTypes>
<UnitCombatType>UNITCOMBAT_MELEE</UnitCombatType>
<UnitCombatType>UNITCOMBAT_GUN</UnitCombatType>
<UnitCombatType>UNITCOMBAT_HITECH</UnitCombatType>
<UnitCombatType>UNITCOMBAT_ASSAULT_MECH</UnitCombatType>
</UnitCombatTypes>
</FreePromotionUnitCombatType>
</FreePromotionUnitCombatTypes>
<BuildingProductionModifierTypes>
<BuildingProductionModifierType>
<BuildingType>BUILDING_BARRACKS</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GARRISON</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_BIOENHANCEMENT_CENTER</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_SIEGE_WORKSHOP</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_TR_WORKSHOP</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_CANNON_FORGE</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_FLETCHER</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GLADIATOR_SCHOOL</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_AEROSPACE_COMPLEX</BuildingType>
<iBuildingProductionModifier>100</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_WARRIOR_HUT</BuildingType>
<iBuildingProductionModifier>25</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MERCENARY_CAMP</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MERCENARY_STABLES</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_SALOON</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_PIRATES_COVE</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_MOB_STOREFRONT</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_REBEL_CAMP</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_TERRORISTS_COMPOUND</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_CROSSES</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_STOCKS</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GALLOWS</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_GUILLOTINE</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_ELECTRIC_CHAIR</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_LETHAL_INJECTION</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
<BuildingProductionModifierType>
<BuildingType>BUILDING_PUBLIC_STONING</BuildingType>
<iBuildingProductionModifier>10</iBuildingProductionModifier>
</BuildingProductionModifierType>
</BuildingProductionModifierTypes>
<iWarWearinessAccumulationModifier>-10</iWarWearinessAccumulationModifier>
<iAttitudeModifier>0</iAttitudeModifier>
<iMilitaryProductionModifier>0</iMilitaryProductionModifier>
<ReplacementCondition>
<And>
<Has>
<GOMType>GOM_OPTION</GOMType>
<ID>GAMEOPTION_LS612_TRAITS</ID>
</Has>
<Not>
<GOMType>GOM_OPTION</GOMType>
<ID>GAMEOPTION_LEADERHEAD_LEVELUPS</ID>
</Not>
</And>
</ReplacementCondition>
</TraitInfo>
<ReplacementCondition>
<And>
<Has>
<GOMType>GOM_OPTION</GOMType>
<ID>GAMEOPTION_LS612_TRAITS</ID>
</Has>
<Not>
<GOMType>GOM_OPTION</GOMType>
<ID>GAMEOPTION_LEADERHEAD_LEVELUPS</ID>
</Not>
</And>
</ReplacementCondition>
All but the last of those are used to pass out information from the CvInfoBase XML read method (which cannot be freely altered because of usage by the exe). This copies the method used by the WoC module code right above your quoted lines.Can I ask, which bright mind is the creator of this invention?
Code:class cvInternalGlobals { ... BoolExpr* getReplacementCondition(); void setReplacementCondition(BoolExpr* pExpr); int getReplacementID(); void setReplacementID(int iID); void resetReplacement(); void updateReplacements(); ... }
Because of the use of different formats there are errors with the cache then switching the dll between Debug<->Release.
I modified the CvXMLLoadUtilitySetMod.cpp to write a value into the CacheHeader to detect the switch like it is done then the CacheVersion is changed.
I attached the modified file maybe someone can add it to the svn.
The other way to solve this would be to use the same Stream for Debug and Release.
@Koshilng, I can't finish incorporating xerces. Unfortunately, there are still some bugs which I can't corrects as I am leaving. And may be absent for a long time. Still I believe, the code is better then it was, so it would be good if you could find the bugs and apply it in C2C.
Most of data is read correctly. The game runs, but units are shifted and when you click next turn, you get CTD. -- I thought, could broke the non-xml code, as I've been find-and-cutting some code and could cut an extra line, which should be there. But I compered caches from my build and that from the repo and there are some differences, so it can be a problem with xml.
I've added a variant of FDataIOStream, which uses ASCII to store all strings and put a new line after each value. So the cache is more readable and you can use some comparing tool, like WinMarge or something, to find the place where something has been read wrong. -- That class is used only in debug build, and only for caching, so it should be safe. Just need to remember to clear cache when you switch between debug and release binary. -- I will commit the current revision only with this functionality added, so it will be possible to compare the proper cache with that from the xerces version.
Also -- xerces uses utf16 almost for everything so I switched tag names to be wchar_t.
Also -- now CvXMLLoadUtility is is fully responsible for getting anything from xml, so everything except CvXMLLoadUtility is now parser-independent. (There is still a getter GetCurrentXMLElement, which exposes a DOM objects, but it was only for debugging purpose.)
Also -- I started switching some design convention. All method which are of the form GetSomething(...) should fail an assertion, if they can't retrieve data. If we allow an optional value which can be missing, we should have another method like TryGetSomthing, GetOptionalSomthing or FindSomthing to get it without errors. This is safer.
I hope you will have some time and plug this code into c2c.
Take care.![]()
I'am going to switch the the xmlparser to xerxes_c using some of your changes. if don't get to many issues i thing i'am done with it next weekend.