예제 #1
0
    // Функция в которой происходит расчет, убит ли враг при такой атаке и защите
    public bool archerTest(float at, float def, float m, int enemyNumReg, int enemyNumSol)
    {
        if (Random.Range(0, 20) > (def - m))
        {
            DeathBuf r;
            r        = new DeathBuf();
            r.regNum = enemyNumReg;
            r.solNum = enemyNumSol;
            r.time   = Random.Range(0, 1000) / 1000.0f * mainStatic.TACTICPERIOD;
            DeadBuff.put(r);

            return(true); // убит
        }
        return(false);    // жив
    }
예제 #2
0
    /// <summary>
    ///  Здесь вызваем обстрел врага с разными модификатора для каждого солдата
    /// </summary>
    public void archerAt(int NumReg, int NumRegTarg, bool togewer)
    {
        float distance = 0; // Расстояние до полка - цели

        distance = (mainStatic.regiment_stat[NumReg].regPosition - mainStatic.regiment_stat[NumRegTarg].regPosition).magnitude;

        // есть ли прямая видмость, пока есть, но потом добавить рейкасты
        bool DirectView = false;
        // кроме этого, надо понять по направлению
        Vector3 v, b;

        v = (mainStatic.regiment_stat[NumRegTarg].regPosition - mainStatic.regiment_stat[NumReg].regPosition).normalized;
        b = (mainStatic.regiment_stat[NumRegTarg].soldiers[0].transform.position + mainStatic.regiment_stat[NumRegTarg].soldiers[0].transform.forward).normalized;
        /// Если в зоне видимости нулевого солдата, то находится в прямлой видимости
        if (Mathf.Abs(Vector3.Angle(v, b)) < 45)
        {
            DirectView = true;
        }



        // Одно время для залпа
        float RegTipe = Random.Range(0, 1000) / 1000.0f * mainStatic.TACTICPERIOD;// +0.3f;

        for (int t = 0; t < mainStatic.regiment_stat[NumReg].soldiers.Count; t++)
        {
            ArchBuf temp = new ArchBuf();

            if (mainStatic.regiment_stat[NumReg].soldiers[t].archer == true)    // Если он стрелок, добавляем стрелу, производим выстрел
            {
                //Если стрелок - добавляем стрелу


                int r = 0;   ///Атакованный человек
                r = Random.Range(0, mainStatic.regiment_stat[NumRegTarg].soldiers.Count);

                /// определяем три параметра для улетевшей стрелы
                temp.stPos = mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position;
                temp.forw  = Quaternion.LookRotation((mainStatic.regiment_stat[NumRegTarg].soldiers[r].gameObject.transform.position - mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position).normalized + mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.up);
                float dis = (mainStatic.regiment_stat[NumRegTarg].soldiers[r].gameObject.transform.position - mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position).magnitude;
                temp.speed = Mathf.Pow(2, 0.5f) * Mathf.Pow(dis * 9.8f / 2, 0.5f);

                //ArrowBuff.put(temp);

                if (archerCheme.makeBum(mainStatic.regiment_stat[NumReg].soldiers[t].FirstLine,
                                        mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerType,
                                        mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerSkill,
                                        distance,
                                        DirectView) == true)
                {
                    // Если атака успешная

                    if (Random.Range(0, 20) > (mainStatic.regiment_stat[NumRegTarg].soldiers[r].defence - mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerPower))
                    {
                        // Если пробиты доспехи, то надо добавить

                        DeathBuf p;
                        p        = new DeathBuf();
                        p.regNum = NumRegTarg;
                        p.solNum = r;

                        if (togewer == true)
                        {
                            /// Если стреляют все вместе
                            p.time = RegTipe;
                            DeadBuff.put(p);

                            temp.time = RegTipe - dis / temp.speed;
                            Debug.Log(temp.time);
                            ArrowBuff.put(temp);
                        }
                        else
                        {
                            p.time = Random.Range(0, 1000) / 1000.0f * mainStatic.TACTICPERIOD;
                            DeadBuff.put(p);

                            temp.time = p.time - dis / temp.speed;
                            Debug.Log(temp.time);
                            ArrowBuff.put(temp);
                            /// Если стреляют по очереди
                        }
                    }
                }
            }
        }

        Debug.Log("------");
        for (int u = 0; u < ArrowBuff.archBuf.Count; u++)
        {
            //Debug.Log(ArrowBuff.archBuf[u].time);
            //Debug.Log(ArrowBuff.archBuf[u].speed);
        }
        Debug.Log("------");
    }
예제 #3
0
    public static void makeTacticUpdate()
    {
        if (b > 1)
        {
            mainStatic.regiment_stat[0].countTypes();
            mainStatic.regiment_stat[0].typeSpecification = 0;
            mainStatic.regiment_stat[0].rebuilding(2);
            mainStatic.updateRegimentPosition(0);

            b = 0;
        }
        else
        {
            for (int i = 0; i < mainStatic.regiment_stat.Count; i++)
            {
                for (int r = 0; r < mainStatic.regiment_stat[i].officers.Count; r++)
                {
                    OfficerStatement.MakeOfficerStatement(i, r);
                }
            }
        }
        // Очищаем массив со смертями на всяк пожарный
        DeadBuff.Delete();
        ArrowBuff.Delete();

        // счетчик смерти на 0
        mainStatic.deathcount = 0;

        // Удаляем пустые места от убитых солдат + проверка на стойкость
        for (int i = 0; i < mainStatic.regiment_stat.Count; i++)
        {
            int t = 0;
            while (t < mainStatic.regiment_stat[i].soldiers.Count)
            {
                if (mainStatic.regiment_stat[i].soldiers[t] == null)
                {
                    mainStatic.regiment_stat[i].soldiers.RemoveAt(t);
                }
                else
                {
                    t++;
                }
            }

            for (int j = 0; j < mainStatic.regiment_stat[i].soldiers.Count; j++)
            {
                mainStatic.regiment_stat[i].soldiers[j].numSoldier = j;
            }


            //// Все драки прекращаются.
            //mainStatic.regiment_stat[i].stateFighting = false;

            /* Debug.Log("ST");
             * Debug.Log(mainStatic.regiment_stat[i].soldier_count);
             * Debug.Log(mainStatic.regiment_stat[i].prim_soldier_count);
             */
            /// Прохождение теста на панику
            if (mainStatic.regiment_stat[i].soldier_count < (mainStatic.regiment_stat[i].prim_soldier_count / 2))
            {
                mainStatic.regiment_stat[i].statePanic    = true;
                mainStatic.regiment_stat[i].stateFighting = false;
                Debug.Log("PANIC");

                // В какую сторону побежит?
                // Направление в которое побежит
                Vector3 PanicTarget = new Vector3(0, 0, 0);

                for (int s = 0; s < mainStatic.regiment_stat[i].figthMas.Count; s++)
                {
                    if (mainStatic.regiment_stat[mainStatic.regiment_stat[i].figthMas[s]].command != mainStatic.regiment_stat[i].command)
                    {
                        //Debug.Log(PanicTarget);
                        PanicTarget += (mainStatic.regiment_stat[i].regPosition - mainStatic.regiment_stat[mainStatic.regiment_stat[i].figthMas[s]].regPosition).normalized;
                    }
                }
                PanicTarget = PanicTarget.normalized;
                //Debug.Log(PanicTarget);
                float x = PanicTarget.x; float y = PanicTarget.y; float z = PanicTarget.z;

                // Считаем угол между двумя векторами
                if (x >= 0 && z >= 0)
                {
                    mainStatic.regiment_stat[i].angle = Mathf.Acos(z) + 3.1415f / 2;
                }
                if (x > 0 && z < 0)
                {
                    mainStatic.regiment_stat[i].angle = -Mathf.Acos(z) + 3.1415f + 3.1415f / 2;
                }
                if (x <= 0 && z <= 0)
                {
                    mainStatic.regiment_stat[i].angle = Mathf.Acos(z) + 3.1415f + 3.1415f / 2;
                }
                if (x < 0 && z > 0)
                {
                    mainStatic.regiment_stat[i].angle = -Mathf.Acos(-z) + 3.1415f * 2 + 3.1415f / 2;
                }
            }
            if (mainStatic.regiment_stat[i].statePanic == true)
            {
                mainStatic.makeRegimentMove(i, 6.0f);
                mainStatic.updateRegimentPosition(i);
            }

            for (int h = 0; h < mainStatic.regiment_stat.Count; h++)
            {
                mainStatic.regiment_stat[h].figthMas.Clear();
            }
            //mainStatic.regiment_stat[i].figthMas.Clear();
        }

        UpdateEnReg();

        mainStatic.addMeshForBattle();
        mainStatic.dellMeshForBattle();

        // Формируем в каждом полку fightMas в котором содержатся номера полков, которые участвуют с ним в одной схватке
        // Для кажого списка
        for (int y = 0; y < mainStatic.regiment_stat.Count; y++)
        {
            mainStatic.regiment_stat[y].figthMas.Clear();
        }

        for (int y = 0; y < mainStatic.listFigReg.Count; y++)
        {
            // Для каждого элемента в списке одной схватке
            for (int r = 0; r < mainStatic.listFigReg[y].M.Count; r++)
            {
                // Сравнить с каждым другим
                for (int w = 0; w < mainStatic.listFigReg[y].M.Count; w++)
                {
                    if (r != w)
                    {
                        mainStatic.regiment_stat[mainStatic.listFigReg[y].M[r]].
                        figthMas.Add(mainStatic.listFigReg[y].M[w]);
                    }
                }
            }
        }


        /// Раздел в котором добавляем точки для навигации солдат во время боя
        /// Каждый период если полк сражается

        for (int t = 0; t < mainStatic.regiment_stat.Count; t++)
        {
            if (mainStatic.regiment_stat[t].stateFighting == true)
            {
                for (int i = 0; i < mainStatic.regiment_stat[t].figthMas.Count; i++)
                {
                    if (mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].command != mainStatic.regiment_stat[t].command)
                    {
                        mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].make_position();
                        mainStatic.regiment_stat[t].targPos.Clear();

                        Vector3 v3 = new Vector3(0, 0, 0);
                        /// Для клина и каре отдельно!
                        if (mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].regFirstLine < 6 && mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].regLastLine < 8)
                        {
                            v3 = mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[0]
                                 + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[1]
                                 + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[2]
                                 + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[3];
                            v3 = v3 / 4;

                            if (mainStatic.regiment_stat[t].command == 1)
                            {
                                Debug.Log("HUD");
                            }
                            mainStatic.regiment_stat[t].targPos.Add(v3);
                        }
                        else
                        {
                            Vector3 v5 = mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[0]
                                         + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[1]
                                         + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[2]
                                         + mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[3];
                            v5 /= 4;
                            mainStatic.regiment_stat[t].targPos.Add(v5);

                            /// Сдвигаемся на 6 в сторону, если там есть солдат,
                            bool  fl = true;
                            float j  = 6;
                            while (fl == true)
                            {
                                if (j < mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].regFirstLine / 2)
                                {
                                    v3 = v5 + j * mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].regDistanseLine * (mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[1] - mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[0]).normalized;
                                    mainStatic.regiment_stat[t].targPos.Add(v3);
                                    v3 = v5 - j * mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].regDistanseLine * (mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[1] - mainStatic.regiment_stat[mainStatic.regiment_stat[t].figthMas[i]].Position_Reg[0]).normalized;
                                    mainStatic.regiment_stat[t].targPos.Add(v3);

                                    if (mainStatic.regiment_stat[t].command == 1)
                                    {
                                        Debug.Log("HUD2");
                                    }
                                    j += 6;
                                }
                                else
                                {
                                    fl = false;
                                }
                            }
                        }
                    }
                }
            }
        }



        // Найти сражающиеся полки и для каждого солдата участника вызвать атаку
        for (int t = 0; t < mainStatic.regiment_stat.Count; t++)
        {
            if (mainStatic.regiment_stat[t].stateFighting == true)
            {
                for (int r = 0; r < mainStatic.regiment_stat[t].soldiers.Count; r++)
                {
                    mainStatic.regiment_stat[t].soldiers[r].at();
                }
            }
        }

        // Сортируем смерти по времени исполения
        DeadBuff.mySort();

        // Сортируем стрелы по времени
        ArrowBuff.mySort();

        // Удалим повторяющиеся
        mainStatic.t0 = Time.time;

        for (int t = 0; t < mainStatic.regiment_stat.Count; t++)
        {
            if (mainStatic.regiment_stat[t].stateFighting == false)
            {
                if (mainStatic.regiment_stat[t].orderForw == true)
                {
                    mainStatic.makeRegimentMove(t, 1.0f);
                    mainStatic.updateRegimentPosition(t);
                    mainStatic.regiment_stat[t].orderForw = false;
                }

                if (mainStatic.regiment_stat[t].orderBack == true)
                {
                    mainStatic.makeRegimentMove(t, -1.0f);
                    mainStatic.updateRegimentPosition(t);
                    mainStatic.regiment_stat[t].orderBack = false;
                }

                if (mainStatic.regiment_stat[t].orderRotW == true)
                {
                    mainStatic.makeRegimentRotation(t, +.3f);
                    mainStatic.updateRegimentPosition(t);
                    mainStatic.regiment_stat[t].orderRotW   = false;
                    mainStatic.regiment_stat[t].delta_angle = 0;
                }
                if (mainStatic.regiment_stat[t].orderRotL == true)
                {
                    mainStatic.makeRegimentRotation(t, -.3f);
                    mainStatic.updateRegimentPosition(t);
                    mainStatic.regiment_stat[t].orderRotL   = false;
                    mainStatic.regiment_stat[t].delta_angle = 0;
                }
                if (mainStatic.regiment_stat[t].archTotewer == true)
                {
                    mainStatic.regiment_stat[t].archerAt(t, TactUpdate.nearestReg(t), true);
                    mainStatic.regiment_stat[t].archTotewer = false;
                }
                if (mainStatic.regiment_stat[t].archAlone == true)
                {
                    mainStatic.regiment_stat[t].archerAt(t, TactUpdate.nearestReg(t), false);
                    mainStatic.regiment_stat[t].archAlone = false;
                }
            }
        }
    }