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 finalHealthCost;
public virtual BaseAbility CreateRuntimeInstance()
{
return Instantiate(this);
}
public virtual void Execute(Taggable user)
{
SpendResourcesNecessary(user);

View File

@ -10,4 +10,8 @@ public class BaseEffect : ScriptableObject
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 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)
{
base.Execute(user);

View File

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

View File

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

View File

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