Skip to main content

Deadeye String

Landing the shot within a specific timing window deals a critical hit.

The critical damage multiplier depends on how accurately the shot is released within that window.

Implementation​

Our skill has two phases: charging and shooting.

We need to track the charge value during the charging phase. However, we cannot store this value directly on the Actor because multiple arrows can be fired in sequence. In that case, storing the charge value on the Actor could cause the charge values of different arrows to interfere with each other.

Therefore, we attach the charge value to each arrow. For this, we use ActorEntity for the arrow prefab, allowing us to store and access the charge value through the arrow's Stats.

The arrow also has other Stats for properties such as direction, speed, and distance.

Arrow_Default — Environment
Environment: Arrow_Default
  • DeadeyeString_ArrowCharge—Clamped Float
  • DeadeyeString_Arrow_TravelDistance—Clamped Float
  • DeadeyeString_Arrow_MoveSpeed—Clamped Float
  • DeadeyeString_Arrow_Direction—Vector3
  • SourceActor—Actor
  • HitCount—Clamped Int
  • TeamNo—Int

Our Skill Targeter contains a SkillInitializer Effect Pack that applies the required initialization effects to the arrow's ActorEntity.

DeadeyeString_Targeting_2 — Skill Targeting Skill Shot
Skill Targeting Skill Shot: DeadeyeString_Targeting_2
Skill Prefab:DeadeyeString
Projectile Parenter:SkillParenter_Global
Projectile Position:SkillPositioner_OffsetToSourceBody
Projectile Rotation:SkillRotator_OffsetToSourceBody
Projectile Layouter:SkillProjectileLayouter_Forward
Use Skill Initializer Effect:true
Skill Initializer Pack:DeadeyeString_SkillInitializer

Now, let's see what the Deadeye String skill delivers to its target.

DeadeyeString_Attack — Float Stat Effect (MAS)
Float Stat Effect (MAS): DeadeyeString_Attack
Processor Id:Standard_Float
Attributes:Everything
Target Stat:Health
Value:-5
Attribute Stat Keys [0]:Attack
Attribute Stat Keys [1]:DeadeyeString_Attack
Attribute Stat Keys [2]:RangedAttack

We use the DeadeyeString_Attack Stat to apply skill specific behaviors. Let's take a look at its configuration.

DeadeyeString_Attack — Stat (Clamped Float)
Stat (Clamped Float): DeadeyeString_Attack
Stat Key:DeadEyeString / FloatClamped / Attack
Relation: CriticalRate_Applying:DeadeyeString_CritRate
Relation: CriticalMultiplier_Applying:DeadeyeString_CritMultiplier
Default:1
Max:100

As you can see, we have skill specific CritRate and CritMultiplier Stats.

We want both of these values to change based on the arrow's charge value. Therefore, we enable UseConditionalModifier for both CritRate and CritMultiplier in the CritProcessor, allowing their values to be conditionally modified.

MASContribution_CriticalHit_Float — MASContribution Critical Hit Float
MASContribution Critical Hit Float: MASContribution_CriticalHit_Float
Required Attributes:Modibifiable|Critable|AttributeStatsProcessable
Receiving Critical Rate Key:CriticalRate_Receiving
Applying Critical Rate Key:CriticalRate_Applying
Receiving Critical Multiplier Key:CriticalMultiplier_Receiving
Applying Critical Multiplier Key:CriticalMultiplier_Applying
Critical Result Attribute:Critical
Use Conditional Rate Modifier:true
Use Conditional Multiplier Modififier:true
Conditional Modifier Processor:ASContribution_ConditionalModifier(Float-Generic)

We also need to add ConditionalModifier_ApplyingAS relations to the CritRate and CritMultiplier Stats.

DeadeyeString_CritRate — Stat (Clamped Float)
Stat (Clamped Float): DeadeyeString_CritRate
Stat Key:DeadEyeString / FloatClamped / CritRate
Relation: ConditionalModifier_ApplyingAS:DeadeyeString_CritRateModifierByCharge
Allow Exceed:true
Max:1
DeadeyeString_CritMultiplier — Stat (Clamped Float)
Stat (Clamped Float): DeadeyeString_CritMultiplier
Stat Key:DeadEyeString / FloatClamped / CritMultiplier
Relation: ConditionalModifier_ApplyingAS:DeadeyeString_CritMultiplierModifierByCharge
Allow Exceed:true
Max:3

The CritRateModifier Stat adds 1 to CritRate as a flat contribution when the charge value is between 0.41 and 0.59.

DeadeyeString_CritRateModifierByCharge — Stat (ConditionalModifier Float)
Stat (ConditionalModifier Float): DeadeyeString_CritRateModifierByCharge
Stat Key:DeadEyeString / ConditionalModifier / CritRateModifier
Default:1
Max:1
Single Stat Checker › Stat › Actor:Effector
Single Stat Checker › Condition:In0.41To0.59(Float)
Stat Scaler › Stat › Actor:Effector
Stat Scaler › Scaler:StatToMultiplier_ArrowCritMultiplierModifierByCharge

The CritMultiplierModifier Stat scales the CritMultiplier value based on the charge value's closeness to 0.41.

DeadeyeString_CritMultiplierModifierByCharge — Stat (ConditionalModifier Float)
Stat (ConditionalModifier Float): DeadeyeString_CritMultiplierModifierByCharge
Stat Key:DeadEyeString / ConditionalModifier / CritMultiplierModifier
Default:1
Max:1
Single Stat Checker › Stat › Actor:Effector
Single Stat Checker › Condition:In0.41To0.59(Float)
Use Scaler:true
Stat Scaler › Stat › Actor:Effector
Stat Scaler › Scaler:StatToMultiplier_ArrowCritMultiplierModifierByCharge