Военный конструктор. Operation Flashpoint: 1985 Cold War Crisis. Часть шестая: Секрет мастерства
Где взять: Встроен в игру
А вот и один из отечественных аддонов. Правда, пока без текстур. Возможности: 40% игровых; после данной статьи: 94% игровых, с учетом предыдущих Сложность освоения: В зависимости от вашего желания. От очень легкого до экстремально сложного. Добро пожаловать на завершающую лекцию по редактированию Operation Flashpoint! Спасибо всем, кто читал прошлые статьи, дотошно разбирался в их содержании и создавал свои маленькие шедевры. Сегодняшняя тема — файл config.cpp, где содержится описание юнита на языке игры (см. предыдущую статью). Этот файл — ключ к созданию собственного аддона. Познай силу config.cpp Сonfig.cpp содержит в себе всю информацию о юните — его класс, параметры. Подобный файл содержится в каждом файле аддона (.pbo), и при создании своего дополнения вам просто-таки необходимо будет его написать. Иначе игра банально проигнорирует плоды ваших трудов. Как я уже говорил в предыдущей статье, создать полностью новый юнит не получится (утилиту для импорта моделей в игру разработчики выдают лишь избранным), а вот изменить текстуры (см. предыдущий номер) и параметры существующих — легко. Как — читайте дальше.
Начало Надеюсь, вы уже распаковали какой-нибудь файл с аддоном, посмотрели, что там к
чему, подготовили все, что вам нужно для создания собственного дополнения, и сидите с раскрытым блокнотом (notepad, в смысле), готовые впитать все, что я вам сегодня продиктую. Перед началом написания config.cpp вам нужно вооружиться Command Reference Manual или, попросту говоря, списком команд (см. предыдущие номера). Любой config.cpp начинается с написания так называемых defines. Это как константы в любом языке программирования — повесил на них определенное значение и используешь везде, где заблагорассудится. Вообще, можно особо не вникать в это, так как обычно все просто копируют defines с оригинальных config.cpp. Но несколько необходимых я все же приведу: #define TEast 0 #define TWest 1 #define TGuerrila 2 #define TCivilian 3 #define TSideUnknown 4
Мода делать спорткары для Flashpoint появилась совсем недавно, но обрела бешеную популярность. NFS, где ты? #define TEnemy 5 #define TFriendly 6 #define TLogic 7 #define true 1 #define false 0 #define private 0 #define protected 1 #define public 2 Патчи разные бывают После назначения defines приступаем к написанию так называемых CfgPatches. Они служат для описания аддона к игре: class CfgPatches { class имя нового класса { units[] = {имя нового юнита}; weapons[] = {имя нового оружия}; requiredVersion = версия OFP, необходимая для запуска; };
Это "Боинг", если непонятно. }; Например, мы хотим создать новый юнит со звучным именем "Игроманьяк": class CfgPatches { class Igromanyak { units[] = {Igromanyak}; weapons[] = {}; requiredVersion = 1.75; }; }; Соответственно, если хотим создать новое оружие, то пишем его название в weapons. С версией игры, думаю, объяснять не стоит — и так поймете. Теперь перейдем к спецификации того аддона, который мы только что описали. Для этого существуют специальные классы: CfgAmmo, CfgVehicles, CfgWeapons и т.д. Принцип их написания завязан на так называемом "наследовании" — я объясню на конкретном примере, ниже. Оружие Для создания
собственного оружия нам, в основном, понадобятся два класса: CfgAmmo и CfgWeapons. Первый создаст уникальную амуницию, а второй — оружие: class CfgAmmo { class default {}; class LAW : Default {}; class RPG : LAW {}; class IgromanyakRPGammo : RPG { hit=3000; indirectHit=1500; indirectHitRange=15; }; }; Что же означает эта запись? Класс LAW наследует первоначальные установки, затем класс RPG наследует установки LAW, а IgromanyakRPGammo, в свою очередь, перенимает все у RPG. После этого мы меняем некоторые из полученных
"Чинук", стреляющий ракетами? Почему бы и нет. параметров. Готово. Естественно, что параметров просто море, и поэтому мы выкладываем на наш диск огромный список default-параметров для различных классов. class CfgWeapons { class default {}; class LAWLauncher : default {}; class CarlGustavLauncher : LAWLauncher {}; class AT4Launcher : CarlGustavLauncher {}; class IgromanyakRPG : AT4Launcher { model="\IgromanyakRPG\IRPG.p3d"; picture="\dtaext\equip\m\m_at4Launcher.paa"; displayName = Igromanyak RPG Launcher; displayNameMagazine = IgromanyakRPG Ammunition; shortNameMagazine = IgRPGa; ammo = IgromanyakRPGammo; initspeed = 125; count = 1;
maxLeadSpeed=150; }; }; Опять все тот же принцип наследования, но уже не с амуницией, а с самим стволом. Тут мы уже прописываем свою модель (помните, что каждый pbo-файл для игры выглядит как директория) оружия, иконку для отображения в игре и много других параметров, вроде скорости развертывания оружия. Полный список вас ждет на компакте. Завершает же написание config.cpp всегда так называемый class CfgNonAIVehicles. Смысл его так до конца никому и не ясен, но для нашего случая запись будет выглядеть так: class CfgNonAIVehicles { class ProxyWeapon {}; class ProxyIgromanyakRPG: ProxyWeapon {}; }; Помимо стандартных CfgAmmo и CfgWeapons, существует еще один
Вы все еще ждете Halo? Зачем? Ведь самое интересное, что там есть - этот джип. класс — CfgRecoils. Как следует из названия, отвечает он за отдачу оружия. Схема очень проста: class CfgRecoils { empty[]={}; riffleSingle[]={0.050000,0.020000,0.040000,0.050000,0,0}; riffleSilenced[]={0.010000,0.004000,0.010000,0.050000,0,0}; }; Чтобы создать собственную отдачу, достаточно записи: class CfgRecoils { IgromanyakRecoil[]={0.4,0.5,0.7}; }; Данная запись будет означать, что за 0.4 секунды ствол сдвинется на 0.5 единиц назад и 0.7 вверх. Но можно еще более гибко управлять отдачей: class CfgRecoils { IgromanyakRPG[]={0.02,0,0.01,0.05,0.07,0.15,0.4,0,0}; };
Получится, что за 0.02 секунды ствол сдвинется на 0.01 вверх, затем за 0.05 секунды брыкнется на 0.07 назад и на 0.15 вверх и вернется в нормальное положение за 0.4 секунды. Как видите, все очень просто. Только не забудьте прописать вашу отдачу в параметрах CfgWeapons:recoil=IgromanyakRecoil. Техника Все, детство кончилось. Одного взгляда на config.cpp какого-нибудь "Апача" достаточно, чтобы раз и навсегда отказаться от идеи хоть в чем-то здесь разбираться. Ничего — прорвемся! Начнем с простого — нарастим броню "Хаммеру": class CfgVehicles { class All {}; class AllVehicles: All {}; class Land: AllVehicles {}; class LandVehicle: Land {};
Поигравшись с config.cpp, народные умельцы заменили ракеты А-10 на пилотов. К результату равнодушным остаться нельзя. class Car: LandVehicle {}; class Jeep : Car {}; class HMMWV: Jeep { displayName= $STR_DN_HMMV; model=\humr\HMMWV.p3d; picture=\humr\ihmmwv.paa; armor = 80; type=VArmor; cost=100000; dammageHalf[]= { ... }; dammageFull[]= { ... }; armorGlass=0.5; armorWheels=0.1;
soundEngine[]={\humr\HMMWVengine,db-25,1.25}; typicalCargo[]={Soldier, Soldier, SoldierLAW, Officer}; }; }; Здесь все очень близко к тому, что мы видели в CfgWeapons. Но "Хаммер" — простой транспорт и не имеет всяких там радаров с башнями. DisplayName — имя юнита в файле stringtable.csv (о нем мы рассказывали в предыдущих номерах). Type — это тип брони (бывают еще VSoft и VAir). В данном случае у машины имеются бронированное стекло (armorGlass) и колеса (armorWheels). DammageHalf — список текстур, которые появятся после нанесения 50% урона, dammageFull — соответственно. SoundEngine — параметры звука мотора. Ну а с typicalCargo и объяснять не стоит. Разберем более сложный пример — Vulcan. Этот зенитный комплекс имеет и радар, и башню: class CfgVehicles { class All {}; class AllVehicles: All {}; class Land: AllVehicles {}; class LandVehicle: Land {};
class Tank: LandVehicle { class TurretBase {}; }; class APC: Tank {}; class M113: APC {}; class Vulcan: M113 { displayName=$STR_DN_VULCAN; picture=\vulcan\ivulcan.paa; icon = antiAC.paa; armor=180; cost=1000000; model=\vulcan\m163a1vulcan; irScanRange = 4000; irScanGround = false;
// outGunnerMayFire = true; forceHideGunner = true; viewGunnerInExternal = true; transportSoldier = 0; }; }; Сразу отмечаем появление class TurretBase —запись станет понятна чуть позже.
Еще одни юмористы. Далее видим irScanRange и irScanGround. Поскольку Vulcan именно зенитный комплекс, то его радар видит только воздушные цели и irScanGround будет равен false. Строка gunnerCanSee определяет то, чем может воспользоваться стрелок в Vulcan — радаром, компасом и т.д. И вот теперь мы натыкаемся на class Turret: TurretBase —запись в начале CfgVehicles просто говорит движку, что нужно пойти сюда и снять параметры. По названию можно догадаться, что они означают минимальный и максимальный уровень подъема дула. Далее идет очень интересный параметр threat —это уровень угрозы, исходящей от различных юнитов. Или приоритет уничтожения, если хотите. Сначала (0.5) идут VSoft (джипы и т.д.), затем (0.5) VArmor (танки) и, наконец (1), VAir (воздушные цели). Данная запись означает, что Vulcan в первую очередь будет стрелять по воздушным целям, а затем уже по наземным. Далее идут установки оптики и анимации для членов экипажа, а также число (0) солдат, которых может данная машина перевозить. Class CfgVehicles для Vulcan разобран, но в config.cpp еще много чего интересного ( CfgWeapons, CfgVehicleActions, CfgMovesMC) — смотрите оригинал. Вообще, изменяя параметры или создавая новый юнит, вы по-любому будете обращаться к оригиналу — моя задача состоит лишь в том, чтобы вы поняли, что там написано. Разберем еще один пример — на этот раз возьмем какое-нибудь воздушное судно. Например, официальный аддон Су-25. Амуницию и оружие опять опускаем (там ничего нового, а если интересно, то смотрите оригинал) и разбираем класс CfgVehicles: class CfgVehicles { class All {}; class AllVehicles: All {}; class Air: AllVehicles {}; class Plane: Air {}; class Su25: Plane { ... crew = SoldierEPilot; ... weapons[]={Ch29TLauncher,
Rocket57x64, MachineGun30A10}; magazines[]={Ch29TLauncher, Rocket57x64, MachineGun30A10}; fov=0.5; type=VAir; threat[]={0.1, 1, 0.7}; class Reflectors { class Reflector { ... }; }; class IndicatorAltRadar { ... }; class IndicatorAltRadar2 { ... }; class IndicatorSpeed { ...
}; class IndicatorVertSpeed { ... }; class IndicatorVertSpeed2 { ... }; }; }; Сразу отмечаем параметр crew = SoldierEPilot — он означает, что SoldierEPilot изначально появится в самолете. Далее видим уже знакомые type и threat — как с ними оперировать, тоже понятно. А вот дальше идут характеристики приборов: задаются цвет огней самолета, его "потолок", скорость и т.д. Запомните: вместе с изменением скорости полета винтокрылой машинки нужно изменить и показания ее приборов. Кстати, максимальный "потолок" для юнитов типа Air составляет 1000 футов — учтите это при редактировании. Без лица Я знаю, вам всегда хотелось поместить свое лицо в игру... Сделать это просто — достаточно создать соответствующий аддон! Для этого нам понадобятся
Один из недавних аддонов - speedbike из "Звездных войн". лишь два класса — СfgPatches и CfgFaces: class CfgPatches { class Faces { units[] = {}; weapons[] = {}; requiredVersion = нужная версия; }; }; class CfgFaces { class Имя класса { name="Имя лица"; texture="\имя файла аддона.pbo\имя файла.jpg"; east=1; west=1; }; }; East/west=1/0 делает доступным/недоступным ваше лицо для определенной стороны. Вместо эпилога Все, пора
окончательно прощаться с темой Flashpoint... Конечно, еще уйму всего можно было бы рассказать об одном только config.cpp, но, как уже говорилось, все рамки дозволенного мы и так превысили. Советую чаще заходить на www.ofpeditingcenter.com и http://flashpoint.xaos.ru —там вы почерпнете еще уйму интересной информации. Flashpoint-сообщество постоянно расширяется, вместе с ним увеличиваются и масштабы раскопок внутренностей игры. Уже созданы утилиты, многократно облегчающие редактирование, пачками выходят аддоны (некоторые умельцы даже сделали гоночную трассу и спортивный Jaguar к ней!), в разработке находится уйма модов, появляются полноценные редакторы... Взять хотя бы отечественный сайт Project OFPinternals (www.ofpinternals.megaforums.ru), где все желающие могут заполучить бета-версию редактора островов WrpEdit для Flashpoint. Кстати, те же
ребята создали программку CPP Creator, которая поможет вам при создании файла config.cpp. Процесс уже нельзя остановить. Скоро Flashpoint будет окончательно разобран по косточкам, а разработчики будут рвать на голове волосы от того, что они натворили с этим миром... От всей души желаю вам присоединиться к всеобщему торжеству и создать какой-нибудь супер-мега-мод или просто миссию. Тем более что повод, скажу вам по секрету, для этого есть, ибо скоро наших читателей ожидает масштабный конкурс по Flashpoint! P.S. Как вы уже знаете, два месяца назад вышел аддон для Flashpoint под названием Resistance. В нем разработчики немного усовершенствовали редактор — советую ознакомиться. Также, в связи с выходом Resistance, BIS выпустили новую версию Operation Flashpoint Scripting Reference, с новым набором команд, — ищите на диске. И еще,в Сети появился новый аддон под названием Kegetys Editor Addon, который добавляет в редактор объекты из Resistance, а их там, как вы знаете, очень много. В общем, тоже ищите на нашем диске.
1229 Прочтений • [Военный конструктор. Operation Flashpoint: 1985 Cold War Crisis. Часть шестая: Секрет мастерства] [19.05.2012] [Комментариев: 0]