Exemple #1
0
    public void AttackSlot(int index, Slots attackedSlots, int damage, Health targetHealth)
    {
        if (damage == 0)
        {
            return;
        }

        var damageText = GameObject.Instantiate <DamageText>(damageTextPrefab);

        damageText.SetNumber(damage);

        var        slot = attackedSlots.slots[index];
        GameObject card = slot.occupied ? slot.objectInSlot : null;

        if (card == null) // No defender, hit face
        {
            //WARN copypasta from line 288!
            damageText.owner = targetHealth.owner;

            var tag = (damageText.owner == Owner.Player ? "Player" : "Enemy") + index;
            damageText.transform.position = GameObject.Find(tag).transform.position;

            targetHealth.DealDamage(damage);
        }
        else // Make defender take damage
        {
            CardInLane defender = card.GetComponent <CardInLane>();
            if (defender.cardType == Card.CardType.Monster)
            {
                damageText.owner = defender.owner;
                damageText.transform.position = defender.transform.position;

                int defenderHp = defender.TakeDamage(damage);
                if (defenderHp <= 0)
                {
                    Remove(defender);
                }
            }
            else
            {
                damageText.owner = targetHealth.owner;

                var tag = (damageText.owner == Owner.Player ? "Player" : "Enemy") + index;
                damageText.transform.position = GameObject.Find(tag).transform.position;

                // Attack bypasses spells, take face dmg
                targetHealth.DealDamage(damage);
            }
        }
    }
Exemple #2
0
    public void Remove(CardInLane cardInLane)
    {
        var card = GameObject.Instantiate <Card>(cardPrefab);

        card.SetOwner(cardInLane.owner);
        card.SetCardModel(cardInLane.card);

        cardInLane.slot.Release();

        card.transform.position = cardInLane.transform.position;
        card.SetInLane(); //TODO add the slot here?
        card.Discard();

        //TODO show death effect or something?

        Destroy(cardInLane.gameObject);
    }
Exemple #3
0
    private int FindLowestHealth()
    {
        CardInLane weakestCard  = null;
        var        weakestSlots = new List <int>();

        for (var i = 0; i < 5; i++)
        {
            var slot = LaneManager.instance.playerSlots.slots[i];
            if (slot.occupied && LaneManager.instance.enemySlots.IsOpenAt(i))
            {
                var card = slot.objectInSlot.GetComponent <CardInLane>();
                if (card != null && card.cardType == Card.CardType.Monster)
                {
                    if (weakestCard == null)
                    {
                        weakestCard = card;
                        weakestSlots.Add(i);
                    }
                    else if (weakestCard.currHp == card.currHp)
                    {
                        weakestSlots.Add(i);
                    }
                    else if (weakestCard.currHp > card.currHp)
                    {
                        weakestCard = card;
                        weakestSlots.Clear();
                        weakestSlots.Add(i);
                    }
                }
            }
        }

        if (weakestSlots.Count > 0)
        {
            return(weakestSlots[UnityEngine.Random.Range(0, weakestSlots.Count)]);
        }
        else
        {
            return(FindBiggestAttacker());
        }
    }
Exemple #4
0
    private void OnPlayed()
    {
        if (!AssertState(State.Playing))
        {
            return;
        }

        if (cardModel.prototype.inLanePrefab != null)
        {
            GameObject laneObject = GameObject.Instantiate(cardModel.prototype.inLanePrefab);

            laneObject.transform.position = currSlot.transform.position;
            CardInLane card = laneObject.GetComponent <CardInLane>();
            card.SetOwner(owner);
            card.SetCardModel(cardModel);
            card.SetSlot(currSlot);
            card.cardType = cardType; //TODO should probably be in CardPrototype
            SpellInLane spell = laneObject.GetComponent <SpellInLane>();
            if (spell != null)
            {
                spell.SetOwner(owner);
                spell.SetCardModel(cardModel);
                spell.SetSlot(currSlot);
            }

            currSlot.Occupy(laneObject);

            //TODO sound effects or whatever (maybe configed on card prototype)
        }
        else
        {
            currSlot.Release();
            currSlot = null;
        }

        Destroy(gameObject);
    }
Exemple #5
0
    public void Attack()
    {
        // Reset dmg queues
        for (int i = 0; i < 5; i++)
        {
            playerDamageArray[i] = 0;
            enemyDamageArray[i]  = 0;
        }

        for (int i = 0; i < 5; i++)
        {
            var playerSlot = playerSlots.slots[i];
            var enemySlot  = enemySlots.slots[i];

            GameObject playerCard = playerSlot.occupied ? playerSlot.objectInSlot : null;
            GameObject enemyCard  = enemySlot.occupied ? enemySlot.objectInSlot : null;

            if (playerCard == null && enemyCard == null)
            {
                continue;
            }
            if (playerCard != null)
            {
                CardInLane card = playerCard.GetComponent <CardInLane>();
                if (card.cardType == Card.CardType.Spell)
                {
                    SpellInLane spell = playerCard.GetComponent <SpellInLane>();
                    spell.CountdownSpell(i, true);
                    if (spell.timeToCast == 0)
                    {
                        Remove(spell);
                    }
                }
                else
                {
                    enemyDamageArray[i] += card.GetAttackDamage();
                }
            }
            if (enemyCard != null)
            {
                CardInLane card = enemyCard.GetComponent <CardInLane>();
                if (card.cardType == Card.CardType.Spell)
                {
                    SpellInLane spell = enemyCard.GetComponent <SpellInLane>();
                    spell.CountdownSpell(i, false);
                    if (spell.timeToCast == 0)
                    {
                        Remove(spell);
                    }
                }
                else
                {
                    playerDamageArray[i] += card.GetAttackDamage();
                }
            }
        }
        // Resolve damage queues
        for (int i = 0; i < 5; i++)
        {
            AttackSlot(i, enemySlots, enemyDamageArray[i], enemyHp);
            AttackSlot(i, playerSlots, playerDamageArray[i], playerHp);
        }

        // track a victory!
        if (enemyHp.current <= 0 && playerHp.current <= 0)
        {
            GameManager.instance.Draw();
        }
        else if (playerHp.current <= 0)
        {
            GameManager.instance.Lose();
        }
        //TODO this should do... something else for the boss capture scene
        else if (enemyHp.current <= 0)
        {
            GameManager.instance.Win();
        }
    }