private bool CheckReq(TacticsMove user, TacticsMove enemy) { bool terrainOk = false; for (int i = 0; i < terrainReq.Count; i++) { if (user.currentTile.terrain == terrainReq[i]) { terrainOk = true; break; } } int dist = BattleMap.DistanceTo(user, enemy); bool rangeOk = (range <= dist && dist <= rangeMax); bool retaliateOk = (enemyCanAttack == EnemyCanAttack.BOTH); if (enemyCanAttack != EnemyCanAttack.BOTH) { InventoryTuple tuple = enemy.GetEquippedWeapon(ItemCategory.WEAPON); bool inRange = (!string.IsNullOrEmpty(tuple.uuid) && tuple.InRange(range)); retaliateOk = ((inRange && enemyCanAttack == EnemyCanAttack.ATTACK) || (!inRange && enemyCanAttack == EnemyCanAttack.NO_ATTACK)); } return(retaliateOk && (terrainOk || rangeOk)); }
/// <summary> /// Shows a basic overview of the character with some stats and combat stats. /// </summary> /// <param name="tactics"></param> private void ShowBasicStats(TacticsMove tactics) { if (tactics == null) { return; } StatsContainer stats = tactics.stats; SkillsContainer skills = tactics.skills; menuView.SetActive(true); statsObject.SetActive(false); basicObject.SetActive(true); inventoryObject.SetActive(false); // colorBackground.color = (tactics.faction == Faction.PLAYER) ? // new Color(0.2f,0.2f,0.5f) : new Color(0.5f,0.2f,0.2f); characterName.text = stats.charData.entryName; portrait.enabled = true; portrait.sprite = stats.charData.portraitSet.small; levelClass.text = string.Format("Level {0} {1}", stats.level, stats.currentClass.entryName); healthBar.SetAmount(tactics.currentHealth, tactics.stats.hp); expBar.SetAmount(tactics.stats.currentExp, 100); expBar.gameObject.SetActive(tactics.faction == Faction.PLAYER); weakIcon1.sprite = weaknessIcons.icons[(int)stats.currentClass.classType]; weakIcon1.enabled = (weakIcon1.sprite != null); InventoryTuple weapon = tactics.GetEquippedWeapon(ItemCategory.WEAPON); wpnIcon.sprite = weapon?.icon; wpnIcon.enabled = (weapon != null); wpnName.text = (weapon != null) ? weapon.entryName : "---"; for (int i = 0; i < skillImages.Length; i++) { if (i >= skills.skills.Length || skills.skills[i] == null) { skillImages[i].sprite = noSkillImage; } else { skillImages[i].sprite = skills.skills[i].icon; } } int pwer = BattleCalc.CalculateDamage(weapon, stats); pwrText.text = (pwer != -1) ? "Pwr: " + pwer : "Pwr: --"; int hitrate = BattleCalc.GetHitRate(weapon, stats); hitText.text = (hitrate != -1) ? "Hit: " + hitrate : "Hit: --"; avoidText.text = "Avo: " + (BattleCalc.GetAvoid(stats) + tactics.currentTile.terrain.avoid); for (int i = 0; i < fatigueLevels.Length; i++) { fatigueLevels[i].SetActive(i == tactics.stats.fatigueAmount); } //Terrain boostAvoid.enabled = (tactics.currentTile.terrain.avoid > 0); }
public void GenerateDamageActions() { TacticsMove attacker = attackerTile.value.currentCharacter; TacticsMove defender = defenderTile.value.currentCharacter; dialogue = null; if (defender == null) { showBattleAnim = false; _currentCharacter = attacker; actions.Clear(); actions.Add(new BattleAction(AttackSide.LEFT, BattleAction.Type.DAMAGE, attacker, defenderTile.value.blockMove)); Debug.Log("BLOCK FIGHT!!"); } else { showBattleAnim = useBattleAnimations.value; // Add battle init boosts attacker.ActivateSkills(SkillActivation.INITCOMBAT, defender); attacker.ActivateSkills(SkillActivation.PRECOMBAT, defender); defender.ActivateSkills(SkillActivation.COUNTER, attacker); defender.ActivateSkills(SkillActivation.PRECOMBAT, attacker); _currentCharacter = attacker; InventoryTuple atkTup = attacker.GetEquippedWeapon(ItemCategory.WEAPON); InventoryTuple defTup = defender.GetEquippedWeapon(ItemCategory.WEAPON); actions.Clear(); actions.Add(new BattleAction(AttackSide.LEFT, BattleAction.Type.DAMAGE, attacker, defender)); int range = Mathf.Abs(attacker.posx - defender.posx) + Mathf.Abs(attacker.posy - defender.posy); if (!string.IsNullOrEmpty(defTup.uuid) && defTup.currentCharges > 0 && defender.GetEquippedWeapon(ItemCategory.WEAPON).InRange(range)) { actions.Add(new BattleAction(AttackSide.RIGHT, BattleAction.Type.DAMAGE, defender, attacker)); } //Compare speeds int spdDiff = actions[0].GetSpeedDifference(); if (spdDiff >= doublingSpeed.value) { if (atkTup.currentCharges > 1) { actions.Add(new BattleAction(AttackSide.LEFT, BattleAction.Type.DAMAGE, attacker, defender)); } } else if (spdDiff <= -doublingSpeed.value) { if (!string.IsNullOrEmpty(defTup.uuid) && defTup.currentCharges > 0 && defender.GetEquippedWeapon(ItemCategory.WEAPON).InRange(range)) { actions.Add(new BattleAction(AttackSide.RIGHT, BattleAction.Type.DAMAGE, defender, attacker)); } } TacticsMove quoter = (attacker.faction == Faction.ENEMY) ? attacker : defender; CharEntry triggerer = (attacker.faction == Faction.ENEMY) ? defender.stats.charData : attacker.stats.charData; FightQuote bestFind = null; for (int q = 0; q < quoter.fightQuotes.Count; q++) { if (quoter.fightQuotes[q].triggerer == null) { if (bestFind == null) { bestFind = quoter.fightQuotes[q]; } } else if (quoter.fightQuotes[q].triggerer == triggerer) { bestFind = quoter.fightQuotes[q]; break; } } if (bestFind != null && !bestFind.activated) { dialogue = bestFind.quote; bestFind.activated = true; } } }