Повышает скорость передвижения зилотов и позволяет им перехватывать находящихся рядом противников. Можно использовать не чаще раза в 10 секунд
Способность является стандартным "чарджем" зилота протоссов, и для её правильной работы необходима подключенная стандартная модификация Liberty.SC2Mod
Видеодемонстрация
Здесь способность имеет тип Augment. Это нужно для того, чтобы единица, после применения способности сразу же начала атаковать свою цель.
Также можно заметить по этим флагам, что способность является "автоприменяемой", и при этом, автоприменение включено по умолчанию при создании единицы.
<Flags index="AutoCast" value="1"/>
<Flags index="AutoCastOn" value="1"/>
Также стоит упомянуть, что автокаст способности сработает только в том случае, если единица не удерживает позицию. Это реализовано через стандартный валидатор CasterNotHoldingPosition, указанный в поле валидаторов автокаста способности.
<AutoCastValidatorArray value="CasterNotHoldingPosition"/>
При активации
При активации способности срабатывает эффект Charge@AB, который накладывает такой бафф как Charge.
В свою очередь этот бафф как раз и ускоряет единицу на несколько секунд. Но этот бафф из-за валидаторов ChargeTargetAttacked и CasterIsNotStationary висит на единице только в том случае, когда эта самая единица в данный момент использует способность атаки (А мы же помним что наш Augment-рывок связан со способностью атаки?) и пока она движется.
Визуальная часть - акторы
Ух самая интересная часть!
У нас тут два актора: актор звука и "простой" актор.
Они оба создаются тогда, когда на "какой-то" единице вешается бафф рывка (тот самый что ускоряет)
Они оба создаются тогда, когда на "какой-то" единице вешается бафф рывка (тот самый что ускоряет)
- С актором звука всё в целом ясно: Событие (бафф создался на юните -> актор создался; бафф уничтожился на юните -> актор уничтожился). Сам актор при своём создании проигрывает звук, указанный в его поле Sound (но в данном случае идентификатор актора и объекта звука совпадают, поэтому звук не задан в самом акторе (игра свяжет их по айди))
- А вот с "простым" актором чуть интереснее. Это скажем так контроллер анимации. Суть в том что у него есть два события на включение/отключение баффа.
- При включении баффа, актор создаётся, что в свою очередь также является "событием актора", и от этого создания актора применяется анимация Spell, на акторе юнита. Тоже самое с уничтожением актора
XML код
<CButton id="Charge">
<Icon value="Assets\Textures\btn-ability-protoss-charge-color.dds"/>
<AlertIcon value="Assets\Textures\btn-ability-protoss-charge-color.dds"/>
<EditorCategories value="Race:Protoss"/>
</CButton>
<CAbilAugment id="Charge">
<EditorCategories value="Race:Protoss,AbilityorEffectType:Units"/>
<CmdButtonArray index="Execute" DefaultButtonFace="Charge"/>
<AbilCmd value="attack,Execute"/>
<Flags index="AutoCast" value="1"/>
<Flags index="AutoCastOn" value="1"/>
<Cost>
<Cooldown Link="Charge" Location="Unit" TimeUse="10"/>
</Cost>
<AutoCastValidatorArray value="CasterNotHoldingPosition"/>
</CAbilAugment>
<CBehaviorBuff id="Charge">
<InfoIcon value="Assets\Textures\btn-ability-protoss-charge.dds"/>
<EditorCategories value="Race:Protoss,AbilityorEffectType:Units"/>
<Duration value="3.5"/>
<Modification MoveSpeedMultiplier="2.2"/>
<Alignment value="Positive"/>
<BuffFlags index="Channeling" value="1"/>
<RemoveValidatorArray value="ChargeTargetAttacked"/>
<RemoveValidatorArray value="CasterIsNotStationary"/>
</CBehaviorBuff>
<CEffectApplyBehavior id="Charge@AB">
<EditorCategories value="Race:Protoss"/>
<Behavior value="Charge"/>
<WhichUnit Value="Caster"/>
<ValidatorArray index="0" value="ChargeMinTriggerDistance"/>
<ValidatorArray value="ChargeMaxDistance"/>
</CEffectApplyBehavior>
<CActorSound id="Charge@Sound" parent="SoundContinuous">
<On Terms="Behavior.Charge.Create" Send="Create"/>
<On Terms="Behavior.Charge.Destroy" Send="Destroy"/>
</CActorSound>
<CActorSimple id="Charge@Animation">
<On Terms="ActorOrphan" Send="Destroy"/>
<On Terms="Behavior.Charge.On" Send="Create"/>
<On Terms="Behavior.Charge.Off" Send="Destroy"/>
<On Terms="ActorCreation" Target="_Unit" Send="AnimGroupApply Spell"/>
<On Terms="ActorDestruction" Target="_Unit" Send="AnimGroupRemove Spell"/>
</CActorSimple>
<CSound id="Charge@Sound" parent="Combat">
<EditorCategories value="Race:Protoss"/>
<AssetArray File="Assets\Sounds\Protoss\Zealot\Zealot_Charge0.wav"/>
<Pitch value="-0.890000,0.840000"/>
<Volume value="-7.960000,-7.960000"/>
<SustainFade index="1" Time="300"/>
</CSound>
<CDataCollectionUnit id="Charge">
<DataRecord Entry="Button,Charge"/>
<DataRecord Entry="Abil,Charge"/>
<DataRecord Entry="Behavior,Charge"/>
<DataRecord Entry="Effect,Charge@AB"/>
<DataRecord Entry="Actor,Charge@Sound"/>
<DataRecord Entry="Actor,Charge@Animation"/>
<DataRecord Entry="Sound,Charge@Sound"/>
</CDataCollectionUnit>
SC2







