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); } } }
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); }
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()); } }
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); }
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(); } }