// Update is called once per frame void Update() { if (first) { bool firstEnemy = true; int count = -1; foreach (SimulationEnemy se in sm.Enemies) { if (firstEnemy) { EnemyText = GameObject.Find("InfoPanel").transform.Find("Enemy").gameObject; //EnemyText.transform.Find("Value").gameObject.GetComponent<TextMeshPro>().text = "||||||||||"; EnemyHealth.Add(se, EnemyText); firstEnemy = false; } else { GameObject go = Instantiate(EnemyText, new Vector3(EnemyText.transform.position.x, (EnemyText.transform.position.y - 10f - 30f * count++) * Multi, 0), Quaternion.identity, GameObject.Find("InfoPanel").transform); EnemyHealth.Add(se, go); } } first = false; } foreach (var pair in EnemyHealth) { SimulationEnemy se = pair.Key; GameObject go = pair.Value; if (se.health > 0) { go.transform.Find("Value").GetComponent <TextMeshProUGUI>().text = "||||||||||".Substring(0, (int)(se.health / se.maxHealth * 10f)); } else { go.transform.Find("Value").GetComponent <TextMeshProUGUI>().text = ""; } } Hull.text = Math.Round(sm.pm.health, 1).ToString(); Heat.text = Math.Round(sm.pm.currentHeat, 1).ToString(); input.Select(); if (Input.GetKeyDown(KeyCode.Return)) { string inputString = input.text; if (inputString.ToLower() == "enemy") { StartCoroutine(EnemyLog()); } if (inputString.ToLower() == "player") { StartCoroutine(PlayerLog()); } if (inputString.ToLower() == "turn") { NextTurn(); } input.text = ""; input.ActivateInputField(); input.Select(); } }
public float ChanceToHit(Weapon wep, SimulationEnemy enemy) { float distance = Mathf.Abs(enemy.xpos - playerXPos); float spreadhalfDist = Mathf.Tan(wep.spreadDeg * Mathf.Deg2Rad) * distance; float chanceToHitFromSpread = enemy.size / spreadhalfDist * 2; float chanceToHitFromVelocity = (40f / (40 + distance)) * (wep.velocity / (enemy.movement / 10f)); return(chanceToHitFromSpread * chanceToHitFromVelocity); }
void Start() { pm = GameObject.Find("PlayerManager").GetComponent <PlayerManager>(); ps = pm.ps; for (int i = 0; i < 5; i++) { Enemies.Add(SimulationEnemy.GenerateEnemy(0, i)); } timeLeftInTurn = TURNTIME; timeTillNextFire = 0; }
public static SimulationEnemy GenerateEnemy(int level, int enemyNumber) { SimulationEnemy se = new SimulationEnemy() { attackType = (EnemyAttackType)UnityEngine.Random.Range(0, Enum.GetValues(typeof(EnemyAttackType)).Length), maxHealth = 10, health = 10, attackDamage = 10, movement = 10, attackTime = 2, xpos = UnityEngine.Random.Range(-20, 20), size = 0.5f, timeTillNextAttack = 0, name = enemyNumber.ToString() }; if (se.attackType == EnemyAttackType.ranged) { se.attackDamage = 5; } return(se); }
public void PlayerTurn() { //let the player go first //find highest chance to hit enemy and fire Dictionary <SimulationEnemy, float> enemies_hitchance = new Dictionary <SimulationEnemy, float>(); foreach (SimulationEnemy enemy in Enemies) { float chanceToHit = ChanceToHit(pm.MainWeapon, enemy); enemies_hitchance.Add(enemy, chanceToHit); } enemies_hitchance = enemies_hitchance.OrderByDescending(p => p.Value).ToDictionary(p => p.Key, p => p.Value); while (timeLeftInTurn > timeTillNextFire && Enemies.Any(p => p.health > 0)) { SimulationEnemy target = enemies_hitchance.FirstOrDefault(p => p.Key.health > 0).Key; float chanceToHit = enemies_hitchance.FirstOrDefault(p => p.Key.health > 0).Value; //if chance to hit is too low, move closer if (chanceToHit < .75f && Mathf.Abs(target.xpos - playerXPos) > 1) { //move in .1s incriments float movement = pm.playerMovementPerTurn / 10f; if (target.xpos - playerXPos > 0) { playerXPos += movement; } else { playerXPos -= movement; } playerLog[turn] += ($"Too far ACC is {chanceToHit}, moving to closest enemy {target.name} at {target.xpos}\n"); timeLeftInTurn -= .1f; timeTillNextFire -= .1f; if (timeTillNextFire < 0) { timeTillNextFire = 0; } foreach (SimulationEnemy enemy in Enemies) { enemies_hitchance[enemy] = ChanceToHit(pm.MainWeapon, enemy); } } else { if (pm.currentHeat < pm.maxHeat) { timeLeftInTurn -= timeTillNextFire; timeTillNextFire = pm.MainWeapon.shootTime; //FIRE pm.currentHeat += pm.MainWeapon.heatOutputPerShot; float damage = 0; for (int i = 0; i < pm.MainWeapon.projectileCount; i++) { if (UnityEngine.Random.Range(0, 100) > (1 - (chanceToHit * 100f))) { damage += pm.MainWeapon.bulletDamage; } } float preDamageHealth = target.health; target.health -= damage; if (damage > 0) { playerLog[turn] += ($"Hit Enemy_{target.name} for {damage}, has {target.health} health left\n"); } else { playerLog[turn] += ($"Missed OV: {pm.currentHeat}\n"); } if (preDamageHealth < damage) { playerLog[turn] += ($"Killed Enemy_{target.name}\n"); } } else { //overheated, need to vent if (pm.currentHeat > pm.maxHealth / 2f) //good health, can vent to zero { while (timeLeftInTurn > 0 || pm.currentHeat < 0f) { timeLeftInTurn -= .1f; timeTillNextFire -= .1f; if (timeTillNextFire < 0) { timeTillNextFire = 0; } pm.currentHeat -= pm.ventPerSecond / 10f; playerLog[turn] += ($"Venting, currently at {pm.currentHeat}\n"); } } else //too low, vent to 50% { while (timeLeftInTurn > 0 || pm.currentHeat > pm.maxHeat / 2f) { timeLeftInTurn -= .1f; timeTillNextFire -= .1f; if (timeTillNextFire < 0) { timeTillNextFire = 0; } pm.currentHeat -= pm.ventPerSecond / 10f; playerLog[turn] += ($"Venting, currently at {pm.currentHeat}\n"); } } } } if (!Enemies.Any(p => p.health > 0)) { playerLog[turn] += ("All Enemies Dead\n"); break; } } timeTillNextFire -= timeLeftInTurn; if (timeTillNextFire < 0) { timeTillNextFire = 0; } timeLeftInTurn = TURNTIME; }