From: <dil...@us...> - 2013-08-13 20:07:59
|
Revision: 6331 http://sourceforge.net/p/freeorion/code/6331 Author: dilvish-fo Date: 2013-08-13 20:07:54 +0000 (Tue, 13 Aug 2013) Log Message: ----------- fix for python AI Interface for ResourceCenter::AvailableFoci after recent change re TemporaryPtrs Modified Paths: -------------- trunk/FreeOrion/default/AI/ResourcesAI.py trunk/FreeOrion/python/PythonUniverseWrapper.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/ResourceCenter.cpp trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/default/AI/ResourcesAI.py =================================================================== --- trunk/FreeOrion/default/AI/ResourcesAI.py 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/default/AI/ResourcesAI.py 2013-08-13 20:07:54 UTC (rev 6331) @@ -25,6 +25,7 @@ RFocus = AIFocusType.FOCUS_RESEARCH MFocus = AIFocusType.FOCUS_MINING GFocus = AIFocusType.FOCUS_GROWTH +fociMap={IFocus:"Industry", RFocus:"Research", MFocus:"Mining", GFocus:"Growth"} useGrowth = True limitAssessments = False @@ -45,7 +46,14 @@ targetPP = sum( map( lambda x: x.currentMeterValue(fo.meterType.targetIndustry), planetMap.values()) ) targetRP = sum( map( lambda x: x.currentMeterValue(fo.meterType.targetResearch), planetMap.values()) ) - + + #print "\nAvailable Foci:" + #for pid in empirePlanetIDs: + # planet=planetMap[pid] + # print planet.name, ": ", ", ".join( [fociMap.get(foc, str(foc)) for foc in planet.availableFoci]) + #print + + newFocus= IFocus for pid in empirePlanetIDs: planet=planetMap[pid] @@ -146,7 +154,7 @@ empire = fo.getEmpire() empireID = empire.empireID currentTurn = fo.currentTurn() - freq = min(3, ( max(5, currentTurn-120) )/4.0)**(1.0/3) + freq = min(1, ( max(5, currentTurn-120) )/4.0)**(1.0/3) if limitAssessments and ( abs(currentTurn - lastFociCheck[0] ) <1.5*freq) and ( random() < 1.0/freq ) : timer = 6*[time()] else: @@ -198,7 +206,7 @@ print "%s focus of planet %s (%d) at Growth Focus"%( ["set", "left" ][ curFocus == GFocus ] , planetMap[spPID].name, spPID) break else: - print "failed setting focus of planet %s (%d) at Growth Focus; focus left at %s"%( planetMap[spPID].name, spPID, planetMap[spPID].focus) + print "Error: failed setting focus of planet %s (%d) at Growth Focus; focus left at %s"%( planetMap[spPID].name, spPID, planetMap[spPID].focus) for pid in empirePlanetIDs: planet = planetMap[pid] if "COMPUTRONIUM_SPECIAL" in planet.specials:#TODO: ensure only one (extremely rarely needed) @@ -281,10 +289,13 @@ ratios.append( (thisFactor, pid ) ) ctPP0 = curTargetPP - ctRP0 = curTargetRP + ctRP0 = curTargetRP + ppIF= sum([ x.get(IFocus, (0, 0))[0] for x in newTargets.values()]) + rpIF= sum([ x.get(IFocus, (0, 0))[1] for x in newTargets.values()]) + ppRF= sum([ x.get(RFocus, (0, 0))[0] for x in newTargets.values()]) + rpRF= sum([ x.get(RFocus, (0, 0))[1] for x in newTargets.values()]) ratios.sort() printedHeader=False - fociMap={IFocus:"Industry", RFocus:"Research", MFocus:"Mining", GFocus:"Growth"} gotAlgo = empire.getTechStatus("LRN_ALGO_ELEGANCE") == fo.techStatus.complete for ratio, pid in ratios: if priorityRatio < ( curTargetRP/ (curTargetPP + 0.0001)) : #we have enough RP @@ -319,7 +330,8 @@ curTargetPP -= (II-RI) print "============================" print "Planet Focus Assignments to achieve target RP/PP ratio of %.2f from current ratio of %.2f ( %.1f / %.1f )"%(priorityRatio, rp/(pp+0.0001), rp, pp) - print "Max Industry assignments would result in target RP/PP ratio of %.2f ( %.1f / %.1f )"%( ctRP0/ (ctPP0 + 0.0001), ctRP0, ctPP0 ) + print "Max Industry assignments would result in target RP/PP ratio of %.2f ( %.1f / %.1f )"%( rpIF/ (ppIF + 0.0001), rpIF, ppIF ) + print "Max Research assignments would result in target RP/PP ratio of %.2f ( %.1f / %.1f )"%( rpRF/ (ppRF + 0.0001), rpRF, ppRF ) print "-------------------------------------" print "%34s|%20s|%15s |%15s|%15s |%15s "%(" Planet ", " current RP/PP ", " current target RP/PP ", "current Focus "," newFocus ", " new target RP/PP ") totalChanged=0 @@ -332,7 +344,7 @@ totalChanged+=1 result = fo.issueChangeFocusOrder(pid, newFocus) if result != 1: - print "Trouble changing focus of planet %s (%d) to %s"%(planetMap[pid].name, pid, newFocus) + print "Error: Trouble changing focus of planet %s (%d) to %s"%(planetMap[pid].name, pid, newFocus) otPP, otRP= newTargets[pid].get(oldFocus, (0, 0)) ntPP, ntRP= newTargets[pid].get(newFocus, (0, 0)) print "pID (%3d) %22s | c: %5.1f / %5.1f | cT: %5.1f / %5.1f | cF: %8s | nF: %8s | cT: %5.1f / %5.1f "%(pid, planetMap[pid].name, cRP, cPP, otRP, otPP, fociMap.get(oldFocus, 'unknown'), fociMap[newFocus] , ntRP, ntPP ) Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2013-08-13 20:07:54 UTC (rev 6331) @@ -505,7 +505,7 @@ //////////////////// class_<ResourceCenter, noncopyable>("resourceCenter", no_init) .add_property("focus", make_function(&ResourceCenter::Focus, return_value_policy<copy_const_reference>())) - .add_property("availableFoci", &ResourceCenter::AvailableFoci) + .add_property("availableFoci", &ResourceCenter::ApparentAvailableFoci) ; /////////////////// Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/universe/Planet.cpp 2013-08-13 20:07:54 UTC (rev 6331) @@ -506,7 +506,7 @@ std::vector<std::string> retval; TemporaryPtr<const Planet> this_planet = dynamic_ptr_cast<const Planet>(res); if (!this_planet) - return retval; + return retval;// can only happen if the ObjectMap of the returned universe didn't contain this planet, which would probably indicate an underlying problem ScriptingContext context(this_planet); if (const Species* species = GetSpecies(this_planet->SpeciesName())) { const std::vector<FocusType>& foci = species->Foci(); @@ -522,6 +522,14 @@ return retval; } +std::vector<std::string> Planet::ApparentAvailableFoci() const { + std::vector<std::string> retval; + TemporaryPtr<const Planet> this_planet = GetUniverse().Objects().Object<Planet>(this->ID()); + if (!this_planet) + return retval;// can only happen if the ObjectMap of the returned universe didn't contain this planet, which would probably indicate an underlying problem + return AvailableFoci(this_planet); +} + const std::string& Planet::FocusIcon(const std::string& focus_name) const { if (const Species* species = GetSpecies(this->SpeciesName())) { const std::vector<FocusType>& foci = species->Foci(); Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/universe/Planet.h 2013-08-13 20:07:54 UTC (rev 6331) @@ -116,8 +116,9 @@ virtual bool Contains(int object_id) const; ///< returns true iff this Planet contains a building with ID \a id. virtual std::vector<TemporaryPtr<UniverseObject> >FindObjects() const; ///< returns objects contained within this object virtual std::vector<int> FindObjectIDs() const; ///< returns ids of objects contained within this object - + virtual std::vector<std::string> AvailableFoci(TemporaryPtr<const ResourceCenter> res) const; // Requires a TemporaryPtr to itself to pass into condition evaluation functions. + virtual std::vector<std::string> ApparentAvailableFoci() const; // uses info from 'local' universe object map; should only give a different result if were ever called on Server virtual const std::string& FocusIcon(const std::string& focus_name) const; bool IsAboutToBeColonized() const { return m_is_about_to_be_colonized; } Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2013-08-13 20:07:54 UTC (rev 6331) @@ -59,6 +59,9 @@ std::vector<std::string> ResourceCenter::AvailableFoci(TemporaryPtr<const ResourceCenter> res) const { return std::vector<std::string>(); } +std::vector<std::string> ResourceCenter::ApparentAvailableFoci() const +{ return std::vector<std::string>(); } + const std::string& ResourceCenter::FocusIcon(const std::string& focus_name) const { return EMPTY_STRING; } Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/universe/ResourceCenter.h 2013-08-13 20:07:54 UTC (rev 6331) @@ -32,6 +32,7 @@ /** \name Accessors */ //@{ const std::string& Focus() const; ///< current focus to which this ResourceCenter is set virtual std::vector<std::string>AvailableFoci(TemporaryPtr<const ResourceCenter> res) const; ///< focus settings available to this ResourceCenter + virtual std::vector<std::string>ApparentAvailableFoci() const; ///< focus settings available to this ResourceCenter; uses info from 'local' universe object map; should only give a different result if were ever called on Server virtual const std::string& FocusIcon(const std::string& focus_name) const; ///< icon representing focus with name \a focus_name for this ResourceCenter std::string Dump() const; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-08-12 19:34:48 UTC (rev 6330) +++ trunk/FreeOrion/universe/Universe.cpp 2013-08-13 20:07:54 UTC (rev 6331) @@ -1404,7 +1404,7 @@ } double fields_time = type_timer.elapsed(); - Logger().debugStream() << "Type times: planet species: " << planet_species_time*1000 + Logger().debugStream() << "Universe::GetEffectsAndTargets Type times: planet species: " << planet_species_time*1000 << " ship species: " << ship_species_time*1000 << " specials: " << special_time*1000 << " techs: " << tech_time*1000 |