From 2538023d8dd95cf99419fd4505ad3105814ddad9 Mon Sep 17 00:00:00 2001 From: Adam Salah Date: Wed, 23 Jul 2025 06:39:59 +0000 Subject: [PATCH] dev/bolas (#11) Reviewed-on: https://gitea.clubconjure.com/Conjure/gather-and-defend/pulls/11 Reviewed-by: Ader_Alisma Co-authored-by: Adam Salah Co-committed-by: Adam Salah --- .../UI/cards/icons/icon_card_bolas.png | Bin 0 -> 7547 bytes .../UI/cards/icons/icon_card_bolas.png.meta | 147 ++ Assets/Design/UnitCards/Bolas.asset | 18 + Assets/Design/UnitCards/Bolas.asset.meta | 8 + .../Design/UnitUpgrades/Upgrade_Bolas.asset | 17 + .../UnitUpgrades/Upgrade_Bolas.asset.meta | 8 + Assets/Prefabs/Sticks/bolasStick.prefab | 2119 +++++++++++++++++ Assets/Prefabs/Sticks/bolasStick.prefab.meta | 7 + Assets/Prefabs/Sticks/slingerStick.prefab | 1 + .../UnitPlacementButtons.prefab | 257 +- Assets/Prefabs/bolasProjectile.prefab | 232 ++ Assets/Prefabs/bolasProjectile.prefab.meta | 7 + Assets/Scenes/Game.unity | 114 +- Assets/Scripts/Ally/Ally.cs | 1 - Assets/Scripts/Entity.cs | 14 +- Assets/Scripts/Enum.cs | 5 + Assets/Scripts/Projectile.cs | 36 +- Assets/Scripts/Projectile.meta | 8 + Assets/Scripts/Projectile/BolasProjectile.cs | 19 + .../Projectile/BolasProjectile.cs.meta | 11 + Assets/Scripts/Root.cs | 3 +- Assets/Scripts/Status.meta | 8 + Assets/Scripts/Status/Slow.cs | 43 + Assets/Scripts/Status/Slow.cs.meta | 11 + Assets/Scripts/Status/Status.cs | 28 + Assets/Scripts/Status/Status.cs.meta | 11 + Assets/Scripts/StatusHandler.cs | 63 + Assets/Scripts/StatusHandler.cs.meta | 11 + 28 files changed, 3121 insertions(+), 86 deletions(-) create mode 100644 Assets/Art/Sprites/UI/cards/icons/icon_card_bolas.png create mode 100644 Assets/Art/Sprites/UI/cards/icons/icon_card_bolas.png.meta create mode 100644 Assets/Design/UnitCards/Bolas.asset create mode 100644 Assets/Design/UnitCards/Bolas.asset.meta create mode 100644 Assets/Design/UnitUpgrades/Upgrade_Bolas.asset create mode 100644 Assets/Design/UnitUpgrades/Upgrade_Bolas.asset.meta create mode 100644 Assets/Prefabs/Sticks/bolasStick.prefab create mode 100644 Assets/Prefabs/Sticks/bolasStick.prefab.meta create mode 100644 Assets/Prefabs/bolasProjectile.prefab create mode 100644 Assets/Prefabs/bolasProjectile.prefab.meta create mode 100644 Assets/Scripts/Projectile.meta create mode 100644 Assets/Scripts/Projectile/BolasProjectile.cs create mode 100644 Assets/Scripts/Projectile/BolasProjectile.cs.meta create mode 100644 Assets/Scripts/Status.meta create mode 100644 Assets/Scripts/Status/Slow.cs create mode 100644 Assets/Scripts/Status/Slow.cs.meta create mode 100644 Assets/Scripts/Status/Status.cs create mode 100644 Assets/Scripts/Status/Status.cs.meta create mode 100644 Assets/Scripts/StatusHandler.cs create mode 100644 Assets/Scripts/StatusHandler.cs.meta diff --git a/Assets/Art/Sprites/UI/cards/icons/icon_card_bolas.png b/Assets/Art/Sprites/UI/cards/icons/icon_card_bolas.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8be099e6096a51ec245891124bd5f167f36849 GIT binary patch literal 7547 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 RQ GlobalConfig.Instance.Current.allySpeedMultiplier; public float PopulationCost => GlobalConfig.Instance.Current.populationCostPerUnit; - public override void Update() { base.Update(); diff --git a/Assets/Scripts/Entity.cs b/Assets/Scripts/Entity.cs index 943edda..a1f2f25 100644 --- a/Assets/Scripts/Entity.cs +++ b/Assets/Scripts/Entity.cs @@ -23,6 +23,10 @@ public abstract class Entity : LevelObject private Shader _shaderSpritesDefault; private SpriteRenderer[] _spriteRenderers; private AudioPlayerComponent _audioPlayerComponent; + private StatusHandler _statusHandler; + + // status modifiers + private float _speedStatusModifier = 1f; //Enemy Spotted private bool _isEnemyDetected = false; @@ -36,11 +40,12 @@ public abstract class Entity : LevelObject _spriteRenderers = GetComponentsInChildren(true); _audioPlayerComponent = GetComponent(); Animation = gameObject.AddComponent(); + _statusHandler = gameObject.AddComponent(); } public virtual void Update() { Animation.AttackSpeedMultiplier = AttackSpeedMultiplier; - Animation.SpeedMultiplier = SpeedMultiplier; + Animation.SpeedMultiplier = SpeedMultiplier * SpeedStatusModifier; _lifeBar.gameObject.SetActive(_lifeBar.value <= 0.99f); } @@ -121,7 +126,7 @@ public abstract class Entity : LevelObject public int Hp => (int)(_hp * HpMultiplier); - public float Speed => _speed * SpeedMultiplier; + public float Speed => _speed * SpeedMultiplier * SpeedStatusModifier; public int AttackDamage { @@ -157,6 +162,11 @@ public abstract class Entity : LevelObject public SpriteRenderer[] SpriteRenderers { get { return _spriteRenderers; } } + public StatusHandler StatusHandler { + get => _statusHandler; + } + public float SpeedStatusModifier { get => _speedStatusModifier; set => _speedStatusModifier = value; } + #region [LevelManager code] public override bool Equals(ILevelObject other) { diff --git a/Assets/Scripts/Enum.cs b/Assets/Scripts/Enum.cs index 08bcd5c..e4cd7ed 100644 --- a/Assets/Scripts/Enum.cs +++ b/Assets/Scripts/Enum.cs @@ -13,4 +13,9 @@ public class Enum Farm = 2, BerryBush = 3 } + public enum StatusType + { + Slow = 0, + SpeedBoost = 1, + } } diff --git a/Assets/Scripts/Projectile.cs b/Assets/Scripts/Projectile.cs index f513ef9..5862d26 100644 --- a/Assets/Scripts/Projectile.cs +++ b/Assets/Scripts/Projectile.cs @@ -22,7 +22,7 @@ public class Projectile : MonoBehaviour private Vector2 _vectorStart; private Vector2 _vectorEnd; - + private int _damage; private float _enemySpeed; private Entity _target; @@ -38,14 +38,14 @@ public class Projectile : MonoBehaviour private float _initialXDistance; private float _initialYDistance; - private void Start() + private void Start() { _rigidbodyProjectile = GetComponent(); _initialX = transform.position.x; _initialY = transform.position.y; _destinationX = _vectorEnd.x - _initialX - _enemySpeed; _destinationY = _vectorEnd.y - _initialY; - + _detectionLinked.gameObject.GetComponent().EntityLinked = _target; _detectionLinked.gameObject.GetComponent().ProjectileDamage = _damage; @@ -58,8 +58,8 @@ public class Projectile : MonoBehaviour if (straightProjectile) { - transform.position = Vector2.Lerp(new Vector2(_initialX, _initialY), - new Vector2(_vectorEnd.x, _vectorEnd.y), _time/_duration); + transform.position = Vector2.Lerp(new Vector2(_initialX, _initialY), + new Vector2(_vectorEnd.x, _vectorEnd.y), _time / _duration); DetStraigthArrowAngle(); @@ -70,15 +70,16 @@ public class Projectile : MonoBehaviour if (transform.position.x >= _vectorEnd.x) { + ApplyEffects(); Destroy(this.gameObject); } return; } float x = _speedTime; - float y = (_angle*-Mathf.Pow(x, 2) + _destinationX * x); + float y = (_angle * -Mathf.Pow(x, 2) + _destinationX * x); - transform.position = new Vector2(_initialX + x*_angle, _initialY + y); + transform.position = new Vector2(_initialX + x * _angle, _initialY + y); // Move projectile angle according to distance with target float lerpStep = (_destinationX - transform.position.x) / _initialXDistance; @@ -87,19 +88,20 @@ public class Projectile : MonoBehaviour _speedTime += _speed * Time.deltaTime; - if(y < 0) { + if (y < 0) + { Destroy(this.gameObject); } } - private void DetStraigthArrowAngle() + protected virtual void DetStraigthArrowAngle() { - if(_target != null) _enemyPosY = _target.Position.y; + if (_target != null) _enemyPosY = _target.Position.y; float angleX = (_destinationX) / _initialXDistance; float angleY = (_destinationY) / _initialYDistance; - + //Obtenir la difference entre la position Y du chateau et de l'ennemie. float diffY = transform.position.y - _enemyPosY; @@ -114,23 +116,27 @@ public class Projectile : MonoBehaviour //Si cette distance est plus petite qu'un certain nombre, on utilise un calcul differents //pour determine l'angle que la fleche doit prendre. if (angleX > 0.23) lerpStepS = Mathf.Rad2Deg * Mathf.Atan(angleX / angleY); - + //Si la position est negative, on utilise un calcul different pour determiner l'angle. //(Il faudra tester si ca marche lorsque le chateau pourrait tirer en arriere). else if (angleX >= 0) lerpStepS = Mathf.Rad2Deg * Mathf.Atan(angleY / angleX); //Calcul utilise pour tenter de mieux faire fonctionner l'angle de la fleche lorsque l'ennemi est //proche de l'unite. - else { + else + { lerpStepS = -Mathf.Rad2Deg * Mathf.Atan(angleY / angleX); - } - + } + float angleS = Mathf.Lerp(lerpStepS, 0, 0); transform.eulerAngles = new Vector3(0, 0, angleS); } } + // applies effects on hit + protected virtual void ApplyEffects() { } + //Getter and Setter public float EnemySpeed { diff --git a/Assets/Scripts/Projectile.meta b/Assets/Scripts/Projectile.meta new file mode 100644 index 0000000..579c88f --- /dev/null +++ b/Assets/Scripts/Projectile.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 796c5970b01ebd249b04e1a0598abc7c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Projectile/BolasProjectile.cs b/Assets/Scripts/Projectile/BolasProjectile.cs new file mode 100644 index 0000000..4285796 --- /dev/null +++ b/Assets/Scripts/Projectile/BolasProjectile.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class BolasProjectile : Projectile +{ + [SerializeField] + private float _slowIntensity = 0.25f; + [SerializeField] + private float _slowDuration = 5f; + + protected override void ApplyEffects() + { + if (Target.StatusHandler) + { + Target.StatusHandler.ApplySlow(_slowIntensity, _slowDuration); + } + } +} diff --git a/Assets/Scripts/Projectile/BolasProjectile.cs.meta b/Assets/Scripts/Projectile/BolasProjectile.cs.meta new file mode 100644 index 0000000..fd0561e --- /dev/null +++ b/Assets/Scripts/Projectile/BolasProjectile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af32629f84318134799756134098abf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Root.cs b/Assets/Scripts/Root.cs index 338cc8f..b5a6d3e 100644 --- a/Assets/Scripts/Root.cs +++ b/Assets/Scripts/Root.cs @@ -41,8 +41,7 @@ public class Root : MonoBehaviour _newArrow.GetComponent().EnemySpeed = _entity.Enemy.Speed; _newArrow.GetComponent().VectorStart = _rigidbodyAlly.position; _newArrow.GetComponent().VectorEnd = _rigidbodyOpponent.position; - _newArrow.GetComponent().Target = _entity.Enemy; - + _newArrow.GetComponent().Target = _entity.Enemy; } public void PlaySound(string soundName) diff --git a/Assets/Scripts/Status.meta b/Assets/Scripts/Status.meta new file mode 100644 index 0000000..d472446 --- /dev/null +++ b/Assets/Scripts/Status.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53425a7650ca89b438da0796d0bd79ed +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Status/Slow.cs b/Assets/Scripts/Status/Slow.cs new file mode 100644 index 0000000..bc4b4f3 --- /dev/null +++ b/Assets/Scripts/Status/Slow.cs @@ -0,0 +1,43 @@ +using System.Collections; +using System.Collections.Generic; +using Unity.VisualScripting.YamlDotNet.Core.Tokens; +using UnityEngine; + +public class Slow : Status +{ + private float _previousSpeedModifier = 1f; + private float _speedModifier = 1f; + + public override void Apply(float duration) + { + // reset slow duration + _duration = Mathf.Max(_duration, duration); + + // slow entity + EntityLinked.SpeedStatusModifier /= _previousSpeedModifier; + EntityLinked.SpeedStatusModifier *= _speedModifier; + } + + public override void Unapply() + { + // bring entity to normal speed + EntityLinked.SpeedStatusModifier /= _speedModifier; + + // stop effect + Destroy(this); + } + + /// + /// A higher intensity results in a stronger slow. + /// Example: An intensity of 0.99 multiplies the entity's speed by 0.01 (which would result in a really low speed) + /// + public float Intensity + { + get => 1 - _speedModifier; + set + { + _previousSpeedModifier = _speedModifier; + _speedModifier = Mathf.Min(_speedModifier, 1 - value); + } + } +} diff --git a/Assets/Scripts/Status/Slow.cs.meta b/Assets/Scripts/Status/Slow.cs.meta new file mode 100644 index 0000000..6904878 --- /dev/null +++ b/Assets/Scripts/Status/Slow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b89154fc4d657474e988151a13f82fc5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Status/Status.cs b/Assets/Scripts/Status/Status.cs new file mode 100644 index 0000000..8fb9721 --- /dev/null +++ b/Assets/Scripts/Status/Status.cs @@ -0,0 +1,28 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class Status : MonoBehaviour +{ + private Entity entityLinked; + [SerializeField] + protected float _duration; + + private void Start() + { + EntityLinked = GetComponent(); + } + + private void Update() + { + // effect timer + _duration -= Time.deltaTime; + if ( _duration < 0 ) Unapply(); + } + + public abstract void Apply(float duration); + public abstract void Unapply(); + + public Entity EntityLinked { get => entityLinked; set => entityLinked = value; } + +} diff --git a/Assets/Scripts/Status/Status.cs.meta b/Assets/Scripts/Status/Status.cs.meta new file mode 100644 index 0000000..c0841ee --- /dev/null +++ b/Assets/Scripts/Status/Status.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cd371169b5f23347994997e816d1d0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StatusHandler.cs b/Assets/Scripts/StatusHandler.cs new file mode 100644 index 0000000..119b1b3 --- /dev/null +++ b/Assets/Scripts/StatusHandler.cs @@ -0,0 +1,63 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class StatusHandler : MonoBehaviour +{ + private Entity _entityLinked; + private Dictionary activeStatuses = new(); + + public void ApplySlow(float intensity, float duration) + { + // check if effect already applied + Slow slow = (Slow)GetStatus(Enum.StatusType.Slow); + + // init effect params + slow.Intensity = intensity; + + // apply effect + slow.Apply(duration); + } + + // please add status to switch case everytime you design one! + private Status GetStatus(Enum.StatusType type) + { + Status status; + + // check if status already exists + activeStatuses.TryGetValue(type, out status); + + // if status doesn't exist, instantiate it + if (!status) + { + switch (type) + { + case Enum.StatusType.Slow: + status = gameObject.AddComponent(); + break; + default: break; + } + + // if key value pair doesn't exist, create it + // else update the existing one + if (!activeStatuses.ContainsKey(type)) + { + activeStatuses.Add(type, status); + } + else + { + activeStatuses[type] = status; + } + } + + // link entity to status + status.EntityLinked = _entityLinked; + + return status; + } + + private void Start() + { + _entityLinked = gameObject.GetComponent(); + } +} diff --git a/Assets/Scripts/StatusHandler.cs.meta b/Assets/Scripts/StatusHandler.cs.meta new file mode 100644 index 0000000..375babf --- /dev/null +++ b/Assets/Scripts/StatusHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e1a590a40aadfa24ab3c0d725467255f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: