ability+effects runtime instances

This commit is contained in:
Pedro Gomes 2025-09-11 21:32:42 +01:00
parent 186f6efd10
commit ccda634b89
7 changed files with 67 additions and 29 deletions

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: ecbc603708f7b784ab0a4bc2cce24156
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -31,6 +31,11 @@ public class BaseAbility : ScriptableObject
private float finalManaCost; private float finalManaCost;
private float finalHealthCost; private float finalHealthCost;
public virtual BaseAbility CreateRuntimeInstance()
{
return Instantiate(this);
}
public virtual void Execute(Taggable user) public virtual void Execute(Taggable user)
{ {
SpendResourcesNecessary(user); SpendResourcesNecessary(user);

View File

@ -10,4 +10,8 @@ public class BaseEffect : ScriptableObject
public virtual void ApplyEffect(Taggable user, List<Taggable> targets) { } public virtual void ApplyEffect(Taggable user, List<Taggable> targets) { }
public virtual BaseEffect CreateRuntimeInstance()
{
return Instantiate(this);
}
} }

View File

@ -28,6 +28,14 @@ public class ProjectileAbility : BaseAbility
private GameObject instantiatedProjectile; private GameObject instantiatedProjectile;
private NetworkedProjectile networkedProjectile; private NetworkedProjectile networkedProjectile;
/*public override BaseAbility CreateRuntimeInstance()
{
var instance = Instantiate(this);
instance.name = $"{name} (Runtime)";
// Any special initialization for projectile abilities
return instance;
}*/
public override void Execute(Taggable user) public override void Execute(Taggable user)
{ {
base.Execute(user); base.Execute(user);

View File

@ -60,7 +60,7 @@ public class BuildManager : MonoBehaviour
if (buildData == null) if (buildData == null)
{ {
SaveCurrentBuild(); SaveCurrentBuild(true);
} }
else else
{ {
@ -68,7 +68,7 @@ public class BuildManager : MonoBehaviour
} }
} }
private void SaveCurrentBuild() private void SaveCurrentBuild(bool rebindAbility = false)
{ {
if (buildData == null) if (buildData == null)
buildData = new BuildData(); buildData = new BuildData();

View File

@ -135,15 +135,6 @@ public class NetworkedProjectile : MonoBehaviour
effect.ApplyEffect(ownerTag, new List<Taggable> { target }); effect.ApplyEffect(ownerTag, new List<Taggable> { target });
} }
try
{
target.GetComponentInChildren<Animator>()?.SetTrigger("hurt");
}
catch (System.Exception)
{
Debug.Log("No Hurt trigger");
}
if (!canPierce) if (!canPierce)
{ {

View File

@ -10,12 +10,14 @@ public class AbilityKeyBinder : MonoBehaviour
[SerializeField] private GameEventListener onLocalPlayerPermaDeath; [SerializeField] private GameEventListener onLocalPlayerPermaDeath;
[SerializeField] private GameEventListener onLocalPlayerRevived; [SerializeField] private GameEventListener onLocalPlayerRevived;
[Space] [Space]
[SerializeField] private BaseAbility ability; //[SerializeField] private BaseAbility ability;
[SerializeField] private GameKey key; [SerializeField] private GameKey key;
[SerializeField] private CastingStateController castingStateController; [SerializeField] private CastingStateController castingStateController;
[SerializeField] private GameEvent_AbilityKeyBinder onAbilityKeyBinderSpawned; [SerializeField] private GameEvent_AbilityKeyBinder onAbilityKeyBinderSpawned;
[SerializeField] private GameInputBinding gamepadBinding; // New field for gamepad binding [SerializeField] private GameInputBinding gamepadBinding; // New field for gamepad binding
[SerializeField] private BaseAbility ability;
private Taggable userTag; private Taggable userTag;
private Mana mana; private Mana mana;
private Health health; private Health health;
@ -34,6 +36,8 @@ public class AbilityKeyBinder : MonoBehaviour
bool abilitySlotUnlocked = false; bool abilitySlotUnlocked = false;
bool isComboAbility = false; bool isComboAbility = false;
ComboAbility combo; ComboAbility combo;
List<BaseAbility> comboAbilities = new List<BaseAbility>();
List<BaseEffect> effects = new List<BaseEffect>();
ComboState comboState = new ComboState(); ComboState comboState = new ComboState();
float finalHealthCost; float finalHealthCost;
@ -204,17 +208,33 @@ public class AbilityKeyBinder : MonoBehaviour
public void BindAbility(BaseAbility ability) public void BindAbility(BaseAbility ability)
{ {
this.ability = ability; if (this.ability != null && this.ability.name.ToLower().Contains("clone"))
if (ability is ComboAbility comboAbility) Destroy(this.ability);
this.ability = ability.CreateRuntimeInstance();
if (this.ability is ComboAbility comboAbility)
{ {
isComboAbility = true; isComboAbility = true;
combo = comboAbility; combo = comboAbility;
for (int i = 0; i < combo.comboChain.Count; i++)
{
comboAbilities.Add(combo.comboChain[i].CreateRuntimeInstance());
}
combo.comboChain = comboAbilities;
abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility()); abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility());
} }
else else
{ {
isComboAbility = false; isComboAbility = false;
combo = null; combo = null;
for (int i = 0; i < ability.abilityEffects.Count; i++)
{
effects.Add(ability.abilityEffects[i].CreateRuntimeInstance());
}
this.ability.abilityEffects = effects;
} }
onAbilityKeyBinderSpawned.Raise(this); onAbilityKeyBinderSpawned.Raise(this);
} }
@ -225,11 +245,32 @@ public class AbilityKeyBinder : MonoBehaviour
abilityBindInstance.SetUnlocked(unlocked); abilityBindInstance.SetUnlocked(unlocked);
} }
private void OnDestroy()
{
if (isComboAbility)
{
for (int i = comboAbilities.Count - 1; i >= 0; i--)
{
Destroy(comboAbilities[i]);
}
}
else
{
if (this.ability != null && this.ability.name.ToLower().Contains("clone"))
Destroy(this.ability);
for (int i = effects.Count - 1; i >= 0; i--)
{
Destroy(effects[i]);
}
}
}
private void AdvanceCombo() private void AdvanceCombo()
{ {
comboState.currentComboIndex++; comboState.currentComboIndex++;
comboState.currentComboIndex %= combo.comboChain.Count; comboState.currentComboIndex %= comboAbilities.Count;
abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility()); abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility());
} }
@ -247,14 +288,14 @@ public class AbilityKeyBinder : MonoBehaviour
public BaseAbility GetCurrentAbility() public BaseAbility GetCurrentAbility()
{ {
if (combo.comboChain.Count == 0) return null; if (comboAbilities.Count == 0) return null;
int index = GetCurrentComboIndex(); int index = GetCurrentComboIndex();
return combo.comboChain[index]; return comboAbilities[index];
} }
public int GetComboLength() public int GetComboLength()
{ {
return combo.comboChain.Count; return comboAbilities.Count;
} }
public List<BaseAbility> GetComboChain() public List<BaseAbility> GetComboChain()