public static AttackPackage CreateNewPackage(AttackPackage template) { var hashID = System.Guid.NewGuid().GetHashCode(); template._hashID = hashID; return(template); }
public virtual AttackResult ReceiveAttack(AttackPackage attack) { if (attacksFreqTimer.ContainsKey(attack._hashID) || attack._attackType == AttackType.Null || attack._faction == this.Faction) { return(AttackResult.Failed); } attacksFreqTimer.Add(attack._hashID, attack._attackRate); StartCoroutine(RemoveTimer(attack._hashID)); var result = new AttackResult { _attackable = this, _attackSuccess = true, _finalDamage = attack._hitPointDamage, _finalFatigue = attack._enduranceDamage, _isWeakspot = _isWeakSpot }; ApplyDamageMultiplier(ref result, attack); RaiseOnHit(attack, result); return(result); }
protected virtual void ApplyDamageMultiplier(ref AttackResult result, AttackPackage attack) { switch (attack._attackType) { case AttackType.Melee: result._finalDamage *= _meleeDamageMultiplier; break; case AttackType.Range: result._finalDamage *= _rangeDamageMultiplier; break; case AttackType.ChargedMelee: result._finalDamage *= _meleeChargeDamageMultiplier; break; case AttackType.ChargedRange: result._finalDamage *= _rangeChargeDamageMultiplier; break; case AttackType.Float: result._finalDamage *= _floatBladeDamageMultiplier; break; } }
public bool Hover() { if (State != KnifeState.Flying) { return(false); } piercing = false; State = KnifeState.Hover; _attackMove = floatAttack; _defaultType = AttackType.Float; _baseAttackRate = floatAttackRate; Activate(AttackPackage.CreateNewPackage(), _attackMove); if (flyingVFX) { flyingVFX.SetParent(null); } if (chargeFlyingEffect) { chargeFlyingEffect.StopDraw(); } return(true); }
public void StartAttack() { var obj = Instantiate(_wavePrefab).GetComponent <BaseWeapon>(); obj.Activate(AttackPackage.CreateNewPackage(), null); obj.transform.position = _attackPoint.position; }
private void HandleSwordOnHit(IAttackable attackable, AttackResult result, AttackPackage attack) { if (attack._move != null && result._isWeakspot) { TimeManager.Instance.FrozenFrame(attack._move.FrameFrozen); //ShakeScreen.Instance.Shake(attack._move.ScreenShakeParam); } }
public static AttackPackage CreateNewPackage() { var hashID = System.Guid.NewGuid().GetHashCode(); var package = new AttackPackage(hashID, 0, 0, 0, 0, 0, false, AttackType.Null, Faction.Null, Vector2.zero, "", "", null); return(package); }
public override void Activate(AttackPackage attack, AttackMove move) { base.Activate(attack, move); if (_triggerBox) { _triggerBox.enabled = true; } }
public virtual void Launch() { if (_launchEffect != null) { _launchEffect.Play(); } var projectile = GetProjectile(); projectile.Activate(AttackPackage.CreateNewPackage(), _move); }
protected override void ApplyDamageMultiplier(ref AttackResult result, AttackPackage attack) { base.ApplyDamageMultiplier(ref result, attack); if (_isWeakSpot && attack._attackType != AttackType.Null && attack._attackType != AttackType.StuckNDraw && attack._attackType != AttackType.Float) { ApplyComboDamage(ref result, attack); } }
private AttackPackage CreateNewPackage(AttackType type, AttackMove move) { var package = AttackPackage.CreateNewPackage(); package._hitPointDamage.Base = _baseHitPointDamage; package._enduranceDamage.Base = _baseEnduranceDamage; package._attackType = type; package._faction = Faction.Player; package = move.Process(package); return(package); }
public void ChargedMeleeAttack(float chargedPercent) { var package = AttackPackage.CreateNewPackage(); package._faction = Faction.Player; package._attackType = AttackType.ChargedMelee; package._hitPointDamage.Base = _state._hitPointDamage; package._enduranceDamage.Base = _state._enduranceDamage; package._chargedPercent.Base = chargedPercent; OnRaisingAttack?.Invoke(sword, chargedMeleeMove); sword.Activate(package, chargedMeleeMove); _audio.clip = _normalMeleeSFX.PickRandom(); _audio.Play(); }
public bool Withdraw() { if (State == KnifeState.InSheath || State == KnifeState.Returning) { return(false); } transform.parent = null; State = KnifeState.Returning; _attackMove = piercing ? chargedAttack : normalAttack; _defaultType = piercing ? AttackType.ChargedRange : AttackType.Range; _baseAttackRate = normalAttackRate; Activate(AttackPackage.CreateNewPackage(), _attackMove); if (stuckOn != null) { Vector2 toStuckOn = (stuckOn as Component).transform.position - this.transform.position; toStuckOn = toStuckOn.normalized * PullingForce; if (stuckOn.TryPullOut(this.gameObject, ref toStuckOn)) { var direction = sheath.transform.position - this.transform.position; direction = DirectionalHelper.NormalizeHorizonalDirection(direction); _defaultType = AttackType.StuckNDraw; TryAttack(stuckAttack, direction); } stuckOn = null; } Returning(); if (flyingVFX) { flyingVFX.SetParent(this.transform); flyingVFX.position = transform.position; flyingVFX.rotation = transform.rotation; } if (chargeFlyingEffect && piercing) { chargeFlyingEffect.StartDraw(); } return(true); }
protected virtual void ApplyComboDamage(ref AttackResult result, AttackPackage attack) { switch (attack._attackType) { case AttackType.Melee: case AttackType.ChargedMelee: _state._currentMeleeComboTimes++; break; case AttackType.Range: case AttackType.ChargedRange: _state._currentRangeComboTimes++; break; } var totalComboTimes = _state._currentMeleeComboTimes + _state._currentRangeComboTimes; var totalComboDamage = _state._currentMeleeComboTimes * _state._meleeComboAdditiveDamage + _state._currentRangeComboTimes * _state._rangeComboAdditiveDamage; _state._currentComboInterval = _state._comboMaxInterval; if (totalComboTimes > _state._comboMaxTimes) { RaiseComboExceeded( _state._currentMeleeComboTimes, _state._currentRangeComboTimes, result._finalDamage, totalComboDamage); _state._currentMeleeComboTimes = 0; _state._currentRangeComboTimes = 0; _state._currentComboInterval = 0; } else { RaiseComboRaise( _state._currentMeleeComboTimes, _state._currentRangeComboTimes, result._finalDamage, totalComboDamage); } result._finalDamage += totalComboDamage; }
public bool Launch(Vector3 direction, bool isPiercing = false) { if (State != KnifeState.InSheath) { return(false); } piercing = isPiercing; State = KnifeState.Flying; transform.position = sheath.LaunchPosition.position; transform.right = direction; _attackMove = isPiercing ? chargedAttack : normalAttack; _defaultType = isPiercing ? AttackType.ChargedRange : AttackType.Range; _baseAttackRate = normalAttackRate; Activate(AttackPackage.CreateNewPackage(), _attackMove); if (flyingVFX) { flyingVFX.SetParent(this.transform); flyingVFX.position = transform.position; flyingVFX.rotation = transform.rotation; List <ParticleSystem> particles = new List <ParticleSystem>(); flyingVFX.GetComponentsInChildren(particles); foreach (var particle in particles) { particle.Play(); } } if (chargeFlyingEffect && piercing) { chargeFlyingEffect.StartDraw(); } return(true); }
public void MeleeAttack() { var package = AttackPackage.CreateNewPackage(); package._faction = Faction.Player; package._attackType = AttackType.Melee; package._hitPointDamage.Base = _state._hitPointDamage; package._enduranceDamage.Base = _state._enduranceDamage; OnRaisingAttack?.Invoke(sword, meleeMove); sword.Activate(package, meleeMove); if (_currentAttackEffect) { return; } _currentAttackEffect = Instantiate(_attackEffectPrefab); _currentAttackEffect.transform.SetParent(sword.transform); _currentAttackEffect.transform.localPosition = Vector3.zero; _audio.clip = _normalMeleeSFX.PickRandom(); _audio.Play(); }
public override void Activate(AttackPackage attack, AttackMove move) { base.Activate(attack, move); this.transform.localScale = Vector3.zero; }
protected void RaiseOnHit(AttackPackage attack, AttackResult result) { OnHit?.Invoke(attack, result); _onHit.Invoke(); }