Hooks
static bool BeforeCvSiteEvaluatorForStart_PlotFoundValue(CvSiteEvaluatorForStart* self, CvPlot* pPlot, CvPlayer* pPlayer, YieldTypes arg2, bool arg3, int& result);static void AfterCvSiteEvaluatorForStart_PlotFoundValue(CvSiteEvaluatorForStart* self, CvPlot* pPlot, CvPlayer* pPlayer, YieldTypes arg2, bool arg3, int& result);static int ReplaceCvSiteEvaluatorForStart_PlotFoundValue(int (*original)(CvSiteEvaluatorForStart*, CvPlot*, CvPlayer*, YieldTypes, bool), CvSiteEvaluatorForStart* self, CvPlot* pPlot, CvPlayer* pPlayer, YieldTypes arg2, bool arg3);CivRegisterBefore<CivHooks::CvSiteEvaluatorForStart_PlotFoundValue>(host, &BeforeCvSiteEvaluatorForStart_PlotFoundValue);CivRegisterAfter<CivHooks::CvSiteEvaluatorForStart_PlotFoundValue>(host, &AfterCvSiteEvaluatorForStart_PlotFoundValue);CivRegisterReplace<CivHooks::CvSiteEvaluatorForStart_PlotFoundValue>(host, &ReplaceCvSiteEvaluatorForStart_PlotFoundValue);
Code
1176/// Value of this site for a civ starting location1177int CvSiteEvaluatorForStart::PlotFoundValue(CvPlot* pPlot, CvPlayer* pPlayer, YieldTypes, bool)1178{1179 int rtnValue = 0;1180 int iI;1181 CvPlot* pLoopPlot(NULL);1182 int iCelticForestCount = 0;11831184 CvAssert(pPlot);1185 if(!pPlot) return rtnValue;11861187 if(!CanFound(pPlot, pPlayer, false))1188 {1189 return rtnValue;1190 }11911192 // Is there any reason this site doesn't work for a start location?1193 //1194 // Not on top of a goody hut1195 if(pPlot->isGoody())1196 {1197 return 0;1198 }11991200 // We have our own special method of scoring, so don't call the base class for that (like settler version does)1201#if defined(MOD_GLOBAL_CITY_WORKING)1202 int iLimit = (pPlayer != NULL) ? pPlayer->GetNumWorkablePlots() : AVG_CITY_PLOTS;1203 for(iI = 0; iI < iLimit; iI++)1204#else1205 for(iI = 0; iI < NUM_CITY_PLOTS; iI++)1206#endif1207 {1208 pLoopPlot = plotCity(pPlot->getX(), pPlot->getY(), iI);12091210 // Too close to map edge?1211 if(pLoopPlot == NULL)1212 {1213 return 0;1214 }1215 else1216 {1217 int iDistance = plotDistance(pPlot->getX(), pPlot->getY(), pLoopPlot->getX(), pLoopPlot->getY());1218#if defined(MOD_GLOBAL_CITY_WORKING)1219 if (pPlayer != NULL) {1220 CvAssert(iDistance <= pPlayer->getWorkPlotDistance());1221 if(iDistance > pPlayer->getWorkPlotDistance()) continue;1222 } else {1223 CvAssert(iDistance <= AVG_CITY_RADIUS);1224 if(iDistance > AVG_CITY_RADIUS) continue;1225 }1226#else 1227 CvAssert(iDistance <= NUM_CITY_RINGS);1228 if(iDistance > NUM_CITY_RINGS) continue;1229#endif1230 int iRingModifier = m_iRingModifier[iDistance];12311232 // Skip the city plot itself for now1233 if(iDistance != 0)1234 {1235 rtnValue += iRingModifier * ComputeFoodValue(pLoopPlot, pPlayer) * /*6*/ GC.getSTART_AREA_FOOD_MULTIPLIER();1236 rtnValue += iRingModifier * ComputeHappinessValue(pLoopPlot, pPlayer) * /*12*/ GC.getSTART_AREA_HAPPINESS_MULTIPLIER();1237 rtnValue += iRingModifier * ComputeProductionValue(pLoopPlot, pPlayer) * /*8*/ GC.getSTART_AREA_PRODUCTION_MULTIPLIER();1238 rtnValue += iRingModifier * ComputeGoldValue(pLoopPlot, pPlayer) * /*2*/ GC.getSTART_AREA_GOLD_MULTIPLIER();1239 rtnValue += iRingModifier * ComputeScienceValue(pLoopPlot, pPlayer) * /*1*/ GC.getSTART_AREA_SCIENCE_MULTIPLIER();1240 rtnValue += iRingModifier * ComputeFaithValue(pLoopPlot, pPlayer) * /*1*/ GC.getSTART_AREA_FAITH_MULTIPLIER();1241 rtnValue += iRingModifier * ComputeTradeableResourceValue(pLoopPlot, pPlayer) * /*1*/ GC.getSTART_AREA_RESOURCE_MULTIPLIER();1242 rtnValue += iRingModifier * ComputeStrategicValue(pLoopPlot, pPlayer, iDistance) * /*1*/ GC.getSTART_AREA_STRATEGIC_MULTIPLIER();1243 }12441245 if (pPlayer)1246 {1247 if (iDistance == 1 && pLoopPlot->getFeatureType() == FEATURE_FOREST)1248 {1249 if (pLoopPlot->getImprovementType() == NO_IMPROVEMENT && pPlayer->GetPlayerTraits()->IsFaithFromUnimprovedForest())1250 {1251 iCelticForestCount += 1;1252 }1253 }1254 }1255 }1256 }12571258 if (iCelticForestCount >= 3)1259 {1260 rtnValue += 2 * 1000 * m_iFlavorMultiplier[YIELD_FAITH];1261 }1262 else if (iCelticForestCount >= 1)1263 {1264 rtnValue += 1 * 1000 * m_iFlavorMultiplier[YIELD_FAITH];1265 }12661267 if(rtnValue < 0) rtnValue = 0;12681269 // Finally, look at the city plot itself and use it as an overall multiplier1270 if(pPlot->getResourceType() != NO_RESOURCE)1271 {1272 rtnValue += rtnValue * GC.getBUILD_ON_RESOURCE_PERCENT() / 100;1273 }12741275 if(pPlot->isRiver())1276 {1277 rtnValue += rtnValue * GC.getBUILD_ON_RIVER_PERCENT() / 100;1278 }12791280 if(pPlot->isCoastalLand())1281 {1282 rtnValue += rtnValue * GC.getSTART_AREA_BUILD_ON_COAST_PERCENT() / 100;1283 }12841285 return rtnValue;1286}