Сегодня я покажу как добавить в Doom 3 новое оружие, используя старое в качестве шаблона. Итак приступим! Сейчас перед нами стоит два вопроса, что будем делать и из чего, точнее, какую визуальную и физическую модель мы будем использовать для модификации? Я лично, как квейкер, не долго думая решил сделать рельсу (RailGun) из плазмогана (PlasmaGun). Чтобы осуществить данную конверсию для начала делаем следующее:

         1. Создаём в корневом каталоге Doom3 новую папку с именем "Test_weapon_mod".

         2. Создаём в ней три папки. Первую переименовываем в "def", здесь будут файлы с разрешением *.def, содержащие базовые параметры оружия, такие как модель, силу и т.п.  Вторую папку называем "guis", в ней будут файлы *.gui, то бишь дисплеи оружия. Используется только в том случае если мы изменяем оружие имеющее дисплей, а поскольку мы переделываем плазму в рельсу, то эта папка нам нужна. Третьей папке даём имя "script", она предназначена для файлов с расширением *.script, описывающих физическую модель оружия: его скорострельность, время перезарядки и т.п. В зависимости от объявленных переменных данного оружия, файл "doom_main.script" содержит лишь список скриптов используемых игрой.

         3. Копируем в эти папки оригинальные файлы с описанием оружия (weapon_*.*), а также файл "doom_main.script" из папки "script", и "player.def" из папки "def" (в него мы допишем наше новое оружие).

         4. Даём файлам новые названия (только weapon_*.* файлам), например, если мы взяли изначально плазму (и перегоняем в рельсу), то ренеймим все файлы "weapon_plasmagun.*" в "weapon_railgun.*";

         Из программ вы должны иметь:

         

         1. Quake 4 GUI Editor 0.25 (запускается как "Doom3.exe +editGUIs");

         2. Редактор для программистов имеющий подсветку синтаксиса С/С++ и пишущий номер строки кода (например,  Crimson Editor подходит идеально), В крайнем случае, если подобного редактора нет – используем WorldPad;

         

         Все, с начальными операциями разобрались, теперь приступим непосредственно к модификации. Сейчас нам нужно дописать в файл "doom_main.script" следующую строку (ВНИМАНИЕ!!! Все далее перечисленное относится только к портированию рельсы (поскольку будет использованы имена "weapon_railgun.*", прошу не забывать это, далее по тексту если вы не хотите добавлять рельсу прошу понимать "weapon_railgun.*" как "weapon_НАЗВАНИЕ_НОВОГО_ОРУЖИЯ.*" и "weapon_plasmagun.*" как "weapon_НАЗВАНИЕ_ОРУЖИЕ_ВЗЯТОГО_ЗА_ИСХОДНИК.*")):

            #include "script/weapon_railgun.script"

         В принципе не важно, в какое место вы ее впишете, но желательно после...

            // weapons

            #include "script/weapon_fists.script"

            ......

            #include "script/weapon_pda.script"

     

         То есть, вписать её после 30-й строки кода. Далее нам необходимо чтоб игра знала, что есть новое оружие, для этого мы открываем в редакторе файл "player.def" и переходим на строку 742, по идее мы увидим следующее (742-746):

            "def_weapon13"                           ""

            "weapon13_best"                          "0"

            "weapon13_cycle"                         "0"

            "weapon13_toggle"                        "0"

            "weapon13_allowempty"                    "0"

         Мы заменяем эти строки на следующие:

            "def_weapon13"                           "weapon_railgun"

            "weapon13_best"                          "1"

            "weapon13_cycle"                         "1"

            "weapon13_toggle"                        "0"

            "weapon13_allowempty"                    "1"

     

      Цифра в weaponХ означает каким по счету в инвентаре будет оружие, если хотите чтобы оно шло после плазмогана, то лучше впишите его под 7-мым номером, при этом не забудьте оригинальные имена последующих оружий сместить на одну цифру.

         Следующая операция - добавить новый тип патронов, но мы этого делать не будем, так как карт поддерживающих наше новоеоружие и его патроны просто не существует, если конечно мы сами их не создадим, но зачем так мучаться, ведь можно прописать "give weapon_railgun" и мы получим нашу рельсу.

         Теперь нам нужно подогнать файл "weapon_railgun.script" под наше оружие, для этого мы открываем файл в нашем редакторе, и заменяем с учетом регистра фразу "PLASMAGUN" на "RAILGUN", также заменяем уже "plasmagun" на "railgun".

         Остановимся на этом файле поподробней, нам нужно изменить поведение нашей рельсы, иначе она будет стрелять как плазма, для этого ищем строку (Х, значение которое будем менять):

            #define RAILGUN_FIRERATE                 Х //changed by Tim

         Меняем значение "Х" переменной "RAILGUN_FIRERATE" на число "1.45" (именно столько проходит времени перед тем как рельса готова стрелять, время выставляется в секундах, если например хотим создать мега-жестокий автомат, то думаю нужно выставить на 0.1), можно также удалить эту переменную и сразу вписать значение вместо "Х" сюда:

            next_attack = sys.getTime() + Х;

         Если есть желание удалить идиотский звук "Мало патронов", то надо просто удалить проверку на низкое количество патронов в следующих строках:

            if ( ammoClip == RAILGUN_LOWAMMO ) {

                  startSound( "snd_lowammo", SND_CHANNEL_ITEM, true );

            }

         Заодно можно удалить переменную, содержащую количество патронов, когда нужно пищать что их мало (строка 8):

            #define RAILGUN_LOWAMMO                  10

         Следующая переменная содержит количество патронов выстреливаемых нашим оружием (поскольку у рельсы 1, то не меняем) (строка 9):

            #define RAILGUN_NUMPROJECTILES           1

         Если нам не нужно чтоб оружие перезаряжалось, то можно просто удалить все упоминания о reload или поступить более элегантно, удалить проверку на количество патронов в обойме (строка 113):

            if ( ( currentTime >= next_attack ) && WEAPON_ATTACK && ( ammoClip > 0 ) ) {

     

Заменяем на:

           

            if ( ( currentTime >= next_attack ) && WEAPON_ATTACK ) {

         Есть много способов предотвратить перезарядку, например можно обьявить "ammoClip = ammoInClip();" как "ammoClip = 1000000;", или, например, в случае отсутствия патронов автоматом их добавлять, за это отвечают строки:

            if ( !ammoInClip() ) {

            weaponOutOfAmmo();

     

Заменяем на:

     

            if ( !ammoInClip() ) {

            addToClip( clipSize() );

         И нет проблем. Далее заканчиваем с этим файлом, сохраняем изменения и забываем про это. Следующий на очереди под раздачу файл "weapon_railgun.def", с ним будет сложнее, фокус "поиск-замена" тут не проходит, нужно не затронуть модель оружия при замене имен, поэтому будем ходить по строкам. Сейчас, для удобства, нужно дописать какой-нибудь коммент в заголовок, чтобы номера строк совпадали с моими.

Во всех перечисленных ниже строках мы должны заменить Plasma на Rail. Первая на очереди строка под номером 41 (кстати, бойцам поленившимся скачать редактор для программистов будет очень туго), потом 45, 56, 57, 62 - в этой строке если у оружия нет дисплея, или если вы не хотите его менять, можно оставить всё как есть, далее 65, 66. Теперь эти строки должны выглядеть так:

            entityDef weapon_railgun {

                  "editor_usage"                     "RailGun"

                  "inv_name"                         "RailGun"

                  "inv_weapon"                       "weapon_railgun"

                  "gui"                              "guis/weapons/railgun.gui"

                  "weapon_scriptobject"              "weapon_railgun"

                  "def_projectile"                   "projectile_railblast"

      Далее изменяем строки 104, 105:

            entityDef moveable_item_railgun {

                  "inherit"                          "weapon_railgun"

         Если есть желание изменить звуки то нам прийдется изменить строки 120, 123, 126, 134, 140, 143, 147, 150. В них прописаны имена звуков, которые используются на определенных кадрах анимации. Названия звуков берутся из файла sound/weapons.sndshd. В него естественно можно добавить что то своё, например прописать звук из Quake 3, чтоб создать эффект присутствия рельсы).

         Теперь правим строку 154 и 155, в 154 мы изменим имя объекта, а в 155 выставим повреждение от рельсы:

            entityDef   damage_railblast {

                  "damage"                           "100"

         Затем меняем название объекта в строке 161. Можно также изменить модель снаряда в строке 166. В 168 строке указываем имя объекта описывающего силу повреждения, оно содержится в строке 154, это "damage_railblast".

Далее: в строке 172 указываем скорость с которой снаряд покидает оружие, рельса очень шустра, поэтому ставим "10000 0 0"; строка  182 - масса снаряда, или дополнительный импульс трупу от попадания, от рельсы мы улетаем очень далеко, поэтому ставим "300"; строка 196 - ставим размер деколи, должна быть маленькой - "5", теперь эти строки выглядят так:

            entityDef projectile_railblast {

                  "def_damage"                       "damage_railblast"

                  "velocity"                         "10000 0 0"

                  "mass"                             "300"

                  "decal_size"                       "5"

                 

         Параметры партиклов можно не менять, это не так важно, хотя если запустить "+editParticles" и слегка поправить размеры, то только станет приятней глазу.

         Последние штрихи - GUI дисплей, запускаем редактор GUI и правим дефолтный экран, например, удаляем место, где пишется количество патронов в обойме, у рельсы нет обоймы, или дописываем сверху гордую надпись RailGun. Вроде с таким простым файлом GUI редактор не должен глючить, но на всякий пожарный случай сделайте бэкап.

         ВСЕ! Оружие готово