danke, ich sollte besser schlafen gehen. Das ist also der Name des vectors im Python-Code. Ich dachte, ich muss den irgend was aus den C++ Code sein.
danke, ich sollte besser schlafen gehen. Das ist also der Name des vectors im Python-Code. Ich dachte, ich muss den irgend was aus den C++ Code sein.
Es ging gestern abends nie, trotz das es richtig sein sollte. Der Grund ist wohl schon wieder das Problem, was mich schon lange stört. Die imports funktionieren mit Boost und Python nicht richtig. Ich muss immer explizit eine Datei aus den Ordern angeben. Was kann es für Ursachen dafür geben bzw. was kann ich vergessen haben? Es wurde von VS 2010 nicht als Fehler angezeigt, nur beim kompilieren. So wurde vector_indexing_suite nicht beim kompilieren gefunden. Nachdem ich den expliziten Pfad angegeben habe, ging es.
Desweiteren habe ich noch folgenden Warnung beim Kompilieren:
Problem ist, es gibt einen Typ Long zum Vergleich in den Includes der vector_indexing_suite. Der ist mit unsigned int als Index nicht ganz kombatibel.Code:1> Boost-1.32.0\include\boost\python\suite\indexing\detail\indexing_suite_detail.hpp(593): warning C4018: '>' : signed/unsigned mismatch 1> Boost-1.32.0\include\boost\python\suite\indexing\detail\indexing_suite_detail.hpp(575) : while compiling class-template member function 'void boost::python::detail::slice_helper<Container,DerivedPolicies,ProxyHandler,Data,Index>::base_get_slice_data(Container &,PySliceObject *,Index &,Index &)' 1> with 1> [ 1> Container=std::vector<UnitTypes>, 1> DerivedPolicies=boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>, 1> ProxyHandler=boost::python::indexing_suite<std::vector<UnitTypes>,boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>,false>::proxy_handler, 1> Data=std::vector<UnitTypes>::value_type, 1> Index=std::vector<UnitTypes>::size_type 1> ] 1> Boost-1.32.0\include\boost\python\suite\indexing\indexing_suite.hpp(204) : see reference to class template instantiation 'boost::python::detail::slice_helper<Container,DerivedPolicies,ProxyHandler,Data,Index>' being compiled 1> with 1> [ 1> Container=std::vector<UnitTypes>, 1> DerivedPolicies=boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>, 1> ProxyHandler=boost::python::indexing_suite<std::vector<UnitTypes>,boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>,false>::proxy_handler, 1> Data=std::vector<UnitTypes>::value_type, 1> Index=std::vector<UnitTypes>::size_type 1> ] 1> Boost-1.32.0\include\boost\python\suite\indexing\indexing_suite.hpp(202) : while compiling class-template member function 'boost::python::api::object boost::python::indexing_suite<Container,DerivedPolicies,NoProxy>::base_get_item(boost::python::back_reference<T>,PyObject *)' 1> with 1> [ 1> Container=std::vector<UnitTypes>, 1> DerivedPolicies=boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>, 1> NoProxy=false, 1> T=std::vector<UnitTypes> & 1> ] 1> Boost-1.32.0\include\boost\python\suite\indexing\vector_indexing_suite.hpp(50) : see reference to class template instantiation 'boost::python::indexing_suite<Container,DerivedPolicies,NoProxy>' being compiled 1> with 1> [ 1> Container=std::vector<UnitTypes>, 1> DerivedPolicies=boost::python::detail::final_vector_derived_policies<std::vector<UnitTypes>,false>, 1> NoProxy=false 1> ] 1> CvDLLPython.cpp(48) : see reference to class template instantiation 'boost::python::vector_indexing_suite<Container>' being compiled 1> with 1> [ 1> Container=std::vector<UnitTypes> 1> ] 1> CvDLLPython.cpp(108) : see reference to function template instantiation 'void createPyVector<UnitTypes>(const char *)' being compiled 1>Boost-1.32.0\include\boost\python\suite\indexing\detail\indexing_suite_detail.hpp(615): warning C4018: '>' : signed/unsigned mismatch
An sonsten funktioniert es. Mein Test im Spiel verlief zufriedenstellend.Code:#include "CvGameCoreDLL.h" #include "CyMap.h" #include "CyPlayer.h" #include "CyPlot.h" #include "CyGame.h" #include "CyUnit.h" #include "CyGlobalContext.h" #include "CyCity.h" #include <boost/python/suite/indexing/vector_indexing_suite.hpp> void CyCityPythonInterface1(python::class_<CyCity>& x); void CyPlotPythonInterface1(python::class_<CyPlot>& x); void CyPlayerPythonInterface1(python::class_<CyPlayer>& x); void CyPlayerPythonInterface2(python::class_<CyPlayer>& x); void CyUnitPythonInterface1(python::class_<CyUnit>& x); void CyGlobalContextPythonInterface1(python::class_<CyGlobalContext>& x); void CyGlobalContextPythonInterface2(python::class_<CyGlobalContext>& x); void CyGlobalContextPythonInterface3(python::class_<CyGlobalContext>& x); void CyGlobalContextPythonInterface4(python::class_<CyGlobalContext>& x); // rucivfan_code_optimization rco[ void CyGlobalContextPythonInterface5(python::class_<CyGlobalContext>& x); // ]rucivfan_code_optimization rco void CyGamePythonInterface(); void CyRandomPythonInterface(); void CyEnumsPythonInterface(); void CyTeamPythonInterface(); void CyAreaPythonInterface(); void CyStructsPythonInterface1(); void CyMapPythonInterface(); void CyMapGeneratorPythonInterface(); void CyInfoPythonInterface1(); void CyInfoPythonInterface2(); void CyInfoPythonInterface3(); void CySelectionGroupInterface(); void CyArtFileMgrPythonInterface(); void CyGameTextMgrInterface(); void CyHallOfFameInterface(); void CyGameCoreUtilsPythonInterface(); void CyMessageControlInterface(); // rucivfan_code_helper rch[ void CyCityPythonInterface2(python::class_<CyCity>& x); // ]rucivfan_code_helper rch // rucivfan_upgrade_optimization ruo[ template<typename T> void createPyVector(const char* name) { python::class_<std::vector<T> >(name) .def(python::init<std::size_t>()) .def(boost::python::vector_indexing_suite<std::vector<T> >()) ; } // ]rucivfan_upgrade_optimization ruo // // // DllExport void DLLPublishToPython() { CyEnumsPythonInterface(); CyGamePythonInterface(); CyRandomPythonInterface(); CyTeamPythonInterface(); CyAreaPythonInterface(); CyStructsPythonInterface1(); CyMapPythonInterface(); CyMapGeneratorPythonInterface(); CySelectionGroupInterface(); CyArtFileMgrPythonInterface(); CyGameTextMgrInterface(); CyInfoPythonInterface1(); CyInfoPythonInterface2(); CyInfoPythonInterface3(); CyHallOfFameInterface(); CyGameCoreUtilsPythonInterface(); CyMessageControlInterface(); // // large interfaces which can be split across files if need be // python::class_<CyCity> city ("CyCity"); // define city class CyCityPythonInterface1(city); // publish it's methods // rucivfan_code_helper rch[ CyCityPythonInterface2(city); // publish it's methods // ]rucivfan_code_helper rch python::class_<CyPlayer> player ("CyPlayer"); // define player class CyPlayerPythonInterface1(player); // publish it's methods CyPlayerPythonInterface2(player); // publish it's methods python::class_<CyUnit> unit ("CyUnit"); // define unit class CyUnitPythonInterface1(unit); // publish it's methods python::class_<CyPlot> plot ("CyPlot"); // define plot class CyPlotPythonInterface1(plot); // publish it's methods python::class_<CyGlobalContext> gc ("CyGlobalContext"); // define globals class CyGlobalContextPythonInterface1(gc); // publish it's methods CyGlobalContextPythonInterface2(gc); // publish it's methods CyGlobalContextPythonInterface3(gc); // publish it's methods CyGlobalContextPythonInterface4(gc); // publish it's methods // rucivfan_code_optimization rco[ CyGlobalContextPythonInterface5(gc); // publish it's methods // ]rucivfan_code_optimization rco // rucivfan_upgrade_optimization ruo[ createPyVector<UnitTypes>("vector"); // ]rucivfan_upgrade_optimization ruo }
Ich hätte aber schon gerne die Warnung weg. Aber alle möglichen Warnungen mit der Fehlernummer dieses imports sollen nicht gleich weg sein.Code:#pragma warning( push ) #pragma warning( disable : 4018 ) #include "boost/python/suite/indexing/vector_indexing_suite.hpp" #pragma warning( pop )
Geändert von rucivfan (22. Mai 2014 um 09:54 Uhr)
Das ist schon richtig so. Damit können Datein den selben Namen haben, solange die Ordernamen verschieden sind.
Was das signed/unsigned angeht, weis ich auch nicht weiter. Ich hatte da keine Warnungen, war aber auch mit Boot 1.55. Darum habe ich mal in den Code geschaut und vergleichen, und mir ist da nichts aufgefallen...
In der Datei CvXMLLoadUtilitySet.cpp ist ja die Ladereihenfolge der .xml-Dateien angegebenen:
Wenn ich jetzt an dieser Reihenfolge irgend etwas ändern würde, sagen wir, EraInfo.xml und UnitClassInfo.xml (die ja direkt hintereinander kommen und bei denen in der zweiten auf keinen Wert aus der ersten zugegriffen wird), mit welchen Problemen müsste ich dann rechnen?Code:LoadGlobalClassInfo(GC.getGameSpeedInfo(), "CIV4GameSpeedInfo", "GameInfo", "Civ4GameSpeedInfo/GameSpeedInfos/GameSpeedInfo", false); LoadGlobalClassInfo(GC.getTurnTimerInfo(), "CIV4TurnTimerInfo", "GameInfo", "Civ4TurnTimerInfo/TurnTimerInfos/TurnTimerInfo", false); LoadGlobalClassInfo(GC.getWorldInfo(), "CIV4WorldInfo", "GameInfo", "Civ4WorldInfo/WorldInfos/WorldInfo", false); LoadGlobalClassInfo(GC.getClimateInfo(), "CIV4ClimateInfo", "GameInfo", "Civ4ClimateInfo/ClimateInfos/ClimateInfo", false); LoadGlobalClassInfo(GC.getSeaLevelInfo(), "CIV4SeaLevelInfo", "GameInfo", "Civ4SeaLevelInfo/SeaLevelInfos/SeaLevelInfo", false); LoadGlobalClassInfo(GC.getAdvisorInfo(), "CIV4AdvisorInfos", "Interface", "Civ4AdvisorInfos/AdvisorInfos/AdvisorInfo", false); LoadGlobalClassInfo(GC.getTerrainInfo(), "CIV4TerrainInfos", "Terrain", "Civ4TerrainInfos/TerrainInfos/TerrainInfo", false); LoadGlobalClassInfo(GC.getEraInfo(), "CIV4EraInfos", "GameInfo", "Civ4EraInfos/EraInfos/EraInfo", false); LoadGlobalClassInfo(GC.getUnitClassInfo(), "CIV4UnitClassInfos", "Units", "Civ4UnitClassInfos/UnitClassInfos/UnitClassInfo", false); LoadGlobalClassInfo(GC.getSpecialistInfo(), "CIV4SpecialistInfos", "GameInfo", "Civ4SpecialistInfos/SpecialistInfos/SpecialistInfo", false); LoadGlobalClassInfo(GC.getVoteSourceInfo(), "CIV4VoteSourceInfos", "GameInfo", "Civ4VoteSourceInfos/VoteSourceInfos/VoteSourceInfo", false); LoadGlobalClassInfo(GC.getTechInfo(), "CIV4TechInfos", "Technologies", "Civ4TechInfos/TechInfos/TechInfo", true, &CvDLLUtilityIFaceBase::createTechInfoCacheObject); LoadGlobalClassInfo(GC.getFeatureInfo(), "Civ4FeatureInfos", "Terrain", "Civ4FeatureInfos/FeatureInfos/FeatureInfo", false); LoadGlobalClassInfo(GC.getReligionInfo(), "CIV4ReligionInfo", "GameInfo", "Civ4ReligionInfo/ReligionInfos/ReligionInfo", false); LoadGlobalClassInfo(GC.getAnimationCategoryInfo(), "CIV4AnimationInfos", "Units", "Civ4AnimationInfos/AnimationCategories/AnimationCategory", false); LoadGlobalClassInfo(GC.getAnimationPathInfo(), "CIV4AnimationPathInfos", "Units", "Civ4AnimationPathInfos/AnimationPaths/AnimationPath", false); LoadGlobalClassInfo(GC.getPromotionInfo(), "CIV4PromotionInfos", "Units", "Civ4PromotionInfos/PromotionInfos/PromotionInfo", true, &CvDLLUtilityIFaceBase::createPromotionInfoCacheObject); LoadGlobalClassInfo(GC.getTraitInfo(), "CIV4TraitInfos", "Civilizations", "Civ4TraitInfos/TraitInfos/TraitInfo", false); LoadGlobalClassInfo(GC.getGoodyInfo(), "CIV4GoodyInfo", "GameInfo", "Civ4GoodyInfo/GoodyInfos/GoodyInfo", false); LoadGlobalClassInfo(GC.getHandicapInfo(), "CIV4HandicapInfo", "GameInfo", "Civ4HandicapInfo/HandicapInfos/HandicapInfo", false, &CvDLLUtilityIFaceBase::createHandicapInfoCacheObject); LoadGlobalClassInfo(GC.getCursorInfo(), "CIV4CursorInfo", "GameInfo", "Civ4CursorInfo/CursorInfos/CursorInfo", false); LoadGlobalClassInfo(GC.getCivicOptionInfo(), "CIV4CivicOptionInfos", "GameInfo", "Civ4CivicOptionInfos/CivicOptionInfos/CivicOptionInfo", false); LoadGlobalClassInfo(GC.getUpkeepInfo(), "CIV4UpkeepInfo", "GameInfo", "Civ4UpkeepInfo/UpkeepInfos/UpkeepInfo", false); LoadGlobalClassInfo(GC.getHurryInfo(), "CIV4HurryInfo", "GameInfo", "Civ4HurryInfo/HurryInfos/HurryInfo", false); LoadGlobalClassInfo(GC.getSpecialBuildingInfo(), "CIV4SpecialBuildingInfos", "Buildings", "Civ4SpecialBuildingInfos/SpecialBuildingInfos/SpecialBuildingInfo", false); LoadGlobalClassInfo(GC.getCultureLevelInfo(), "CIV4CultureLevelInfo", "GameInfo", "Civ4CultureLevelInfo/CultureLevelInfos/CultureLevelInfo", false); LoadGlobalClassInfo(GC.getBonusClassInfo(), "CIV4BonusClassInfos", "Terrain", "Civ4BonusClassInfos/BonusClassInfos/BonusClassInfo", false); LoadGlobalClassInfo(GC.getVictoryInfo(), "CIV4VictoryInfo", "GameInfo", "Civ4VictoryInfo/VictoryInfos/VictoryInfo", false); LoadGlobalClassInfo(GC.getBonusInfo(), "CIV4BonusInfos", "Terrain", "Civ4BonusInfos/BonusInfos/BonusInfo", false, &CvDLLUtilityIFaceBase::createBonusInfoCacheObject); LoadGlobalClassInfo(GC.getCorporationInfo(), "CIV4CorporationInfo", "GameInfo", "Civ4CorporationInfo/CorporationInfos/CorporationInfo", false); LoadGlobalClassInfo(GC.getRouteInfo(), "Civ4RouteInfos", "Misc", "Civ4RouteInfos/RouteInfos/RouteInfo", false); LoadGlobalClassInfo(GC.getImprovementInfo(), "CIV4ImprovementInfos", "Terrain", "Civ4ImprovementInfos/ImprovementInfos/ImprovementInfo", true, &CvDLLUtilityIFaceBase::createImprovementInfoCacheObject); LoadGlobalClassInfo(GC.getBuildingClassInfo(), "CIV4BuildingClassInfos", "Buildings", "Civ4BuildingClassInfos/BuildingClassInfos/BuildingClassInfo", false); LoadGlobalClassInfo(GC.getBuildingInfo(), "CIV4BuildingInfos", "Buildings", "Civ4BuildingInfos/BuildingInfos/BuildingInfo", false, &CvDLLUtilityIFaceBase::createBuildingInfoCacheObject);
Konkret möchte ich es umgehen, mit diesem "GC.getBuildingClassInfo((BuildingClassTypes)i).readPass3();" Konstrukt zu arbeiten, zugleich würde ich gerne in der EraInfo.xml jeweils einen Einheitentyp festlegen, der unter bestimmten Umständen als Söldnereinheit dieser Ära erscheint, z.B. bei den Stammesdörfern.
Ein guter Rat readPass3() zu verwenden ist, ist tausend mal besser wie die Ladereihenfolge zu ändern. Wenn man immer wieder neues einbaut, steht man immer wieder vor dem Problem der Ladereihenfolge. Es macht daher wenig Sinn, umbedingt die Ladereihenfolge ändern. Ab irgend einen Punkt geht es nämlich wirklich nicht ohne readPass3().
Grundsätzlich sollte es aber keine Probleme geben, wenn UnitClassInfo.xml keinen Wert aus der EraInfo.xml benötigt, wenn man das Laden der UnitClassInfo.xml vor der EraInfo.xml schiebt. Aber man muss auch sicher sein, dass dem so ist. Es geht in der Regel viel schneller mit readPass3() zu arbeiten als sowas zu überprüfen, vor allem wenn man die readPass3() Methode nicht mehr anlegen muss, weil sie es schon ist.
Geändert von rucivfan (29. Mai 2014 um 12:15 Uhr)
Jetzt für den konkreten Fall, müsste ich da mehr tun als
Vorausgesetzt, getNumEraInfos() existiert?Code:LoadGlobalClassInfo(GC.getEraInfo(), "CIV4EraInfos", "GameInfo", "Civ4EraInfos/EraInfos/EraInfo", false); LoadGlobalClassInfo(GC.getUnitClassInfo(), "CIV4UnitClassInfos", "Units", "Civ4UnitClassInfos/UnitClassInfos/UnitClassInfo", false); //entspricht der unveränderten Ladereihenfolge for (int i=0; i < GC.getNumEraInfos(); ++i) { GC.getEraInfo((EraTypes)i).readPass3(); }
Vermutlich muss ich dann doch vorher nocheinfügen, und dies vorher noch definieren, oder?, &CvDLLUtilityIFaceBase::createUnitClassInfoCacheObject);
getNumEraInfos() existert immer. Das Problem ist eher, wie lautet die Anzahl. Da vorher die EraInfo eingelesen wurde, sollte das der Zahl der Einträge Erainfo entsprechen.
Viel wichtiger ist aber, exisitert die readPass3() für die EraInfo-Klasse? Diese muss man je Cv...Info-Klassen selbst definieren, wenn sie noch nicht angelegt wurde. Du kannst dich an bestehenden readPass3() Methoden orientieren.
Das hat damit nichts zu tun.
Also, irgend etwas habe ich falsch gemacht. Wenn ich den Mod nun lade, passiert gar nichts mehr. Der Computer läd und läd und dann hört er auf, Geräusche zu machen, aber es kommt kein Spiel.
Das hört sich anch einer endloschleife an. Poste doch mal den kompletten Code, wenn möglich.
Ich bin nicht sicher, ob es eine Endlosschleife ist, denn das Spiel, also der Ladevorgang, läuft nicht mehr weiter, weder im Taskmanager unter Prozesse noch sonst irgendwo. Ich kann die Gamecore.dll danach überschreiben, was normalerweise blockiert würde, weil darauf zugegriffen wird.
Hier der Code:
CvXMLLoadUtilitySet.cpp:
CvInfos.cppCode:bool CvXMLLoadUtility::LoadPreMenuGlobals() { if (!CreateFXml()) { return false; } LoadGlobalClassInfo(GC.getGameSpeedInfo(), "CIV4GameSpeedInfo", "GameInfo", "Civ4GameSpeedInfo/GameSpeedInfos/GameSpeedInfo", false); LoadGlobalClassInfo(GC.getTurnTimerInfo(), "CIV4TurnTimerInfo", "GameInfo", "Civ4TurnTimerInfo/TurnTimerInfos/TurnTimerInfo", false); LoadGlobalClassInfo(GC.getWorldInfo(), "CIV4WorldInfo", "GameInfo", "Civ4WorldInfo/WorldInfos/WorldInfo", false); LoadGlobalClassInfo(GC.getClimateInfo(), "CIV4ClimateInfo", "GameInfo", "Civ4ClimateInfo/ClimateInfos/ClimateInfo", false); LoadGlobalClassInfo(GC.getSeaLevelInfo(), "CIV4SeaLevelInfo", "GameInfo", "Civ4SeaLevelInfo/SeaLevelInfos/SeaLevelInfo", false); LoadGlobalClassInfo(GC.getAdvisorInfo(), "CIV4AdvisorInfos", "Interface", "Civ4AdvisorInfos/AdvisorInfos/AdvisorInfo", false); LoadGlobalClassInfo(GC.getTerrainInfo(), "CIV4TerrainInfos", "Terrain", "Civ4TerrainInfos/TerrainInfos/TerrainInfo", false); LoadGlobalClassInfo(GC.getEraInfo(), "CIV4EraInfos", "GameInfo", "Civ4EraInfos/EraInfos/EraInfo", false); LoadGlobalClassInfo(GC.getUnitClassInfo(), "CIV4UnitClassInfos", "Units", "Civ4UnitClassInfos/UnitClassInfos/UnitClassInfo", false); //Kathy Era Mercenaires Beginn for (int i=0; i < GC.getNumEraInfos(); ++i) { GC.getEraInfo((EraTypes)i).readPass3(); } //Kathy Era Mercenaires End LoadGlobalClassInfo(GC.getSpecialistInfo(), "CIV4SpecialistInfos", "GameInfo", "Civ4SpecialistInfos/SpecialistInfos/SpecialistInfo", false); LoadGlobalClassInfo(GC.getVoteSourceInfo(), "CIV4VoteSourceInfos", "GameInfo", "Civ4VoteSourceInfos/VoteSourceInfos/VoteSourceInfo", false); LoadGlobalClassInfo(GC.getTechInfo(), "CIV4TechInfos", "Technologies", "Civ4TechInfos/TechInfos/TechInfo", true, &CvDLLUtilityIFaceBase::createTechInfoCacheObject); LoadGlobalClassInfo(GC.getFeatureInfo(), "Civ4FeatureInfos", "Terrain", "Civ4FeatureInfos/FeatureInfos/FeatureInfo", false); LoadGlobalClassInfo(GC.getReligionInfo(), "CIV4ReligionInfo", "GameInfo", "Civ4ReligionInfo/ReligionInfos/ReligionInfo", false); LoadGlobalClassInfo(GC.getAnimationCategoryInfo(), "CIV4AnimationInfos", "Units", "Civ4AnimationInfos/AnimationCategories/AnimationCategory", false); LoadGlobalClassInfo(GC.getAnimationPathInfo(), "CIV4AnimationPathInfos", "Units", "Civ4AnimationPathInfos/AnimationPaths/AnimationPath", false); LoadGlobalClassInfo(GC.getPromotionInfo(), "CIV4PromotionInfos", "Units", "Civ4PromotionInfos/PromotionInfos/PromotionInfo", true, &CvDLLUtilityIFaceBase::createPromotionInfoCacheObject); LoadGlobalClassInfo(GC.getTraitInfo(), "CIV4TraitInfos", "Civilizations", "Civ4TraitInfos/TraitInfos/TraitInfo", false); LoadGlobalClassInfo(GC.getGoodyInfo(), "CIV4GoodyInfo", "GameInfo", "Civ4GoodyInfo/GoodyInfos/GoodyInfo", false); LoadGlobalClassInfo(GC.getHandicapInfo(), "CIV4HandicapInfo", "GameInfo", "Civ4HandicapInfo/HandicapInfos/HandicapInfo", false, &CvDLLUtilityIFaceBase::createHandicapInfoCacheObject); LoadGlobalClassInfo(GC.getCursorInfo(), "CIV4CursorInfo", "GameInfo", "Civ4CursorInfo/CursorInfos/CursorInfo", false); LoadGlobalClassInfo(GC.getCivicOptionInfo(), "CIV4CivicOptionInfos", "GameInfo", "Civ4CivicOptionInfos/CivicOptionInfos/CivicOptionInfo", false); LoadGlobalClassInfo(GC.getUpkeepInfo(), "CIV4UpkeepInfo", "GameInfo", "Civ4UpkeepInfo/UpkeepInfos/UpkeepInfo", false); LoadGlobalClassInfo(GC.getHurryInfo(), "CIV4HurryInfo", "GameInfo", "Civ4HurryInfo/HurryInfos/HurryInfo", false); LoadGlobalClassInfo(GC.getSpecialBuildingInfo(), "CIV4SpecialBuildingInfos", "Buildings", "Civ4SpecialBuildingInfos/SpecialBuildingInfos/SpecialBuildingInfo", false); LoadGlobalClassInfo(GC.getCultureLevelInfo(), "CIV4CultureLevelInfo", "GameInfo", "Civ4CultureLevelInfo/CultureLevelInfos/CultureLevelInfo", false); LoadGlobalClassInfo(GC.getBonusClassInfo(), "CIV4BonusClassInfos", "Terrain", "Civ4BonusClassInfos/BonusClassInfos/BonusClassInfo", false); LoadGlobalClassInfo(GC.getVictoryInfo(), "CIV4VictoryInfo", "GameInfo", "Civ4VictoryInfo/VictoryInfos/VictoryInfo", false); LoadGlobalClassInfo(GC.getBonusInfo(), "CIV4BonusInfos", "Terrain", "Civ4BonusInfos/BonusInfos/BonusInfo", false, &CvDLLUtilityIFaceBase::createBonusInfoCacheObject); LoadGlobalClassInfo(GC.getCorporationInfo(), "CIV4CorporationInfo", "GameInfo", "Civ4CorporationInfo/CorporationInfos/CorporationInfo", false); LoadGlobalClassInfo(GC.getRouteInfo(), "Civ4RouteInfos", "Misc", "Civ4RouteInfos/RouteInfos/RouteInfo", false); LoadGlobalClassInfo(GC.getImprovementInfo(), "CIV4ImprovementInfos", "Terrain", "Civ4ImprovementInfos/ImprovementInfos/ImprovementInfo", true, &CvDLLUtilityIFaceBase::createImprovementInfoCacheObject); LoadGlobalClassInfo(GC.getBuildingClassInfo(), "CIV4BuildingClassInfos", "Buildings", "Civ4BuildingClassInfos/BuildingClassInfos/BuildingClassInfo", false); LoadGlobalClassInfo(GC.getBuildingInfo(), "CIV4BuildingInfos", "Buildings", "Civ4BuildingInfos/BuildingInfos/BuildingInfo", false, &CvDLLUtilityIFaceBase::createBuildingInfoCacheObject); for (int i=0; i < GC.getNumBuildingClassInfos(); ++i) { GC.getBuildingClassInfo((BuildingClassTypes)i).readPass3(); } LoadGlobalClassInfo(GC.getSpecialUnitInfo(), "CIV4SpecialUnitInfos", "Units", "Civ4SpecialUnitInfos/SpecialUnitInfos/SpecialUnitInfo", false); LoadGlobalClassInfo(GC.getProjectInfo(), "CIV4ProjectInfo", "GameInfo", "Civ4ProjectInfo/ProjectInfos/ProjectInfo", true); LoadGlobalClassInfo(GC.getCivicInfo(), "CIV4CivicInfos", "GameInfo", "Civ4CivicInfos/CivicInfos/CivicInfo", false, &CvDLLUtilityIFaceBase::createCivicInfoCacheObject); for (int i=0; i < GC.getNumVoteSourceInfos(); ++i) { GC.getVoteSourceInfo((VoteSourceTypes)i).readPass3(); } LoadGlobalClassInfo(GC.getLeaderHeadInfo(), "CIV4LeaderHeadInfos", "Civilizations", "Civ4LeaderHeadInfos/LeaderHeadInfos/LeaderHeadInfo", false, &CvDLLUtilityIFaceBase::createLeaderHeadInfoCacheObject); LoadGlobalClassInfo(GC.getColorInfo(), "CIV4ColorVals", "Interface", "Civ4ColorVals/ColorVals/ColorVal", false); LoadGlobalClassInfo(GC.getPlayerColorInfo(), "CIV4PlayerColorInfos", "Interface", "Civ4PlayerColorInfos/PlayerColorInfos/PlayerColorInfo", false); LoadGlobalClassInfo(GC.getEffectInfo(), "CIV4EffectInfos", "Misc", "Civ4EffectInfos/EffectInfos/EffectInfo", false); LoadGlobalClassInfo(GC.getEntityEventInfo(), "CIV4EntityEventInfos", "Units", "Civ4EntityEventInfos/EntityEventInfos/EntityEventInfo", false); LoadGlobalClassInfo(GC.getBuildInfo(), "CIV4BuildInfos", "Units", "Civ4BuildInfos/BuildInfos/BuildInfo", false); LoadGlobalClassInfo(GC.getUnitInfo(), "CIV4UnitInfos", "Units", "Civ4UnitInfos/UnitInfos/UnitInfo", false, &CvDLLUtilityIFaceBase::createUnitInfoCacheObject); for (int i=0; i < GC.getNumUnitClassInfos(); ++i) { GC.getUnitClassInfo((UnitClassTypes)i).readPass3(); } LoadGlobalClassInfo(GC.getUnitArtStyleTypeInfo(), "CIV4UnitArtStyleTypeInfos", "Civilizations", "Civ4UnitArtStyleTypeInfos/UnitArtStyleTypeInfos/UnitArtStyleTypeInfo", false); LoadGlobalClassInfo(GC.getCivilizationInfo(), "CIV4CivilizationInfos", "Civilizations", "Civ4CivilizationInfos/CivilizationInfos/CivilizationInfo", true, &CvDLLUtilityIFaceBase::createCivilizationInfoCacheObject); LoadGlobalClassInfo(GC.getHints(), "CIV4Hints", "GameInfo", "Civ4Hints/HintInfos/HintInfo", false); LoadGlobalClassInfo(GC.getMainMenus(), "CIV4MainMenus", "Art", "Civ4MainMenus/MainMenus/MainMenu", false); LoadGlobalClassInfo(GC.getSlideShowInfo(), "CIV4SlideShowInfos", "Interface", "Civ4SlideShowInfos/SlideShowInfos/SlideShowInfo", false); LoadGlobalClassInfo(GC.getSlideShowRandomInfo(), "CIV4SlideShowRandomInfos", "Interface", "Civ4SlideShowRandomInfos/SlideShowRandomInfos/SlideShowRandomInfo", false); LoadGlobalClassInfo(GC.getWorldPickerInfo(), "CIV4WorldPickerInfos", "Interface", "Civ4WorldPickerInfos/WorldPickerInfos/WorldPickerInfo", false); LoadGlobalClassInfo(GC.getSpaceShipInfo(), "Civ4SpaceShipInfos", "Interface", "Civ4SpaceShipInfos/SpaceShipInfos/SpaceShipInfo", false); LoadGlobalClassInfo(GC.getYieldInfo(), "CIV4YieldInfos", "Terrain", "Civ4YieldInfos/YieldInfos/YieldInfo", false); LoadGlobalClassInfo(GC.getCommerceInfo(), "CIV4CommerceInfo", "GameInfo", "Civ4CommerceInfo/CommerceInfos/CommerceInfo", false); LoadGlobalClassInfo(GC.getGameOptionInfo(), "CIV4GameOptionInfos", "GameInfo", "Civ4GameOptionInfos/GameOptionInfos/GameOptionInfo", false); LoadGlobalClassInfo(GC.getMPOptionInfo(), "CIV4MPOptionInfos", "GameInfo", "Civ4MPOptionInfos/MPOptionInfos/MPOptionInfo", false); LoadGlobalClassInfo(GC.getForceControlInfo(), "CIV4ForceControlInfos", "GameInfo", "Civ4ForceControlInfos/ForceControlInfos/ForceControlInfo", false); // add types to global var system for (int i = 0; i < GC.getNumCursorInfos(); ++i) { int iVal; CvString szType = GC.getCursorInfo((CursorTypes)i).getType(); if (GC.getDefinesVarSystem()->GetValue(szType, iVal)) { char szMessage[1024]; sprintf(szMessage, "cursor type already set? \n Current XML file is: %s", GC.getCurrentXMLFile().GetCString()); gDLL->MessageBox(szMessage, "XML Error"); } GC.getDefinesVarSystem()->SetValue(szType, i); } // Check Playables for (int i=0; i < GC.getNumCivilizationInfos(); ++i) { // if the civilization is playable we will increment the playable var if (GC.getCivilizationInfo((CivilizationTypes) i).isPlayable()) { GC.getNumPlayableCivilizationInfos() += 1; } // if the civilization is playable by AI increments num playable if (GC.getCivilizationInfo((CivilizationTypes) i).isAIPlayable()) { GC.getNumAIPlayableCivilizationInfos() += 1; } } UpdateProgressCB("GlobalOther"); DestroyFXml(); return true; }
CvInfos.hCode:CvEraInfo::CvEraInfo() : m_iStartingUnitMultiplier(0), //Kathy Beginn Era Mercenaries m_MercenaryUnitclass(NO_UNITCLASS), //Kathy End Era Mercenaries m_iStartingDefenseUnits(0), m_iStartingWorkerUnits(0), m_iStartingExploreUnits(0), m_iAdvancedStartPoints(0), m_iStartingGold(0), m_iFreePopulation(0), m_iStartPercent(0), m_iGrowthPercent(0), m_iTrainPercent(0), m_iConstructPercent(0), m_iCreatePercent(0), m_iResearchPercent(0), /************************************************************************************************/ /* BETTER_BTS_AI_MOD 08/21/09 jdog5000 */ /* */ /* Tech Diffusion */ /************************************************************************************************/ m_iTechCostModifier(0), /************************************************************************************************/ /* BETTER_BTS_AI_MOD END */ /************************************************************************************************/ m_iBuildPercent(0), m_iImprovementPercent(0), m_iGreatPeoplePercent(0), m_iAnarchyPercent(0), m_iEventChancePerTurn(0), m_iSoundtrackSpace(0), m_iNumSoundtracks(0), m_bNoGoodies(false), m_bNoAnimals(false), m_bNoBarbUnits(false), m_bNoBarbCities(false), m_bFirstSoundtrackFirst(false), m_paiCitySoundscapeSciptIds(NULL), m_paiSoundtracks(NULL) { } bool CvEraInfo::read(CvXMLLoadUtility* pXML) { if (!CvInfoBase::read(pXML)) { return false; } pXML->GetChildXmlValByName(&m_bNoGoodies, "bNoGoodies"); //Kathy Beginn Mercenary Era pXML->GetChildXmlValByName(&m_MercenaryUnitclass, "MercenaryUnitclass"); //Kathy End Mercenary Era pXML->GetChildXmlValByName(&m_bNoAnimals, "bNoAnimals"); pXML->GetChildXmlValByName(&m_bNoBarbUnits, "bNoBarbUnits"); pXML->GetChildXmlValByName(&m_bNoBarbCities, "bNoBarbCities"); pXML->GetChildXmlValByName(&m_iStartingUnitMultiplier, "iStartingUnitMultiplier"); pXML->GetChildXmlValByName(&m_iStartingDefenseUnits, "iStartingDefenseUnits"); pXML->GetChildXmlValByName(&m_iStartingWorkerUnits, "iStartingWorkerUnits"); pXML->GetChildXmlValByName(&m_iStartingExploreUnits, "iStartingExploreUnits"); pXML->GetChildXmlValByName(&m_iAdvancedStartPoints, "iAdvancedStartPoints"); pXML->GetChildXmlValByName(&m_iStartingGold, "iStartingGold"); pXML->GetChildXmlValByName(&m_iFreePopulation, "iFreePopulation"); pXML->GetChildXmlValByName(&m_iStartPercent, "iStartPercent"); pXML->GetChildXmlValByName(&m_iGrowthPercent, "iGrowthPercent"); pXML->GetChildXmlValByName(&m_iTrainPercent, "iTrainPercent"); pXML->GetChildXmlValByName(&m_iConstructPercent, "iConstructPercent"); pXML->GetChildXmlValByName(&m_iCreatePercent, "iCreatePercent"); pXML->GetChildXmlValByName(&m_iResearchPercent, "iResearchPercent"); /************************************************************************************************/ /* BETTER_BTS_AI_MOD 08/21/09 jdog5000 */ /* */ /* Tech Diffusion */ /************************************************************************************************/ pXML->GetChildXmlValByName(&m_iTechCostModifier, "iTechCostModifier"); /************************************************************************************************/ /* BETTER_BTS_AI_MOD END */ /************************************************************************************************/ pXML->GetChildXmlValByName(&m_iBuildPercent, "iBuildPercent"); pXML->GetChildXmlValByName(&m_iImprovementPercent, "iImprovementPercent"); pXML->GetChildXmlValByName(&m_iGreatPeoplePercent, "iGreatPeoplePercent"); pXML->GetChildXmlValByName(&m_iAnarchyPercent, "iAnarchyPercent"); pXML->GetChildXmlValByName(&m_iEventChancePerTurn, "iEventChancePerTurn"); pXML->GetChildXmlValByName(&m_iSoundtrackSpace, "iSoundtrackSpace"); pXML->GetChildXmlValByName(&m_bFirstSoundtrackFirst, "bFirstSoundtrackFirst"); pXML->GetChildXmlValByName(m_szAudioUnitVictoryScript, "AudioUnitVictoryScript"); pXML->GetChildXmlValByName(m_szAudioUnitDefeatScript, "AudioUnitDefeatScript"); if (gDLL->getXMLIFace()->SetToChildByTagName(pXML->GetXML(), "EraInfoSoundtracks")) { CvString* pszSoundTrackNames = NULL; pXML->SetStringList(&pszSoundTrackNames, &m_iNumSoundtracks); if (m_iNumSoundtracks > 0) { m_paiSoundtracks = new int[m_iNumSoundtracks]; int j; for (j=0;j<m_iNumSoundtracks;j++) { m_paiSoundtracks[j] = ((!gDLL->getAudioDisabled()) ? gDLL->getAudioTagIndex(pszSoundTrackNames[j], AUDIOTAG_2DSCRIPT) : -1); } } else { m_paiSoundtracks = NULL; } gDLL->getXMLIFace()->SetToParent(pXML->GetXML()); SAFE_DELETE_ARRAY(pszSoundTrackNames); } pXML->SetVariableListTagPairForAudioScripts(&m_paiCitySoundscapeSciptIds, "CitySoundscapes", GC.getCitySizeTypes(), sizeof(GC.getCitySizeTypes((CitySizeTypes)0))); return true; } //Kathy BEginn Mercenary Era bool CvEraInfo::readPass3() { if (m_aszExtraXMLforPass3.size() < 1) { FAssert(false); return false; } m_MercenaryUnitclass = GC.getInfoTypeForString(m_aszExtraXMLforPass3[0]); m_aszExtraXMLforPass3.clear(); return true; } //Kathy End Mercenary Era
CyInfoInterface3.cppCode:class CvEraInfo : public CvInfoBase { public: CvEraInfo(); virtual ~CvEraInfo(); int getStartingUnitMultiplier() const; // Exposed to Python //Kathy Beginn Mercenary Era int getMercenaryUnitclass() const; // Exposed to Python //Kathy End Mercenary Era int getStartingDefenseUnits() const; // Exposed to Python int getStartingWorkerUnits() const; // Exposed to Python int getStartingExploreUnits() const; // Exposed to Python int getAdvancedStartPoints() const; // Exposed to Python int getStartingGold() const; // Exposed to Python int getFreePopulation() const; // Exposed to Python int getStartPercent() const; // Exposed to Python int getGrowthPercent() const; // Exposed to Python int getTrainPercent() const; // Exposed to Python int getConstructPercent() const; // Exposed to Python int getCreatePercent() const; // Exposed to Python int getResearchPercent() const; // Exposed to Python /************************************************************************************************/ /* BETTER_BTS_AI_MOD 08/21/09 jdog5000 */ /* */ /* Tech Diffusion */ /************************************************************************************************/ int getTechCostModifier() const; /************************************************************************************************/ /* BETTER_BTS_AI_MOD END */ /************************************************************************************************/ int getBuildPercent() const; // Exposed to Python int getImprovementPercent() const; // Exposed to Python int getGreatPeoplePercent() const; // Exposed to Python int getAnarchyPercent() const; // Exposed to Python int getEventChancePerTurn() const; // Exposed to Python int getSoundtrackSpace() const; // Exposed to Python int getNumSoundtracks() const; // Exposed to Python const TCHAR* getAudioUnitVictoryScript() const; // Exposed to Python const TCHAR* getAudioUnitDefeatScript() const; // Exposed to Python bool isNoGoodies() const; // Exposed to Python bool isNoAnimals() const; // Exposed to Python bool isNoBarbUnits() const; // Exposed to Python bool isNoBarbCities() const; // Exposed to Python bool isFirstSoundtrackFirst() const; // Exposed to Python // Arrays int getSoundtracks(int i) const; int getCitySoundscapeSciptId(int i) const; bool read(CvXMLLoadUtility* pXML); //Kathy Beginn Era Mercenaries bool readPass3(); //Kathy End Era Mercenaries protected: int m_iStartingUnitMultiplier; //Kathy Beginn Era Mercenaries int m_MercenaryUnitclass; //Kathy End Era Mercenaries int m_iStartingDefenseUnits; int m_iStartingWorkerUnits; int m_iStartingExploreUnits; int m_iAdvancedStartPoints; int m_iStartingGold; int m_iFreePopulation; int m_iStartPercent; int m_iGrowthPercent; int m_iTrainPercent; int m_iConstructPercent; int m_iCreatePercent; int m_iResearchPercent; /************************************************************************************************/ /* BETTER_BTS_AI_MOD 08/21/09 jdog5000 */ /* */ /* Tech Diffusion */ /************************************************************************************************/ int m_iTechCostModifier; /************************************************************************************************/ /* BETTER_BTS_AI_MOD END */ /************************************************************************************************/ int m_iBuildPercent; int m_iImprovementPercent; int m_iGreatPeoplePercent; int m_iAnarchyPercent; int m_iEventChancePerTurn; int m_iSoundtrackSpace; int m_iNumSoundtracks; CvString m_szAudioUnitVictoryScript; CvString m_szAudioUnitDefeatScript; bool m_bNoGoodies; bool m_bNoAnimals; bool m_bNoBarbUnits; bool m_bNoBarbCities; bool m_bFirstSoundtrackFirst; // Arrays int* m_paiSoundtracks; int* m_paiCitySoundscapeSciptIds; };
Das müssten eigentlich alle Codeteile sein.Code:python::class_<CvEraInfo, python::bases<CvInfoBase> >("CvEraInfo") .def("getStartingUnitMultiplier", &CvEraInfo::getStartingUnitMultiplier, "int () -") //Kathy Mercenary Era Beginn .def("getMercenaryUnitclass", &CvEraInfo::getMercenaryUnitclass, "int () -") //Kathy Mercenary Era Beginn .def("getStartingDefenseUnits", &CvEraInfo::getStartingDefenseUnits, "int () -") .def("getStartingWorkerUnits", &CvEraInfo::getStartingWorkerUnits, "int () -") .def("getStartingExploreUnits", &CvEraInfo::getStartingExploreUnits, "int () -") .def("getStartingGold", &CvEraInfo::getStartingGold, "int () -") .def("getFreePopulation", &CvEraInfo::getFreePopulation, "int () -") .def("getStartPercent", &CvEraInfo::getStartPercent, "int () -") .def("getGrowthPercent", &CvEraInfo::getGrowthPercent, "int () -") .def("getTrainPercent", &CvEraInfo::getTrainPercent, "int () -") .def("getConstructPercent", &CvEraInfo::getConstructPercent, "int () -") .def("getCreatePercent", &CvEraInfo::getCreatePercent, "int () -") .def("getResearchPercent", &CvEraInfo::getResearchPercent, "int () -") .def("getBuildPercent", &CvEraInfo::getBuildPercent, "int () -") .def("getImprovementPercent", &CvEraInfo::getImprovementPercent, "int () -") .def("getGreatPeoplePercent", &CvEraInfo::getGreatPeoplePercent, "int () -") .def("getAnarchyPercent", &CvEraInfo::getAnarchyPercent, "int () -") .def("getEventChancePerTurn", &CvEraInfo::getEventChancePerTurn, "int () -") .def("getSoundtrackSpace", &CvEraInfo::getSoundtrackSpace, "int () -") .def("isFirstSoundtrackFirst", &CvEraInfo::isFirstSoundtrackFirst, "int () -") .def("getNumSoundtracks", &CvEraInfo::getNumSoundtracks, "int () -") .def("getAudioUnitVictoryScript", &CvEraInfo::getAudioUnitVictoryScript, "string () -") .def("getAudioUnitDefeatScript", &CvEraInfo::getAudioUnitDefeatScript, "string () -") .def("isNoGoodies", &CvEraInfo::isNoGoodies, "bool () -") .def("isNoAnimals", &CvEraInfo::isNoAnimals, "bool () -") .def("isNoBarbUnits", &CvEraInfo::isNoBarbUnits, "bool () -") .def("isNoBarbCities", &CvEraInfo::isNoBarbCities, "bool () -") // Arrays .def("getSoundtracks", &CvEraInfo::getSoundtracks, "int (int i) -") .def("getCitySoundscapeSciptId", &CvEraInfo::getCitySoundscapeSciptId, "int (int i) -") ;
Mir fällt schon mal ein Fehler auf.
Das geht so nicht, du hast die Lesereihenfolge vergessen, weswegen du ja readpass nutzen sollst/wolltest.Code://Kathy Beginn Mercenary Era pXML->GetChildXmlValByName(&m_MercenaryUnitclass, "MercenaryUnitclass"); //Kathy End Mercenary Era
Beispiel:
Das Auslesen sieht richtig aus.Code:CvString szTextVal; pXML->GetChildXmlValByName(szTextVal, "DefaultUnit"); m_aszExtraXMLforPass3.push_back(szTextVal);
int getMercenaryUnitclass() const; // Exposed to Python
Davon sehe ich die Definition nicht, nur diese Deklaration.
Die Definition für habe ich tatsächlich im Post oben vergessen, sie existiert aber in CvInfos.cpp:
Das andere habe ich jetzt eingefügt, der Test folgt.Code://Kathy Baginn Mercenairy Era int CvEraInfo::getMercenaryUnitclass() const { return m_MercenaryUnitclass; } //Kathy End Mercenairy Era
Startest du mit Release oder Debug-DLL?
Ist das ein Start über den Pfeil oder der Verknüpfung? Mittlerweile starte ich nur noch über die Verknüpfung und hänge VS erst hinter zum Debuggen an.
Debuggen -> An Prozess anhängen -> Civ 4 exe auswählen.
Das hinterer anhängen spart viel Zeit beim starten.
Bei deinen konkreten Fall macht es zu mindest Sinn, das Spiel direkt über den Pfeil zu starten um zu sehen, ob ein Fehler gemacht wurde. Jedoch wüsste man dann beim normalen Start eher, ob das Spiel bis in das Menü kommt.