protected bool RangedAttack(unitScript unit, unitScript clickedUnit, bool initialAttack = true) { // Check LoS if (!canSee(unit, clickedUnit)) { return(false); } if (hitShield(unit, clickedUnit)) { return(true); } //Resolve Attack float roll = UnityEngine.Random.Range(0.0f, 1.0f); float chanceToHit = rangedChanceToHit(unit, clickedUnit); print(roll + " " + chanceToHit); if (roll < chanceToHit) { clickedUnit.takeDamage(unit.getCurrentWeapon().damage); } else { clickedUnit.displayMiss(); } unit.activateAttack(); if (initialAttack && clickedUnit.getStrikeback() == false) { bool result; if (clickedUnit.getCurrentWeapon().type == WeaponType.melee) { result = MeleeAttack(clickedUnit, unit, false); } else if (clickedUnit.getCurrentWeapon().type == WeaponType.ranged) { result = RangedAttack(clickedUnit, unit, false); } else { result = false; } if (result) { clickedUnit.useStrikeback(); } } return(true); }
protected bool activateShield(unitScript unit, GridItem position) { if (!(unit.getCurrentWeapon().type == WeaponType.shield)) { return(false); } Shield currentShield = (Shield)unit.getCurrentWeapon(); if (currentShield.isBroken(unit.GetInstanceID())) { return(false); } if (currentShield.getShield(unit.GetInstanceID()) != null) { Destroy(currentShield.getShield(unit.GetInstanceID())); } //Check position is within range if (currentShield == null || Vector2.Distance(unit.GetComponent <GridItem>().getPos(), position.getPos()) > currentShield.range) { return(false); } //Create the game object //TODO- Fix the roation and shape of shields to be frontal not surround Vector3 toPosition = position.getVectorPostion() - unit.GetComponent <GridItem>().getVectorPostion(); float rotation = Vector3.Angle(new Vector3(0, 0, 1), Vector3.Cross(toPosition, new Vector3(0, 1, 0))); print(rotation); GameObject newShield = Instantiate <GameObject>(Resources.Load <GameObject>("Units/Shield"), position.getVectorPostion(), Quaternion.Euler(0, rotation, 0)); currentShield.setShield(unit.GetInstanceID(), newShield); newShield.GetComponent <shieldScript>().setStats(controllerID, unit.getSmarts() * 3); //Check it's collisions with other shields currentShield.shieldBreakCheck(); unit.activateAttack(); print("ACTIVATE SHIELD"); map.UnHilightMap(); return(true); }
protected bool MeleeAttack(unitScript unit, unitScript clickedUnit, bool initialAttack = true) { // Check attack can occur if (unit.getCurrentWeapon().type == WeaponType.ranged || unit == null || clickedUnit == null) { return(false); } float distance = Vector2.Distance(unit.GetComponent <GridItem>().getPos(), clickedUnit.GetComponent <GridItem>().getPos()); if (!(unit.getCurrentWeapon().type == WeaponType.melee) || distance > ((MeleeWeapon)unit.getCurrentWeapon()).range) { return(false); } // Given it can roll the dice float roll = UnityEngine.Random.Range(0.0f, 1.0f); float chanceToHit = meleeChanceToHit(unit, clickedUnit); print(roll + " " + chanceToHit); if (roll < chanceToHit) { clickedUnit.takeDamage(unit.getStrength() + unit.getCurrentWeapon().damage); } else { clickedUnit.displayMiss(); } unit.activateAttack(); if (initialAttack && clickedUnit.getStrikeback() == false) { bool result = MeleeAttack(clickedUnit, unit, false); if (result) { clickedUnit.useStrikeback(); } } return(true); }