设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
楼主: Khyron

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

[复制链接]
发表于 2008-10-20 16:49:50 | 显示全部楼层
原帖由 Khyron 于 2008-10-20 16:12 发表


据我初步分析,我猜测:
对于
AI_isXXXXDirty(),AI_setXXXXDirty(bool bNewValue)
它们是用来判断和标记是否将执行相应AI的
打个比方:打扫房间时,清洁工看到什么地方需要打扫,就在那里挂个标签“脏 ...


有趣,我可是给你提供了一个很有趣的研究课题哦
 楼主| 发表于 2008-10-22 14:40:17 | 显示全部楼层

边境冲突和数字8(BTS3.17)

在影响外交关系的各种因素中,有一项是:边境冲突。
边境冲突带来的修正,即
"Our close borders spark tensions."
对应的数值,其计算公式为:
态度修正 = 领袖对边境冲突的敏感度 * iPercent / 100

注1:由于领袖对边境冲突的敏感度都是负数,上式右方的取整是向上的,如-1.2 -> -1。

iPercent的计算公式为:
iPercent = min(60,此AI的被你窃取的地块的数量 * 3) + (如果你所属组队还是这个AI所属组队的陆地目标)40

(1)AI的被你窃取的地块:此地块位于此AI某个城市工作范围内的21格,但属于你。

(2)组队T1是组队T2的陆地目标,当且仅当:
a. 存在2个玩家P1,P2,它们分别属于组队T1和组队T2,且P1的某个城市与P2的首都3座城市位于同一大陆
b. 组队T1有8个陆地格子与和组队T2的陆地格子相邻

因此,当你与AI陆地接壤的陆地格子达到8时,iPercent有个幅度为40的跳跃。由于大多数领袖对边境冲突的敏感度是-2到-4,这个跳跃直接导致态度修正超过-1。
如果不到8,则这项修正基本上会被取整忽略掉。

注2:边境冲突带来的修正与大多数外交修正不同,不是即时更新,而是被缓存,每回合更新一次。
注3:AI之间也会产生边境冲突,计算方法一样。

附录: 领袖对边境冲突的敏感度
0
BARBARIAN
-1
WILLEM_VAN_ORANJE
-2
ASOKA, BRENNUS, CHURCHILL, CYRUS, DARIUS, DE_GAULLE, FREDERICK, GANDHI, HAMMURABI, HATSHEPSUT, JOAO, LINCOLN, MANSA_MUSA, CHINESE_LEADER, MEHMED, PACAL, PERICLES, RAMESSES, RAGNAR, STALIN, SULEIMAN, VICTORIA, WANGKON, WASHINGTON, ZARA_YAQOB
-3
BOUDICA, CHARLEMAGNE, ELIZABETH, GILGAMESH, HANNIBAL, HUAYNA_CAPAC, ISABELLA, KUBLAI_KHAN, NAPOLEON, PETER, FRANKLIN_ROOSEVELT, SALADIN, SURYAVARMAN, TOKUGAWA
-4
ALEXANDER, AUGUSTUS, BISMARCK, CATHERINE, GENGHIS_KHAN, JULIUS_CAESAR, JUSTINIAN, LOUIS_XIV, MONTEZUMA, QIN_SHI_HUANG, SHAKA, SITTING_BULL

[ 本帖最后由 Khyron 于 2009-12-31 19:40 编辑 ]
 楼主| 发表于 2008-10-22 14:41:21 | 显示全部楼层

边境冲突和数字8(BTS3.17)

  1. int CvPlayerAI::AI_getCloseBordersAttitude(PlayerTypes ePlayer)
  2. {
  3.         if (m_aiCloseBordersAttitudeCache[ePlayer] == MAX_INT)
  4.         {
  5.         int iPercent;

  6.         if (getTeam() == GET_PLAYER(ePlayer).getTeam() || GET_TEAM(getTeam()).isVassal(GET_PLAYER(ePlayer).getTeam()) || GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isVassal(getTeam()))
  7.         {
  8.                 return 0;
  9.         }

  10.         iPercent = std::min(60, (AI_calculateStolenCityRadiusPlots(ePlayer) * 3));

  11.         if (GET_TEAM(getTeam()).AI_isLandTarget(GET_PLAYER(ePlayer).getTeam()))
  12.         {
  13.                 iPercent += 40;
  14.         }

  15.                 m_aiCloseBordersAttitudeCache[ePlayer] = ((GC.getLeaderHeadInfo(getPersonalityType()).getCloseBordersAttitudeChange() * iPercent) / 100);
  16.         }

  17.         return m_aiCloseBordersAttitudeCache[ePlayer];
  18. }
复制代码

  1. bool CvTeamAI::AI_isLandTarget(TeamTypes eTeam) const
  2. {
  3.         if (!AI_hasCitiesInPrimaryArea(eTeam))
  4.         {
  5.                 return false;
  6.         }

  7.         if (AI_calculateAdjacentLandPlots(eTeam) < 8)
  8.         {
  9.                 return false;
  10.         }

  11.         return true;
  12. }
复制代码
T
发表于 2008-10-22 14:44:44 | 显示全部楼层
喂,我可是一直在等待关于dirty的详尽研究啊
 楼主| 发表于 2008-10-22 21:51:01 | 显示全部楼层

回复 #44 西艾薇.I.王子 的帖子

这部分既难,又太深层了,即使像better AI那样的mod也不会涉及于此。
我只是推测那些涉及dirty的最终要牵扯到图像刷新,即和这几个有关
getEngineIFace()->isDirty(EngineDirtyBit eBit)
getEngineIFace()->SetDirty(EngineDirtyBit eBit, BOOL bNewValue)
getInterfaceIFace()->isDirty(InterfaceDirtyBit eDirty)
getInterfaceIFace()->setDirty(InterfaceDirtyBit eDirty, BOOL bDirty)

CyEngine和CyInterface又都不在SDK中,要研究只有靠反向工程了,这个的难度就太大了。
发表于 2008-10-22 21:59:12 | 显示全部楼层

回复 #45 Khyron 的帖子

看来是牵涉到引擎的问题了
那么就pass吧
 楼主| 发表于 2008-11-15 15:56:45 | 显示全部楼层

传教士传教成功率计算公式(BTS3.17)

当传教士试图向一座城市传播宗教时,成功的概率为:
成功概率 = (基础传播率 + floor((游戏中宗教总数量 - 城市现有宗教数量) * (100 - 基础传播率) / 游戏中宗教总数量)) / 100

传教士的基础传播率由CIV4UnitInfos.xml<iReligionSpread>词条定义,都是40
如果这个城市不属于此传教士所属组队,基础传播率还要折半,即对于其它组队城市,基础传播率等于20

对于本组队,公式可化为:
成功概率 = (40 + floor((7 - 城市现有宗教数量) * 60 / 7)) / 100

对于其它组队,公式为:
成功概率 = (20 + floor((7 - 城市现有宗教数量) * 80 / 7)) / 100

注1:由此可见,当你试图向外国传教时,把传教士赠送给对方,效果可能更好。

附录:城市现有宗教数量与传教成功率换算表
城市现有宗教数量 0 1 2 3 4 5 6
组队内成功率 100% 91% 82% 74% 65% 57% 48%
组队外成功率 100% 88% 77% 65% 54% 42% 31%


注2:公司扩张成功率的计算方法与传教士传教成功率的完全相同,再加上公司总数量也是7,所以上表对公司也成立。
  1. bool CvUnit::spread(ReligionTypes eReligion)
  2. {
  3.                 ………………
  4.                 iSpreadProb = m_pUnitInfo->getReligionSpreads(eReligion);
  5.                 if (pCity->getTeam() != getTeam())
  6.                 {
  7.                         iSpreadProb /= 2;
  8.                 }
  9.                 bool bSuccess;
  10.                 iSpreadProb += (((GC.getNumReligionInfos() - pCity->getReligionCount()) * (100 - iSpreadProb)) / GC.getNumReligionInfos());
  11.                 if (GC.getGameINLINE().getSorenRandNum(100, "Unit Spread Religion") < iSpreadProb)
  12.                 {
  13.                         pCity->setHasReligion(eReligion, true, true, false);
  14.                         bSuccess = true;
  15.                 }
  16.                 ………………
  17. }
复制代码
T
发表于 2008-12-2 09:00:59 | 显示全部楼层
强悍数据男,LZ是我们的希望、我们的明灯、我们的未来
 楼主| 发表于 2009-3-29 22:09:28 | 显示全部楼层

士兵数量计算公式(BTS3.17)

在INFO SCREEN(F9)中DEMOGRAPHICS下有一项关于Soldiers的统计,现简述其计算公式

对于一个玩家(player), 这项统计数字等于其军事力量(Power)乘以1000,而其
军事力量 = 建筑力量 + 科技力量 + 单位力量 + 人口力量

建筑/科技/单位力量 = 此玩家拥有的所有建筑/科技/单位的力量之和
人口力量 = floor(此玩家总人口 / 2)

例子:
神级难度下,中国初始科技为农业和开矿,有一武士,此时军事力量等于
0+2+2 = 4
所以这时士兵数量是4000。
假设我们建城,此时人口为1,人口力量=floor(1/2)=0,士兵数量还是4000,如果过了若干回合,人口涨到了2,其它什么都没变,兵力为5000, 若还建成了兵营,则为8000。

注:
文明4中,军事力量是一项非常重要的统计,电脑AI会反复使用这个数据,如论是战争计划的制订,还是外交谈判中筹码的平衡,你都会见到它的身影。另外所有玩家的军事力量的数值对电脑是公开,不受战争迷雾的影响。
组队的军事力量分2类:一个等于所属玩家军事力量之和;另一个还要加上附庸国的军事力量。
对于组队还有一个很重要的军事力量统计,即军事防御力量,它等于组队本身的军事力量,共同防御同盟的军事力量,还有附庸的军事力量之和,和战争相关的AI,有时用的是这个军事防御力量值。


附录:建筑/科技/单位力量简单统计(已忽略那些力量值为0的建筑/科技/单位)

Building
1
VIKING_TRADING_POST, JAPANESE_SHALE_PLANT, NATIVE_AMERICA_TOTEM
2
WALLS, CASTLE, STABLE, DRYDOCK, FORGE, MALI_MINT, FACTORY, GERMAN_ASSEMBLY_PLANT, INDUSTRIAL_PARK, LEVEE, NETHERLANDS_DIKE
3
CELTIC_DUN, SPANISH_CITADEL, BARRACKS, ZULU_IKHANDA
4
MONGOL_GER, IRON_WORKS, MT_RUSHMORE, RED_CROSS, STATUE_OF_ZEUS
6
MILITARY_ACADEMY
8
HEROIC_EPIC, WEST_POINT, SCOTLAND_YARD, CHICHEN_ITZA
10
GREAT_WALL, CRISTO_REDENTOR, MOAI_STATUES


Tech
2
SAILING, HUNTING, MINING, ANIMAL_HUSBANDRY
4
THE_WHEEL, ALPHABET, ASTRONOMY, METAL_CASTING, COMPASS, CONSTRUCTION, STEEL, RADIO, SATELLITES
5
COMPOSITES, STEALTH
6
MATHEMATICS, CHEMISTRY, COMBUSTION, ARCHERY
8
GUILDS, FISSION, FLIGHT, BRONZE_WORKING, MACHINERY, ASSEMBLY_LINE
10
ADVANCED_FLIGHT, HORSEBACK_RIDING, IRON_WORKING, ARTILLERY, INDUSTRIALISM, LASER, ROCKETRY
12
GUNPOWDER, MILITARY_SCIENCE, RIFLING


Unit
1
LION, BEAR, PANTHER, WOLF
2
EXPLORER, WARRIOR, INCAN_QUECHUA, GALLEY
3
ARCHER, TRIREME, CARAVEL, PORTUGAL_CARRACK
4
SPEARMAN, ZULU_IMPI, MAYA_HOLKAN, MALI_SKIRMISHER, BABYLON_BOWMAN, CHARIOT, EGYPT_WARCHARIOT, PERSIA_IMMORTAL, GALLEON, AIRSHIP
5
CATAPULT, KOREAN_HWACHA
6
SWORDSMAN, AZTEC_JAGUAR, CELTIC_GALLIC_WARRIOR, AXEMAN, GREEK_PHALANX, SUMERIAN_VULTURE, NATIVE_AMERICA_DOG_SOLDIER, PIKEMAN, HOLY_ROMAN_LANDSKNECHT, LONGBOWMAN, HORSE_ARCHER, CARTHAGE_NUMIDIAN_CAVALRY, MONGOL_KESHIK, NETHERLANDS_OOSTINDIEVAARDER, PRIVATEER, GUIDED_MISSILE
7
CROSSBOWMAN, CHINA_CHOKONU
8
ROME_PRAETORIAN, WAR_ELEPHANT, KHMER_BALLISTA_ELEPHANT, TREBUCHET, FRIGATE
9
MACEMAN, JAPAN_SAMURAI, MUSKETMAN, FRENCH_MUSKETEER, OTTOMAN_JANISSARY, ETHIOPIAN_OROMO_WARRIOR
10
VIKING_BESERKER, KNIGHT, ARABIA_CAMELARCHER, SHIP_OF_THE_LINE
12
GRENADIER, BYZANTINE_CATAPHRACT, SPANISH_CONQUISTADOR, CUIRASSIER, CANNON, IRONCLAD, FIGHTER
14
RIFLEMAN, ENGLISH_REDCOAT, AT_INFANTRY, MACHINE_GUN, MISSILE_CRUISER
15
CAVALRY, RUSSIA_COSSACK
16
TRANSPORT, CARRIER, BOMBER
18
SAM_INFANTRY, ARTILLERY
20
INFANTRY, STEALTH_BOMBER
22
MOBILE_SAM
24
JET_FIGHTER
26
GUNSHIP, MOBILE_ARTILLERY
28
MARINE, AMERICAN_NAVY_SEAL, SUBMARINE
30
PARATROOPER, TANK, GERMAN_PANZER, DESTROYER, STEALTH_DESTROYER, ATTACK_SUBMARINE, TACTICAL_NUKE
32
MECHANIZED_INFANTRY
40
MODERN_ARMOR, BATTLESHIP, ICBM


看了这个统计,发现摩艾石像群好强,值10000雄兵。日本武士被鄙视了,只和普通的钉锤手一样,比维金的狂战士低一档。

[ 本帖最后由 Khyron 于 2009-4-1 20:33 编辑 ]
发表于 2009-3-29 22:25:01 | 显示全部楼层
是啊,长城和石像居然都有10000,而且这两个本身也不错,造这两个对于防守打法很有用
发表于 2009-4-25 22:33:55 | 显示全部楼层
lz此贴很强大,佩服佩服
发表于 2009-4-26 20:37:00 | 显示全部楼层

回复 #49 Khyron 的帖子

默哀石像也能提高军事评价!
 楼主| 发表于 2009-5-15 02:07:15 | 显示全部楼层

简单分析AI科技研究路线的选择(BTS3.17)

文明4中一个AI玩家是通过CvPlayerAI::AI_chooseResearch这个方法来选择当前所研究的科技, 而AI_chooseResearch在绝大多数情形下是通过CvPlayerAI::AI_bestTech来得出研究目标的. 本文就集中介绍AI_bestTech.

以下讨论中, 若主语省略, 省略的均是此AI玩家

为了便于讨论, 先给出以下名词的解释
有可能研究: canEverResearch
非模组游戏下所有的科技都有可能研究

首都孤立: AI_isCapitalAreaAlone() == true
指首都所在大陆没有组队以外的非野蛮人城市.

财政困难: AI_isFinancialTrouble() == true
指财政净余百分比低于一安全线, 普通情况下安全线是40%, 如果有战争计划则是28%.

潜在的外国通商城市:
一个城市不属于本组队,且能通商,即已经开边或全世界自由通商,则是一个潜在的外国通商城市.

统治百分比:
大致等于 100 * 本组队相对世界的人口比例 / (世界第2人口大国所占人口比例 + 统治胜利所需领先人口百分比)
如果统治胜利未开启, 则等于0.

科技搜索深度: 也称科技距离
简单的讲, 等于你要获得此科技所需要研究的科技的数量的最小值.

AI_bestTech执行中, 此AI将遍历所有科技, 对于每一科技,如果
a. 未拥有;
b. 有可能研究;
c. 此科技的时代数 <= 此AI的时代数+1;
d. 科技距离小于等于3

将成为候选科技.
然后AI将比较所有候选科技的研究价值, 最大的将成为其当前研究目标.

注: 如果AI在执行'文化3'策略, 搜索深度将只有1.

[ 本帖最后由 Khyron 于 2009-5-15 15:41 编辑 ]
 楼主| 发表于 2009-5-15 02:08:51 | 显示全部楼层

科技的AI研究价值计算方法(3.17)

对于一科技, AI眼中, 其研究价值V初始为1, 然后还要

+ [0,2000)中一随机数
+ 所属组队在此科技上积累的进度,即瓶子数

如果此科技有效果: 增加水面视野
    如果有滨海城市
        + 100;
    如果首都孤立
        + 400;

如果此科技有效果: 使地图居中
    + 100;

如果此科技有效果: 显示地图
    + 100;
    如果首都孤立
        + 400;

如果此科技有效果: 开启地图交易
    + 100;
    如果首都孤立
        + 400;

如果此科技有效果: 开启科技交易; 且游戏没有禁止科技交易
    + 500;
    + 500 * 已相遇的组队数量;

如果此科技有效果: 开启金钱交易
    + 200;
    如果遇到过其它组队
        + 400;

如果此科技有效果: 开启边境交易
    如果遇到过其它组队
        + 500;
        如果有滨海城市
            + 400;

如果此科技有效果: 开启共同防御交易
    + 400;

如果此科技有效果: 开启永久同盟交易
    + 200;

如果此科技有效果: 开启附庸交易   
    + 200;

如果此科技有效果: 造桥   
    + 200;

如果此科技有效果: 灌溉   
    + 400;

如果此科技有效果: 无需灌溉即可种田   
    + 500;

如果此科技有效果: 开启水面工作
    + 600 * 滨海城市数量;

+ 此科技对地貌生产修正系数 * 2 (例如,数学由于对砍树的加成有50%, + 50*2)
+ 此科技对工人工作速度修正系数 * 4
+ 此科技增加商路数量 * max(城市数量 + 2, 潜在的外国通商城市数量) * 100(如果有财政困难则乘以200)


如果统治百分比小于90
    + 此科技带来的额外健康 * 200;
否则
    + 此科技带来的额外健康 * 350;

遍历所有道路(Route)类型,对每一种道路
    - 此科技对这种道路的移动修正 * 100; (例如: 工程学的普通道路的修正是-10)

遍历所有领域(Domain)类型,对每一种领域
    + 此科技对此领域产生的额外移动力 * 200;

遍历所有商业(Commerce)类型,对每一种商业 (指科技,金钱,文化,谍报)
    如果此科技有效果: 能够条件此类型商业的百分比
        + 100;
        如果这种商业是文化, 且在执行'文化2'策略
            + 1000;

遍历所有地形(Terrain)类型,对每一种地形
    如果此科技有效果: 开启这种地形下的商路连接 (例如: 天文对海洋)
        如果这种地形是水域
            如果有首都
                + 潜在的的异大陆的外国通商城市数量 * 100;
            如果有滨海城市
                + 350(如果首都孤立则+950);
            + 50;
        否则
            + 1000;

如果此科技有效果: 开启河流商路连接
    + 1000;

遍历所有设施(Improvement)类型,对每一种设施J
    遍历所有产出(Yield), 对每一种产出K
        + 此科技对设施J的产出K的改变值 * 拥有的设施J的数量 * 50 * 此玩家AI对产出K的权重 / 100;

遍历所有工人建造(Build)类型, 对每一种工作类型
    + 工人建造数值;

遍历所有地貌(Feature)类型,对每一种地貌
    如果科技有效果: 移除此地貌
        + 100;
        如果此地貌总体作用是负面的
            + 25 * 城市范围内的此种地貌数量;

遍历所有资源(Bonus)类型,对每一种资源
    如果此科技有效果: 揭示这种资源
        + 150 * (100 + 某系数 * min(3, 城市数量) / 3) / 100;

遍历所有单位级别(UnitClass)类型,对每一种单位级别
    如果本文明对应于此单位级别的单位存在
        如果此科技是这个单位的前提科技
            + 单位价值; (此价值基础值为200, 如果单位是UU, 则再加600, 其它加成的详细计算方法略, 总之单位价值可以很高,有时可达数千)

如果此科技是未完成的世界单位的前提科技, 且搜索深度小于等于1, 总人口大于5
    + [0,400)中一随机数;
    如果首都孤立
        + 200;

遍历所有建筑级别(BuildingClass)类型,对每一种建筑级别
    如果本文明对应于此建筑级别的建筑存在
        如果此科技是这个建筑的前提科技
            + 建筑价值; (此价值基础值为100, 如果建筑是UB, 则再加600, 粮仓有额外加成, 其它加成的详细计算方法略)

如果在上述遍历中至少有一个建筑, 满足此科技是这个建筑的前提科技
    + 上述建筑价值中的最大的;
   
如果此科技是某能产生文化的建筑的前提科技, 且当前能建造的产生文化的非奇迹建筑数量小于2
    如果城市不能自动产生文化
        如果城市数量大于1
            + 150 * max(1, 3 - 2 * 当前能建造的产生文化的非奇迹建筑数量) * (城市数量 - 1);

如果此科技是某个未完成的奇迹的前提科技
    + 500;
    + [0, 800)中一随机数 / 1 (除以5, 如果处于高级开局为完成中);

遍历所有工程(Project)类型,对每一种工程
    如果此科技是这个工程的前提科技

如果此科技是未完成的世界工程的前提科技, 且搜索深度小于等于1, 总人口大于5
    + 200 + [0, 200)中一随机数;
    如果首都孤立
        + 100;

遍历所有产能转化(Process)类型,对每一种产能转化  (例如: 造瓶子,造金币)
    如果此科技是这种产能转化的前提科技
        + 100;
        + 产能转化系数 * 4 * 此玩家AI对相应转化产出的权重 / 100 * 1(如果在执行'文化1'策略, 且产出是文化时乘以3);
        

如果有财政困难, 且此科技是科技或金钱产能转化的前提科技
    如果当前既不能将产能转化科技也不能转化为金钱
        + 1500;

遍历所有内政法令(Civic)类型,对每一种内政法令
    如果此科技是这种内政法令的前提科技
        + 200;
        如果AI对这种内政法令的价值判断大于当前使用的内政法令的价值大
            + min(2400, 2400 * (这种内政法令的价值 - 当前使用的内政法令的价值) / max(1, 当前使用的内政法令的价值));
        如果这种内政法令是领袖对应的性格的最爱
            + 600;

如果搜索深度小于等于2
    如果此科技还未被发现
        如果此科技是某未创立的宗教的前提科技
            + 宗教价值; (详细计算方法略)
   
        遍历所有公司(Corporation)类型,对每一种公司
            如果此科技是这一公司的前提科技
                如果这个公司还未创立
                    + 100 + [0, 2400)中的一个随机数;
        
        如果此科技首发赠送单位级别存在
            如果本文明对应于这个单位级别的单位存在
                + 200 + [0, 3200)中一随机数;
                如果首都孤立
                    + 400;

        如果此科技首发赠送科技
            + 200 + [0, 3200)中一随机数
            如果首都孤立
                + 400;

+ 此科技的AI权重 (非模组游戏下全为0);

如果不是人类玩家
    遍历所有偏好(Flavor)类型, 对每一种偏好
        + 领袖对此偏好的程度 * 此科技对此偏好的数值 * 20;


到目前为止, 计算的全是此科技研究价值的基础值,以下将处理修正乘子.

如果此科技可以重复研究
    V = V / 10;

如果此科技的研究价值大于0
    先计算研究剩余回合数, 调节系数
    百倍研究剩余回合数大约等于完成此科技所需回合数(保留小数点后2位)乘以100
    调节系数等于对应于当前游戏速度下的研究百分比,标准速度下是100, 马拉松下是300
   
    然后从[0,5)中选取一随机数
    如果这个随机数等于0,并且百倍研究剩余回合数 < 2 * 调节系数
        V = V * 100000 / (百倍研究剩余回合数 + 1);
    否则
        V = V * 100000 / (百倍研究剩余回合数 + 5 * 调节系数);

如果游戏没有禁止科技交易
    如果此科技开启科技交易, 或者所属组队可以进行科技交易
        然后从[0,100)中选取一随机数, 如果这个随机数 < 10 (如果开启了禁止科技倒卖,则是20)
            如果对于所有已相遇的组队, 都未掌握此科技
                如果已相遇的组队数量大于2
                    V = V * (100 + min(150, 25 * (已相遇的组队 - 2))) / 100;

如果AI在执行'文化3'策略
    V = V * (此科技的文化胜利价值 + 10) / 100 (如果此科技的文化胜利价值 < 100, 则处于400);

最后
V = max(1,V)
即此科技相对于这个AI玩家的研究价值.

[ 本帖最后由 Khyron 于 2009-5-15 15:42 编辑 ]
发表于 2009-5-15 06:56:04 | 显示全部楼层
貌似不同AI也就是在UU UB和喜爱政体方面有所不同啊‘
发表于 2009-5-15 07:15:05 | 显示全部楼层

回复 #55 孟仲玄 的帖子

还有初始科技,然后很快就有人出宗教了,这样子大家就基本上各走各的路了吧?我拍脑袋瞎猜的。
 楼主| 发表于 2009-6-3 05:27:56 | 显示全部楼层

附带伤害(collateral damage)打击目标的选择机制(BTS3.17)

游戏中某些单位, 例如轰炸机, 压制单位, 进攻时能够给予与防守者同处一格的某些其它单位造成附带伤害, 哪些单位会被群伤杀伤呢? 本文将简单解释这一选择机制.

假设当一个单位发起进攻, 若其能造成附带伤害, 承受附带伤害的候选目标们是那些与防守单位同处一格的敌对, 非隐形, 且能防御的单位, 不包括防守者.
注: "能防御""能享受防御加成"不是一个概念, 在标准游戏中, "能防御"基本等同于"能战斗", 即基础战斗力量(Combat Strength)大于0.
注: 若一个单位处于装载状态, 比如在船上, 将被视为隐形.
注: 若进攻单位是空军, 则防守单位为空.

游戏将按以下方法决定附带伤害的打击目标.

首先, 游戏要计算附带伤害打击目标的数量(iPossibleTargets), 这个数量等于以下二者中的较小的那个
a. 附带伤害杀伤单位数量上限
b. 所有候选单位的数量

注: 一个单位其附带伤害杀伤单位数量上限, 由Civ4UnitInfos.xml<iCollateralDamageMaxUnits>词条决定, 具体统计见附录.

然后,对每一个候选打击目标单位都产生一数值V, 姑且称之为附带伤害价值, V的计算公式为:
V = [0, 10000)中的一随机整数 * 此候选单位的当前生命值

最后, 所有候选者按上述附带伤害价值排序, 从大到小, 前N(=iPossibleTargets)个将成为不幸儿, 遭受附带伤害的打击.

就这N个中标者, 并不意味着它们都将受到伤害, 在以下2种情况下, 中标者不会受伤:
a. 对进攻方的单位类型的附带伤害免疫, 例如压制武器对压制武器的附带伤害免疫
b. 已损失的生命值大于等于进攻单位的附带伤害杀伤上限
而剩余的真正受到附带伤害杀伤的单位的数量, 则是战斗记录(Combat Log)中显示的群伤单位进攻时附带伤害杀伤的单位的数量, 这就是战斗记录中的那个数值飘忽不定的原因.

从以上讨论, 我们能得出一个有趣的推论:
压制武器可以帮助其它单位抵御来源于压制武器的附带伤害.

AI攻城时, 如果我们在城中布署压制武器, 那么敌人压制武器的附带伤害造成真正伤害, 即打击到我们的非压制武器的概率将降低. 由于附带伤害价值与单位的当前生命值正相关, 一般来说, AI的压制武器总先上, 这一阶段我们的压制武器不会成为防御者, 应是满血的, 所以随着其它非压制武器遭受的附带伤害杀伤的增多, 敌人的附带伤害打到压制武器从而无效的可能性会越来越大.
当敌人大军带着大量压制武器兵临城下时, 如果无力反击, 也许适当造些压制武器, 可能效果更好.


附录:
附带伤害(迂回攻击)杀伤单位数量上限
iCollateralDamageMaxUnits Type
5 UNIT_CHINA_CHOKONU, UNIT_TANK, UNIT_GERMAN_PANZER, UNIT_BATTLESHIP, UNIT_MISSILE_CRUISER, UNIT_BOMBER
6 UNIT_HORSE_ARCHER, UNIT_CARTHAGE_NUMIDIAN_CAVALRY, UNIT_MONGOL_KESHIK, UNIT_KNIGHT, UNIT_ARABIA_CAMELARCHER, UNIT_BYZANTINE_CATAPHRACT, UNIT_SPANISH_CONQUISTADOR, UNIT_CUIRASSIER, UNIT_MODERN_ARMOR, UNIT_CATAPULT, UNIT_KOREAN_HWACHA, UNIT_TREBUCHET, UNIT_STEALTH_BOMBER
7 UNIT_CAVALRY, UNIT_RUSSIA_COSSACK, UNIT_CANNON
8 UNIT_GUNSHIP, UNIT_ARTILLERY, UNIT_MOBILE_ARTILLERY

不在此表的单位, 此项数值均为0.

[ 本帖最后由 Khyron 于 2009-6-3 17:45 编辑 ]
 楼主| 发表于 2009-6-3 05:29:13 | 显示全部楼层

附带伤害(collateral damage)打击目标的选择机制(BTS3.17)


  1. void CvUnit::collateralCombat(const CvPlot* pPlot, CvUnit* pSkipUnit)
  2. {
  3.         .........
  4.         iCollateralStrength = ((((getDomainType() == DOMAIN_AIR) ? airBaseCombatStr() : baseCombatStr()) * collateralDamage()) / 100);

  5.         if (iCollateralStrength == 0)
  6.         {
  7.                 return;
  8.         }

  9.         iPossibleTargets = std::min((pPlot->getNumVisibleEnemyDefenders(this) - 1), collateralDamageMaxUnits());

  10.         pUnitNode = pPlot->headUnitNode();

  11.         while (pUnitNode != NULL)
  12.         {
  13.                 pLoopUnit = ::getUnit(pUnitNode->m_data);
  14.                 pUnitNode = pPlot->nextUnitNode(pUnitNode);

  15.                 if (pLoopUnit != pSkipUnit)
  16.                 {
  17.                         if (isEnemy(pLoopUnit->getTeam(), pPlot))
  18.                         {
  19.                                 if (!(pLoopUnit->isInvisible(getTeam(), false)))
  20.                                 {
  21.                                         if (pLoopUnit->canDefend())
  22.                                         {
  23.                                                 iValue = (1 + GC.getGameINLINE().getSorenRandNum(10000, "Collateral Damage"));

  24.                                                 iValue *= pLoopUnit->currHitPoints();

  25.                                                 mapUnitDamage[pLoopUnit] = iValue;
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }
  30.         }

  31.         CvCity* pCity = NULL;
  32.         if (getDomainType() == DOMAIN_AIR)
  33.         {
  34.                 pCity = pPlot->getPlotCity();
  35.         }

  36.         iDamageCount = 0;
  37.         iCount = 0;

  38.         while (iCount < iPossibleTargets)
  39.         {
  40.                 iBestValue = 0;
  41.                 pBestUnit = NULL;

  42.                 for (it = mapUnitDamage.begin(); it != mapUnitDamage.end(); it++)
  43.                 {
  44.                         if (it->second > iBestValue)
  45.                         {
  46.                                 iBestValue = it->second;
  47.                                 pBestUnit = it->first;
  48.                         }
  49.                 }

  50.                 if (pBestUnit != NULL)
  51.                 {
  52.                         mapUnitDamage.erase(pBestUnit);

  53.                         if (NO_UNITCOMBAT == getUnitCombatType() || !pBestUnit->getUnitInfo().getUnitCombatCollateralImmune(getUnitCombatType()))
  54.                         {
  55.                                 iTheirStrength = pBestUnit->baseCombatStr();

  56.                                 iStrengthFactor = ((iCollateralStrength + iTheirStrength + 1) / 2);

  57.                                 iCollateralDamage = (GC.getDefineINT("COLLATERAL_COMBAT_DAMAGE") * (iCollateralStrength + iStrengthFactor)) / (iTheirStrength + iStrengthFactor);

  58.                                 int iModifier = 100;
  59.                                 iModifier += getExtraCollateralDamage();
  60.                                 iModifier -= pBestUnit->getCollateralDamageProtection();
  61.                                 if (pCity != NULL)
  62.                                 {
  63.                                         iModifier += pCity->getAirModifier();
  64.                                 }
  65.                                 iCollateralDamage *= iModifier;
  66.                                 iCollateralDamage /= 100;

  67.                                 iCollateralDamage = std::max(0, iCollateralDamage);

  68.                                 int iMaxDamage = std::min(collateralDamageLimit(), (collateralDamageLimit() * (iCollateralStrength + iStrengthFactor)) / (iTheirStrength + iStrengthFactor));
  69.                                 iUnitDamage = std::max(pBestUnit->getDamage(), std::min(pBestUnit->getDamage() + iCollateralDamage, iMaxDamage));

  70.                                 if (pBestUnit->getDamage() != iUnitDamage)
  71.                                 {
  72.                                         pBestUnit->setDamage(iUnitDamage, getOwnerINLINE());
  73.                                         iDamageCount++;
  74.                                 }
  75.                         }

  76.                         iCount++;
  77.                 }
  78.                 else
  79.                 {
  80.                         break;
  81.                 }
  82.         }
  83.         .........
  84. }
复制代码

T

[ 本帖最后由 Khyron 于 2009-6-3 05:35 编辑 ]
发表于 2009-6-3 08:58:40 | 显示全部楼层
但个人经验,守在城里的骑兵(不能防守)还是会受到群伤的吧
发表于 2009-6-3 09:08:37 | 显示全部楼层
原帖由 孟仲玄 于 2009-6-3 08:58 发表
但个人经验,守在城里的骑兵(不能防守)还是会受到群伤的吧


是的,守城骑会受群伤
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 03:29

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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