Exemplo n.º 1
0
 // 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();
     }
 }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
 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);
    }
Exemplo n.º 5
0
    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;
    }