设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
楼主: Khyron

[原创] 文明游戏机制拾遗

[复制链接]
 楼主| 发表于 2008-8-8 17:06:43 | 显示全部楼层

科技交易中某些独特的科技(BTS3.17)

Fishing, Agriculture, Mining, Animal Husbandry, Monothesim, Monarchy, Alphabet, Printing Press, Liberalism, Scientific Method

对于那些以上垄断价值为0的科技,如果没有特殊理由,最好不要自己研究,而是从AI手里换来。

比如Monarchy, Scientific Method, Printing Press(如果不是用大科点),还是换来比较值。当然像字母自由主义这样的,还是自己研发收益大。
 楼主| 发表于 2008-8-9 14:27:14 | 显示全部楼层

战争胜利指数(BTS3.17)

一个组队(team)对另一组队战争胜利指数(WarSuccess)计算方法如下:
1. 得到下述战果后,增加相应战争胜利数;
防守时杀死进攻者  WAR_SUCCESS_DEFENDING       3
进攻时杀死防守者  WAR_SUCCESS_ATTACKING       4
捕获单位            WAR_SUCCESS_UNIT_CAPTURING  1
占领城市            WAR_SUCCESS_CITY_CAPTURING  10
核弹命中            WAR_SUCCESS_NUKE            10

注:像厌战一样,这里要求杀死,而不仅仅是战斗胜利,另外有隐藏国籍单位参加的战斗不会带来战争胜利。

2. 达成和平协议,战争胜利指数清0.

由此可见,为什么有时我们连下数城,敌人不肯投降,而有时一城未下,敌人却降了。另外,打打停停的战争,是勒索不了什么东西的。当然AI在进行外交时不是简单的比较双方的战争胜利指数,关于详细计算方法,如有可能,我将单独撰文来探讨。
发表于 2008-8-9 14:32:02 | 显示全部楼层

回复 #15 囧囧囧囧囧 的帖子

提得好~~~~~~
 楼主| 发表于 2008-8-21 18:21:38 | 显示全部楼层

AI是如何计算科技的垄断价值的(BTS3.17)

在前面的贴子里已有结论:
对于一个科技,AI按以下方法判断是否对某国实行科技垄断。
1. AI根据这个科技和是否准备对此国开战来计算一个垄断价值。
2. 根据此AI领袖性格和游戏难度,进行修正。
3. 再根据已发现此科技的队伍数和此AI碰到的队伍数进行修正,均不包括此AI和想和此AI进行交易的队伍。


现在,我们将进一步讨论如何计算这个垄断价值,并给出AI判定是否对科技保密的完整公式。

假设组队(Team)TeamA询问组队TeamB是否愿意交换科技TechX, 那么TeamB眼里针对TeamA科技TechX的垄断价值AI_getTechMonopolyValue(TechX,TeamA)的计算方法是:
1. 垄断价值初始值为0。
2. 对于每一个前提科技是TechX的单位(Unit),根据TeamB是否有针对TeamA的战争计划(Warplan),垄断价值增加相应的数值。此数值的完整计算方法比较繁琐就不详述了,如有兴趣可参见前面的源代码。大致是非战斗单位为0,力量与当前世界上最强的陆地单位的力量比大于50%,有额外加成。
3. 对于每一个前提科技是TechX的建筑(Building), 如果这个建筑不是宗教建筑,每一个加30,如果此建筑还是未被建的世界奇迹,再加50。
注:这里的建筑包括普通建筑,国家奇迹和世界奇迹,另外UB和其对应的建筑算不同建筑。宗教建筑指Temple,Monastery和Cathedral这3类建筑。
4. 对于每一个前提科技是TechX的工程(Project), 每一个加50, 如果此工程还是未被建的世界工程(如Internet),再加100。

经过这4步所得数值就是TeamB眼里针对TeamA科技TechX的垄断价值,简称为垄断价值。


为了便于叙述,先定义以下名词
可知数: 刨除TeamA和TeamB,TeamB遇到过的所有组队的数量;
已知数: 刨除TeamA和TeamB,TeamB遇到过的且拥有科技TechX的所有组队的数量;
领袖科技保密度: TeamB的领袖关于科技保密的性格,这个由CIV4LeaderHeadInfos.xml中iTechTradeKnownPercent决定;
难度修正: TeamA的难度设定中对科技保密的修正,这个由CIV4HandicapInfo.xml中iTechTradeKnownModifier决定,这项noble以上都是0了;

科技交易已知度: = 领袖科技保密度 * (100 + 难度修正) / 100 * 垄断价值 / 100

经以上准备,我们来给出AI判定是否对科技保密的完整公式:
1. 可知数 = 0 (即TeamB没有遇到除TeamA以外的任何组队)
如果科技交易已知度 > 0,TeamB将以"We don't want to start trading away this technology just yet"为理由,拒绝放出科技TechX;
2. 可知数 > 0
如果科技交易已知度 > 100 * 已知数 / 可知数, TeamB将拒绝放出科技TechX。
 楼主| 发表于 2008-8-21 18:22:27 | 显示全部楼层

科技的垄断价值计算公式的检验(BTS3.17)

immortal/1human+6AI
AI领袖分别为
Peter, Gandhi, Hannibal, Elizabeth, Pacal II, Isabella
AI领袖科技保密度分别为
10,20,30,40,50,60

先让所有人都联系上,这样此时
可知数 = 5
难度修正 = 0

科技:神秘论
石圈未建时,垄断价值为5*30+50=200
对于科技交易已知度:
Peter = 10 * (100 + 0) /100 * 200 /100 = 20
那么当Peter有神秘论时,只要其它一人也有神秘论,则有(20>100*1/5=20)不成立,则Peter放出神秘论。
Elizabeth = 40 * (100 + 0) /100 * 200 /100 = 80
那么当Elizabeth有神秘论时,则只有至少其它4人有神秘论,她才放出神秘论。

石圈已建时,垄断价值为5*30=150
对于科技交易已知度:
Elizabeth = 40 * (100 + 0) /100 * 150 /100 = 60
那么这时当Elizabeth有神秘论时,则其它3人有神秘论,她就放出神秘论。

科技: 冥想
瑞光大金塔未建时垄断价值为30+50=80
瑞光大金塔已建时垄断价值为30
那么要从Hannibal手里得到冥想,分别需要有另外2人和1人(未建和已建)知道冥想。

特别的,当科技是石工时,垄断价值可高达390(大金,大灯塔,长城都未建),即使这3个奇迹都建了,垄断价值也有240。这也说明为什么难以换到石工。
发表于 2008-8-21 19:37:21 | 显示全部楼层
原帖由 Khyron 于 2008-8-9 14:27 发表
一个组队(team)对另一组队战争胜利指数(WarSuccess)计算方法如下:
1. 得到下述战果后,增加相应战争胜利数;
防守时杀死进攻者  WAR_SUCCESS_DEFENDING       3
进攻时杀死防守者  WAR_SUCCESS_ATTACKING   ...


很想知道电脑投降的机制

经常把电脑打到1城1兵都不肯投降

前几天还有一次投降那个选项显示为 You've grown too powerful for us
我晕,既然知道我too powerful为什么还不投降...

[ 本帖最后由 blackartist 于 2008-8-21 19:39 编辑 ]
发表于 2008-8-21 20:07:07 | 显示全部楼层
因为AI也是想赢的.......
发表于 2008-8-21 22:28:48 | 显示全部楼层
...那他也要先考虑活下来才能再考虑赢的问题阿

难得我还特意让他多活了几回合,然后每回合都陪着笑脸让他做我的附庸..
 楼主| 发表于 2008-10-15 01:08:31 | 显示全部楼层

与时间有关的计数器,电脑的记性和忘性(BTS3.17)

文明4里有一类特殊的计数器(Counter),有时也叫计时器(Timer),一般被用来记录事件触发后持续的时间。
此类型的计数器都有以下性质:
(1) 计数器储存的数值都是非负整数(或非负整数数组)
(2) 每回合结束后,计数器数值要么增大;要么减少,只要数值大于0。换句话说,只要计数器数值不为0,每回合都要变化。并且绝大多数的计数器增大减小的数值都是1。

我对此类型的计数器做了一个大致总结,主要介绍计数器的变化,对计数器变化的原因和后果就不详述了。也许有遗漏,欢迎补充。
其中:
每回合变化:冒号分割不同可能性,2种可能性只能2选一。
一次性变化:+C指增加C,=C指设定为C。此处的数值是基础值,一般还受游戏速度影响。C与此计数器相关。
作用对象:指此计数器附着的对象。
第二对象/子类:此计数器相对于第二对象/子类可以视作子计数器。比如ContactTimer针对每一个player和每一种ContactType都有一对应数值。
描述关键词每回合变化一次性变化每回合变化前提条件一次性变化触发事件作用对象第二对象/子类
反间谍行动CounterespionageTurnsLeftAgainstTeam-1+10间谍对第二对象执行反间谍任务TeamTeam
窃取军事计划StolenVisibilityTimer-1+2间谍从第二对象窃取军事计划(原版,战神)TeamTeam
AI执行外交时间间隔ContactTimer-1+C和第二对象执行相对应于联系类型的外交AI_PlayerPlayer/ContactType
黄金时代GoldenAgeTurns-1+8开启黄金时代Player 
无政府AnarchyTurns-1+C革命或改宗Player 
革命RevolutionTimer-1=(5+C)/=1革命/拥有耶稣巨像,C是无政府持续的长度Player 
改宗ConversionTimer-1=(5+C)/=1改宗/拥有耶稣巨像,C是无政府持续的长度Player 
文化升级CultureUpdateTimer-1+C/=0城市暴动/大艺术家创作艺术杰作City 
城市占领OccupationTimer-1+C/=0通过战争占领城市/大艺术家创作艺术杰作City 
加速建设愤怒HurryAngerTimer-1+10奴隶制下杀人加速City 
征兵愤怒ConscriptAngerTimer-1+10征兵City 
抵制决议愤怒DefyResolutionAngerTimer-1+20/C抵制教皇宫或联合国决议City 
事件快乐HappinessTimer-1+C一般由随机事件触发City 
中毒EspionageHealthCounter-1+8间谍投毒City 
不满EspionageHappinessCounter-1+8间谍煽动不满City 
强制地域无主ForceUnownedTimer-1=2通过战争占领在对方文化范围内的城市Plot 
        
共同防御DefensivePactCounter+1:-1和第二对象有共同防御条约:其余 AI_TeamTeam
同宗SameReligionCounter+1:-1和第二对象有相同国教:其余 AI_PlayerPlayer
异教DifferentReligionCounter+1:-1有国教,和第二对象国教不同:其余 AI_PlayerPlayer
最爱的内政条令FavoriteCivicCounter+1:-1采用自己最爱的政令,第二对象也采用:其余 AI_PlayerPlayer
进口资源BonusTradeCounter+x:-y从第二对象进口资源:其余 AI_PlayerPlayer
        
战争计划WarPlanStateCounter+1=0对第二对象执行战争计划改变对第二对象的战争计划AI_TeamTeam
战争AtWarCounter+1=0和第二对象作战和第二对象和平AI_TeamTeam
和平AtPeaceCounter+1=0和第二对象和平和第二对象作战AI_TeamTeam
开放边境OpenBordersCounter+1=0和第二对象开放边境取消和第二对象的开放边境条约AI_TeamTeam
共同作战ShareWarCounter+1=0和第二对象与某第三国共同作战和第二对象作战AI_TeamTeam
地块有主时间OwnershipDuration+1=0此地块有主地块易主Plot 
区域设施ImprovementDuration+1=0改变此地块设施类型PlotImprovement
区域设施升级UpgradeProgress+1=0要有市民工作,人身自由下某些设施+2/Turn改变此地块设施类型PlotImprovement
        
组队相遇HasMetCounter+1和第二对象相遇 AI_TeamTeam


抵制决议愤怒:每回合变化中如果是联合国决议,C=1;教皇宫决议,C=城市中宗教数量。
进口资源:x=进口资源的数量,y=min(当前此计数器的数值, 此玩家城市数量/4 + 1),所以此计数器衰减的速度极快。
区域设施升级:除了进口资源计数器,唯一一个每回合变化幅度大于1的计数器。
组队相遇:唯一一个单调增加计数器。


注:除了表格中列举的影响,当2个组队建立永久同盟时,2个组队计数器要合并,从而各数值要重新处理。

另外还有3个类似的计数器,但其数值并不是每回合固定变化。
描述关键词每回合变化一次性变化每回合变化前提条件一次性变化触发事件作用对象第二对象/子类
电脑的记性MemoryCount-1*P+1第二对象执行对应于记忆类型的外交AI_PlayerPlayer/MemoryType
        
建筑建造暂停BuildingProductionTime+1*[1,0]=0未建造完第二对象,暂停建造此建筑建造完毕CityBuilding
单位训练暂停UnitProductionTime+1*[1,0]=0未训练完第二对象,暂停训练此单位训练完毕CityUnit
 楼主| 发表于 2008-10-15 01:17:20 | 显示全部楼层

电脑的记性和忘性(BTS3.17)

对于电脑的记性(MemoryCount)这个计数器,其主要作用是影响外交关系,它对外交关系的修正的计算公式为:
AI_getMemoryAttitude(PlayerTypes ePlayer, MemoryTypes eMemory) = AI_getMemoryCount(ePlayer, eMemory) * GC.getLeaderHeadInfo(getPersonalityType()).getMemoryAttitudePercent(eMemory)) / 100

外交修正 = 此记忆类型计数 * 领袖性格中此记忆类型态度百分比 / 100

每当发生和记忆类型对应的外交事件时,此记忆类型的计数增加1。
而电脑的记性里计数的减少与其它普通的计数器不同,特殊的地方是:
如果iMemoryRand不为0,则每回合有可能减1,减小的可能性P = 1 / iMemoryRand
这也是为什么我们称此机制为电脑的忘性。

由于对于每一种记忆,除野蛮人领袖以外,所有的领袖的iMemoryRand都相同,但iMemoryAttitudePercent略有区别,以下表格选取Alexander做代表,给出每一种记忆对应的iMemoryAttitudePercent和iMemoryRand。

Civ4LeaderHeadInfos.xml
记忆类型MemoryTypeiMemoryAttitudePercentiMemoryRand外交影响时效
宣战MEMORY_DECLARED_WAR-300 永久
对其朋友宣战MEMORY_DECLARED_WAR_ON_FRIEND-100 永久
雇佣别国宣战MEMORY_HIRED_WAR_ALLY-200 永久
对其使用核武器MEMORY_NUKED_US-200 永久
对其朋友使用核武器MEMORY_NUKED_FRIEND-100 永久
摧毁城市MEMORY_RAZED_CITY-250 永久
摧毁其国教的圣城MEMORY_RAZED_HOLY_CITY-200 永久
间谍被捕MEMORY_SPY_CAUGHT-100 永久
提供帮助MEMORY_GIVE_HELP100200暂时
拒绝帮助MEMORY_REFUSED_HELP-100100暂时
接受勒索MEMORY_ACCEPT_DEMAND10050暂时
拒绝勒索MEMORY_REJECTED_DEMAND-100150暂时
接受别国改宗请求MEMORY_ACCEPTED_RELIGION100100暂时
拒绝别国改宗请求MEMORY_DENIED_RELIGION-10050暂时
接受别国转换政体请求MEMORY_ACCEPTED_CIVIC100100暂时
拒绝别国转换政体请求MEMORY_DENIED_CIVIC-10050暂时
接受别国加入战争请求MEMORY_ACCEPTED_JOIN_WAR 150
拒绝别国加入战争请求MEMORY_DENIED_JOIN_WAR-100100暂时
接受别国停止贸易请求MEMORY_ACCEPTED_STOP_TRADING50100暂时
拒绝别国停止贸易请求MEMORY_DENIED_STOP_TRADING-10050暂时
在第三国请求下停止贸易MEMORY_STOPPED_TRADING-10030暂时
雇佣别国停止贸易MEMORY_HIRED_TRADE_EMBARGO-10020暂时
取消开放边境条约MEMORY_CANCELLED_OPEN_BORDERS 10
最近勒索和请求帮助MEMORY_MADE_DEMAND_RECENT 20
勒索MEMORY_MADE_DEMAND-100 永久
输出科技MEMORY_TRADED_TECH_TO_US10100暂时
输入科技MEMORY_RECEIVED_TECH_FROM_ANY 20
投票反对MEMORY_VOTED_AGAINST_US-20010暂时
投票支持MEMORY_VOTED_FOR_US20010暂时
增进关系的事件MEMORY_EVENT_GOOD_TO_US10050暂时
破坏关系的事件MEMORY_EVENT_BAD_TO_US-10050暂时
解放城市MEMORY_LIBERATED_CITIES150 永久

注:表格中的无针对的只是外交影响,并不表明对其它事情没有影响。

(1) MEMORY_MADE_DEMAND_RECENT和MEMORY_MADE_DEMAND的区别
如果你是请求帮助,或勒索计数大于等于10,这时属于MEMORY_MADE_DEMAND_RECENT,MEMORY_MADE_DEMAND_RECENT要加1。
也就是说勒索引起的态度变差有下限

(2) MEMORY_TRADED_TECH_TO_US
由于这个记忆的iMemoryAttitudePercent很小,所以以下外交修正很少见。
"You have shared your technological discoveries with us."

(3) MEMORY_RECEIVED_TECH_FROM_ANY
对这个,电脑记在心里的数,就是你在外交交易中获得科技的数量,也就是臭名昭著的WFYABTA的根源。
 楼主| 发表于 2008-10-15 01:35:43 | 显示全部楼层

附录:iMemoryAttitudePercent详表删节版(BTS3.17)

由于字数限制,只列出那些全部文明领袖不全相同的态度百分比
请注意:从SULEIMAN到ZARA_YAQOB对应于禁运,雇佣禁运,勒索,输出科技的态度百分比是理论值

为什么这么说呢?
这是因为Civ4LeaderHeadInfos.xml中这些领袖的这4个记忆类型对应的标签出现了2次,而且在后面重复出现的明显是copy-paste错误,但遗憾的是程序导入XML文件时,后面错误的数值会覆盖前面正确的数值。
对于这8位领袖,这4项实际数值都是:
-100, -100, -100, 5

iMemoryAttitudePercent
领袖
间谍被捕拒绝帮助拒绝勒索拒绝改宗拒绝换政体拒绝参战
拒绝禁运
禁运
雇佣禁运
勒索
输出科技
ALEXANDER-100-100-100-100-100-100-100-100-100-10010
ASOKA-100-100-100-100-100-100-100-100-100-1005
AUGUSTUS-100-100-100-100-100-100-100-100-100-10010
BISMARCK-100-100-100-100-100-100-100-100-100-1005
BOUDICA-100-100-100-100-100-100-100-100-100-10015
BRENNUS-100-100-100-100-100-100-100-100-100-10010
CATHERINE-200-200-200-200-200-200-200-100-100-20015
CHARLEMAGNE-100-100-100-100-100-100-100-100-100-10010
CHURCHILL-100-100-100-100-100-100-100-100-100-10010
CYRUS-100-100-100-100-100-100-100-100-100-10010
DARIUS-100-100-100-100-100-100-100-100-100-10010
DE_GAULLE-100-100-100-100-100-100-100-100-100-10010
ELIZABETH-100-100-100-100-100-100-100-100-100-10015
FREDERICK-100-100-100-100-100-100-100-100-100-10015
GANDHI-100








5
GENGHIS_KHAN-100-100-100-100-100-100-100-100-100-10010
GILGAMESH-100-100-100-100-100-100-100-100-100-10015
HAMMURABI-100-100-100-100-100-100-100-100-100-10010
HANNIBAL-100-100-100-100-100-100-100-100-100-10015
HATSHEPSUT-100-100-100-100-100-100-100-100-100-10010
HUAYNA_CAPAC-100-100-100-100-100-100-100-100-100-10010
ISABELLA-100-100-100-100-100-100-100-100-100-1005
JOAO-100-100-100-100-100-100-100-100-100-10015
JULIUS_CAESAR-100-100-100-100-100-100-100-100-100-10010
JUSTINIAN-100-100-100-100-100-100-100-100-100-10015
KUBLAI_KHAN-100-200-200-200-200-200-200-100-100-20015
LINCOLN-100-100-100-100-100-100-100-100-100-10015
LOUIS_XIV-100-200-200-200-200-100-100-100-100-20010
MANSA_MUSA-100-100-100-100-100-100-100-100-100-10020
CHINESE_LEADER-100-100-100-100-100-100-100-100-100-1005
MEHMED-100-100-100-100-100-100-100-100-100-10010
MONTEZUMA-100-100-100-100-100-100-100-100-100-10015
NAPOLEON-100-100-100-100-100-100-100-100-100-10010
PACAL-100-100-100-100-100-100-100-100-100-10010
PERICLES-100-100-100-100-100-100-100-100-100-10010
PETER-100-100-100-100-100-100-100-100-100-10020
QIN_SHI_HUANG-100-200-200-200-200-100-100-100-100-20010
RAMESSES-100-100-100-100-100-100-100-100-100-10010
RAGNAR-100-100-100-100-100-100-100-100-100-1005
FRANKLIN_ROOSEVELT-100-100-100-100-100-100-100-100-100-10010
SALADIN-100-100-100-100-100-100-100-100-100-10010
SHAKA-100-100-100-100-100-100-100-100-100-1005
SITTING_BULL-100-100-100-100-100-100-100-100-100-1005
STALIN-100-100-100-100-100-100-100-100-100-1005
SULEIMAN-100-100-100-100-100-100-100-100-100-10010
SURYAVARMAN-100-200-200-200-200-200-200-100-100-20010
TOKUGAWA-100-200-200-200-200-200-200-100-100-2005
VICTORIA-100-100-100-100-100-100-100-100-100-10010
WANGKON-100-100-100-100-100-100-100-100-100-10010
WASHINGTON-100-100-100-100-100-100-100-100-100-10010
WILLEM_VAN_ORANJE-100-100-100-100-100-100-100-100-100-10015
ZARA_YAQOB-100-100-100-100-100-100-100-100-100-10010


[ 本帖最后由 Khyron 于 2008-10-15 01:44 编辑 ]
 楼主| 发表于 2008-10-18 15:00:26 | 显示全部楼层

浅论文明4中的时代(BTS3.17)

标准游戏中,文明4有7个时代(Era),它们分别是:
远古,古典,中古,启蒙,工业,信息,未来
Ancient,Classical,Medieval,Renaissance,Industial,Modern,Future
在游戏里,实际作用的是和它们对应的时代数,按从古至今,为0-6

由于时代和时代数是一一对应的,为了行文方便,以下两者互指,不加区分。

1. 时代的确定
游戏中一个玩家(player)的时代是由并且仅由其拥有的科技决定,即
当这个玩家获得一个科技时,如果此科技对应的时代晚于此玩家的时代,则玩家的时代变为这个科技对应的时代。
所以各个玩家都有自己的时代,当一个玩家进入工业时代,另一个玩家有可能还没进启蒙呢。

除了每个玩家的时代,游戏里还有一个时代,姑且称之为游戏(game)当前时代。
这个时代是当前所有还存活的玩家时代的平均
也就是说游戏当前时代是当前所有还存活的玩家时代数的平均值,再取整得到对应的时代

另外,还有一个时代,即游戏开局时代。


2. 玩家时代的作用
除了对画面的影响外,在游戏中玩家的时代数的实质影响有:
a. 对于不是野蛮人的电脑玩家有时代修正
b. 城市文化力量
c. 游戏当前时代

(1) 对于电脑玩家,受时代数影响的游戏元素有
a. 建造建筑所需生产力
b. 训练单位所需生产力
c. 创建工程所需生产力
d. 单位维持费用
e. 单位远征费用
f. 内政法令的维护费
g. 城市人口增加所需粮食数量
h. 城市中厌战造成不满人口数量
i. 单位升级所需金钱

j. 通货膨胀

对于a-i这9项修正,作用方式都是额外乘以
max(0,此玩家的时代数 * 与游戏难度对应的iAIPerEraModifier + 100) / 100

对于j项即通货膨胀修正,也是对AI有
max(0,此玩家的时代数 * 与游戏难度对应的iAIPerEraModifier + 100) / 100
这样的优惠,但不是简单叠乘,这里就不详述了。

注:对a-c这3项修正不像难度的修正,要分普通和世界2种,比如对普通建筑和奇迹的各有对应的难度修正,而是对这2种都有上述修正

Civ4HandicapInfo.xml <iAIPerEraModifier>

Handicap
SETTLER CHIEFTAIN WARLORD NOBLE PRINCE MONARCH EMPEROR IMMORTAL DEITY
iAIPerEraModifier 0 0 0 0 -1 -2 -3 -4 -5


例子: 普通速度,远古开局,Immortal难度,
引水渠本需要100锤子,经过难度的AI打折后,需要80锤子,那么
对于进入了信息时代电脑玩家,经过时代修正,则只需要80*(5*(-4)+100)/100=64锤子
而如果这个电脑玩家还只处于古典时代,则时代的修正乘子只为(1*(-4)+100)/100=96%
凡尔赛宫需要800锤子,对于奇迹,AI的修正乘子是100%,所以经过难度修正后,还需800锤子,
对于处于工业时代的电脑玩家,时代修正为84%,建造凡尔赛宫则800*84%=672锤子

(2) 时代对城市文化力量的影响
在计算城市受其它文化影响而是否叛乱时,城市所在地块的文化意义上的拥有者产生的文化力量是叛乱的源泉,而这个文化力量受文化意义上的拥有者时代数影响,时代越晚力量越大。
详细计算方法就不详述了,有兴趣的可以查阅
int CvCity::cultureStrength(PlayerTypes ePlayer) const

3. 游戏当前时代和游戏开局时代的作用
游戏开局时代的不同,游戏中很多东西打相应的折扣;
游戏当前时代的作用只是用来判读是否在地图中能自动生成动物,野蛮人,野蛮人城市。
这2者的影响均由Civ4EraInfos.xml决定。

4. 总结
对于人类玩家,时代变迁的影响微乎其微;但对于电脑,每进入到下一个时代,享受的折扣就增大。
我们常说的电脑越到后期越变态,iAIPerEraModifier起了主要作用。

由于一个玩家,无论是人类还是电脑,其时代只受其科技控制。
所以过去那些什么
进入下一个时代,研究以前的科技会更快
为了削弱电脑的iAIPerEraModifier折扣,应尽量延迟进入下一个时代
都是错误的。
对于电脑的时代修正,你在游戏中只需注意这点:将跨时代的科技卖给电脑时,如果能晚则晚。

说句题外话,其实文明4中研究科技的花费才是真正的对人类玩家电脑玩家一视同仁,研究科技的花费并没有特别的针对电脑的折扣,或对人类的惩罚,只是不同难度下需要的瓶子不同。
而人类玩家的难度是开始设定的难度,即游戏的难度;电脑玩家的难度,是由GlobalDefines.xml设定的,是noble。区别由此而来。
 楼主| 发表于 2008-10-18 15:01:32 | 显示全部楼层

浅论文明4中的时代(BTS3.17)

  1. void CvTeam::setHasTech(TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce)
  2. {
  3.         ………………
  4.                                                 GET_PLAYER((PlayerTypes)iI).setCurrentEra((EraTypes)(GC.getTechInfo(eIndex).getEra()));
  5.         ………………
  6. }
复制代码
  1. void CvPlayer::setCurrentEra(EraTypes eNewValue)
  2. {
  3.         CvCity* pLoopCity;
  4.         CvUnit* pLoopUnit;
  5.         CvPlot* pLoopPlot;
  6.         int iLoop;
  7.         int iI;

  8.         if (getCurrentEra() != eNewValue)
  9.         {
  10.                 EraTypes eOldEra = m_eCurrentEra;
  11.                 m_eCurrentEra = eNewValue;

  12.                 if (GC.getGameINLINE().getActiveTeam() != NO_TEAM)
  13.                 {
  14.                         for (iI = 0; iI < GC.getMapINLINE().numPlotsINLINE(); iI++)
  15.                         {
  16.                                 pLoopPlot = GC.getMapINLINE().plotByIndexINLINE(iI);
  17.                                 pLoopPlot->updateGraphicEra();

  18.                                 if (pLoopPlot->getRevealedImprovementType(GC.getGameINLINE().getActiveTeam(), true) != NO_IMPROVEMENT)
  19.                                 {
  20.                                         if ((pLoopPlot->getOwnerINLINE() == getID()) || (!(pLoopPlot->isOwned()) && (getID() == GC.getGameINLINE().getActivePlayer())))
  21.                                         {
  22.                                                 pLoopPlot->setLayoutDirty(true);
  23.                                         }
  24.                                 }
  25.                         }
  26.                 }

  27.                 // dirty all of this player's cities...
  28.                 for (pLoopCity = firstCity(&iLoop); pLoopCity != NULL; pLoopCity = nextCity(&iLoop))
  29.                 {
  30.                         if (pLoopCity->getOwnerINLINE() == getID())
  31.                         {
  32.                                 pLoopCity->setLayoutDirty(true);
  33.                         }
  34.                 }

  35.                 //update unit eras
  36.                 for(pLoopUnit = firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = nextUnit(&iLoop))
  37.                 {
  38.                         gDLL->getEntityIFace()->updateGraphicEra(pLoopUnit->getUnitEntity(), eOldEra);
  39.                 }

  40.                 //update flag eras
  41.                 gDLL->getInterfaceIFace()->setDirty(Flag_DIRTY_BIT, true);

  42.                 if (getID() == GC.getGameINLINE().getActivePlayer())
  43.                 {
  44.                         gDLL->getInterfaceIFace()->setDirty(Soundtrack_DIRTY_BIT, true);
  45.                 }

  46.                 if (isHuman() && (getCurrentEra() != GC.getGameINLINE().getStartEra()) && !GC.getGameINLINE().isNetworkMultiPlayer())
  47.                 {
  48.                         if (GC.getGameINLINE().isFinalInitialized() && !(gDLL->GetWorldBuilderMode()))
  49.                         {
  50.                                 CvPopupInfo* pInfo = new CvPopupInfo(BUTTONPOPUP_PYTHON_SCREEN);
  51.                                 if (NULL != pInfo)
  52.                                 {
  53.                                         pInfo->setData1(eNewValue);
  54.                                         pInfo->setText(L"showEraMovie");
  55.                                         addPopup(pInfo);
  56.                                 }
  57.                         }
  58.                 }
  59.         }
  60. }
复制代码
  1. int CvPlayer::getProductionNeeded(UnitTypes eUnit) const
  2. {
  3.         ………………
  4.                 iProductionNeeded *= std::max(0, ((GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAIPerEraModifier() * getCurrentEra()) + 100));
  5.                 iProductionNeeded /= 100;
  6.         ………………
  7. }
复制代码
T
发表于 2008-10-18 21:52:10 | 显示全部楼层
这段非常有价值啊!!


4. 总结
对于人类玩家,时代变迁的影响微乎其微;但对于电脑,每进入到下一个时代,享受的折扣就增大。
我们常说的电脑越到后期越变态,iAIPerEraModifier起了主要作用。

由于一个玩家,无论是人类还是电脑,其时代只受其科技控制。
所以过去那些什么
进入下一个时代,研究以前的科技会更快
为了削弱电脑的iAIPerEraModifier折扣,应尽量延迟进入下一个时代
都是错误的。
对于电脑的时代修正,你在游戏中只需注意这点:将跨时代的科技卖给电脑时,如果能晚则晚。
发表于 2008-10-19 04:44:01 | 显示全部楼层
补充:iAIPerEraModifier不仅仅对生产力和科技速度产生影响,还对AI的厌战情绪产生影响,此文甚强!
发表于 2008-10-19 08:09:11 | 显示全部楼层
一直有些不明白的,是Dirty到底是什么意思?

一直没有深究,比如这个函数AI_setAssignWorkDirty()
发表于 2008-10-19 08:30:51 | 显示全部楼层
或许是核污染?
发表于 2008-10-19 08:52:04 | 显示全部楼层
原帖由 孟仲玄 于 2008-10-19 08:30 发表
或许是核污染?


不是……,这点我敢肯定……这个函数被呼叫的次数异乎寻常的多,我的推断是,决定AI是否采取残暴政策,比如饿死人来加快生产,比如whip
发表于 2008-10-19 10:15:13 | 显示全部楼层
那也不用叫dirty吧
 楼主| 发表于 2008-10-20 16:12:46 | 显示全部楼层
原帖由 西艾薇.I.王子 于 2008-10-19 08:09 发表
一直有些不明白的,是Dirty到底是什么意思?

一直没有深究,比如这个函数AI_setAssignWorkDirty()


据我初步分析,我猜测:
对于
AI_isXXXXDirty(),AI_setXXXXDirty(bool bNewValue)
它们是用来判断和标记是否将执行相应AI的
打个比方:打扫房间时,清洁工看到什么地方需要打扫,就在那里挂个标签“脏”,就看到什么地方标记为脏,就打扫一番,打扫完了就把“脏”的标记去掉,有时清洁完一处的同时会弄脏别处,这时还会在弄脏的地方标记上脏。
游戏里的电脑的AI就像这个清洁工,只不过它干活的顺序很复杂。

对于
getEngineIFace()->isDirty(EngineDirtyBit eBit)
getEngineIFace()->SetDirty(EngineDirtyBit eBit, BOOL bNewValue)
getInterfaceIFace()->isDirty(InterfaceDirtyBit eDirty)
getInterfaceIFace()->setDirty(InterfaceDirtyBit eDirty, BOOL bDirty)
它们是负责图像刷新的。
这时简单的多,不涉及其它,就好像什么衣服脏了,就直接重新洗一下,洗衣服不会对其它东西有影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 23:27

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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