相信年纪稍大一点的朋友都还记得当年播放的动画片《变形金刚》吧。现在随着变形金刚新系列动画的播出,变形金刚又再次红火了起来,去变形金刚中国联盟WWW.TFCLUB.COM的网友也越来越多…啊呀扯远了,现在我们来看看如何在绝命时刻中制作一个可以变形的单位。
在绝命时刻中新增加了GLA摩托车,当不同步兵进入的时候,就可以改变它的武器,外观和控制菜单。不过不是所有人都注意到摩托车的移动方式也可以随之改变。现在我们就利用摩托车的代码来制作变形金刚。
在DATA\INI\OBJECT目录下新建一个INI文件,加入以下内容
Object Transformer
SelectPortrait = SACRaptor_L
ButtonImage = SACRaptor
Draw = W3DTruckDraw ModuleTag_01
DefaultConditionState
Model = AVLeopard
End
ConditionState = RIDER1;RIDER1说明这一段定义当第一种“步兵”进入变形金刚时,变形金刚的外形。在这里我们使用十字军坦克的外形。
Model = AVLeopard
Turret = Turret
WeaponFireFXBone = PRIMARY TurretMS
WeaponRecoilBone = PRIMARY Barrel
WeaponMuzzleFlash = PRIMARY TurretFX
WeaponLaunchBone = PRIMARY TurretMS
End
ConditionState = REALLYDAMAGED RIDER1
Model = AVLeopard_D
Turret = Turret
WeaponFireFXBone = PRIMARY TurretMS
WeaponRecoilBone = PRIMARY Barrel
WeaponMuzzleFlash = PRIMARY TurretFX
WeaponLaunchBone = PRIMARY TurretMS
End
ConditionState = RUBBLE RIDER1
Model = AVLeopard_D
End
ConditionState = RIDER2;RIDER2说明这里是当第二种“步兵”进入变形金刚时,变形金刚的外形。在这里使用猛禽战机的外形。
Model = AVRaptor
HideSubObject = BurnerFX01 BurnerFX02
WeaponLaunchBone = PRIMARY WeaponA
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
ConditionState = JETEXHAUST RIDER2
WeaponLaunchBone = PRIMARY WeaponA
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
ConditionState = JETEXHAUST JETAFTERBURNER RIDER2
; exhaust
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
; afterburner
ShowSubObject = BurnerFX01 BurnerFX02
ParticleSysBone = Engine01 JetLenzflare
ParticleSysBone = Engine02 JetLenzflare
End
ConditionState = REALLYDAMAGED RIDER2
Model = AVRaptor_D
; damage
ParticleSysBone = Smoke01 JetSmoke
ParticleSysBone = Engine01 JetEngineDamagedSmoke
WeaponLaunchBone = PRIMARY WeaponA
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
ConditionState = REALLYDAMAGED JETEXHAUST RIDER2
Model = AVRaptor_D
; damage
ParticleSysBone = Smoke01 JetSmoke
ParticleSysBone = Engine01 JetEngineDamagedSmoke
WeaponLaunchBone = PRIMARY WeaponA
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
ConditionState = REALLYDAMAGED JETEXHAUST JETAFTERBURNER RIDER2
Model = AVRaptor_D
; damage
ParticleSysBone = Smoke01 JetSmoke
ParticleSysBone = Engine01 JetEngineDamagedSmoke
; afterburner
ShowSubObject = BurnerFX01 BurnerFX02
ParticleSysBone = Engine01 JetLenzflare
ParticleSysBone = Engine02 JetLenzflare
; exhaust
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
ConditionState = RUBBLE RIDER2
Model = AVRaptor_D1B
HideSubObject = None
ShowSubObject = None
End
ConditionState = RUBBLE JETEXHAUST JETAFTERBURNER RIDER2
Model = AVRaptor_D1B
;HideSubObject is needed cause there’re inherited from default condition state
HideSubObject = None
ShowSubObject = None
ParticleSysBone = Engine01 JetExhaust
ParticleSysBone = Engine02 JetExhaust
WeaponLaunchBone = PRIMARY WeaponA
ParticleSysBone = Wingtip01 JetContrail
ParticleSysBone = Wingtip02 JetContrail
End
OkToChangeModelColor = Yes
TrackMarks = EXTireTrack.tga
Dust = RocketBuggyDust
DirtSpray = RocketBuggyDirtSpray
PowerslideSpray = RocketBuggyDirtPowerSlide
; These parameters are only used if the model has a separate suspension,
; and the locomotor has HasSuspension = Yes.
LeftFrontTireBone = Tire01
RightFrontTireBone = Tire02
LeftRearTireBone = Tire03
RightRearTireBone = Tire04
TireRotationMultiplier = 0.2 ; this * speed = rotation.
PowerslideRotationAddition = 1.25
End
; ***DESIGN parameters ***
DisplayName = OBJECT:CombatBike
Side = GLA
EditorSorting = VEHICLE
TransportSlotCount = 1 ;how many “slots” we take in a transport (0 == not transportable)
WeaponSet
Conditions = None
Weapon = PRIMARY NONE
End
WeaponSet
Conditions = WEAPON_RIDER1;变形金刚第一种外形使用的武器
Weapon = PRIMARY CrusaderTankGun
End
WeaponSet
Conditions = WEAPON_RIDER2;变形金刚第二种外形使用的武器。在这里我们将它设定为第二武器,为的是使炮塔只在第一种外形起作用。
Weapon = PRIMARY NONE
Weapon = SECONDARY TunnelDefenderBikerRocketWeapon
End
ArmorSet
Conditions = None
Armor = TransformerArmor;变形金刚使用的装甲类型
DamageFX = TankDamageFX
End
BuildCost = 500
BuildTime = 4.0 ;in seconds
VisionRange = 180
ShroudClearingRange = 300
ExperienceValue = 50 50 100 150 ;Experience point value at each level
ExperienceRequired = 0 50 100 200 ;Experience points needed to gain each level
IsTrainable = Yes ;Can gain experience
CrusherLevel = 2 ;What can I crush?: 1 = infantry, 2 = trees, 3 = vehicles
CrushableLevel = 2 ;What am I?: 0 = for infantry, 1 = for trees, 2 = general vehicles
;CommandSet = GLAVehicleCombatBikeDefaultCommandSet ;GLAVehicleCombatBikeCommandSet ****COMMANDSET is overwritten in RiderChangeContain!
VoiceSelect = CrusaderTankVoiceSelect
VoiceMove = CrusaderTankVoiceMove
VoiceGuard = CrusaderTankVoiceMove
VoiceAttack = CrusaderTankVoiceAttack
SoundMoveStart = CrusaderTankMoveStart
SoundMoveStartDamaged = CrusaderTankMoveStart
UnitSpecificSounds
; These have the syntax of SomeNameSomewhereInCode = SomeNameSomewhereInLookupINIs
VoiceCreate = CrusaderTankVoiceCreate
VoiceEnter = CrusaderTankVoiceMove
TurretMoveStart = NoSound
TurretMoveLoop = TurretMoveLoop
VoiceCrush = CrusaderTankVoiceCrush
End
; *** ENGINEERING Parameters ***
RadarPriority = UNIT
KindOf = PRELOAD SELECTABLE CAN_ATTACK ATTACK_NEEDS_LINE_OF_SIGHT CAN_CAST_REFLECTIONS VEHICLE SCORE
Body = ActiveBody ModuleTag_02
MaxHealth = 500
InitialHealth = 500
SubdualDamageCap = 200
SubdualDamageHealRate = 500
SubdualDamageHealAmount = 50
End
Behavior = AIUpdateInterface ModuleTag_03
Turret
TurretTurnRate = 180 ; turn rate, in degrees per sec
NaturalTurretAngle = 0
ControlledWeaponSlots = PRIMARY;炮塔只对第一武器,也就是第一种外形的武器起作用。
End
AutoAcquireEnemiesWhenIdle = Yes
End
Locomotor = SET_NORMAL CrusaderLocomotor;第一种外形使用的移动方式
Locomotor = SET_SLUGGISH ComancheLocomotor;第二种外形使用的移动方式
Behavior = PhysicsBehavior ModuleTag_04
Mass = 15.0
End
Behavior = SlowDeathBehavior DeathTag_14
DeathTypes = ALL
DestructionDelay = 0
End
Behavior = TransitionDamageFX ModuleTag_15
ReallyDamagedParticleSystem1 = Bone:Smoke RandomBone:Yes PSys:SmallLightSmokeColumn
ReallyDamagedFXList1 = Loc: X:0 Y:0 Z:0 FXList:FX_BattleMasterDamageTransition
End
Behavior = RiderChangeContain ModuleTag_99
Rider1 = upgradeobject1 RIDER1 WEAPON_RIDER1 STATUS_RIDER1 upgradeset1 SET_NORMAL;当第一种“步兵”upgradeobject1进入变形金刚时,变形金刚使用第一种武器,菜单使用upgradeset1,移动方式设为SET_NORMAL
Rider2 = upgradeobject2 RIDER2 WEAPON_RIDER2 STATUS_RIDER2 upgradeset2 SET_SLUGGISH;当第二种“步兵”upgradeobject2进入变形金刚时,变形金刚使用第二种武器,菜单使用upgradeset2,移动方式设为SET_SLUGGISH
ScuttleDelay = 1500
ScuttleStatus = TOPPLED
;Standard TransportContain stuff
Slots = 1
InitialPayload = upgradeobject1 1;变形金刚预先具有的“步兵”。如果没有这一项,整个系统会无法工作
ScatterNearbyOnExit = Yes;No
HealthRegen%PerSec = 0
DamagePercentToUnits = 0% ; This module will Delete the rider on death, but we need to kill him as well so he doesn’t pick up the bike’s salvage crate.
BurnedDeathToUnits = No ; And no Burned death.
AllowInsideKindOf = CAN_ATTACK;INFANTRY
ExitDelay = 99999999;250
NumberOfExitPaths = 0;1 ; Defaults to 1. Set 0 to not use ExitStart/ExitEnd, set higher than 1 to use ExitStart01-nn/ExitEnd01-nn
GoAggressiveOnExit = No;Yes ; AI Will tell people to set their mood to Aggressive on exiting
DoorOpenTime = 99999990
GoAggressiveOnExit = Yes
End
Behavior = ObjectCreationUpgrade ModuleTag_96;设定当升级bikeupgrade1完成时,在变形金刚内部产生第一种“步兵”upgradeobject1,于是变形金刚改变为第一种形状
UpgradeObject = OCL_upgradeobject1
TriggeredBy = bikeupgrade1
RemovesUpgrades = bikeupgrade1 bikeupgrade2;去除升级bikeupgrade1和bikeupgrade2,于是这两个升级在以后又能被使用
End
Behavior = ObjectCreationUpgrade ModuleTag_97;设定当升级bikeupgrade2完成时,在变形金刚内部产生第二种“步兵”upgradeobject2,于是变形金刚改变为第二种形状
UpgradeObject = OCL_upgradeobject2
TriggeredBy = bikeupgrade2
RemovesUpgrades = bikeupgrade2 bikeupgrade1
End
Behavior = MaxHealthUpgrade ModuleTag_95;在这里我们设定当变形金刚处于第二种形状时他的生命值减少50%
TriggeredBy = bikeupgrade2
AddMaxHealth = 250.0
ChangeType = PRESERVE_RATIO;, ADD_CURRENT_HEALTH_TOO, and SAME_CURRENTHEALTH
End
Behavior = MaxHealthUpgrade ModuleTag_94;在这里我们设定当变形金刚处于第一种形状时他的生命值增加50%
TriggeredBy = bikeupgrade1
AddMaxHealth = -250.0
ChangeType = PRESERVE_RATIO;, ADD_CURRENT_HEALTH_TOO, and SAME_CURRENTHEALTH
End
Behavior = ProductionUpdate ModuleTag_98
MaxQueueEntries = 1
End
Behavior = AnimationSteeringUpdate ModuleTag_17
MinTransitionTime = 300
End
Behavior = FlammableUpdate ModuleTag_21
AflameDuration = 5000 ; If I catch fire, I’ll burn for this long…
AflameDamageAmount = 3 ; taking this much damage…
AflameDamageDelay = 500 ; this often.
End
Behavior = FXListDie ModuleDieSoundTag_22
DeathTypes = ALL -TOPPLED ; Not if we are “dying” by being abandoned by our human. Nobody left to scream
DeathFX = FX_CombatCycleDie
End
Behavior = FXListDie ModuleDieSoundTag_23
DeathTypes = NONE +TOPPLED
DeathFX = FX_CombatCycleDieNoScream
End
Geometry = Box
GeometryIsSmall = Yes
GeometryMajorRadius = 14.0
GeometryMinorRadius = 7.0
GeometryHeight = 5.0
Shadow = SHADOW_VOLUME
ShadowSizeX = 89
End
;第一种“步兵”
Object upgradeobject1
Draw = W3DModelDraw ModuleTag_01
DefaultConditionState
Model = None
End
End
DisplayName = OBJECT:DogwoodTree OPTIMIZED_TREE
EditorSorting = SHRUBBERY
CrushableLevel = 1
TransportSlotCount = 1
KindOf = CAN_ATTACK SHRUBBERY IMMOBILE IGNORED_IN_GUI
Body = HighlanderBody ModuleTag_02
MaxHealth = 50.0
InitialHealth = 50.0
End
Behavior = DeletionUpdate ModuleTag_03
MinLifetime = 1
MaxLifetime = 1
End
Behavior = AIUpdateInterface ModuleTag_04
End
Behavior = SlowDeathBehavior ModuleTag_05
DeathTypes = NONE +TOPPLED
SinkRate = 2 ; in Dist/Sec
SinkDelay = 14000
DestructionDelay = 20000
End
Geometry = CYLINDER
GeometryIsSmall = Yes
GeometryMajorRadius = 4.0
GeometryHeight = 15
Shadow = SHADOW_DECAL
InstanceScaleFuzziness = 0.1
End
;第二种“步兵”
Object upgradeobject2
Draw = W3DModelDraw ModuleTag_01
DefaultConditionState
Model = None
End
End
DisplayName = OBJECT:DogwoodTree OPTIMIZED_TREE
EditorSorting = SHRUBBERY
CrushableLevel = 1
TransportSlotCount = 1
KindOf = CAN_ATTACK SHRUBBERY IMMOBILE IGNORED_IN_GUI
Body = HighlanderBody ModuleTag_02
MaxHealth = 50.0
InitialHealth = 50.0
End
Behavior = DeletionUpdate ModuleTag_03
MinLifetime = 1
MaxLifetime = 1
End
Behavior = AIUpdateInterface ModuleTag_04
End
Behavior = SlowDeathBehavior ModuleTag_05
DeathTypes = NONE +TOPPLED
SinkRate = 2 ; in Dist/Sec
SinkDelay = 14000
DestructionDelay = 20000
End
Geometry = CYLINDER
GeometryIsSmall = Yes
GeometryMajorRadius = 4.0
GeometryHeight = 15
Shadow = SHADOW_DECAL
InstanceScaleFuzziness = 0.1
End
然后在Armor.ini里加入以下内容:
Armor TransformerArmor
Armor = CRUSH 50%
Armor = SMALL_ARMS 50%
Armor = GATTLING 50% ;resistant to gattling tank
Armor = COMANCHE_VULCAN 50%
Armor = INFANTRY_MISSILE 50%
Armor = POISON 50%
Armor = MICROWAVE 0%
Armor = SNIPER 0%
Armor = MELEE 0% ;trucks don’t generally take much damage other than paint damage from MELEE weapons
Armor = LASER 0% ;lasers are anti-personel and anti-projectile only (for point defense laser)
Armor = HAZARD_CLEANUP 0% ;Not harmed by cleaning weapons
Armor = KILL_PILOT 100% ;Jarmen Kell uses against vehicles only.
Armor = SURRENDER 0% ;Capture type weapons are effective only against infantry.
Armor = SUBDUAL_MISSILE 0%
Armor = SUBDUAL_VEHICLE 100%
Armor = SUBDUAL_BUILDING 0%
Armor = FALLING 0%;下坠导致的伤害设定为0,这样变形金刚从战机变形为坦克时就不会受到伤害了
End
在CommandSet.ini里加入以下内容:
;第一种形态使用的菜单,可以选择升级为第二形态
CommandSet upgradeset1
2 = Command_upgrade1
11 = Command_AttackMove
13 = Command_Guard
14 = Command_Stop
End
;第二种形态使用的菜单,可以选择升级为第一形态
CommandSet upgradeset2
2 = Command_upgrade2
11 = Command_AttackMove
13 = Command_Guard
14 = Command_Stop
End
在CommandButton.ini里加入以下内容:
CommandButton Command_upgrade1
Command = OBJECT_UPGRADE
Options = OK_FOR_MULTI_SELECT MUST_BE_STOPPED
Upgrade = bikeupgrade1
ButtonImage = SACRaptor
ButtonBorderType = UPGRADE ; Identifier for the User as to what kind of button this is
End
CommandButton Command_upgrade2
Command = OBJECT_UPGRADE
Options = OK_FOR_MULTI_SELECT MUST_BE_STOPPED
Upgrade = bikeupgrade2
ButtonImage = SACLeopard
ButtonBorderType = UPGRADE ; Identifier for the User as to what kind of button this is
End
在Upgrade.ini里加入以下内容:
Upgrade bikeupgrade1
; DisplayName = UPGRADE:Radar
Type = OBJECT
BuildTime = 0.0
BuildCost = 0
ButtonImage = SARadarUpgrade
; ResearchSound = NoSound
End
Upgrade bikeupgrade2
; DisplayName = UPGRADE:Radar
Type = OBJECT
BuildTime = 0.0
BuildCost = 0
ButtonImage = SARadarUpgrade
; ResearchSound = NoSound
End
在ObjectCreationList.ini里加入以下内容:
ObjectCreationList OCL_upgradeobject1
CreateObject
ObjectNames = upgradeobject2
Count = 1
ContainInsideSourceObject = Yes;“步兵”将产生于变形金刚内部,并将先前在变形金刚内部的步兵排挤出去。
End
End
ObjectCreationList OCL_upgradeobject2
CreateObject
ObjectNames = upgradeobject1
Count = 1
ContainInsideSourceObject = Yes
End
End
这样一来,这个新单位就可以从战机变形为坦克或者反过来,同时武器和移动方式也得到了改变。不过它仍有不足之处:当变形金刚升级之后再进行变形,就会失去当前的等级。而且不能为它加入超过2种形态,否则变形的过程会有问题,而且升级之后再进行变形会直接死亡。
