Beispiel #1
0
    /// <summary>
    /// Resets the values to default.
    /// </summary>
    public override void ResetValues()
    {
        base.ResetValues();

        icon        = null;
        description = "";

        itemCategory = ItemCategory.WEAPON;
        weaponType   = WeaponType.NONE;
        attackType   = AttackType.PHYSICAL;
        keyType      = KeyType.STAR;

        cost           = 0;
        maxCharge      = 0;
        researchNeeded = false;
        skillReq       = WeaponRank.NONE;

        power    = 0;
        hitRate  = 0;
        critRate = 0;
        range    = new WeaponRange(1, 1);

        advantageType = new List <MovementType>();
        boost         = new Boost();
    }
    public void OnActivation(EntityController entity)
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (this.weapon is WeaponMelee)
            {
                WeaponMelee weaponMeleeToEquip = this.weapon as WeaponMelee;

                if (entity.entityProperties.weaponMelee != null)
                {
                    Debug.Log("Drop a " + entity.entityProperties.weaponMelee.weaponName + " and get a " + this.weapon.weaponName);

                    weaponPrefab.GetComponent <WeaponDisplay>().weapon = entity.entityProperties.weaponMelee;
                    Instantiate(weaponPrefab, this.transform);
                }
                entity.entityProperties.weaponMelee = weaponMeleeToEquip;
            }
            else if (this.weapon is WeaponRange)
            {
                WeaponRange weaponRangeToEquip = this.weapon as WeaponRange;
                if (entity.entityProperties.weaponRange != null)
                {
                    Debug.Log("Drop a " + entity.entityProperties.weaponRange.weaponName + " and get a " + this.weapon.weaponName);
                    weaponPrefab.GetComponent <WeaponDisplay>().weapon = entity.entityProperties.weaponRange;

                    Instantiate(weaponPrefab, this.transform);
                }

                entity.entityProperties.weaponRange = weaponRangeToEquip;
            }
            Destroy(this.gameObject);
        }
    }
Beispiel #3
0
    // Functions for checking if the character can do stuff.
    #region Can do stuff

    /// <summary>
    /// Takes the range of the character's weapons and checks if any enemy is in range.
    /// </summary>
    /// <returns></returns>
    public bool CanAttack()
    {
        WeaponRange range = inventory.GetReach(ItemCategory.WEAPON);

        if (range.max == 0)
        {
            return(false);
        }
        for (int i = 0; i < enemyList.values.Count; i++)
        {
            if (!enemyList.values[i].IsAlive() || enemyList.values[i].hasEscaped)
            {
                continue;
            }
            int distance = BattleMap.DistanceTo(this, enemyList.values[i]);
            if (range.InRange(distance))
            {
                return(true);
            }
        }
        for (int i = 0; i < battleMap.breakables.Count; i++)
        {
            if (!battleMap.breakables[i].blockMove.IsAlive())
            {
                continue;
            }
            int distance = BattleMap.DistanceTo(this, battleMap.breakables[i]);
            if (range.InRange(distance))
            {
                return(true);
            }
        }
        return(false);
    }
Beispiel #4
0
    public void ShowSupportTiles(MapTile startTile, WeaponRange range, Faction faction, bool isDanger, bool isBuff)
    {
        if (isDanger)
        {
            return;
        }

        for (int i = 0; i < tiles.Length; i++)
        {
            int tempDist = DistanceTo(startTile, tiles[i]);
            if (!range.InRange(tempDist))
            {
                continue;
            }

            if (tiles[i].IsEmpty())
            {
                tiles[i].supportable = true;
            }
            else if (tiles[i].currentCharacter.faction == faction)
            {
                if (isBuff || tiles[i].currentCharacter.IsInjured())
                {
                    tiles[i].supportable = true;
                }
            }
        }
    }
Beispiel #5
0
        private void applyRangeAttributes(WeaponRange weaponRange, RangeBasedWeaponAttributesPatch rangePatch, WeaponAttributesWrapper weaponWrapper)
        {
            if (rangePatch == null)
            {
                return;
            }

            var ranges = weaponWrapper.Ranges;

            var newRanges = ranges.Where(r => r.Range < weaponRange);

            var range = ranges.SingleOrDefault(r => r.Range == weaponRange);

            using (logger.BeginScope($"RangeAttributes{weaponRange}:"))
            {
                if (rangePatch.Remove)
                {
                    logger.Log("(removed)");
                }
                else
                {
                    RangeBasedWeaponAttributesWrapper rangeWrapper;

                    if (range != null)
                    {
                        rangeWrapper = new RangeBasedWeaponAttributesWrapper(range);
                    }
                    else
                    {
                        logger.Log("(created)");
                        rangeWrapper = new RangeBasedWeaponAttributesWrapper(weaponRange);
                    }

                    ApplyRangeBasedWeaponAttributesPatch(rangePatch, rangeWrapper);

                    newRanges = newRanges.Concat(new[] { rangeWrapper });
                }
            }

            newRanges = newRanges.Concat(ranges.Where(r => r.Range > weaponRange));

            weaponWrapper.Ranges = newRanges.ToArray();
        }
Beispiel #6
0
    /// <summary>
    /// Adds attackable to all tiles surrounding the character depending on range.
    /// </summary>
    /// <param name="range1"></param>
    /// <param name="range2"></param>
    public void ShowAttackTiles(WeaponRange range, int damage)
    {
        if (!IsAlive())
        {
            return;
        }

        for (int i = 0; i < battleMap.tiles.Length; i++)
        {
            if (range.InRange(BattleMap.DistanceTo(this, battleMap.tiles[i])))
            {
                battleMap.tiles[i].attackable = true;
                if (damage >= currentHealth)
                {
                    damage += 100;
                }
                battleMap.tiles[i].value = damage;
            }
        }
    }
Beispiel #7
0
    /// <summary>
    /// Shows which tiles are attackable from the startTile given the weapon range.
    /// isDanger is used to show the enemy danger area.
    /// </summary>
    /// <param name="startTile"></param>
    /// <param name="range"></param>
    /// <param name="faction"></param>
    /// <param name="isDanger"></param>
    public void ShowAttackTiles(MapTile startTile, WeaponRange range, Faction faction, bool isDanger)
    {
        for (int i = 0; i < tiles.Length; i++)
        {
            int tempDist = DistanceTo(startTile, tiles[i]);
            if (!range.InRange(tempDist))
            {
                continue;
            }

            if (isDanger)
            {
                tiles[i].dangerous = true;
            }
            else if (tiles[i].IsEmpty() || tiles[i].currentCharacter.faction != faction)
            {
                tiles[i].attackable = true;
            }
        }
    }
Beispiel #8
0
    /// <summary>
    /// Takes a list of characters and finds all which are in range and picks one randomly.
    /// </summary>
    /// <param name="list"></param>
    /// <param name="category"></param>
    /// <param name="checkInjured"></param>
    /// <returns></returns>
    private MapTile FindRandomTarget(List <TacticsMove> list, ItemCategory category, bool checkInjured)
    {
        List <MapTile> hits  = new List <MapTile>();
        WeaponRange    range = inventory.GetReach(category);

        for (int i = 0; i < list.Count; i++)
        {
            if (list[i] == this || !list[i].IsAlive() || (checkInjured && !list[i].IsInjured()))
            {
                continue;
            }
            int distance = BattleMap.DistanceTo(this, list[i]);
            if (range.InRange(distance))
            {
                hits.Add(list[i].currentTile);
            }
        }

        hits.Shuffle();
        return(hits[0]);
    }
Beispiel #9
0
        int IComparable <BProtoObjectVeterancy> .CompareTo(BProtoObjectVeterancy other)
        {
            if (XP != other.XP)
            {
                return(XP.CompareTo(other.XP));
            }

            if (Damage != other.Damage)
            {
                return(Damage.CompareTo(other.Damage));
            }

            if (Velocity != other.Velocity)
            {
                return(Velocity.CompareTo(other.Velocity));
            }

            if (Accuracy != other.Accuracy)
            {
                return(Accuracy.CompareTo(other.Accuracy));
            }

            if (WorkRate != other.WorkRate)
            {
                return(WorkRate.CompareTo(other.WorkRate));
            }

            if (WeaponRange != other.WeaponRange)
            {
                return(WeaponRange.CompareTo(other.WeaponRange));
            }

            if (DamageTaken != other.DamageTaken)
            {
                return(DamageTaken.CompareTo(other.DamageTaken));
            }

            return(0);
        }
Beispiel #10
0
    /// <summary>
    /// Adds supportable to all tiles surrounding the character depending on range.
    /// </summary>
    /// <param name="range1"></param>
    /// <param name="range2"></param>
    public void ShowSupportTiles(WeaponRange range, bool isBuff)
    {
        if (!IsAlive())
        {
            return;
        }

        for (int i = 0; i < battleMap.tiles.Length; i++)
        {
            if (range.InRange(BattleMap.DistanceTo(this, battleMap.tiles[i])))
            {
                battleMap.tiles[i].supportable = true;
                if (isBuff)
                {
                    battleMap.tiles[i].value = 5;
                }
                else
                {
                    battleMap.tiles[i].value = stats.hp - currentHealth;
                }
            }
        }
    }
Beispiel #11
0
    /// <summary>
    /// Takes the range of the character's staffs and checks if any supportable is in range.
    /// </summary>
    /// <returns></returns>
    public bool CanSupport()
    {
        WeaponRange range = inventory.GetReach(ItemCategory.SUPPORT);

        if (range.max == 0)
        {
            return(false);
        }

        List <InventoryTuple> staffs = inventory.GetAllUsableItemTuple(ItemCategory.SUPPORT);
        bool isBuff = false;

        for (int i = 0; i < staffs.Count; i++)
        {
            if (staffs[i].weaponType == WeaponType.BARRIER)
            {
                isBuff = true;
                break;
            }
        }

        for (int i = 0; i < playerList.values.Count; i++)
        {
            bool usable = (playerList.values[i].IsAlive() && playerList.values[i].IsInjured() || isBuff);
            if (!usable || playerList.values[i] == this)
            {
                continue;
            }
            int distance = BattleMap.DistanceTo(this, playerList.values[i]);
            if (range.InRange(distance))
            {
                return(true);
            }
        }
        return(false);
    }
Beispiel #12
0
    /// <summary>
    /// Takes a weapon and shows the possible tiles it can be used on to define where the AI
    /// can do things. Each opponent or each ally depending on weapon type.
    /// </summary>
    /// <param name="weapon"></param>
    private void GenerateHitTiles(List <InventoryTuple> weapons)
    {
        battleMap.ResetMap();

        //Sort characters
        enemies.Clear();
        friends.Clear();
        if (faction == Faction.ALLY)
        {
            for (int i = 0; i < enemyList.values.Count; i++)
            {
                if (enemyList.values[i].IsAlive() && !enemyList.values[i].hasEscaped)
                {
                    enemies.Add(enemyList.values[i]);
                }
            }
            for (int i = 0; i < playerList.Count; i++)
            {
                if (playerList.values[i].IsAlive() && !playerList.values[i].hasEscaped)
                {
                    friends.Add(playerList.values[i]);
                }
            }
            for (int i = 0; i < allyList.Count; i++)
            {
                if (this != allyList.values[i] && allyList.values[i].IsAlive() && !allyList.values[i].hasEscaped)
                {
                    friends.Add(allyList.values[i]);
                }
            }
        }
        else if (faction == Faction.ENEMY)
        {
            for (int i = 0; i < enemyList.values.Count; i++)
            {
                if (this != enemyList.values[i] && enemyList.values[i].IsAlive() && !enemyList.values[i].hasEscaped)
                {
                    friends.Add(enemyList.values[i]);
                }
            }
            for (int i = 0; i < playerList.Count; i++)
            {
                if (playerList.values[i].IsAlive() && !playerList.values[i].hasEscaped)
                {
                    enemies.Add(playerList.values[i]);
                }
            }
            for (int i = 0; i < allyList.Count; i++)
            {
                if (allyList.values[i].IsAlive() && !allyList.values[i].hasEscaped)
                {
                    enemies.Add(allyList.values[i]);
                }
            }
        }

        //Calculate range

        //Generate attack/support tiles
        if (weapons[0].itemCategory == ItemCategory.WEAPON)
        {
            int         damage = BattleCalc.CalculateDamage(weapons[0], stats);
            WeaponRange reach  = inventory.GetReach(ItemCategory.WEAPON);
            for (int i = 0; i < enemies.Count; i++)
            {
                int defense = (weapons[0].attackType == AttackType.PHYSICAL) ? enemies[i].stats.def : enemies[i].stats.mnd;
                enemies[i].ShowAttackTiles(reach, damage - defense);
            }
        }
        else
        {
            WeaponRange reach = inventory.GetReach(ItemCategory.SUPPORT);
            for (int i = 0; i < friends.Count; i++)
            {
                bool isBuff = (weapons[0].weaponType == WeaponType.BARRIER);
                if (isBuff || friends[i].IsInjured())
                {
                    friends[i].ShowSupportTiles(reach, isBuff);
                }
            }
        }
    }
Beispiel #13
0
 public Sprite GetIcon(WeaponRange range) => WeaponRangeIcons[(int)range];
Beispiel #14
0
 void SwapWeapon(PropWeaponUserRangePlayer userRangePlayer)
 {
     weapon = (WeaponRange)userRangePlayer.GetWeapon();
     UpdateUI();
 }
 public RangeBasedWeaponAttributesWrapper(WeaponRange range)
 {
     Range = range;
 }