7-5 灵活使用优先级


灵活使用tactics优先级可以弄出较好的效果,例如给城堡添加添加上像城镇中心的攻击,驻守人数越多,攻击越高,但是没人驻守时任然能攻击。
可以这样说,在这个教程出来之前(或者有类似这样的单位被制作出来),95%的人都是想不出可以这样做的。

tactics文件最底部的tactic中的action语句是可以增加优先顺序的,只需要在action后面添加上priority="X",X值越大,优先级越高。


        举个例子:远程单位的齐射攻击分别设定了远距离攻击、近战攻击与攻城攻击的action,远距离攻击的priority值为100,近战攻击的priority值为25,攻城攻击的priority值为75。

        这个齐射攻击设定了三种攻击,那么为什么一般情况下只会远距离射击,而不会使用近战或攻城?
        因为远距离攻击的priority为100是几个设定中最高的,所以这个单位的齐射攻击会优先采用远距离攻击。

        但是为什么攻击建筑不是远距离攻击呢?
        因为远距离攻击的对象只定义了"Unit",只能攻击单位,所以远距离无法攻击建筑物,当需要攻击建筑物的时候,会采用下一个优先等级较高的攻击,(如果不能攻击建筑的话则继续判断),因此单位攻击建筑物的时候会主动切换到攻城动作。

        齐射攻击有时候会自动转换成近战攻击,原因也是与攻城攻击一样的:
        因为远距离射击有最短射击距离2,当距离小于2的时候会才采用攻城攻击,但是攻城攻击不能攻击单位,所以最后采用了可以攻击单位的近战攻击。

        还有一点是如果在齐射模式打船是远距离攻击的,在近战则是攻城攻击的,这是因为船只单位标签有unit,所以远距离攻击能攻击船只;而近战攻击在tactics并没有添加远距离攻击的action,所以只能采用攻城攻击(这句话看不懂的话,我补充一点:攻城攻击的对象是LogicalTypeShipsAndBuildings;VolleyAttack的优先级比BuildingAttack要高。)。



不说那么多了,来直接看例子吧:给城堡添加“当有单位驻守后,额外增加攻击”的功能。
需要用上这几个语句:

		<activeifcontainsunits>1</activeifcontainsunits>

当有单位驻守的时候,才开启攻击

		<damagefactorcap>X</damagefactorcap>
当驻守单位达到X后,停止增加伤害
		<scalebycontainedunits>1</scalebycontainedunits>
驻守一个单位增加一次伤害(单位攻击力),该数值只能为1

如果只是把几个语句加上去的确是可以增加攻击,但是只能在有单位驻守时才能攻击,那么怎样让不驻守单位也能攻击?这时候就要用上优先级了。
首先在城堡的tactics文件复制粘贴一个action,然后改名,再把那三个语句加上去

例如:

	<action>
		<name stringid="38133">ContainRangedAttack</name>
		<type>Attack</type>
		<attackaction>1</attackaction>
		<rangedlogic>1</rangedlogic>
		<anim>RangedAttack</anim>
		<maxheight>0</maxheight>
		<activeifcontainsunits>1</activeifcontainsunits>
		<damagefactorcap>10</damagefactorcap>
		<scalebycontainedunits>1</scalebycontainedunits>
		<accuracy>1.0</accuracy>
		<accuracyreductionfactor>0.01</accuracyreductionfactor>
		<aimbonus>0</aimbonus>
		<maxspread>5</maxspread>
		<spreadfactor>0.25</spreadfactor>
		<trackrating>12</trackrating>
		<unintentionaldamagemultiplier>0.7</unintentionaldamagemultiplier>
		<projectile>InvisibleProjectile</projectile>
		<impacteffect>effects\impacts\gun</impacteffect>
		<rate type="Unit">1.0 </rate>
		<instantballistics>1</instantballistics>
	</action>
		
  castle.tactics - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
<!-- converted from XMB to XML -->

<tactics>
	<action>
		<name stringid="38133">ContainRangedAttack</name>
		<type>Attack</type>
		<attackaction>1</attackaction>
		<rangedlogic>1</rangedlogic>
		<anim>RangedAttack</anim>
		<maxheight>0</maxheight>
		<activeifcontainsunits>1</activeifcontainsunits>
		<damagefactorcap>10</damagefactorcap>
		<scalebycontainedunits>1</scalebycontainedunits>
		<accuracy>1.0</accuracy>
		<accuracyreductionfactor>0.01</accuracyreductionfactor>
		<aimbonus>0</aimbonus>
		<maxspread>5</maxspread>
		<spreadfactor>0.25</spreadfactor>
		<trackrating>12</trackrating>
		<unintentionaldamagemultiplier>0.7</unintentionaldamagemultiplier>
		<projectile>InvisibleProjectile</projectile>
		<impacteffect>effects\impacts\gun</impacteffect>
		<rate type="Unit">1.0 </rate>
		<instantballistics>1</instantballistics>
	</action>
	<action>
		<name stringid="38133">RangedAttack</name>
		<type>Attack</type>
		<attackaction>1</attackaction>
		<rangedlogic>1</rangedlogic>
		<anim>RangedAttack</anim>
		<maxheight>0</maxheight>
		<accuracy>1.0</accuracy>
		<accuracyreductionfactor>0.01</accuracyreductionfactor>
		<aimbonus>0</aimbonus>
		<maxspread>5</maxspread>
		<spreadfactor>0.25</spreadfactor>
		<trackrating>12</trackrating>
		<unintentionaldamagemultiplier>0.7</unintentionaldamagemultiplier>
		<projectile>InvisibleProjectile</projectile>
		<impacteffect>effects\impacts\gun</impacteffect>
		<rate type="Unit">1.0 </rate>
		<instantballistics>1</instantballistics>
	</action>
	<action>
		<name stringid="38119">CannonAttack</name>
		<type>Attack</type>
		<attackaction>1</attackaction>
		<rangedlogic>1</rangedlogic>
		<anim>RangedAttackShip</anim>
		<maxheight>0</maxheight>
		<accuracy>1.0</accuracy>
		<aimbonus>0</aimbonus>
		<maxspread>5</maxspread>
		<spreadfactor>0.25</spreadfactor>
		<trackrating>12</trackrating>
		<unintentionaldamagemultiplier>0.7</unintentionaldamagemultiplier>
		<projectile>Cannonball</projectile>
		<impacteffect>effects\impacts\cannon</impacteffect>
		<rate type="Unit">1.0 </rate>
		<active>0</active>
		<throw>1</throw>
		<outerdamageareadistance>.25</outerdamageareadistance>
		<outerdamageareafactor>.20</outerdamageareafactor>
		<areasortmode>Directional</areasortmode>
		<perfectaccuracy>1</perfectaccuracy>
		<targetground>1</targetground>
		<numberbounces>1</numberbounces>
		<basedamagecap>1</basedamagecap>
	</action>
	<action>
		<name stringid="38121">AntiShipAttack</name>
		<type>Attack</type>
		<attackaction>1</attackaction>
		<rangedlogic>1</rangedlogic>
		<anim>RangedAttackShip</anim>
		<maxheight>0</maxheight>
		<accuracy>1.0</accuracy>
		<aimbonus>0</aimbonus>
		<maxspread>5</maxspread>
		<spreadfactor>0.25</spreadfactor>
		<trackrating>12</trackrating>
		<unintentionaldamagemultiplier>0.7</unintentionaldamagemultiplier>
		<projectile>Cannonball</projectile>
		<impacteffect>effects\impacts\cannon</impacteffect>
		<perfectaccuracy>1</perfectaccuracy>
		<rate type="AbstractWarship">1.0 </rate>
	</action>
	<action>
		<name stringid="69776">SpawnSamurai</name>
		<type>Maintain</type>
		<rate type="ypKensei">1</rate>
		<active>1</active>
		<persistent>0</persistent>
		<singleuse>1</singleuse>
	</action>
	<tactic>
		Normal
		<attacktype>LogicalTypeRangedUnitsAttack</attacktype>
		<autoattacktype>LogicalTypeRangedUnitsAutoAttack</autoattacktype>
		<attackresponsetype>LogicalTypeRangedUnitsAttack</attackresponsetype>
		<action priority="100">AntiShipAttack</action>
		<action priority="75">CannonAttack</action>
		<action priority="50">ContainRangedAttack</action>
		<action priority="25">RangedAttack</action>
		<action>Spawn</action>
	</tactic>
</tactics>

然后在底部的tactic语句把action写上去,priority要比原来的远距攻击设定要高,这样的话城堡会先优先采用有驻守单位的攻击,当没有人驻守在城堡,新添加的攻击会自动关闭,接着根据优先级顺序切换回原本的远距攻击。另外新攻击的priority值要比炮轰攻击的设定要低,才不会把炮轰攻击给覆盖掉。







最后在protoy把新添加远距攻击的攻击力写上去,就完成了,进入游戏看结果吧。

		<ProtoAction>
			<Name>ContainRangedAttack</Name>
			<Damage>30.000000</Damage>
			<DamageType>Ranged</DamageType>
			<MinRange>0.000000</MinRange>
			<MaxRange>24.000000</MaxRange>
			<ROF>3.000000</ROF>
			<DamageBonus type ='AbstractVillager'>0.250000</DamageBonus>
			<DamageBonus type ='AbstractCavalry'>1.500000</DamageBonus>
			<DamageBonus type ='AbstractSiegeTrooper'>0.500000</DamageBonus>
			<DamageBonus type ='AbstractLightInfantry'>1.500000</DamageBonus>
		</ProtoAction>
	
  protoy.xml - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	<Unit id ='1043' name ='ypCastle'>
		<DBID>1560</DBID>
		<DisplayNameID>62979</DisplayNameID>
		<ObstructionRadiusX>4.0000</ObstructionRadiusX>
		<ObstructionRadiusZ>4.0000</ObstructionRadiusZ>
		<MaxVelocity>0.0000</MaxVelocity>
		<MaxRunVelocity>0.0000</MaxRunVelocity>
		<MovementType>land</MovementType>
		<AnimFile>buildings\asian_civs\castle\castle.xml</AnimFile>
		<DeadReplacement>BuildingRubble4x4</DeadReplacement>
		<DeadReplacementLifespan>15</DeadReplacementLifespan>
		<ImpactType>Wood</ImpactType>
		<PhysicsInfo>blockhouse</PhysicsInfo>
		<PlacementFile>buildingsmall.xml</PlacementFile>
		<Icon>buildings\asian_civs\castle\China\chinese_castle_icon</Icon>
		<PortraitIcon>buildings\asian_civs\castle\China\chinese_castle_icon_portrait</PortraitIcon>
		<RolloverTextID>62978</RolloverTextID>
		<ShortRolloverTextID>62977</ShortRolloverTextID>
		<InitialHitpoints>3000.0000</InitialHitpoints>
		<MaxHitpoints>3000.0000</MaxHitpoints>
		<LOS>32.0000</LOS>
		<ProjectileProtoUnit>Arrow</ProjectileProtoUnit>
		<UnitAIType>RangedCombative</UnitAIType>
		<BuildPoints>60.0000</BuildPoints>
		<BuildLimit>5</BuildLimit>
		<Bounty>140.0000</Bounty>
		<BuildBounty>70.0000</BuildBounty>
		<Cost resourcetype ='Wood'>250.0000</Cost>
		<Cost resourcetype ='Gold'>100.0000</Cost>
		<BuildingWorkRate>1.0000</BuildingWorkRate>
		<MaxContained>20</MaxContained>
		<AllowedAge>0</AllowedAge>
		<Armor type ='Siege' value ='0.0000'></Armor>
		<BuilderLimit>4</BuilderLimit>
		<UnitType>LogicalTypeValidSabotage</UnitType>
		<UnitType>LogicalTypeHandUnitsAutoAttack</UnitType>
		<UnitType>LogicalTypeBuildingsNotWalls</UnitType>
		<UnitType>LogicalTypeRangedUnitsAutoAttack</UnitType>
		<UnitType>LogicalTypeVillagersAttack</UnitType>
		<UnitType>LogicalTypeHandUnitsAttack</UnitType>
		<UnitType>LogicalTypeShipsAndBuildings</UnitType>
		<UnitType>LogicalTypeRangedUnitsAttack</UnitType>
		<UnitType>LogicalTypeBuildingsNotWallsOrGroves</UnitType>
		<UnitType>LogicalTypeMinimapFilterMilitary</UnitType>
		<UnitType>BuildingClass</UnitType>
		<UnitType>MilitaryBuilding</UnitType>
		<UnitType>Building</UnitType>
		<UnitType>CountsTowardMilitaryScore</UnitType>
		<UnitType>HasBountyValue</UnitType>
		<UnitType>AbstractFoundry</UnitType>
		<UnitType>ConvertsHerds</UnitType>
		<Train row ='0' page ='0' column ='0'>ypFlameThrower</Train>
		<Train row ='0' page ='0' column ='0'>ypFlamingArrow</Train>
		<Train row ='0' page ='0' column ='1'>ypHandMortar</Train>
		<Train row ='0' page ='0' column ='1'>ypMorutaru</Train>
		<Train row ='0' page ='0' column ='0'>ypMercFlailiphant</Train>
		<Train row ='0' page ='0' column ='3'>ypSiegeElephant</Train>
		<Train row ='0' page ='0' column ='0'>xpArrowKnight</Train>
		<Train row ='0' page ='0' column ='1'>xpEagleKnight</Train>
		<Train row ='0' page ='0' column ='2'>xpJaguarKnight</Train>
		<Train row ='0' page ='0' column ='4'>ypMongolianArmy</Train>
		<Train row ='0' page ='0' column ='3'>ypBlackFlagArmy</Train>
		<Tech row ='0' page ='1' column ='1'>YPHonoredMorutaru</Tech>
		<Tech row ='0' page ='1' column ='0'>YPExaltedFlailElephant</Tech>
		<Tech row ='0' page ='1' column ='1'>YPExaltedMorutaru</Tech>
		<Tech row ='0' page ='1' column ='0'>YPDisciplinedFlameThrower</Tech>
		<Tech row ='0' page ='1' column ='0'>YPExaltedFlameThrower</Tech>
		<Tech row ='0' page ='1' column ='1'>YPExaltedSiegeElephant</Tech>
		<Tech row ='0' page ='1' column ='0'>YPHonoredFlameThrower</Tech>
		<Tech row ='0' page ='1' column ='0'>YPExaltedFlamingArrow</Tech>
		<Tech row ='0' page ='1' column ='3'>ypFortifiedCastle</Tech>
		<Tech row ='0' page ='1' column ='3'>ypFrontierCastle</Tech>
		<Tech row ='0' page ='1' column ='0'>YPHonoredFlamingArrow</Tech>
		<Tech row ='0' page ='1' column ='1'>YPExaltedHandMortar</Tech>
		<Tech row ='0' page ='1' column ='0'>YPHonoredFlailElephant</Tech>
		<Tech row ='0' page ='1' column ='1'>YPHonoredHandMortar</Tech>
		<Tech row ='0' page ='1' column ='0'>YPDisciplinedFlailElephant</Tech>
		<Tech row ='0' page ='1' column ='1'>YPHonoredSiegeElephant</Tech>
		<Flag>CollidesWithProjectiles</Flag>
		<Flag>StartsAtFullEfficiency</Flag>
		<Flag>Immoveable</Flag>
		<Flag>NoBloodOnDeath</Flag>
		<Flag>ObscuresUnits</Flag>
		<Flag>NonAutoFormedUnit</Flag>
		<Flag>Doppled</Flag>
		<Flag>SelectWithObstruction</Flag>
		<Flag>PaintTextureWhenPlacing</Flag>
		<Flag>FlattenGround</Flag>
		<Flag>HasGatherPoint</Flag>
		<Flag>AllowAutoGarrison</Flag>
		<Flag>Tracked</Flag>
		<Contain>AbstractVillager</Contain>
		<Contain>Imam</Contain>
		<Contain>Missionary</Contain>
		<Contain>NatMedicineMan</Contain>
		<Contain>xpMedicineMan</Contain>
		<Contain>Surgeon</Contain>
		<Contain>Priest</Contain>
		<Contain>xpMedicineManAztec</Contain>
		<Contain>ypDaimyoRegicide</Contain>
		<Command page ='10' column ='0'>SetGatherPointMilitary</Command>
		<Command page ='10' column ='2'>Eject</Command>
		<Command page ='10' column ='3'>Delete</Command>
		<Command page ='10' column ='1'>SetGatherPointEconomy</Command>
		<Command page ='1' column ='5'>StartNativeDance</Command>
		<Command page ='1' column ='5'>CancelNativeDance</Command>
		<Command page ='1' column ='9'>SetUnitAsHomeCityGatherPoint</Command>
		<Tactics>castle.tactics</Tactics>
		<ProtoAction>
			<Name>AntiShipAttack</Name>
			<Damage>100.000000</Damage>
			<DamageType>Siege</DamageType>
			<MinRange>0.000000</MinRange>
			<MaxRange>40.000000</MaxRange>
			<ROF>3.000000</ROF>
			<DamageBonus type ='AbstractSiegeTrooper'>0.500000</DamageBonus>
		</ProtoAction>
		<ProtoAction>
			<Name>CannonAttack</Name>
			<Damage>60.000000</Damage>
			<DamageType>Siege</DamageType>
			<MinRange>0.000000</MinRange>
			<MaxRange>24.000000</MaxRange>
			<ROF>3.000000</ROF>
			<DamageCap>120.000000</DamageCap>
			<DamageBonus type ='AbstractVillager'>0.250000</DamageBonus>
			<DamageArea>3.000000</DamageArea>
			<DamageFlags>GAIAEnemy</DamageFlags>
			<DamageBonus type ='AbstractCavalry'>1.500000</DamageBonus>
			<DamageBonus type ='AbstractSiegeTrooper'>0.500000</DamageBonus>
		</ProtoAction>
		<ProtoAction>
			<Name>RangedAttack</Name>
			<Damage>30.000000</Damage>
			<DamageType>Ranged</DamageType>
			<MinRange>0.000000</MinRange>
			<MaxRange>24.000000</MaxRange>
			<ROF>3.000000</ROF>
			<DamageBonus type ='AbstractVillager'>0.250000</DamageBonus>
			<DamageBonus type ='AbstractCavalry'>1.500000</DamageBonus>
			<DamageBonus type ='AbstractSiegeTrooper'>0.500000</DamageBonus>
			<DamageBonus type ='AbstractLightInfantry'>1.500000</DamageBonus>
		</ProtoAction>
		<ProtoAction>
			<Name>ContainRangedAttack</Name>
			<Damage>30.000000</Damage>
			<DamageType>Ranged</DamageType>
			<MinRange>0.000000</MinRange>
			<MaxRange>24.000000</MaxRange>
			<ROF>3.000000</ROF>
			<DamageBonus type ='AbstractVillager'>0.250000</DamageBonus>
			<DamageBonus type ='AbstractCavalry'>1.500000</DamageBonus>
			<DamageBonus type ='AbstractSiegeTrooper'>0.500000</DamageBonus>
			<DamageBonus type ='AbstractLightInfantry'>1.500000</DamageBonus>
		</ProtoAction>
	</Unit>



不知道你留意到没,为了方便我是直接改良了两张卡片,一张给城堡增加10%攻击力,另一张设定坚固城堡的科技状态为作用中,都给城堡添加了攻击力,但是techtreey.xml这几个卡片(科技)都没有给定义增加新的远距攻击的攻击力,所以新的远距攻击依然是30*X不变。

  techtreey.xml - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	<Tech name ='ypFrontierCastle' type ='Normal'>
		<DBID>4799</DBID>
		<DisplayNameID>66027</DisplayNameID>
		<Cost resourcetype ='Wood'>400.0000</Cost>
		<Cost resourcetype ='Gold'>200.0000</Cost>
		<ResearchPoints>60.0000</ResearchPoints>
		<Status>UNOBTAINABLE</Status>
		<Icon>ui\techs\asians\tech_frontier_castle</Icon>
		<RolloverTextID>66026</RolloverTextID>
		<Flag>CountsTowardMilitaryScore</Flag>
		<Prereqs>
			<TechStatus status ='Active'>Fortressize</TechStatus></Prereqs>
		<Effects>
			<Effect type ='SetName' proto ='ypCastle' culture ='none' newName ='66386'></Effect>
			<Effect type ='Data' action ='RangedAttack' amount ='1.50' subtype ='Damage' relativity ='BasePercent'>
				<Target type ='ProtoUnit'>ypCastle</Target></Effect>
			<Effect type ='Data' action ='ContainRangedAttack' amount ='1.50' subtype ='Damage' relativity ='BasePercent'>
				<Target type ='ProtoUnit'>ypCastle</Target></Effect>
			<Effect type ='Data' amount ='0.00' subtype ='UpdateVisual' unittype ='ypCastle' relativity ='Absolute'>
				<Target type ='Player'></Target></Effect>
		</Effects>
	</Tech>
	<Tech name ='ypFortifiedCastle' type ='Normal'>
		<DBID>4800</DBID>
		<DisplayNameID>66032</DisplayNameID>
		<Cost resourcetype ='Wood'>800.0000</Cost>
		<Cost resourcetype ='Gold'>400.0000</Cost>
		<ResearchPoints>60.0000</ResearchPoints>
		<Status>UNOBTAINABLE</Status>
		<Icon>ui\techs\asians\tech_fortified_castle</Icon>
		<RolloverTextID>66031</RolloverTextID>
		<Flag>CountsTowardMilitaryScore</Flag>
		<Prereqs>
			<TechStatus status ='Active'>ypFrontierCastle</TechStatus>
			<TechStatus status ='Active'>Industrialize</TechStatus>
		</Prereqs>
		<Effects>
			<Effect type ='Data' amount ='1.50' subtype ='Hitpoints' relativity ='BasePercent'>
				<Target type ='ProtoUnit'>ypCastle</Target></Effect>
			<Effect type ='SetName' proto ='ypCastle' culture ='none' newName ='66387'></Effect>
			<Effect type ='Data' action ='CannonAttack' amount ='1.00' subtype ='ActionEnable' relativity ='Absolute'>
				<Target type ='ProtoUnit'>ypCastle</Target></Effect>
			<Effect type ='Data' action ='AntiShipAttack' amount ='2.00' subtype ='Damage' relativity ='BasePercent'>
				<Target type ='ProtoUnit'>ypCastle</Target></Effect>
			<Effect type ='Data' amount ='0.00' subtype ='UpdateVisual' unittype ='ypCastle' relativity ='Absolute'>
				<Target type ='Player'></Target></Effect>
		</Effects>
	</Tech>

其他的科技或者卡片自己添加上去吧,数量有点多,大概有五六个吧。


另外如果你想给炮轰攻击也添加上这个效果的话,方法都是一样的,不过要记得在techtreey.xml的强化城堡科技加上启用新炮轰攻击的语句。

对3.0版本的后续补充

在protoy.xml或tactics添加该句<DamageArea>1.000000</DamageArea>(范围伤害语句)后无论驻守多少人,虽然攻击力数值上升了,但实际攻击力不会上升。所以炮轰攻击你自己抉择吧,是要驻守增加攻击力还是要保留范围伤害。