public GameObject GetAnimationPrefabByName(MissileScript.MissileAnimationName name) { GameObject anim = null; // con.clips[0].overrideClip.SampleAnimation foreach (NamedAnimationController mapping in animationStore) { if (mapping.name == name) { anim = mapping.animationPrefab; break; } } return(anim); }
public CastRoutine SpellRangedAttack(SpellAttackEffector hit, MissileScript.MissileAnimationName missileName, SpellAttackEffector crit = null, SpellAttackEffector miss = null) { return((AT.Battle.Actor caster,AT.Battle.Action cast,List <AT.ATTile> targets) => { GameObject prefab = MissileAnimationPrefabDispenser.instance.GetAnimationPrefabByName(missileName); foreach (AT.ATTile target in targets) { AttackSituation sit = new AttackSituation(caster.CharSheet,target.FirstOccupant.CharSheet,cast); List <AT.Character.Effect.GenericEffect> resultingEffects = null; ResultType result = sit.GetResult(); switch (result) { case ResultType.HIT: resultingEffects = hit.Invoke(cast,target); break; case ResultType.CRITICAL_HIT: if (crit != null) { resultingEffects = crit.Invoke(cast,target); } break; case ResultType.MISS: if (miss != null) { resultingEffects = miss.Invoke(cast,target); } break; case ResultType.CRITICAL_MISS: //nothing break; } CharacterCastingAnimation castingAnims = caster.GetComponent <CharacterCastingAnimation>(); if (castingAnims != null) { castingAnims.SetupAndDoCastAnimation(cast); castingAnims.OneShotSpellRelease((animationInst) => { GameObject copy = Instantiate(prefab); copy.transform.position = caster.transform.position; MissileScript missile = copy.GetComponent <MissileScript>(); missile.LaunchAt(target,true); //Safe to not worry about unsubbing, thanks to garbage cleanup missile.OnConnectedWithTarget += (MissileScript self) => { if (resultingEffects != null) { foreach (AT.Character.Effect.GenericEffect effect in resultingEffects) { if (target.FirstOccupant != null) { effect.ApplyTo(target.FirstOccupant.CharSheet,cast); } } } //This assumes only one missile. Needs a "Checkin of sorts, to conditionally check on finished" cast.CallOnFinished(); }; }); //ToBe ATOCIJL } else { GameObject copy = Instantiate(prefab); copy.transform.position = caster.transform.position; MissileScript missile = copy.GetComponent <MissileScript>(); missile.LaunchAt(target.transform); //Safe to not worry about unsubbing, thanks to garbage cleanup missile.OnConnectedWithTarget += (MissileScript self) => { if (resultingEffects != null) { foreach (AT.Character.Effect.GenericEffect effect in resultingEffects) { effect.ApplyTo(target.FirstOccupant.CharSheet,cast); } } //This assumes only one missile. Needs a "Checkin of sorts, to conditionally check on finished" cast.CallOnFinished(); }; } } }); }