Beispiel #1
0
    public void CastSpell(SpellValues spell, CharacterValues caster, Tile currentMouseTile)
    {
        playerBehaviour.aControll.PlayAttack(caster);
        playerBehaviour.aControll.PlaySpell(spell);


        Tile casterTile = gridController.GetTile(caster.currentTile.x, caster.currentTile.z);
        Tile targetTile = currentMouseTile;
        //Tile temp1 = gridController.GetTile(caster.currentTile.x,caster.currentTile.z);
        //Tile temp2 = gridController.GetTile(target.currentTile.x,target.currentTile.z);
        List <Tile> targetsList = abilities.AreaType(currentSpell.mySpellAreaType);
        int         leach       = 0;

        foreach (var item in targetsList)
        {
            PlayerInfo      checker = item.CharCurrentlyOnTile;
            CharacterValues target  = null;
            if (checker)
            {
                target = checker.thisCharacter;
            }

            if (target)
            {
                int damageStuff  = 0;
                int healingIsFun = 0;

                if (spell.healsAlly == true)
                {
                    if (target.team == caster.team)
                    {
                        healingIsFun = TrueHealCalculator(spell.spellHealMax, spell.spellHealMin, target.healsReceived);
                    }
                    else
                    {
                        damageStuff = TrueDamageCalculator(spell.spellDamageMax, spell.spellDamageMin, caster.damageChange, target.armorChange, caster.damagePlus, target.armorPlus);
                    }
                }
                else if (spell.hurtsAlly == false)
                {
                    if (target.team != caster.team)
                    {
                        damageStuff = TrueDamageCalculator(spell.spellDamageMax, spell.spellDamageMin, caster.damageChange, target.armorChange, caster.damagePlus, target.armorPlus);
                    }
                }
                else
                {
                    damageStuff = TrueDamageCalculator(spell.spellDamageMax, spell.spellDamageMin, caster.damageChange, target.armorChange, caster.damagePlus, target.armorPlus);
                }
                leach = leach + damageStuff;
                GetHit(target, damageStuff);
                GetHealed(target, healingIsFun);
                if (spell.effect && spell.effectOnTarget == true && target != caster)
                {
                    sEffects.ApplyEffect(caster, spell.effect, target);
                    playerBehaviour.UpdateTabs();
                }
                if (spell.effect && spell.effectOnCaster == true && target == caster)
                {
                    sEffects.ApplyEffect(caster, spell.effect, target);
                    playerBehaviour.UpdateTabs();
                }
            }
        }
        if (spell.damageStealsHp == true)
        {
            StealHp(caster, leach);
        }
        if (spell.spellPull != 0)
        {
            //abilities.SpellPull(spell.mySpellPullType);
        }
        if (spell.spellPushback != 0)
        {
            //abilities.SpellPush(spell.mySpellPushType);
        }

        if (spell.moveCloserToTarget != 0)
        {
            //abilities.WalkTowardsTarget();
        }
        if (spell.moveAwayFromTarget != 0)
        {
            //abilities.MoveAwayFromTarget();
        }

        if (spell.teleportToTarget == true)
        {
            abilities.CasterTeleport(casterTile);
        }
        if (spell.chagePlaceWithTarget == true)
        {
            abilities.TeleportSwitch(casterTile, targetTile);
        }
        HandleCoolDownIncrease(spell);
        UpdateHpApMp();
    }
    void Update()
    {
        //Mouse/ray setup

        Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;


        if (Physics.Raycast(ray, out hitInfo))
        {
            hitObject = hitInfo.transform.gameObject;

            if (hitObject.CompareTag("Tile"))
            {
                //if (selected)
                //    selected.GetComponent<Renderer>().material = selected.BaseMaterial;
                selected = hitObject.gameObject.GetComponent <Tile>();

                if (selected.myType == Tile.BlockType.BaseBlock && selected != previousTile)
                {
                    // Debug.Log("Tämä on baseblock");


                    if (previousTile)
                    {
                        Renderer pr = previousTile.GetComponent <Renderer>();
                        pr.material  = previousTile.GetComponent <Tile>().BaseMaterial;
                        previousTile = null;
                        if (targetedTiles != null)
                        {
                            ResetTileMaterials(targetedTiles);
                            targetedTiles = null;
                            ChangeTileMaterials(rangeTiles, rangeMaterial);
                            ChangeTileMaterials(nullTiles, rangeNullMaterial);
                        }
                    }
                    previousTile = selected;
                    Renderer sr = selected.GetComponent <Renderer>();
                    sr.material = hovermaterial;
                }
            }
            //Jos hovertile on jotain muuta, resettaa hovertilet
            if (!hitObject.CompareTag("Tile") || (hitObject.CompareTag("Tile") && selected.myType != Tile.BlockType.BaseBlock))
            {
                if (previousTile)
                {
                    Renderer pr = previousTile.GetComponent <Renderer>();
                    pr.material  = previousTile.GetComponent <Tile>().BaseMaterial;
                    previousTile = null;

                    if (targetedTiles != null)
                    {
                        ResetTileMaterials(targetedTiles);
                        targetedTiles = null;
                        ChangeTileMaterials(rangeTiles, rangeMaterial);
                        ChangeTileMaterials(nullTiles, rangeNullMaterial);
                    }
                }
            }
        }

        if (hitInfo.transform == null)
        {
            selected = null;
        }

        // kun spell nappulaa on painettu
        if (spellCast.spellOpen == true)
        {
            if (currentMovement)
            {
                ResetTileMaterials(tilesToBeReset);
                tilesToBeReset.Clear();
                rangeTilesPainted = false;
            }
            //pitäisi maalata target range
            if (rangeTiles == null)
            {
                if (spellCast.currentSpell.needLineOfSight == true)
                {
                    nullTiles = abilities.RangeType(spellCast.currentSpell.mySpellRangeType, true);
                    foreach (var tile in nullTiles)
                    {
                        Renderer aR = tile.GetComponent <Renderer>();
                        aR.material = rangeNullMaterial;
                    }

                    rangeTiles = abilities.RangeType(spellCast.currentSpell.mySpellRangeType, false);
                    foreach (var tile in rangeTiles)
                    {
                        Renderer aR = tile.GetComponent <Renderer>();
                        aR.material = rangeMaterial;
                    }
                }
                else
                {
                    rangeTiles = abilities.RangeType(spellCast.currentSpell.mySpellRangeType, false);
                    foreach (var tile in rangeTiles)
                    {
                        Renderer aR = tile.GetComponent <Renderer>();
                        aR.material = rangeMaterial;
                    }
                }
            }

            //pitäisi maalata AOE tilet
            targetedTiles = abilities.AreaType(spellCast.currentSpell.mySpellAreaType);
            foreach (var tile in rangeTiles)
            {
                if (tile == selected)
                {
                    ChangeTileMaterials(targetedTiles, targetMaterial);
                }
            }

            // kun spell castataan
            if (Input.GetMouseButtonDown(0) && !stillMoving && spellCast.currentSpell != null)
            {
                if (abilities.CheckCastability(spellCast.currentSpell, selected) == true)
                {
                    if (targetedTiles != null)
                    {
                        spellCast.CastSpell(spellCast.currentSpell, playerBehaviour.currentCharacter, selected);
                        foreach (var tile in rangeTiles)
                        {
                            Renderer tr = tile.GetComponent <Renderer>();
                            tr.material = tile.GetComponent <Tile>().BaseMaterial;
                        }
                        rangeTiles = null;
                        foreach (var target in targetedTiles)
                        {
                            Renderer ar = target.GetComponent <Renderer>();
                            ar.material = target.GetComponent <Tile>().BaseMaterial;
                        }
                        targetedTiles = null;
                        spellCast.Aftermath();
                    }
                    else
                    {
                        spellCast.SpellCancel();
                    }
                }
                else
                {
                    Debug.Log("cannot be cast");
                    spellCast.SpellCancel();
                }
            }


            // spell cansellataan
            if (Input.GetMouseButtonDown(1))
            {
                //if (rangeTiles != null)
                //{
                //    ResetTileMaterials(rangeTiles);
                //    rangeTiles = null;
                //}
                //if (targetedTiles != null)
                //{
                //    ResetTileMaterials(targetedTiles);
                //    targetedTiles = null;
                //}
                spellCast.SpellCancel();
            }
            movementEnabled = false;
        }
        else
        {
            movementEnabled = true;
        }

        if (movementEnabled)
        {
            if (!currentMovement)
            {
                Debug.Log("Movement still not set!");
            }

            if (!rangeTilesPainted || selected == null)
            {
                ResetTileMaterials(tilesToBeReset);
                tilesToBeReset.Clear();
                movementRangeTiles = currentMovement.TilesInRange();
                ChangeTileMaterials(movementRangeTiles, movementMaterial);
                tilesToBeReset.AddRange(movementRangeTiles);
                rangeTilesPainted = true;
            }

            ChangeTileMaterials(movementRangeTiles, movementMaterial);  //otherwise hovering over resets the tiles
            if (movementRangeTiles.Contains(selected))
            {
                //Hae reitti ja maalaa se
                PlayerMovement.PathTile tempTest = currentMovement.pathTiles.Where(x => x._tile == selected).FirstOrDefault();
                if (tempTest != null)
                {
                    tilesInPath = PlayerMovement.CalculateRouteBack(tempTest);
                    ChangeTileMaterials(tilesInPath, pathMaterial);
                    Renderer sr = selected.GetComponent <Renderer>();
                    sr.material = pathSelectedMaterial;
                    huijaus     = tempTest;
                }
                else
                {
                    huijaus = null;
                }
            }

            if (Input.GetMouseButtonDown(0) &&
                !stillMoving &&
                selected != currentMovement.CurrentTile &&
                movementRangeTiles.Contains(selected))
            {
                if (currentMovement.MoveToTile(selected, PlayerMovement.MovementMethod.Walk, huijaus))
                {
                    if (!currentMovement.unlimitedMovementPoints)
                    {
                        currentMovement.playerInfo.thisCharacter.currentMp -= (tilesInPath.Count() - 2);
                    }
                }

                ResetTileMaterials(tilesToBeReset);
                tilesToBeReset.Clear();
                rangeTilesPainted = false;
                spellCast.UpdateHpApMp();
            }
        }
    }