тэкс) а теперь вторая часть алгоритма просчета))
в общем, в представленном выше коде для каждого объекта есть своя модель взрыва. соотвественно, после запуска взрыва для каждого объекта вызываеться свой расчет повреждений и по ней ведеться расчет.
если бомба осколочная, и объект
чувтсивтелен: а ето танки,дома, самолеты к осколкам сначала идет расчет осколков вот по такому коду:
количество осколков:
Код:
00022 void computeSplinterParams(float f)
00023 {
00024 float f1 = f * 0.9F;
00025 nSplinters = f1 / 0.015F;
00026 if(nSplinters < 0.5F)
00027 {
00028 nSplinters = 0.0F;
00029 return;
00030 } else
00031 {
00032 return;
00033 }
00034 }
скорость осколков:
Код:
00036 public float computeSplinterSpeed(float f)
00037 {
00038 if(f <= 0.01F)
00039 return 650F;
00040 if(f >= radius)
00041 {
00042 return 150F;
00043 } else
00044 {
00045 float f1 = f / radius;
00046 return 650F * (1.0F - f1) + 150F * f1;
00047 }
00048 }
само поражение от осколков:
Код:
00050 public void computeSplintersHit(Point3d point3d, float f, float f1, float af[])
00051 {
00052 float f2 = (float)point3d.distance(p) - f;
00053 if(f2 <= 0.001F)
00054 {
00055 af[0] = nSplinters * 0.5F;
00056 af[1] = computeSplinterSpeed(f2);
00057 }
00058 float f3 = 3.141593F * f * f;
00059 float f4 = 12.56637F * f2 * f2;
00060 float f5 = (nSplinters * f3) / f4;
00061 if(f5 >= nSplinters * 0.5F)
00062 f5 = nSplinters * 0.5F;
00063 af[0] = f5;
00064 af[1] = computeSplinterSpeed(f2);
00065 }
еще есть для некоторых типов радиус, в котором возможно поражение. он называеться вот так, и рбаотает тоже так:
Код:
static boolean com.maddox.il2.ai.Explosion.killable ( ActorMesh actormesh,
float f,
float f1,
float f2,
float f3
) [static]
Definition at line 126 of file Explosion.java.
00127 {
00128 float f4 = f;
00129 if(f4 <= f1)
00130 return false;
00131 if(f4 >= f2)
00132 {
00133 return true;
00134 } else
00135 {
00136 float f5 = (f4 - f1) / (f2 - f1);
00137 f3 += (1.0F - f3) * f5;
00138 return World.Rnd().nextFloat(0.0F, 1.0F) < f3;
00139 }
00140 }
теперь поехали по типам...
Здания:
расчет:
Код:
{
00077 float f = actormesh.collisionR();
00078 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p);
00079 f1 -= f;
00080 if(f1 >= radius)
00081 return 0.0F;
00082 float f2 = 1.0F - f1 / radius;
00083 f2 *= f2;
00084 if(f2 >= 1.0F)
00085 return power;
00086 else
00087 return f2 * power;
00088 }
условие умиранияот фугасок:
Код:
if(Explosion.killable(this, explosion.receivedPower(this), prop.MIN_TNT, prop.MAX_TNT, prop.PROBAB_DEATH_WHEN_EXPLOSION))
00498 die(explosion.initiator, true);
00499 return;
условие умирания от осколочных бомб:
Код:
float af[] = new float[6];
00480 mesh().getBoundBox(af);
00481 pos.getAbs(p);
00482 p.x = (p.x - (double)af[0]) + (double)(af[3] - af[0]);
00483 p.y = (p.y - (double)af[1]) + (double)(af[4] - af[1]);
00484 p.z = (p.z - (double)af[2]) + (double)(af[5] - af[2]);
00485 float af1[] = new float[2];
00486 explosion.computeSplintersHit(p, mesh().collisionR(), 0.7F, af1);
00487 Explosion _tmp1 = explosion;
00488 float f = 0.015F * af1[1] * af1[1] * 0.5F;
00489 float f1 = ComputeProbabOfPenetrateKill(f, (int)(af1[0] + 0.5F));
00490 if(RndB(f1))
00491 die(explosion.initiator, true);
-------
для поездов, людей, кораблей, ракетной артиллерии(катюш чтоли?), парашютистов, мостов и самолетов: вот етот расчет(если я прально понял)
Код:
{
00092 if(f >= radius)
00093 return 0.0F;
00094 if(f < 1.0F)
00095 return power;
00096 else
00097 return power / (f * f);
00098 }
условие умирания(на примере корабля)
Код:
float f = explosion.power;
00675 Explosion explosion1 = explosion;
00676 if(explosion.powerType == 2 && explosion.chunkName != null)
00677 f *= 0.45F;
00678 float f1;
00679 if(explosion.chunkName != null)
00680 {
00681 float f2 = f;
00682 f2 *= Rnd(1.0F, 1.1F);
00683 if(f2 < prop.stre.EXPLHIT_MIN_TNT)
00684 return;
00685 f1 = f2 / prop.stre.EXPLHIT_MAX_TNT;
00686 } else
00687 {
00688 float f3 = explosion.receivedTNT_1meter(this);
00689 f3 *= Rnd(1.0F, 1.1F);
00690 if(f3 < prop.stre.EXPLNEAR_MIN_TNT)
00691 return;
00692 f1 = f3 / prop.stre.EXPLNEAR_MAX_TNT;
00693 }
00694 life -= f1;
00695 if(life <= 0.0F)
00696 Die(explosion.initiator, -1L, true);
00697 }
------
для танков,артиллерии,машин, самолетов и статических юнитов
вот ето:
Код:
{
00114 float f = actormesh.collisionR();
00115 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - f;
00116 if(f1 <= 0.0F)
00117 return 0.5F * power;
00118 float f2 = 1.0F / (float)Math.pow(f1, 1.2000000476837158D);
00119 if(f2 <= 0.0F)
00120 return 0.0F;
00121 if(f2 >= 0.5F)
00122 f2 = 0.5F;
00123 return f2 * power;
00124 }
условие умирания на прмиере танка:
от осколочных:
Код:
00902 int i = explosion.powerType;
00903 if(explosion == null);
00904 if(i == 1)
00905 {
00906 if(splintersKill(explosion, prop.fnShotPanzer, Rnd(0.0F, 1.0F), Rnd(0.0F, 1.0F), this, 0.7F, 0.25F, prop.PANZER_BODY_FRONT, prop.PANZER_BODY_SIDE, prop.PANZER_BODY_BACK, prop.PANZER_BODY_TOP, prop.PANZER_HEAD, prop.PANZER_HEAD_TOP))
00907 Die(explosion.initiator, false);
00908 }
от остальных бомб:
Код:
else
00909 {
00910 int j = explosion.powerType;
00911 if(explosion == null);
00912 if(j == 2 && explosion.chunkName != null)
00913 {
00914 Die(explosion.initiator, false);
00915 } else
00916 {
00917 float f;
00918 if(explosion.chunkName != null)
00919 f = 0.5F * explosion.power;
00920 else
00921 f = explosion.receivedTNTpower(this);
00922 f *= Rnd(0.95F, 1.05F);
00923 float f1 = prop.fnExplodePanzer.Value(f, prop.PANZER_TNT_TYPE);
00924 if(f1 < 1000F && (f1 <= 1.0F || RndB(1.0F / f1)))
00925 Die(explosion.initiator, true);
00926 }
00927 }
вот такие вот дела)
в общем случае, идет расчет дамага(либо от осколков, либо от фугаса), потом он вычитаеться из лайфбара объекта

иногда добавляетья еще область, в которой поражение зависит от рандома
вот тако оно собсна рассчитывает...теперь зная ети формулы и способы вычисления осталось просчитать исходные параметры так, чтобы получалось похоже на нужный результат

или если совсем косяки в формулах-подрихтовать формулы

токо помните, что рихтовка формул отразиться на всех объектах данного типа!
вводить новые параметры бомб, ровно как и менять типа объектов низя.