суббота, 16 апреля 2016 г.

Горячая пора - 2. Записки бюрократа.

Пару дней назад сдуру удалил файл МиГ-23БН. Теперь вот думаю, а может не сдуру. Как сказал Диего Марадона, забив мяч англичанам рукой: "Мою руку направлял сам Бог". Учитывая, что совсем недавно перед этим матчем Аргентина огребла от британцев на фолклендских, то бишь Мальвинских островах, кое-какие основания для этих слов у него были (обида аргентинцев не прошла с тех пор). Ну, может быть, мою руку направляла Высокое Небо (читаем Валентинова). В том файле содержался начатый мною стартовый класс для семейства МиГ-23 и МиГ-27. Обычно я всегда проверяю содержимое корзины перед удалением, но тут почему-то не стал. Может, к лучшему.
Позавчера я этот файл восстановил, вчера написал класс FLG_, то бишь FLOGGER_, в котором помимо расстановки вооружения, указал конкретные технические характеристики для разных модификаций. Какие-то модификации почти не отличаются, какие-то отличаются сильно. я бы не сказал, что файл полностью закончен, потому что в нем пока отсутствуют характеристики БРЭО, вроде дальности действия радара, его угла обзора, времени сканирования и пр.
Тем не менее, прописывание всего этого заняло весь день, потому что везде надо было менять own на self, прописывать другие имена и тому подобное. В несколько приемов я с этим справился. Та же участь ждет остальные модули первой версии для МиГ-29, Су-25, F-15, F-16 и F-5.  Про модули для новых машин я не говорю, потому что добавляться они будут с новыми машинами. вообще же класс FLG_ выглядит примерно так:
стартовые характеристики:
class FLG_(bge.types.KX_GameObject):   
    def __init__(self, old_owner):
        if self.parent.parent['unitName'] in ['MiG-23MF','MiG-23M']:
           
            #Если этот юнит управляется игроком, то выставляем камеру пилота в кабине в нужную позицию
            if.self.parent.parent['bot'] == 0:
                Gor = scene.objects["Gor"]
                Gor.localPosition = [0.0, 3.0, 0.56]
           
            if 'PilotObj' not in bge.logic.globalDict['listLoadObj']:
                #Вызов и установка фигуры пилота
                bge.logic.LibLoad('//Aircraft/PilotObj.blend', 'Scene', load_actions = False)
                bge.logic.globalDict['listLoadObj'].append('PilotObj')
           
            pilot = scene.addObject('PilotRus', self.parent)
            pilot.setParent(self.parent, False, False)
            pilot.localPosition = [0.0, 2.85, 0.25]
           
            #Пушка ГШ-6-30 для МиГ-27
            if 'MiG-27' in self.parent.parent['unitName']:
                pushka = scene.addObject('UniversalMesh', self.parent) 
                pushka['meshes'] = 'GSh630'     
                pushka.setParent(self.parent, False, False)
                pushka.localPosition = [0.0,1.4,-0.675]
           
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 17500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.1 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4090 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.1 #встроенная система РЭБ - эффективность
        elif self.parent.parent['unitName'] == 'MiG-23MS':
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 17500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.12 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4590 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.05 #встроенная система РЭБ - эффективность
        elif self.parent.parent['unitName'] == 'MiG-23BN':
            #Вначале выдаем ограничения по маневренности, высотности, скорости и прочим ТХ
            self.parent.parent['speedMax'] = 694 #максимальная скорость
            self.parent.parent['heightMax'] = 18500 #потолок
            self.parent.parent['MaxPower'] = 12.5 #максимальная  тяга двигателя
            self.parent.parent['speedVert'] = 220 #максимальная вертикальная скорость
            self.parent.parent['angX'] = 0.8 #максимальная угловая скорость тангажа
            self.parent.parent['angY'] = 1.3 #максимальная угловая скорость крена
            self.parent.parent['angZ'] = 0.3 #максимальная угловая скорость рыска
            self.parent.parent['rotatDyn'] = 0.13 #динамичность угловых скоростей
            self.parent.parent['dvigDyn'] = 4 #динамичность двигателя
            self.parent.parent['speedDyn'] = 5 #динамичность скорости
            self.parent.parent['startSpeed'] = 1.0 #стартовый коэффициенот скорости
            self.parent.parent['maxFuelSpeed'] = 1.8 #максимальный расход топлива кг в секунду
            self.parent.parent['massFuelOwn'] = 4590 #внутренний запас топлива
            self.parent.parent['unitChassy'] = 'E_' #тип шасси
            self.parent.parent['ownECM'] = 0.05 #встроенная система РЭБ - эффективность

Здесь отнюдь не все модификации - а то слишком много места уйдет. А теперь кусочек кода по вооружению:

#Генерация вооружения
            if self.point9 != 'pusto':
                #Добавление топливных баков
                if self.point0 in ['FuelTank-1','FuelTank-3']:
                    ptbCnt = scene.addObject('UniversalMesh', self)
                    ptbCnt['meshes'] = 'FLG_FuelTank_Center_'
                    ptbCnt['fuel'] = 800.0
                    ptbCnt.setParent(self.parent, False, False)
                    ptbCnt.localPosition = [0.0,-1.13,-1.04]
                if self.point0 in ['FuelTank-2','FuelTank-3']:
                    #Левый подвесной бак
                    ptbL = scene.addObject('UniversalMesh', self)
                    ptbL['meshes'] = 'FLG_FuelTank_Wing_'
                    ptbL['fuel'] = 800.0
                    ptbL.setParent(self.parent, False, False)
                    ptbL.localPosition = [-2.67,-1.76,-0.1]
                    #Правый подвесной бак
                    ptbR = scene.addObject('UniversalMesh', self)
                    ptbR['meshes'] = 'FLG_FuelTank_Wing_'
                    ptbR['fuel'] = 800.0
                    ptbR.setParent(self.parent, False, False)
                    ptbR.localPosition = [2.67,-1.76,-0.1]
           
            #Генерация вооружения
            if self.point1 != 'pusto':
               
                #Добавление оружия
                #Ракеты средней дальности для МиГ-23
                if self.point1 in ['R-23R+R-23T','R-24R+R-24T','R-24RM+R-24T','R-24R','R-23R','R-24RM','R-24T','R-23T']:
                    #Пилон стандартный для всех вариантов
                    pilon1 = scene.addObject('UniversalMesh', self)
                    pilon1.setParent(own, False, False)
                    pilon1['meshes'] = 'FLG_APU23_'
                    #Ракет две штуки всегда, расположение - одинаковое
                    weaponMesh1newObject1 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject1.setParent(self, False, False)
                    weaponMesh1newObject2 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject2.setParent(self, False, False)
                    weaponMesh1newObject1.localPosition = [-1.428,-2.0,0.03]
                    weaponMesh1newObject1.applyRotation([-0.035,0.0,0.0],True)
                    weaponMesh1newObject2.localPosition = [1.428,-2.0,0.03]
                    weaponMesh1newObject2.applyRotation([-0.035,0.0,0.0],True)
                   
                    if self.point1 in ['R-24R','R-23R','R-24RM','R-24T','R-23T']:
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = self.point1
                        #При симметричной подвеске нет вопросов и по второй ракете
                        weaponMesh1newObject2['weapon'] = 1
                        weaponMesh1newObject2['meshes'] = self.point1
                       
                    #Смешанная подвеска   
                    elif self.point1 == 'R-23R+R-23T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-23R'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-23T'
                    elif self.point1 == 'R-24R+R-24T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-24R'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-24T'
                    elif self.point1 == 'R-24RM+R-24T':
                        #Для первой ракеты значение проперти и меша по-любому стандартны
                        weaponMesh1newObject1['weapon'] = 1
                        weaponMesh1newObject1['meshes'] = 'R-24RM'
                        #При смешанной подвеске вторая ракета получает другие значения проперти и меша
                        weaponMesh1newObject2['weapon'] = 3
                        weaponMesh1newObject2['meshes'] = 'R-24T'
       
       
                #Ракеты Р-3Р, Р-3С, Р-13М и Р-13М1      
                elif self.point1 in ['R-3R','R-3S','R-13M','R-13M1']:
                    weaponMesh1newObject1 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject1.setParent(self, False, False)
                    weaponMesh1newObject1['weapon'] = 1
                    weaponMesh1newObject1['meshes'] = self.point1
                    weaponMesh1newObject2 = scene.addObject('UniversalMesh', self)       
                    weaponMesh1newObject2.setParent(self, False, False)
                    weaponMesh1newObject2['weapon'] = 1
                    weaponMesh1newObject2['meshes'] = self.point1
                    #Это расположение ракет на пилонах МиГ-23
                    if 'MiG-23' in self.parent.parent['unitName']:
                        weaponMesh1newObject1.localPosition = [-1.428,-1.57,0.027]
                        weaponMesh1newObject1.applyRotation([-0.0175,0.0,0.0],True)
                        weaponMesh1newObject2.localPosition = [1.428,-1.57,0.027]
                        weaponMesh1newObject2.applyRotation([-0.0175,0.0,0.0],True)
                        pilon1 = scene.addObject('UniversalMesh', self)
                        pilon1.setParent(self, False, False)
                        pilon1['meshes'] = 'FLG_APU13W'
                    #Расположение ракет на МиГ-27 чуть отличается плюс другой пилон   
                    elif 'MiG-27' in self.parent.parent['unitName']:
                        weaponMesh1newObject1.localPosition = [-1.428,-1.57,-0.02]
                        weaponMesh1newObject1.applyRotation([-0.0175,0.0,0.0],True)
                        weaponMesh1newObject2.localPosition = [1.428,-1.57,0.02]
                        weaponMesh1newObject2.applyRotation([-0.0175,0.0,0.0],True)
                        pilon1 = scene.addObject('UniversalMesh', self)
                        pilon1.setParent(self, False, False)
                        pilon1['meshes'] = 'FLG_APU3W_'

Несколько длинновато, ну ладно, пускай на всякий случай будет.
Как видно из написанного, в обязательном порядке добавляется фигура летчика, а для МиГ-27 еще и пушка ГШ-630. Кроме того, с течением времени добавятся блоки выброса помех, контейнеры РЭБ, и другое вооружение, вроде никак не доделываемых мною УРВЗ Х-25.
Все это - одноразовая функция, исполняемая объектом Generator, с коротким временм жизни, двойной parent - это родитель его родителя (дедушка, сатло быть, хе-хе) - сам двигатель юнита. вот, значит, внучок, дедушку жизни учит... Проставляя ему свойства, прописанные в классе. Вся эта бюрократия, хотя и весьма объемна, но необходима. могу только сказать, что в том же WoE подобных перечислений на порядок больше. Хотя, может стоит брать все данные из текстовых файлов?  я просто не знаю, открытый, а потом закрытый текстовый файл загружает память или нет...
В общем, пока так обстоят дела. Картинок пока новых нет, так что остается только текст.
P.S. Сейчас видел забавное поведение вороны, прилетевшей на огород - попить ей, видите ли захотелось. Четыре ведра, одно закрытое. По очереди отпила из КАЖДОГО ОТКРЫТОГО. Видимо, думала, что в разных ведрах вода разной степени вкусности. Потом некоторое время поизучала закрытое и улетела. Видимо, решила, что там та же самая вода...

Комментариев нет:

Отправить комментарий