Любовь к странным заголовкам у меня непреходяща, есть такой грешок. Тем, кто читал книгу братьев Стругацких "Трудно быть богом", прекрасно известно имя арканарского министра Охраны Короны и кем он был, так сказать, как личность. Пусть и вымышленная, но очень реальная, как ни странно. А еще я бы посоветовал поискать статьи Сергея Переслегина, которые были написаны уже довольно давно - лет двадцать тому назад, в качестве предисловия к этой самой книге. Тогда, во второй половине 90-х состоялось переиздание если не всех, то подавляющего большинства произведений Стругацких и я горжусь тем, что я их выловил. Так вот-с, глядя на сегодняшнее, начинаешь сильно удивляться тому, насколько пророческими могут оказаться многие вещи. Кстати, у Переслегина весьма интересная версия "тайнфх пружин" событий, развернувшихся в конце книги - когда сломанный гибелью возлюбленной, взбешенный и озверевший земной разведчик-Прогрессор Антон, он же дон Румата Эсторский, устраивает резню в Арканаре, убивая и дона Рэбу. Весьма возможно, что как раз министр Охраны Короны, ставший боевым Магистром и наместником Святого Ордена в Арканарской Области, учинивший кровавый переворот с убийством королевской семьи, которая его же вознесла к вершинам власти, дон Рэба никакого отношения к гибели Киры не имел. Зато провокация удалась на славу и закончилось все еще более кроваво и страшно...
Был еще совместный советско-польский фильм по книге, с тем же названием, так сказать, по мотивам, потому что от книги он отличается очень уж сильно. особенно отсутствием вожака восставших по имени Арата Горбатый, которого почему-то заменили Цурэном - поэтом, которого в книге дон Румата смог выпихнуть из Арканара, спасая ему жизнь. В жизни во главе восстаний стоят как правило не Цурэны, идеалисты-романтики, которые могут послужить только знаменем (как правило, до своей героической гибели), а такие вот Араты, которые почти н7ичем не отличаются от дона Рэбы. Пожалуй, ке в чем они дона Рэбу и переплюнут...
Ну ладно, дань уважения покойным, к сожалению,ныне, писателям отдана, Фильм и статьи критиков упомянуты, мысль по древу растеклась. Теперь, собственно, к делу...
После некоторой возни с ГСН ракет я на время отвлекся от кодинга и в течение трех дней усердно моделил советские контейнеры РЭБ - Радио Электронной Борьбы (теперь вы поняли, откуда заголовок- да? Миссия у РЭБ самая что ни есть благородная - уберечь самолет от вражеских ракет). Были мною смоделены "Сирень", "Гвоздика", "Омуль" и "Сорбция".
Скрин контейнеров:
Как обычно, последовало создание json для СПС-142 "Гвоздика" и подгружаемого бленда. А далее последовало написание скрипта РЭБ. Суть работы "Гвоздики" (кстати, вроде как еще ее называют СПС-141МВГ и эта система опровергает тезис об отставании СССР в области РЭБ от США - во время ирано-иракской вофны ни один иракский самолет, оснащенный этим контейнером не был сбит УР с радиолокационной головкой, а вот иранцам американские системы помогали мало) заключается в ослеплении БРЛС вражеских машин и выдаче ложных координат летящей в самолет-носитель вражеской ракете. Это - "уводящая помеха" - ракета идет не на сам самолет,а на его "призрак". После некоторой возни скрипт заработал. После проверки его работоспособности пришлось срочно ухудшать свойства СПС-142, потому что она делала самолет игрока неуязвимым и бессмертным.
Скрин - СПС-142 "Гвоздика" на МиГ-23МФ.
Кроме того, по аналогу с работой РЭБ для РЛ-головок и бортовых РЛС, написал функцию работы аналога для оптического диапазона - для ракет с ТГСН. Такие системы известны под названием "Витебск" (хорошо показавшей себя в Сирии) и более старой - "Липа". Они ослепляют ГСН тепловых ракет мощными УФ-импульсами, также "уводя" их в сторону (это чисто дилетантское мнение, все, конечно, сложнее на самом деле, но, понятное дело, раскрывать эти подробности никто не будет). Пока скрипт выглядит так:
# -*- coding: utf8 -*-
"""
"JAMMER":"ECM",
"timerCycle":0,
"limitCycle":360,
"timerPause":0,
"limitPause":300,
"limitCoord":100,
"distanceAntiMissile":25000,
"distanceAntiBRLS":30000,
"massChild":0.1,
"antiForce":0.0018
"""
import sys
import bge
import random
#import mathutils
#Скрипт работы систем противодействия - электронные помехи, УФ-помехи и так далее
#Функция-коммутатор - определяет специализацию систем противодействия
def jammer():
scene = bge.logic.getCurrentScene()
cont = bge.logic.getCurrentController()
own = cont.owner
if 'threatDict' not in own:
own['threatDict'] = {"threatList":[],"enemyList":[],"kX":0,"ky":0,"kZ":0}
else:
#Вызов метода
g = globals()
#Тип головки самонаведения - название функции
typeJAMMER = own['JAMMER']
#Проверка на функцирнирование ГСН и ее особенностей
g[typeJAMMER](own)
#Активные помехи - контейнерные и встроенные системы РЭБ
def ECM(own):
scene = bge.logic.getCurrentScene()
randomBLINDER = random.randrange(0,100)
randomJAMMER = random.randrange(1,101)
phantomCoord = random.randrange(0,own['limitCoord'])
#print('JAMMER')
#Словари носителя - списки угроз и списрк в словаре обрабатываемого вражеского оружия
#own.parent.parent['threatListWeapon']
#own['weaponDict'] = {'dopX':0,'dopY':0,'dopZ':0}
#Таймер цикла противодействия
if own['timerCycle'] < own['limitCycle']:
own['timerCycle'] += 1
#Формируем список угроз от ракет с радиолокационными головками
if own['timerCycle'] == 1:
CoordPlusMinus(own)
try:
for missile in own.parent['localDict']['threatListWeapon']:
#print('localDict')
if 'typeGSN' in missile:
if 'RGSN' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
elif 'RK' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
except:
pass
#Начинаем воздействие
if own['timerCycle'] > 1:
#Ослепляющая помеха для РЛС противника
if randomBLINDER > 90:
if len(own.parent['localDict']['threatListUnit'][0]):
for objThreatRLS in own.parent['localDict']['threatListUnit'][0]:
#Ослепляющая помеха срабатывает на дальних рубежах, вблизи радары противника помехи "прожигают"
if own.getDistanceTo(objThreatRLS) > own['distanceAntiBRLS']:
#При низком уровне помехозащищенности захват будет сорван и противнику придется вновь выполнять прицеливание
if randomJAMMER/100 > objThreatRLS['antiECM']:
objThreatRLS['idTarget'] = '1'
if len(own['threatDict']['threatList']) > 0:
try:
#Начинаем попытку "взломать" ГСН ракеты и подчинить ее системе РЭБ
MISSILEattack = own['threatDict']['threatList'][0]
if own.getDistanceTo(MISSILEattack) < own['distanceAntiMissile']*MISSILEattack['antiAC']/100:
#print(randomJAMMER)
if MISSILEattack['antiAC'] > randomJAMMER:
if MISSILEattack['antiAC'] < 101:
#Взлом произошел
MISSILEattack['antiAC'] = 101
#Включаем функцию исажений координат
escapeCoord(own, MISSILEattack)
except:
own['threatDict']['threatList'] = []
#Включаем таймер паузы
if own['timerCycle'] == own['limitCycle']:
if own['timerPause'] < own['limitPause']:
own['timerPause'] += 1
if own['timerPause'] == 1:
#Сбрасываем в ноль искажение для ракеты, можно даже вернуть ей привычную стойкость к помехам
if len(own['threatDict']['threatList']) > 0:
CoordNull(own, MISSILEattack)
#Сброс таймеров в ноль
if own['timerPause'] == own['limitPause']:
own['threatDict']['threatList'] = []
own['timerPause'] = 0
own['timerCycle'] = 0
#Активные помехи - оптика - инфракрасные ГСН (тепловы)
def UF(own):
scene = bge.logic.getCurrentScene()
randomJAMMER = random.randrange(1,101)
phantomCoord = random.randrange(0,own['limitCoord'])
#print('JAMMER')
#Словари носителя - списки угроз и списрк в словаре обрабатываемого вражеского оружия
#own.parent.parent['threatListWeapon']
#own['weaponDict'] = {'dopX':0,'dopY':0,'dopZ':0}
#Таймер цикла противодействия
if own['timerCycle'] < own['limitCycle']:
own['timerCycle'] += 1
#Формируем список угроз от ракет с радиолокационными головками
if own['timerCycle'] == 1:
CoordPlusMinus(own)
try:
for missile in own.parent['localDict']['threatListWeapon']:
#print('localDict')
if 'typeGSN' in missile:
if 'IKGSN' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
except:
pass
#Начинаем воздействие
if own['timerCycle'] > 1:
if len(own['threatDict']['threatList']) > 0:
try:
#Начинаем попытку "взломать" ГСН ракеты и подчинить ее системе РЭБ
MISSILEattack = own['threatDict']['threatList'][0]
if own.getDistanceTo(MISSILEattack) < own['distanceAntiMissile']*MISSILEattack['antiUF']/100:
#print(randomJAMMER)
if MISSILEattack['antiUF'] > randomJAMMER:
if MISSILEattack['antiUF'] < 101:
#Взлом произошел
MISSILEattack['antiUF'] = 101
#Включаем функцию исажений координат
escapeCoord(own, MISSILEattack)
except:
own['threatDict']['threatList'] = []
#Включаем таймер паузы
if own['timerCycle'] == own['limitCycle']:
if own['timerPause'] < own['limitPause']:
own['timerPause'] += 1
if own['timerPause'] == 1:
#Сбрасываем в ноль искажение для ракеты, можно даже вернуть ей привычную стойкость к помехам
if len(own['threatDict']['threatList']) > 0:
CoordNull(own, MISSILEattack)
#Сброс такмеров в ноль
if own['timerPause'] == own['limitPause']:
own['threatDict']['threatList'] = []
own['timerPause'] = 0
own['timerCycle'] = 0
#Выборнаправления уводящей помехи
def CoordPlusMinus(own):
#Показатели
own['threatDict']["kX"] = random.randrange(-2,2)
own['threatDict']["kY"] = random.randrange(-2,2)
own['threatDict']["kZ"] = random.randrange(-2,2)
#Уводящая помеха
def escapeCoord(own, MISSILEattack):
#Искажаем координаты - доработать - слишком длинная запись
MISSILEattack['weaponDict']['dopZ'] += phantomCoord*own['threatDict']["kX"]
MISSILEattack['weaponDict']['dopY'] += phantomCoord*own['threatDict']["kY"]
MISSILEattack['weaponDict']['dopX'] += phantomCoord*own['threatDict']["kZ"]
#Обнуление искажений
def CoordNull(own, MISSILEattack):
MISSILEattack['weaponDict']['dopZ'] = 0.0
MISSILEattack['weaponDict']['dopY'] = 0.0
MISSILEattack['weaponDict']['dopX'] = 0.0
Думаю, понятно. Весь скрипт висит на объекте Jammer, который и занимается своей работой. Причем информацию об угрозах он получает от своего родителя юнита. Работает он длинными импульсами с длинными же паузами - циклами. система РЭБ не всесильна, но одну ракету точно успевает отвести, если сильно повезет - пару. В общем-то, так и задумывалось.
Кроме систем РЭБ я в авральном режиме занимался головками самонаведения ракет - вводил подсветку, реакцию на ловушки и диполи и так далее. А еще писал дальше искусственный интеллект. В первом приближении систему воздушного боя можно считать выстроенной. Конечно, придется ее корректировать, дополнять, настраивать, но основные параметры и величины, принцип работы уже выстроены. Теперь надо начинать выстраивать работу ИИ по земле и заканчивать с анархией - учить ботов воевать группами, держать строй и даже принимать "командные" решения...
Был еще совместный советско-польский фильм по книге, с тем же названием, так сказать, по мотивам, потому что от книги он отличается очень уж сильно. особенно отсутствием вожака восставших по имени Арата Горбатый, которого почему-то заменили Цурэном - поэтом, которого в книге дон Румата смог выпихнуть из Арканара, спасая ему жизнь. В жизни во главе восстаний стоят как правило не Цурэны, идеалисты-романтики, которые могут послужить только знаменем (как правило, до своей героической гибели), а такие вот Араты, которые почти н7ичем не отличаются от дона Рэбы. Пожалуй, ке в чем они дона Рэбу и переплюнут...
Ну ладно, дань уважения покойным, к сожалению,ныне, писателям отдана, Фильм и статьи критиков упомянуты, мысль по древу растеклась. Теперь, собственно, к делу...
После некоторой возни с ГСН ракет я на время отвлекся от кодинга и в течение трех дней усердно моделил советские контейнеры РЭБ - Радио Электронной Борьбы (теперь вы поняли, откуда заголовок- да? Миссия у РЭБ самая что ни есть благородная - уберечь самолет от вражеских ракет). Были мною смоделены "Сирень", "Гвоздика", "Омуль" и "Сорбция".
Скрин контейнеров:
Как обычно, последовало создание json для СПС-142 "Гвоздика" и подгружаемого бленда. А далее последовало написание скрипта РЭБ. Суть работы "Гвоздики" (кстати, вроде как еще ее называют СПС-141МВГ и эта система опровергает тезис об отставании СССР в области РЭБ от США - во время ирано-иракской вофны ни один иракский самолет, оснащенный этим контейнером не был сбит УР с радиолокационной головкой, а вот иранцам американские системы помогали мало) заключается в ослеплении БРЛС вражеских машин и выдаче ложных координат летящей в самолет-носитель вражеской ракете. Это - "уводящая помеха" - ракета идет не на сам самолет,а на его "призрак". После некоторой возни скрипт заработал. После проверки его работоспособности пришлось срочно ухудшать свойства СПС-142, потому что она делала самолет игрока неуязвимым и бессмертным.
Скрин - СПС-142 "Гвоздика" на МиГ-23МФ.
Кроме того, по аналогу с работой РЭБ для РЛ-головок и бортовых РЛС, написал функцию работы аналога для оптического диапазона - для ракет с ТГСН. Такие системы известны под названием "Витебск" (хорошо показавшей себя в Сирии) и более старой - "Липа". Они ослепляют ГСН тепловых ракет мощными УФ-импульсами, также "уводя" их в сторону (это чисто дилетантское мнение, все, конечно, сложнее на самом деле, но, понятное дело, раскрывать эти подробности никто не будет). Пока скрипт выглядит так:
# -*- coding: utf8 -*-
"""
"JAMMER":"ECM",
"timerCycle":0,
"limitCycle":360,
"timerPause":0,
"limitPause":300,
"limitCoord":100,
"distanceAntiMissile":25000,
"distanceAntiBRLS":30000,
"massChild":0.1,
"antiForce":0.0018
"""
import sys
import bge
import random
#import mathutils
#Скрипт работы систем противодействия - электронные помехи, УФ-помехи и так далее
#Функция-коммутатор - определяет специализацию систем противодействия
def jammer():
scene = bge.logic.getCurrentScene()
cont = bge.logic.getCurrentController()
own = cont.owner
if 'threatDict' not in own:
own['threatDict'] = {"threatList":[],"enemyList":[],"kX":0,"ky":0,"kZ":0}
else:
#Вызов метода
g = globals()
#Тип головки самонаведения - название функции
typeJAMMER = own['JAMMER']
#Проверка на функцирнирование ГСН и ее особенностей
g[typeJAMMER](own)
#Активные помехи - контейнерные и встроенные системы РЭБ
def ECM(own):
scene = bge.logic.getCurrentScene()
randomBLINDER = random.randrange(0,100)
randomJAMMER = random.randrange(1,101)
phantomCoord = random.randrange(0,own['limitCoord'])
#print('JAMMER')
#Словари носителя - списки угроз и списрк в словаре обрабатываемого вражеского оружия
#own.parent.parent['threatListWeapon']
#own['weaponDict'] = {'dopX':0,'dopY':0,'dopZ':0}
#Таймер цикла противодействия
if own['timerCycle'] < own['limitCycle']:
own['timerCycle'] += 1
#Формируем список угроз от ракет с радиолокационными головками
if own['timerCycle'] == 1:
CoordPlusMinus(own)
try:
for missile in own.parent['localDict']['threatListWeapon']:
#print('localDict')
if 'typeGSN' in missile:
if 'RGSN' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
elif 'RK' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
except:
pass
#Начинаем воздействие
if own['timerCycle'] > 1:
#Ослепляющая помеха для РЛС противника
if randomBLINDER > 90:
if len(own.parent['localDict']['threatListUnit'][0]):
for objThreatRLS in own.parent['localDict']['threatListUnit'][0]:
#Ослепляющая помеха срабатывает на дальних рубежах, вблизи радары противника помехи "прожигают"
if own.getDistanceTo(objThreatRLS) > own['distanceAntiBRLS']:
#При низком уровне помехозащищенности захват будет сорван и противнику придется вновь выполнять прицеливание
if randomJAMMER/100 > objThreatRLS['antiECM']:
objThreatRLS['idTarget'] = '1'
if len(own['threatDict']['threatList']) > 0:
try:
#Начинаем попытку "взломать" ГСН ракеты и подчинить ее системе РЭБ
MISSILEattack = own['threatDict']['threatList'][0]
if own.getDistanceTo(MISSILEattack) < own['distanceAntiMissile']*MISSILEattack['antiAC']/100:
#print(randomJAMMER)
if MISSILEattack['antiAC'] > randomJAMMER:
if MISSILEattack['antiAC'] < 101:
#Взлом произошел
MISSILEattack['antiAC'] = 101
#Включаем функцию исажений координат
escapeCoord(own, MISSILEattack)
except:
own['threatDict']['threatList'] = []
#Включаем таймер паузы
if own['timerCycle'] == own['limitCycle']:
if own['timerPause'] < own['limitPause']:
own['timerPause'] += 1
if own['timerPause'] == 1:
#Сбрасываем в ноль искажение для ракеты, можно даже вернуть ей привычную стойкость к помехам
if len(own['threatDict']['threatList']) > 0:
CoordNull(own, MISSILEattack)
#Сброс таймеров в ноль
if own['timerPause'] == own['limitPause']:
own['threatDict']['threatList'] = []
own['timerPause'] = 0
own['timerCycle'] = 0
#Активные помехи - оптика - инфракрасные ГСН (тепловы)
def UF(own):
scene = bge.logic.getCurrentScene()
randomJAMMER = random.randrange(1,101)
phantomCoord = random.randrange(0,own['limitCoord'])
#print('JAMMER')
#Словари носителя - списки угроз и списрк в словаре обрабатываемого вражеского оружия
#own.parent.parent['threatListWeapon']
#own['weaponDict'] = {'dopX':0,'dopY':0,'dopZ':0}
#Таймер цикла противодействия
if own['timerCycle'] < own['limitCycle']:
own['timerCycle'] += 1
#Формируем список угроз от ракет с радиолокационными головками
if own['timerCycle'] == 1:
CoordPlusMinus(own)
try:
for missile in own.parent['localDict']['threatListWeapon']:
#print('localDict')
if 'typeGSN' in missile:
if 'IKGSN' in missile['typeGSN']:
own['threatDict']['threatList'].append(missile)
except:
pass
#Начинаем воздействие
if own['timerCycle'] > 1:
if len(own['threatDict']['threatList']) > 0:
try:
#Начинаем попытку "взломать" ГСН ракеты и подчинить ее системе РЭБ
MISSILEattack = own['threatDict']['threatList'][0]
if own.getDistanceTo(MISSILEattack) < own['distanceAntiMissile']*MISSILEattack['antiUF']/100:
#print(randomJAMMER)
if MISSILEattack['antiUF'] > randomJAMMER:
if MISSILEattack['antiUF'] < 101:
#Взлом произошел
MISSILEattack['antiUF'] = 101
#Включаем функцию исажений координат
escapeCoord(own, MISSILEattack)
except:
own['threatDict']['threatList'] = []
#Включаем таймер паузы
if own['timerCycle'] == own['limitCycle']:
if own['timerPause'] < own['limitPause']:
own['timerPause'] += 1
if own['timerPause'] == 1:
#Сбрасываем в ноль искажение для ракеты, можно даже вернуть ей привычную стойкость к помехам
if len(own['threatDict']['threatList']) > 0:
CoordNull(own, MISSILEattack)
#Сброс такмеров в ноль
if own['timerPause'] == own['limitPause']:
own['threatDict']['threatList'] = []
own['timerPause'] = 0
own['timerCycle'] = 0
#Выборнаправления уводящей помехи
def CoordPlusMinus(own):
#Показатели
own['threatDict']["kX"] = random.randrange(-2,2)
own['threatDict']["kY"] = random.randrange(-2,2)
own['threatDict']["kZ"] = random.randrange(-2,2)
#Уводящая помеха
def escapeCoord(own, MISSILEattack):
#Искажаем координаты - доработать - слишком длинная запись
MISSILEattack['weaponDict']['dopZ'] += phantomCoord*own['threatDict']["kX"]
MISSILEattack['weaponDict']['dopY'] += phantomCoord*own['threatDict']["kY"]
MISSILEattack['weaponDict']['dopX'] += phantomCoord*own['threatDict']["kZ"]
#Обнуление искажений
def CoordNull(own, MISSILEattack):
MISSILEattack['weaponDict']['dopZ'] = 0.0
MISSILEattack['weaponDict']['dopY'] = 0.0
MISSILEattack['weaponDict']['dopX'] = 0.0
Думаю, понятно. Весь скрипт висит на объекте Jammer, который и занимается своей работой. Причем информацию об угрозах он получает от своего родителя юнита. Работает он длинными импульсами с длинными же паузами - циклами. система РЭБ не всесильна, но одну ракету точно успевает отвести, если сильно повезет - пару. В общем-то, так и задумывалось.
Кроме систем РЭБ я в авральном режиме занимался головками самонаведения ракет - вводил подсветку, реакцию на ловушки и диполи и так далее. А еще писал дальше искусственный интеллект. В первом приближении систему воздушного боя можно считать выстроенной. Конечно, придется ее корректировать, дополнять, настраивать, но основные параметры и величины, принцип работы уже выстроены. Теперь надо начинать выстраивать работу ИИ по земле и заканчивать с анархией - учить ботов воевать группами, держать строй и даже принимать "командные" решения...
Комментариев нет:
Отправить комментарий