// Функция в которой происходит расчет, убит ли враг при такой атаке и защите 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); // жив }
/// <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("------"); }
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; } } } }