现在我来证明为何我能预判资源.
这幅埃及图是盘古, 那么它用的是Pangaea.py来生成地图, 查阅此脚本的addBonusType函数
- def addBonusType(argsList):
- [iBonusType] = argsList
- gc = CyGlobalContext()
- type_string = gc.getBonusInfo(iBonusType).getType()
- if (CyMap().getCustomMapOption(2) == 1):
- if (type_string in balancer.resourcesToBalance) or (type_string in balancer.resourcesToEliminate):
- return None # don't place any of this bonus randomly
-
- CyPythonMgr().allowDefaultImpl() # pretend we didn't implement this method, and let C handle this bonus in the default way
复制代码
这说明它用的是默认的资源添加方式, 即使用的是
void CvMapGenerator::addBonuses()的后半段
- void CvMapGenerator::addBonuses()
- {
- PROFILE("CvMapGenerator::addBonuses");
- gDLL->NiTextOut("Adding Bonuses...");
- if (gDLL->getPythonIFace()->callFunction(gDLL->getPythonIFace()->getMapScriptModule(), "addBonuses", NULL))
- {
- if (!gDLL->getPythonIFace()->pythonUsingDefaultImpl())
- {
- return; // Python override
- }
- }
- for (int iOrder = 0; iOrder < GC.getNumBonusInfos(); iOrder++)
- {
- for (int iI = 0; iI < GC.getNumBonusInfos(); iI++)
- {
- gDLL->callUpdater();
- if (GC.getBonusInfo((BonusTypes)iI).getPlacementOrder() == iOrder)
- {
- CyArgsList argsList;
- argsList.add(iI);
- if (!gDLL->getPythonIFace()->callFunction(gDLL->getPythonIFace()->getMapScriptModule(), "addBonusType", argsList.makeFunctionArgs()) || gDLL->getPythonIFace()->pythonUsingDefaultImpl())
- {
- if (GC.getBonusInfo((BonusTypes)iI).isOneArea())
- {
- addUniqueBonusType((BonusTypes)iI);
- }
- else
- {
- addNonUniqueBonusType((BonusTypes)iI);
- }
- }
- }
- }
- }
- }
复制代码
你会发现其核心是addUniqueBonusType, addNonUniqueBonusType这两个函数
先看void CvMapGenerator::addUniqueBonusType(BonusTypes eBonusType), addNonUniqueBonusType的情形类似.
这个函数很长, 我只引用关键部分:
if (pBestArea == pPlot->area())
{
if (canPlaceBonusAt(eBonusType, pPlot->getX_INLINE(), pPlot->getY_INLINE(), bIgnoreLatitude))
{
pPlot->setBonusType(eBonusType);
for (int iDX = -(pBonusInfo.getGroupRange()); iDX <= pBonusInfo.getGroupRange(); iDX++)
{
for (int iDY = -(pBonusInfo.getGroupRange()); iDY <= pBonusInfo.getGroupRange(); iDY++)
{
if (GC.getMapINLINE().getNumBonuses(eBonusType) < iBonusCount)
{
CvPlot* pLoopPlot = plotXY(pPlot->getX_INLINE(), pPlot->getY_INLINE(), iDX, iDY);
if (pLoopPlot != NULL && (pLoopPlot->area() == pBestArea))
{
if (canPlaceBonusAt(eBonusType, pLoopPlot->getX_INLINE(), pLoopPlot->getY_INLINE(), bIgnoreLatitude))
{
if (GC.getGameINLINE().getMapRandNum(100, "addUniqueBonusType") < pBonusInfo.getGroupRand())
{
pLoopPlot->setBonusType(eBonusType);
}
}
}
}
}
}
}
}
引人注目的是canPlaceBonusAt, 这个函数如果返回false的话, 显然是无法放置资源的.
那让我们转向
bool CvMapGenerator::canPlaceBonusAt(BonusTypes eBonus, int iX, int iY, bool bIgnoreLatitude)
这个函数也很长, 我再次只引用关键部分:
for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++)
{
pLoopPlot = plotDirection(iX, iY, ((DirectionTypes)iI));
if (pLoopPlot != NULL)
{
if ((pLoopPlot->getBonusType() != NO_BONUS) && (pLoopPlot->getBonusType() != eBonus))
{
return false;
}
}
}
这说明当一个资源的周围8格不可能有其它种类的资源.
有人或许说我印象中不是这样啊.
答案很简单, 要么用的是其它地图脚本, 那里面用了特殊的资源添加方式. 要么是异常出现在首都范围内.
首都21格有特殊的资源添加方法, 对于盘古地图来说, 就是normalizeAddFoodBonuses()和normalizeAddExtras(), 这是其它话题了, 不展开了.
如果你观察nanoprince兄的1分, 根据上述结论, 只有首都的玉米的右1格下2格处有可能放置资源. 而那个格子恰好在首都2次文化扩张圈内.
所以是他的1分是不能带来战略资源的.
[ 本帖最后由 zahlen 于 2011-12-2 16:38 编辑 ] |