设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37220|回复: 56

[原创] 有关科技、研究、补正、溢出以及研究协定的问题总结(BNW 1.0.3.279)(2016.9更新)

[复制链接]
发表于 2013-12-26 18:12:53 | 显示全部楼层 |阅读模式
本帖最后由 ming_infinite 于 2016-9-28 14:18 编辑

1研发补正
  1.1研发补正的算法
  1.2学术交流
2科技成本
3研究和溢出
  3.1回合研究
  3.2研究进度的改变和研究完成
4研究协定
5大科学家
6结论

评分

2

查看全部评分

 楼主| 发表于 2013-12-26 18:13:28 | 显示全部楼层
本帖最后由 ming_infinite 于 2016-9-28 14:14 编辑

有关科技、研究、研发补正、溢出以及研究协定的种种问题的总结。


在文明5中,已被研发的科技会贬值。贬值程度由研发补正决定。

1研发补正ResearchModifier

CvPlayer.cpp
Line:8818

  1. //        --------------------------------------------------------------------------------
  2. int CvPlayer::calculateResearchModifier(TechTypes eTech)
  3. {
  4.         int iModifier = 100;

  5.         if(NO_TECH == eTech)
  6.         {
  7.                 return iModifier;
  8.         }

  9.         int iKnownCount = 0;
  10.         int iPossibleKnownCount = 0;
  11.         for(int iI = 0; iI < MAX_CIV_TEAMS; iI++)
  12.         {
  13.                 CvTeam& kLoopTeam = GET_TEAM((TeamTypes)iI);
  14.                 if(kLoopTeam.isAlive() && !kLoopTeam.isMinorCiv())
  15.                 {
  16.                         if(GET_TEAM(getTeam()).isHasMet((TeamTypes)iI))
  17.                         {
  18.                                 if(kLoopTeam.GetTeamTechs()->HasTech(eTech))
  19.                                 {
  20.                                         iKnownCount++;
  21.                                 }
  22.                         }
  23.                         iPossibleKnownCount++;
  24.                 }
  25.         }
  26.         if(iPossibleKnownCount > 0)
  27.         {
  28.                 iModifier += (GC.getTECH_COST_TOTAL_KNOWN_TEAM_MODIFIER() * iKnownCount) / iPossibleKnownCount;
  29.         }

  30.         int iPossiblePaths = 0;
  31.         int iUnknownPaths = 0;
  32.         for(int iI = 0; iI < GC.getNUM_OR_TECH_PREREQS(); iI++)
  33.         {
  34.                 if(GC.getTechInfo(eTech)->GetPrereqOrTechs(iI) != NO_TECH)
  35.                 {
  36.                         if(!(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes)(GC.getTechInfo(eTech)->GetPrereqOrTechs(iI)))))
  37.                         {
  38.                                 iUnknownPaths++;
  39.                         }

  40.                         iPossiblePaths++;
  41.                 }
  42.         }
  43.         CvAssertMsg(iPossiblePaths >= iUnknownPaths, "The number of possible paths is expected to match or exceed the number of unknown ones");
  44.         iModifier += (iPossiblePaths - iUnknownPaths) * GC.getTECH_COST_KNOWN_PREREQ_MODIFIER();

  45.         // Leagues mod
  46.         int iLeaguesMod = GC.getGame().GetGameLeagues()->GetResearchMod(GetID(), eTech);
  47.         if (iLeaguesMod != 0)
  48.         {
  49.                 iModifier *= (100 + iLeaguesMod);
  50.                 iModifier /= 100;
  51.         }

  52.         return iModifier;
  53. }
复制代码
1.1研发补正的算法

iModifier补正初始值为1.
iKnownCount为该玩家所遇见过的玩家当中,拥有该科技的玩家数目。
iPossibleKnownCount为当前游戏中存活的玩家总数。
TECH_COST_TOTAL_KNOWN_TEAM_MODIFIER值为0.3

  1. if(iPossibleKnownCount > 0)
  2. {
  3.         iModifier += (GC.getTECH_COST_TOTAL_KNOWN_TEAM_MODIFIER() * iKnownCount) / iPossibleKnownCount;
  4. }
复制代码
研发补正=1+0.3*已知拥有该科技的玩家数/存活玩家总数

1.2学术交流Scholars In Residence

学术交流是bnw新增的一项议案,效果是对所有已被相识文明研发的科技,其研发补正乘以1.2

取整

上两部分计算各有一次取整,实际游戏中即是保留两位小数。

在本篇的相关代码当中,绝大部分数值计算是将游戏中实际数值乘以100后进行的整形计算。整形除法涉及到取整,对应实际游戏当中即是保留两位小数。后续有关取整不再一一赘述。

2科技成本ResearchCost

CvTechClasses.cpp
Line:1424

  1. //        ----------------------------------------------------------------------------
  2. /// Return the research cost for a tech for this player.  This will be different from the team research cost as it will
  3. /// include the player's research adjustment
  4. int CvPlayerTechs::GetResearchCost(TechTypes eTech) const
  5. {
  6.         // Get the research cost for the team
  7.         int iResearchCost = GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->GetResearchCost(eTech);
  8.        
  9.         // Adjust to the player's research modifier
  10.         int iResearchMod = std::max(1, m_pPlayer->calculateResearchModifier(eTech));
  11.         iResearchCost = ((iResearchCost * 10000) / iResearchMod);

  12.         // Mod for City Count
  13.         int iMod = GC.getMap().getWorldInfo().GetNumCitiesTechCostMod();        // Default is 40, gets smaller on larger maps
  14.         iMod = iMod * m_pPlayer->GetMaxEffectiveCities(/*bIncludePuppets*/ true);
  15.         iResearchCost = iResearchCost * (100 + iMod) / 100;

  16.         // We're going to round up so that the user wont get confused when the research progress seems to be equal to the research cost, but it is not acutally done.
  17.         // This is because the 'real' calculations use the GameCore's fixed point math where things are multiplied by 100
  18.         if((iResearchCost % 100) != 0)
  19.                 iResearchCost = (iResearchCost / 100) + 1;
  20.         else
  21.                 iResearchCost = (iResearchCost / 100);

  22.         return iResearchCost;
  23. }
复制代码
已被其他所识玩家研发的科技会贬值。

科技成本=科技在XML中定义的原始值/研发补正*地图尺寸修正*城数修正
(暂略组队情况)

其中
地图尺寸修正值
Small较小地图及以下为1.0
Standard标准图为1.1
Large大地图为1.2
Huge极大图为1.3

城数修正值
Standard标准图及以下:每城5%
Large大地图:每城3%
Huge极大图:每城2%

城数取最大有效城数(代码略):
最大有效城数=曾最大直辖城数+当前傀儡城数

例:铺10城,城数为10。卖1剩9,城数为10。傀儡2,为12。将其中一个吞并,变回11。卖掉另一个傀儡城,还是10。

游戏中,地图和城数修正值是易得的,我们可以通过计算科技未贬值时的成本/当前显示科技成本以计算该科技的补正值,从而进一步推算出当前有几个玩家拥有该科技。

科技剩余回合数计算

Line:1329
  1. /// Accessor: How many turns of research left?
  2. int CvPlayerTechs::GetResearchTurnsLeft(TechTypes eTech, bool bOverflow) const
  3. {
  4.         int iTurnsLeft = GetResearchTurnsLeftTimes100(eTech, bOverflow);

  5.         if(iTurnsLeft == INT_MAX)
  6.         {
  7.                 return INT_MAX;
  8.         }

  9.         iTurnsLeft = (iTurnsLeft + 99) / 100; // round up

  10.         return std::max(1, iTurnsLeft);
  11. }

  12. /// Accessor: How many turns of research left? (in hundredths)
  13. int CvPlayerTechs::GetResearchTurnsLeftTimes100(TechTypes eTech, bool bOverflow) const
  14. {
  15.         int iResearchRate;
  16.         int iOverflow;
  17.         int iTurnsLeft;
  18.         int iI;

  19.         iResearchRate = 0;
  20.         iOverflow = 0;

  21.         for(iI = 0; iI < MAX_PLAYERS; iI++)
  22.         {
  23.                 CvPlayerAI& kPlayer = GET_PLAYER((PlayerTypes)iI);
  24.                 if(kPlayer.isAlive())
  25.                 {
  26.                         // Find everyone on our team
  27.                         if(kPlayer.getTeam() == m_pPlayer->getTeam())
  28.                         {
  29.                                 // If this is us or if the tech matches, then increment totals
  30.                                 if((iI == m_pPlayer->GetID()) || kPlayer.GetPlayerTechs()->GetCurrentResearch() == eTech)
  31.                                 {
  32.                                         iResearchRate += kPlayer.GetScienceTimes100();
  33.                                         iOverflow += (kPlayer.getOverflowResearch() * m_pPlayer->calculateResearchModifier(eTech)) / 100;
  34.                                 }
  35.                         }
  36.                 }
  37.         }

  38.         if(iResearchRate == 0)
  39.         {
  40.                 return INT_MAX;
  41.         }

  42.         int iResearchCost = GetResearchCost(eTech);                                // Get our research cost (not the 'team' one which doesn't use our player modifier)
  43.         // Get the team progress
  44.         int iResearchProgress = GET_TEAM(m_pPlayer->getTeam()).GetTeamTechs()->GetResearchProgress(eTech);
  45.         // Get the raw amount left
  46.         int iResearchLeft = std::max(0, (iResearchCost - iResearchProgress));

  47.         // Removed any current overflow if requested.
  48.         if(bOverflow)
  49.         {
  50.                 iResearchLeft -= iOverflow;
  51.         }

  52.         iResearchLeft *= 10000;

  53.         iTurnsLeft = (iResearchLeft / iResearchRate);

  54.         if(iTurnsLeft * iResearchRate < iResearchLeft)
  55.         {
  56.                 ++iTurnsLeft;
  57.         }

  58.         return std::max(1, iTurnsLeft);
  59. }
复制代码
这里只提一点。在计算科技剩余回合数,同时有溢出的情况下,不是用成本直接减去研究进度和溢出,而是减掉溢出乘以其研发补正。原因见下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-26 18:14:14 | 显示全部楼层
本帖最后由 ming_infinite 于 2016-9-28 14:17 编辑

3研究和溢出Research&Overflow

3.1回合研究doResearch
来看过回合研究科技的时候,具体发生了什么。

CvPlayer.cpp
Line:19531
  1. //        --------------------------------------------------------------------------------
  2. void CvPlayer::doResearch()
  3. {
  4.         if(GC.getGame().isOption(GAMEOPTION_NO_SCIENCE))
  5.         {
  6.                 return;
  7.         }

  8.         AI_PERF_FORMAT("AI-perf.csv", ("CvPlayer::doResearch, Turn %03d, %s", GC.getGame().getElapsedGameTurns(), getCivilizationShortDescription()) );
  9.         bool bForceResearchChoice;
  10.         int iOverflowResearch;

  11.         if(GetPlayerTechs()->IsResearch())
  12.         {
  13.                 bForceResearchChoice = false;

  14.                 // Force player to pick Research if he doesn't have anything assigned
  15.                 if(GetPlayerTechs()->GetCurrentResearch() == NO_TECH)
  16.                 {
  17.                         if(GetID() == GC.getGame().getActivePlayer() && GetScienceTimes100() > 0)
  18.                         {
  19.                                 chooseTech();
  20.                         }

  21.                         if(GC.getGame().getElapsedGameTurns() > 4)
  22.                         {
  23.                                 AI_chooseResearch();

  24.                                 bForceResearchChoice = true;
  25.                         }
  26.                 }

  27.                 TechTypes eCurrentTech = GetPlayerTechs()->GetCurrentResearch();
  28.                 if(eCurrentTech == NO_TECH)
  29.                 {
  30.                         int iOverflow = (GetScienceTimes100()) / std::max(1, calculateResearchModifier(eCurrentTech));
  31.                         changeOverflowResearchTimes100(iOverflow);
  32.                 }
  33.                 else
  34.                 {
  35.                         iOverflowResearch = (getOverflowResearchTimes100() * calculateResearchModifier(eCurrentTech)) / 100;
  36.                         setOverflowResearch(0);
  37.                         if(GET_TEAM(getTeam()).GetTeamTechs())
  38.                         {
  39.                                 int iBeakersTowardsTechTimes100 = GetScienceTimes100() + iOverflowResearch;
  40.                                 GET_TEAM(getTeam()).GetTeamTechs()->ChangeResearchProgressTimes100(eCurrentTech, iBeakersTowardsTechTimes100, GetID());
  41.                                 UpdateResearchAgreements(GetScienceTimes100() / 100);
  42.                         }
  43.                 }

  44.                 if(bForceResearchChoice)
  45.                 {
  46.                         clearResearchQueue();
  47.                 }
  48.         }
  49.         GetPlayerTechs()->CheckForTechAchievement();

  50. }
复制代码
首先,如果当前没有研究科技,会让选一个。该部分略。

如果当前玩家没有正在研究的科技(这是可能的),那么将当前回合瓶直接加到溢出当中

如果有科技正在研究,那么将溢出和回合瓶注入到该科技当中

研发进度增量=回合瓶+溢出*研发补正

溢出,一般是科技完成时产生的,不属于任何科技,处于溢出状态的瓶子。研发补正是当前所选择研究科技的研发补正。
也就是说,溢出的瓶子最终变成多少,是由下一个要研究的科技决定的。如果你将溢出的瓶子指向一个没有补正的科技,那么也就不会发生任何变化,1+1=2。如果你将溢出的瓶子指向一个贬值的科技,那么溢出的瓶子就乘以该科技的研发补正。

前面科技剩余回合数的计算,就考虑到了溢出流入科技时的补正,因而每个科技所显示的剩余回合数都是按其对应补正计算后的数值,是更为准确的数值。尽管这样的回合数可能看起来会有些奇怪。


瓶子流入科技,科技累计的瓶子最终超过了科技成本,即研发完成,那又发生了什么呢,看接下来的部分。

3.2研究进度的改变和研究完成

CvTechClasses.cpp
Line:1934
  1. /// Accessor: set research done on one tech (in hundredths)
  2. void CvTeamTechs::SetResearchProgressTimes100(TechTypes eIndex, int iNewValue, PlayerTypes ePlayer)
  3. {
  4.         CvAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");
  5.         CvAssertMsg(eIndex < GC.getNumTechInfos(), "eIndex is expected to be within maximum bounds (invalid Index)");
  6.         CvAssertMsg(ePlayer >= 0, "eIndex is expected to be non-negative (invalid Index)");
  7.         CvAssertMsg(ePlayer < MAX_PLAYERS, "ePlayer is expected to be within maximum bounds (invalid Index)");

  8.         if(GetResearchProgressTimes100(eIndex) != iNewValue)
  9.         {
  10.                 m_paiResearchProgress[eIndex] = iNewValue;
  11.                 CvAssert(GetResearchProgressTimes100(eIndex) >= 0);

  12.                 if(m_pTeam->GetID() == GC.getGame().getActiveTeam())
  13.                 {
  14.                         GC.GetEngineUserInterface()->setDirty(GameData_DIRTY_BIT, true);
  15.                         GC.GetEngineUserInterface()->setDirty(Score_DIRTY_BIT, true);
  16.                 }

  17.                 int iResearchProgress = GetResearchProgressTimes100(eIndex);
  18.                 int iResearchCost = GetResearchCost(eIndex) * 100;

  19.                 // Player modifiers to cost
  20.                 int iResearchMod = std::max(1, GET_PLAYER(ePlayer).calculateResearchModifier(eIndex));
  21.                 iResearchCost = (iResearchCost * 100) / iResearchMod;
  22.                 int iNumCitiesMod = GC.getMap().getWorldInfo().GetNumCitiesTechCostMod();        // Default is 40, gets smaller on larger maps
  23.                 iNumCitiesMod = iNumCitiesMod * GET_PLAYER(ePlayer).GetMaxEffectiveCities(/*bIncludePuppets*/ true);
  24.                 iResearchCost = iResearchCost * (100 + iNumCitiesMod) / 100;
  25.                
  26.                 int iOverflow = iResearchProgress - iResearchCost;

  27.                 // April 2014 Balance Patch change - EFB
  28.                 //    Don't allow the overflow to get out of hand
  29.                 int iMaxOverflow = GetMaxResearchOverflow(eIndex, ePlayer);
  30.                 if (iOverflow > iMaxOverflow)
  31.                 {
  32.                         iOverflow = iMaxOverflow;
  33.                 }

  34.                 if(iOverflow >= 0)
  35.                 {
  36.                         GET_PLAYER(ePlayer).changeOverflowResearchTimes100(iOverflow);
  37.                         m_pTeam->setHasTech(eIndex, true, ePlayer, true, true);
  38.                         SetNoTradeTech(eIndex, true);

  39.                         // Mark city specialization dirty
  40.                         GET_PLAYER(ePlayer).GetCitySpecializationAI()->SetSpecializationsDirty(SPECIALIZATION_UPDATE_RESEARCH_COMPLETE);

  41.                         // Culture bonus for Player researching a Tech
  42.                         PlayerTypes eLoopPlayer;
  43.                         int iCulture;
  44.                         TeamTypes eTeamID = m_pTeam->GetID();
  45.                         for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)
  46.                         {
  47.                                 eLoopPlayer = (PlayerTypes) iPlayerLoop;
  48.                                 CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);

  49.                                 if(kLoopPlayer.getTeam() == eTeamID)
  50.                                 {
  51.                                         iCulture = kLoopPlayer.GetCulturePerTechResearched();
  52.                                         if(iCulture != 0)
  53.                                         {
  54.                                                 kLoopPlayer.changeJONSCulture(iCulture);
  55.                                         }
  56.                                 }
  57.                         }
  58.                 }
  59.         }
  60. }
复制代码
溢出=研究进度-科技成本,超出的部分就是溢出了。

此时,如果溢出超限,则溢出=溢出上限。

溢出上限
Line:2114
  1. int CvTeamTechs::GetMaxResearchOverflow(TechTypes eTech, PlayerTypes ePlayer) const
  2. {
  3.         CvPlayer &kPlayer = GET_PLAYER(ePlayer);

  4.         // 5 turns of science is a reasonable allowance of overflow (about equal to a standard research agreement award)
  5.         int iReturnValue = kPlayer.GetScienceTimes100() * 5;   

  6.         // Alternatively let it be the raw cost of the tech (times 100)
  7.         CvTechEntry* pkTechInfo = GC.getTechInfo(eTech);
  8.         if(pkTechInfo == NULL)
  9.         {
  10.                 return 0;
  11.         }

  12.         int iCost = pkTechInfo->GetResearchCost() * 100;

  13.         iReturnValue = max(iCost, iReturnValue);

  14.         return iReturnValue;
  15. }
复制代码
溢出是否超限的判定只发生在此刻也就是研究完成时。上限值为此时回合瓶*5与科技在xml中定义的原始成本两者中的较大值

判断完溢出上限,将此时不超过该上限的瓶子累加进原有的溢出当中。

也就是说,你可以获得超过溢出上限的溢出,但不能通过仅一次完成科技获得。可以多次完成科技积累溢出,但如前所述,这一过程不能过回合。因为过回合时溢出会进入研究进度中。
在一个回合内完成多个科技可以累加溢出超过上限,但在接下来过回合时同样无法超出下一次的上限。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-26 18:14:37 | 显示全部楼层
本帖最后由 ming_infinite 于 2016-9-28 14:26 编辑

4研究协定Research Agreement

研究协定简称RA,在交易中结算。

CvDealClasses.cpp
Line:2804
  1.         // Research Agreement
  2.         else if(pItem->m_eItemType == TRADE_ITEM_RESEARCH_AGREEMENT)
  3.         {
  4.                 GET_TEAM(eFromTeam).SetHasResearchAgreement(eToTeam, false);

  5.                 if(!GET_TEAM(eFromTeam).isAtWar(eToTeam) && !bCancelled)
  6.                 {
  7.                         // Beaker boost = ((sum of both players' beakers over term of RA) / 2) / 3) * (median tech percentage rate)
  8.                         CvTeam& kTeam = GET_TEAM(toPlayer.getTeam());
  9.                         int iToPlayerBeakers = toPlayer.GetResearchAgreementCounter(eFromPlayer);
  10.                         int iFromPlayerBeakers = fromPlayer.GetResearchAgreementCounter(eToPlayer);
  11.                         int iBeakersBonus = min(iToPlayerBeakers, iFromPlayerBeakers) / GC.getRESEARCH_AGREEMENT_BOOST_DIVISOR(); //one (third) of minimum contribution
  12.                         iBeakersBonus = (iBeakersBonus * toPlayer.GetMedianTechPercentage()) / 100;

  13.                         TechTypes eCurrentTech = toPlayer.GetPlayerTechs()->GetCurrentResearch();
  14.                         if(eCurrentTech == NO_TECH)
  15.                         {
  16.                                 toPlayer.changeOverflowResearch(iBeakersBonus);
  17.                         }
  18.                         else
  19.                         {
  20.                                 kTeam.GetTeamTechs()->ChangeResearchProgress(eCurrentTech, iBeakersBonus, eToPlayer);
  21.                         }

  22.                         pNotifications = toPlayer.GetNotifications();
  23.                         if(pNotifications)
  24.                         {
  25.                                 strBuffer = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH", fromPlayer.getNameKey());
  26.                                 strSummary = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH_S", fromPlayer.getNameKey());
  27.                                 pNotifications->Add(NOTIFICATION_DEAL_EXPIRED_RESEARCH_AGREEMENT, strBuffer, strSummary, -1, -1, -1);
  28.                         }
  29.                 }
  30.                 else
  31.                 {
  32.                         pNotifications = toPlayer.GetNotifications();
  33.                         if(pNotifications)
  34.                         {
  35.                                 if(GET_TEAM(eFromTeam).isAtWar(eToTeam))
  36.                                 {
  37.                                         strBuffer = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH_WAR_CANCEL", fromPlayer.getNameKey());
  38.                                         strSummary = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH_WAR_CANCEL_S");
  39.                                 }
  40.                                 else
  41.                                 {
  42.                                         strBuffer = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH_CANCEL", fromPlayer.getNameKey());
  43.                                         strSummary = GetLocalizedText("TXT_KEY_NTFN_RA_FREE_TECH_CANCEL_S");
  44.                                 }

  45.                                 pNotifications->Add(NOTIFICATION_DEAL_EXPIRED_RESEARCH_AGREEMENT, strBuffer, strSummary, -1, -1, -1);
  46.                         }
  47.                 }
  48.         }
复制代码
交易结算发生在玩家回合的一开始,因而RA的结算早于玩家自己的回合研究。

iToPlayerBeakers己方RA计数量
iFromPlayerBeakers对方RA计数量
RESEARCH_AGREEMENT_BOOST_DIVISOR值为3
GetMedianTechPercentage中位数百分比,初始50%,理性左三科学革命和大报恩寺塔各加25%,最大100%。

上一节doResearch中的最后,UpdateResearchAgreements存入了当前回合瓶,即是每回合存入RA计数中的瓶子,该值为实际值,受赤字、无政府状态等影响。

RA=两方交易期间每回合产瓶总量较小者/3*己方中位数百分比

然后,如果当前无正在研究科技,RA累加进溢出;
如果有,触发上一节讲的变更研究进度:如果完成科技,同样触发溢出上限判定。


5大科学家Great Scientist

大科大家都很熟悉了,详细代码就略过了。提几个地方。
  1. int iTurnScience = getReplayDataValue(getReplayDataSetIndex("REPLAYDATASET_SCIENCEPERTURN"), iTurn);
复制代码
大科每回合取的瓶子读的是ReplayData,所以是城市产出的瓶子,不受之后的各种加成影响,同样也不受赤字、无政府影响。

补正:bnw加了个国际空间站,对大科有33%的补正,就是直接乘以1.33。
游戏速度:无论什么速度,都是8回合的烧瓶,只是最后再乘以速度补正。快速游戏就是8回合产瓶*0.67。

同样,大科如果空烧,瓶子直接进溢出。否则,触发变更研究进度。



其他

宗教对话Interfaith Dialogue原理上是一样的。没有什么使用价值,代码就略过了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-26 18:14:53 | 显示全部楼层
本帖最后由 ming_infinite 于 2016-9-28 14:38 编辑

6结论conclusion

研发补正=1+0.3*已知拥有该科技的玩家数/存活玩家总数

改变研究进度的几种方式——回合科研、RA、大科,一旦完成科技,都会触发溢出上限判定。

溢出产生时值不变,回合内多次溢出直接累加。溢出只在每回合流入科技时乘以该科技的研发补正。




思考题


如图所示
较大图,10城。6386溢出流入2428瓶的生物学,问,过回合之后,溢出是多少?
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:15:56 | 显示全部楼层
5楼已过,开抢!


终于抢到了,神贴前排,不枉我加班按F5
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:17:43 | 显示全部楼层
骗到楼下 其实我是7楼

[ 本帖最后由 点閪势 于 2013-12-26 18:21 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:17:55 | 显示全部楼层
好吧是8楼

[ 本帖最后由 石木小丑 于 2013-12-26 18:19 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:23:24 | 显示全部楼层
不明觉厉是9楼
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:36:17 | 显示全部楼层
特地上来点个赞   话说赞这个按钮在哪里
回复 支持 反对

使用道具 举报

发表于 2013-12-26 18:49:06 | 显示全部楼层
soga!

這樣就能理解秘技的原理了, 原來是溢出瓶每吃掉一個科技就會放大的緣故, 只要放大的比例高過消耗掉的數值, 這個溢出瓶就會越滾越大

以實例來說明

假設每回合科研瓶200

燒掉大科後增加1600

這時候拿來秒400的科技, 下回合就多出 (1600+200-400)*1.2(科研補正) = 1680

如此一直秒400的科技, 會發現溢出瓶反而越滾越多

如此溢出瓶數最高可以秒多大的瓶數也可以計算了

溢出瓶 = a

現在科研 = b

秒掉科技 = c

(a+b-c)*1.2 = a  簡化下可以把 a = 8b , 所以 c = 2.33b

也就是在科研200的情況下燒掉一大科, 可以靠溢出瓶來秒 460 以下的科技不耗科研瓶

同理類推, 燒掉兩大科, 三大科則x2 x3, 而且在溢出瓶滾高之後, 可以再秒更高的科技
回复 支持 反对

使用道具 举报

发表于 2013-12-26 19:06:59 | 显示全部楼层
不错,收藏
回复 支持 反对

使用道具 举报

发表于 2013-12-26 19:34:52 | 显示全部楼层

回复 11# 的帖子

系数放大的是溢出瓶,不放大本t自产瓶。
溢出瓶=上t溢出瓶*补正值+本t科研-科技成本
补正值1.2、科研200、溢出1600时,可以无成本秒掉1600*0.2+200=520的科技
何况补正值不是固定的,每个科技都不一样。
补正值=(百科的科研成本*科研惩罚)/实际科研成本
8人图从1.0375到1.51,需要逐个科技计算。

[ 本帖最后由 石木小丑 于 2013-12-26 19:37 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2013-12-26 20:48:10 | 显示全部楼层
后排拜教主
回复 支持 反对

使用道具 举报

发表于 2013-12-26 21:00:02 | 显示全部楼层
路过赞一个
回复 支持 反对

使用道具 举报

发表于 2013-12-26 21:05:35 | 显示全部楼层
终于发了
回复 支持 反对

使用道具 举报

发表于 2013-12-26 21:11:54 | 显示全部楼层
先留名
回复 支持 反对

使用道具 举报

发表于 2013-12-26 21:43:23 | 显示全部楼层
怪不得有一次我同一回合签了8张RA(22AI,有的已经干掉了),然后就爽了,一下一线科技都完成了。(有外籍学者)
回复 支持 反对

使用道具 举报

发表于 2013-12-27 01:30:26 | 显示全部楼层
幸好睡前扫了眼CC 首页也健在
回复 支持 反对

使用道具 举报

发表于 2013-12-27 07:43:57 | 显示全部楼层
啥也不说抢一楼
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|塞爱维(CIV)文明联盟    

GMT+8, 2020-12-4 12:36

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表