设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
查看: 12558|回复: 16

[原创] 金钱溢出机制简介(BTS31.7, 3.19)

[复制链接]
发表于 2009-6-11 18:50:42 | 显示全部楼层 |阅读模式
文明4中, 由于城市的生产力有时会大于建造项目所需的剩余锤子数量, 这时就会产生了生产力的溢出. 生产力的溢出可以用到下一个项目的建设当中, 也可以积累. 但如果一次溢出过多的生产力, 超过某限度, 超出的部分将自动转化为金钱进入国库. 本文将简单介绍这一机制.
如果你对定义和公式感到枯燥, 可直接跳至最后的图文例子.

为了行文方便, 先引入一些定义.
一座城市的生产力分为:
基础生产力
真实生产力 = 基础生产力 * (1 + 基础生产力修正系数)
当前生产力 = 基础生产力 * (1 + 基础生产力修正系数 + 当前项目生产力修正系数)
当前锤子产出 = (砍树的锤子积累 + 基础生产力的溢出积累 + 基础生产力) * (1 + 基础生产力修正系数 + 当前项目生产力修正系数)
注: 如果当前项目还可以使用粮食建造, 粮食的余额也要加入到真实生产力和当前生产力中.

假设回合结束后能完成当前项目的建设, 则(下一回合)
原始生产力溢出 = 当前锤子产出 + 当前项目锤子积累数量 - 当前项目所需锤子数
最大原始生产力溢出 = max(当前项目所需锤子数, 当前生产力)
生产力溢出 = min(原始生产力溢出, 最大原始生产力溢出)
基础生产力的溢出积累 += 生产力溢出 / (1 + 基础生产力修正系数 + 当前项目生产力修正系数) = min(原始生产力溢出, 最大原始生产力溢出) / (1 + 基础生产力修正系数 + 当前项目生产力修正系数)
注: +=指增加, 但由于正常生产时每回合城市都会用掉以前的基础生产力溢出, 所以这里的等同为=.

在非模组游戏中
属于基础生产力修正系数的生产力加成, 有
官僚制度下的首都: +50%
大铁厂: 煤+50%, 铁+50%
国有制: +10%
锻造铺: +25%, 工厂: +25%
电力: +50%(有工厂的话)
油页岩电站: +10%

属于当前项目生产力修正系数的生产力加成, 有
奇迹建筑工程的资源加成
领袖特性对应建筑的加成
强化监控对军事单位的加成, 信仰控制对信仰国教的城市建筑的加成
干船坞对水面单位的加成, 天梯实验室对飞船的加成

换言之, 城市的基础生产力修正系数对所有项目都有效, 当前项目生产力修正系数只对当前项目有效.
注: 当我们用生产力来造金钱/科技/文化时, 生产力用的是真实生产力.


现在我们可以正式讨论金钱溢出的机制了.
在BTS3.17中, 也可以说在3.19以前的版本中, 但原始生产力溢出大于最大原始生产力溢出时, 超出的部分会全部转化为金钱, 即
金钱溢出 = max(0, 原始生产力溢出 - 最大原始生产力溢出)

在BTS3.19中, 机制有了大变化, 而且这个变化不是像我们预期的. 在计算金钱溢出时, 还要计算
最大生产力溢出之金钱 = max(当前项目所需锤子数, 真实生产力)

二者之差则是现在的金钱溢出
金钱溢出 = max(0, 生产力溢出 - 最大原始生产力溢出之金钱)

比较
3.17: 原始生产力溢出 - 最大原始生产力溢出
3.19: 生产力溢出 - 最大原始生产力溢出之金钱

对于第一项, 由于3.19中生产力溢出是原始生产力溢出和最大原始生产力溢出比小的结果, 可以说变得小多了. 如果3.19中第二项还是最大原始生产力溢出, 金钱溢出将永远是0了.

所以Firaxis修改了第二项为最大原始生产力溢出之金钱. 再比较
最大原始生产力溢出 = max(当前项目所需锤子数, 当前生产力)
最大原始生产力溢出之金钱 = max(当前项目所需锤子数, 真实生产力)
区别就是当前生产力被换为了真实生产力, 这导致
a. 当当前生产力=真实生产力时, 最大原始生产力溢出=最大原始生产力溢出之金钱, 这时金钱溢出为0;
b. 由于真实生产力<=当前生产力, 若当前生产力<=当前项目所需锤子数, 则最大原始生产力溢出之金钱<=最大原始生产力溢出, 金钱溢出也为0.

补充说明:
当年通过砍树修城墙来产生金钱溢出时, 城市的基础生产力很低, 基本上当前生产力不大于50即城墙所需锤子数, 所以在3.19中不会产生金钱溢出.

生产力溢出 = min(原始生产力溢出, 最大原始生产力溢出)
由于这一比小, 原始生产力溢出超出最大原始生产力溢出的那部分在3.19中没有任何作用, 也就是说浪费掉了, 所以应避免这一情况.

[ 本帖最后由 Khyron 于 2009-6-11 19:16 编辑 ]
 楼主| 发表于 2009-6-11 18:51:44 | 显示全部楼层
例子:
城市有锻造铺, 工厂和水电站; 英雄史诗, 干船坞, 军事学院, 正在生产工船

基础生产力修正系数 = 25% + 25% + 50% = 100%
当前项目生产力修正系数 = 100% + 50% + 50% = 200%
基础生产力 = 100
真实生产力 = 200 (如果我们造金钱的话, 则收入为200)
当前生产力 = 400
砍树的锤子积累 = 60
基础生产力的溢出积累 = 69
当前项目锤子积累数量 = 0
当前项目所需锤子数 = 工船所需锤子数 = 30
当前锤子产出 = (60 + 69 + 100) * 4 = 916
原始生产力溢出 = 916 + 0 - 30 = 886
最大原始生产力溢出 = max(30, 400) = 400
生产力溢出 = min(886, 400) = 400
最大原始生产力溢出之金钱 = max(30, 200) = 200


下一回合
基础生产力溢出 = 400 / 4 = 100
金钱溢出(3.19) = max(0, 生产力溢出 - 最大原始生产力溢出之金钱) = 400 - 200 = 200
金钱溢出(3.17) = max(0, 原始生产力溢出 - 最大原始生产力溢出) = 886 - 400 = 486


从这个例子看3.19中金钱溢出被削弱了, 但若换个例子, 还是上面那个城市, 唯一变化的是现在
砍树的锤子积累 = 基础生产力的溢出积累 = 0
这时
当前锤子产出 = (0 + 0 + 100) * 4 = 400
原始生产力溢出 = 400 + 0 - 30 = 370
最大原始生产力溢出 = max(30, 400) = 400
生产力溢出 = min(370, 400) = 370
最大原始生产力溢出之金钱 = max(30, 200) = 200

下一回合
基础生产力溢出 = 370 / 4 = 92
金钱溢出(3.19) = max(0, 生产力溢出 - 最大原始生产力溢出之金钱) = 370 - 200 = 170
金钱溢出(3.17) = max(0, 原始生产力溢出 - 最大原始生产力溢出) = max(0, 370 - 400) = 0
怎么样, 同样剩余92锤子, 3.19中凭空变出170块钱.


总结:
3.19中, 锤子不能积累太多,否则会浪费, 当前项目生产力修正系数不为0时可以凭空生钱;
而以前的版本, 所有的锤子都不会浪费, 大不了变成钱, 但不能从当前项目生产力修正获得额外收益.
从实际应用的角度看, 3.19中的金钱溢出反而很难利用.

===================================

参考文献
[1]. CvCity.cpp, CvCity::popOrder, Firaxis Games, Sid Meier's Civilization 4 Beyond the Sword v3.19, 2009
[2]. CvCity.cpp, CvCity::popOrder, Firaxis Games, Sid Meier's Civilization 4 Beyond the Sword v3.17, 2009

[ 本帖最后由 Khyron 于 2009-6-11 23:49 编辑 ]
发表于 2009-6-11 18:54:52 | 显示全部楼层
很好,只在用日本冲圣人的时候,用过一次
发表于 2009-6-11 18:57:58 | 显示全部楼层
实验派遇理论派只能死无全尸
发表于 2009-6-11 18:58:22 | 显示全部楼层
这么快就有机理文章了
发表于 2009-6-11 19:04:19 | 显示全部楼层
有个问题,偶尔出现情况
最大原始生产力溢出 = max(当前项目所需锤子数, 当前生产力-1)
 楼主| 发表于 2009-6-11 19:10:34 | 显示全部楼层
我曾经设想将金钱溢出修正为
金钱溢出 = max(0, 原始生产力溢出 - 最大原始生产力溢出) / (1 + 基础生产力修正系数 + 当前项目生产力修正系数)
这样可以避免领袖特性或资源的加成造成锤子金钱转化率过高.
再精细点, 还可以
金钱溢出 = max(0, 原始生产力溢出 - 最大原始生产力溢出) / (1 + 基础生产力修正系数 + 当前项目生产力修正系数) * (1 + 基础生产力修正系数)
这样既可以避免生产力溢出的浪费, 进而较少微操, 还可以避免获得非法利益.

Firaxis, 在3.19中修改了金钱溢出的机制, 本以外是按照上述思路修改的. 没想到, 走的是其它路.
说实话, 我觉得3.19现在的计算很不直观, 不明白为什么要这样改. 而且还能凭空生钱, 岂不是bug?
 楼主| 发表于 2009-6-11 19:13:59 | 显示全部楼层
原帖由 西艾薇.C.Kyou 于 2009-6-11 19:04 发表
有个问题,偶尔出现情况
最大原始生产力溢出 = max(当前项目所需锤子数, 当前生产力-1)


由于程序内部处处取整, 比如使用修正系数125%时实际是
floor( 基础生产力 * 125 / 100 )
所以差一点很正常.
发表于 2009-6-11 19:19:39 | 显示全部楼层
总而言之,319锤子溢出金钱的来源是对特定建造项目的特有加成,而这种加成的程度也决定了溢出的上限?
 楼主| 发表于 2009-6-11 19:24:53 | 显示全部楼层
原帖由 西艾薇.C.Kyou 于 2009-6-11 19:19 发表
总而言之,319锤子溢出金钱的来源是对特定建造项目的特有加成,而这种加成的程度也决定了溢出的上限?


对特定建造项目的特有加成, 主要决定了锤子溢出时的额外收益率
收益的多少由城市当前生产力, 即基础生产力和加成共同决定.
发表于 2009-6-11 19:26:37 | 显示全部楼层

回复 #8 Khyron 的帖子

有个问题,现在我城市基础生产力13,WB了一个Forge,生产武士(15锤子),每回合没有原始生产力溢出
发表于 2009-6-11 19:33:18 | 显示全部楼层
同样,基础生产力16,锻造厂及工厂,加成后为24,生产武士,下回合溢出锤子数应为9,而实际为6.

经过试验,我确信原始生产力溢出受到了逆加成,即9/1.5=6
 楼主| 发表于 2009-6-11 19:46:38 | 显示全部楼层
原帖由 西艾薇.C.Kyou 于 2009-6-11 19:26 发表
有个问题,现在我城市基础生产力13,WB了一个Forge,生产武士(15锤子),每回合没有原始生产力溢出


基础生产力的溢出积累 += 生产力溢出 / (1 + 基础生产力修正系数 + 当前项目生产力修正系数)

你看我给出的例子中有:
基础生产力溢出 = 370 / 4 = 92

所以你的例子中
生产力溢出 = 1
基础生产力溢出 = floor(100 * 1 / 125 ) = 0
所以就没有锤子溢出了.
发表于 2009-6-11 19:50:36 | 显示全部楼层
原帖由 西艾薇.C.Kyou 于 2009-6-11 19:33 发表
同样,基础生产力16,锻造厂及工厂,加成后为24,生产武士,下回合溢出锤子数应为9,而实际为6.

经过试验,我确信原始生产力溢出受到了逆加成,即9/1.5=6

原始生产力溢出很早就有逆加成了
发表于 2009-6-11 19:52:24 | 显示全部楼层

回复 #14 zz_fly 的帖子

刚才发现自己脑袋短路了,再想想
发表于 2009-6-11 22:53:17 | 显示全部楼层
原帖由 西艾薇.C.Kyou 于 2009-6-11 18:57 发表
实验派遇理论派只能死无全尸


别灰心,楼主里面小错误还是有的,比如说积累锤子数量的0在以后的计算中应该是加而不是减。

莫名其妙多出钱来的确比较bug

个人觉得溢出锤子应该根据接下来建造的东西来算,让第i回合溢出的锤子在第i+1回合清算,不知道这个想法合不合理。
发表于 2009-6-11 23:01:15 | 显示全部楼层

回复 #16 modekiller 的帖子

说实话,我没看出这个小错误 在哪里啊 另外我写了一篇新的应用篇
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 04:55

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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