Exemplo n.º 1
0
    public void LaunchMissileAndSetup(GameObject missilePrefab)
    {
        rangedAttacking = true;
        GameObject missileCopy = Instantiate(missilePrefab);

        missileCopy.transform.position = GetComponent <TileMovement> ().avatar.position;
        MissileScript missile = missileCopy.GetComponent <MissileScript> ();


        //this means miss
        if (lastAttack.resultingEffect == null)
        {
            List <ATTile> tiles = lastAttack.TargetActor().TileMovement.occupying.TilesWithinRange(1);
            missile.LaunchAt(tiles [Random.Range(0, tiles.Count)]);
        }
        else
        {
            missile.LaunchAt(lastAttack.TargetActor().TileMovement.occupying);
        }

//		UIManager.instance.cameraController.LockOn (missile.transform);

        GenericWeapon unequipped = lastAttack
                                   .actor
                                   .CharSheet
                                   .Unequip(lastAttack.WeaponUsed) as GenericWeapon;

        missile.OnConnectedWithTarget += (MissileScript self) => {
            AttackAnimationHitMoment();
            rangedAttacking = false;
            AttackAnimationEnded();
            if (lastAttack.TypeChoice.IsRanged() && lastAttack.WeaponUsed.IsThrown())
            {
                self.targetTile.AddItemToGround(unequipped);
            }
            //Add item to ground of the last tile hit.
        };

        missile.OnHitBlocker += (MissileScript self, ATTile blocker) => {
            lastAttack.resultingEffect = null;
            AttackAnimationHitMoment();
            rangedAttacking = false;
            AttackAnimationEnded();
            if (lastAttack.TypeChoice.IsRanged() && lastAttack.WeaponUsed.IsThrown())
            {
                self.previousHitTile.AddItemToGround(unequipped);
            }
            //Add item to ground of the player
        };

        lastMissileScript = missile;
    }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        MissileScript missile = (MissileScript)target;

        if (GUILayout.Button("Test Launch"))
        {
            missile.LaunchAt(BattleManager.instance.AllActors() [0].TileMovement.occupying, true);
        }
    }
    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();
                    };
                }
            }
        });
    }