一个悲惨的消息,因为当时编写圣典,没有测试清楚,现在已经坑害他人两年。注:被坑人数=0 。 坑人的教程为12-6神话时代科技条件中判断单位数量的前置条件写错,gte解释成了等于,实测为大于等于,现已修复网页版,至于软件,懒得管了 其实我今天是来解决判断单位数量BUG的,然后无意中发现gte写错了,顺带测试了lte、eq与neq,最终测试结果如下: <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="lt"/>当单位A数量<X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="lte"/>当单位A数量<=X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="gte"/>当单位A数量>=X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="gt"/>当单位A数量>X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="eq"/>当单位A数量=X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="neq"/>当单位A数量=X时开启本科技,备注:经过实际测试,neq在帝国3里面的确为等于,而不是不等于。 错误版本与正确版本对比: 原教程
解决判断单位数量前置科技BUG方法
解决判断单位数量前置科技BUG方法
已修复的网页版
解决判断单位数量前置科技BUG方法
解决判断单位数量前置科技BUG方法
回到正题,判断单位数量的BUG在圣典已经解释过,自己训练的单位要改良任意一个科技或建造支持人口的建筑才能刷新显示科技,而旗军、剧情编辑器放置的单位不受影响(tactics生产的单位未测,估计spawn不受影响,而Maintain会受影响,tactics只是估计,没有经过实测,请勿当真)。下面来构思解决方法,大概有以下两种种 1.无限研究科技 2.无限利用tactics生成人口数量单位 第1种方法已经实现了 初步构思为 科技A禁用科技A并启用科技B,科技B启用科技A并禁用科技B,两个科技均为0秒科技会自动研发; <Tech name="LoopTech1" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Icon>ui\units\ironclad_icon</Icon> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech1</Effect> <Effect type ='TechStatus' status ='obtainable'>LoopTech2</Effect> <Effect type ='TextOutput'>00028</Effect> <Effect type ="TextOutputAll">00028</Effect> </Effects> </Tech> <Tech name="LoopTech2" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Icon>ui\units\ironclad_icon</Icon> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech2</Effect> <Effect type ='TechStatus' status ='obtainable'>LoopTech1</Effect> <Effect type ='TextOutput'>00029</Effect> <Effect type ="TextOutputAll">00029</Effect> </Effects> </Tech>
TextOutput是用来输出stringtabley文字的,方便查看结果 <String _locID="00028">Loop Tech1.</String> <String _locID="00029">Loop Tech2.</String>
实测结果,只运行了6次,停止运行,失败告终。得出结论为0秒科技也是有限制的,同一科技自动研发不会超过3次(至于这个结论是否正确,请自行研究)。 后面我想到了有一个<Flag>Volatile</Flag>会自动改良科技,然后给两个科技都添加上就成功了 <Tech name="LoopTech1" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Icon>ui\units\ironclad_icon</Icon> <Flag>Volatile</Flag> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech1</Effect> <Effect type ='TechStatus' status ='obtainable'>LoopTech2</Effect> <Effect type ='TextOutput'>00028</Effect> <Effect type ="TextOutputAll">00028</Effect> </Effects> </Tech> <Tech name="LoopTech2" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Icon>ui\units\ironclad_icon</Icon> <Flag>YPInfiniteTech</Flag> <Flag>Volatile</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech2</Effect> <Effect type ='TechStatus' status ='obtainable'>LoopTech1</Effect> <Effect type ='TextOutput'>00029</Effect> <Effect type ="TextOutputAll">00029</Effect> </Effects> </Tech>
实测结果:
解决判断单位数量前置科技BUG方法
上面的两个可能有点消耗内存,我又把科技改成了一个科技,自己禁用自己,再启用自己 <Tech name="LoopTech" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Icon>ui\units\ironclad_icon</Icon> <Flag>Volatile</Flag> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech</Effect> <Effect type ='TechStatus' status ='obtainable'>LoopTech</Effect> <Effect type ='TextOutput'>00028</Effect> <Effect type ="TextOutputAll">00028</Effect> </Effects> </Tech> 实测结果:16分钟研究48万次?有点怕低配置电脑不能运行起来
解决判断单位数量前置科技BUG方法
然后又过了5个小时,又发现<Flag>Volatile</Flag>的一个特性,如果使用<Effect type ='TechStatus' status ='unobtainable'>xxxx</Effect>对带<Flag>Volatile</Flag>的科技使用后,那么并不会关闭科技,而是重新激活一次,如果使用<Effect type ='TechStatus' status ='obtainable'>xxxx</Effect>则只能在未启用状态下(<Status>OBTAINABLE</Status>)激活一次,自动改良后无法再次激活。也就是说,上面的思路虽然没错,但也只是误打误撞成功让<Flag>Volatile</Flag>自动改良而已。 至于为什么用两个科技比一个科技卡顿也解释的通了,因为两个科技在无限运行。。。 那么重新整理一下最终语句 <Tech name="LoopTech" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Flag>Volatile</Flag> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech</Effect> </Effects> </Tech> 将上面语句粘贴进入techtreey后,开局就会无限研发LoopTech,能达到刷新科技显示目的,这样就能使用下面5个前置科技条件判断了。
<typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="lt"/>当单位A数量<X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="lte"/>当单位A数量<=X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="gte"/>当单位A数量>=X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="gt"/>当单位A数量>X时开启本科技 <typecount unit="A" count="X.00" state="noneState aliveState buildingState" operator="eq"/>当单位A数量=X时开启本科技
以下为测试结果 techtreey.xml <Tech name="LoopTech" type="Normal"> <DBID>5290</DBID> <ResearchPoints>0.0000</ResearchPoints> <Status>OBTAINABLE</Status> <Flag>Volatile</Flag> <Flag>YPInfiniteTech</Flag> <Effects> <Effect type ='TechStatus' status ='unobtainable'>LoopTech</Effect> </Effects> </Tech> <Tech name ='TypecountTech0' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00033</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06002</RolloverTextID> <Icon>icon\flagtest\lt_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="lt"/> </Prereqs> <Effects> </Effects> </Tech> <Tech name ='TypecountTech1' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00034</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06002</RolloverTextID> <Icon>icon\flagtest\lte_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="lte"/> </Prereqs> <Effects> </Effects> </Tech> <Tech name ='TypecountTech2' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00035</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06004</RolloverTextID> <Icon>icon\flagtest\gte_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="gte"/> </Prereqs> <Effects> </Effects> </Tech> <Tech name ='TypecountTech3' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00036</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06004</RolloverTextID> <Icon>icon\flagtest\gt_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="gt"/> </Prereqs> <Effects> </Effects> </Tech> <Tech name ='TypecountTech4' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00037</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06004</RolloverTextID> <Icon>icon\flagtest\eq_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="eq"/> </Prereqs> <Effects> </Effects> </Tech> <Tech name ='TypecountTech5' type ='Normal'> <DBID>5271</DBID> <DisplayNameID>00038</DisplayNameID> <Status>OBTAINABLE</Status> <RolloverTextID>06004</RolloverTextID> <Icon>icon\flagtest\neq_icon</Icon> <Flag>CountsTowardEconomicScore</Flag> <Prereqs> <typecount unit="Musketeer" count="5.00" state="noneState aliveState buildingState" operator="neq"/> </Prereqs> <Effects> </Effects> </Tech>
PS:我每一个科技都是用<Status>OBTAINABLE</Status>,所以每一个国家都会激活该科技,无需用其他语句激活。
protoy.xml <Tech row ='0' page ='2' column ='0'>TypecountTech0</Tech> <Tech row ='0' page ='2' column ='1'>TypecountTech1</Tech> <Tech row ='0' page ='2' column ='2'>TypecountTech2</Tech> <Tech row ='0' page ='2' column ='3'>TypecountTech3</Tech> <Tech row ='0' page ='2' column ='4'>TypecountTech4</Tech> <Tech row ='0' page ='2' column ='5'>TypecountTech5</Tech> 视频:
|