Биошоковая терапия. Новое оружие в BioShock
Ученые подводного города Rapture изобрели новые виды боеприпасов. Среди них — резиновые пули и пули с заморозкой, в буквальном смысле останавливающие врагов. Наконечники новых стрел к арбалету пропитаны бактериальными спорами, которые при попадании в кровь жертвы заражают ее смертельной болезнью. Под воздействием других арбалетных снарядов броня противников рассыпается, словно карточный домик на ветру.
Все эти боеприпасы разработчики изначально собирались добавить в игру, но потом отказались от них (возможно, на некоторые просто не хватило времени). Так что нам придется добавить их в BioShock самостоятельно.
Смертельное оружие
Основной инструмент для модифицирования игры — обычный «Блокнот» или любой другой текстовый редактор. Рабочим материалом послужит файл ConfigINI.IBF из директории < Каталог игры>\Content. Он состоит из нескольких разделов, нас интересуют только те, что относятся к оружию. Они располагаются почти в самом начале файла, сразу за комментарием WEAPONS.INI TABLE OF CONTENTS. «Оружейный» блок состоит из восьми модулей: PLAYER WEAPONS & AMMO — параметры конкретных видов оружия игрока, MONSTER WEAPONS & AMMO — параметры оружия монстров, STIMULI SETS — характеристики различных видов урона, DAMAGE RESISTANCE SETS — параметры защиты от попаданий, Weapon Bases — базовые характеристики вооружения, Ammunition Bases & Hierarchy — основные характеристики патронов, Projectile Data & Hierarchy — параметры снарядов, WEAPON UPGRADE DATA — апгрейды.
Каждый модуль состоит из множества разделов, названия которых выделены фигурными скобками. Остановимся пока на начальном модуле — PLAYER WEAPONS & AMMO. В нем каждому виду оружия (которых, напомним, в игре семь плюс фотокамера) соответствует четыре соседних блока (исключение составляет гаечный ключ, ему отводится всего два раздела). Первый, именуемый ShockGame.X , содержит общие параметры, а еще три с названиями вида ShockGame.XYAmmo — характеристики боеприпасов (X — название оружия, Y — боеприпаса). На месте X могут стоять следующие наименования: Wrench — гаечный ключ, Pistol — пистолет, ShotGun — ружье, Crossbow — арбалет, GrenadeLauncher — гранатомет, ChemicalThrower — химическая пушка, MachineGun — пулемет, ResearchCamera — фотокамера.
Общее
Познакомимся поближе с разделом ShockGame.X. При создании нового оружия нам пригодятся следующие показатели:
WeaponModel — модель оружия;
FriendlyName — название пушки, отображаемое в игре;
AvailableAmmoTypes — вид патронов, которыми стреляет оружие. Поскольку в оригинале у каждого образца (кроме первого) их три, то и параметров с таким именем соответственно тоже три (плюс некоторые могут быть закомментированы);
DefaultAmmoSelection — вид боеприпасов, который используется по умолчанию;
BaseMagazineSize — вместимость магазина. Этот и три следующих показателя могут улучшаться при апгрейде оружия;
BaseAccuracy — точность стрельбы;
BaseReloadRate — продолжительность перезарядки;
BaseFireRate — скорострельность. Чем ниже значение, тем скорость стрельбы выше;
OnFiredEffects — эффект, появляющийся при стрельбе;
UpgradeStatName — доступный апгрейд. В качестве значения (строится по принципу: XUpgrade _ Y , где X — название пушки, а Y — улучшаемый параметр) здесь указывается название раздела (модуль WEAPON UPGRADE DATA ), характеризующего это улучшение. Если для данного вида оружия есть несколько апгрейдов, то и атрибутов будет больше одного;
CanBeZoomed — имеет ли оружие прицел с зумом ( true — да, false — нет);
ZoomedFOVAngle — угол обзора при использовании зума. Этот параметр активируется только при значении true у параметра XUpgrade_Y;
ZoomLevels — величина приближения. Сколько таких отметок у прицела, столько и атрибутов с названием ZoomLevels ;
ZoomSpeed — быстрота зумирования;
bHideWhileUnequipped — прятать ли пушку, когда у игрока к ней нет патронов ( true — да, false — нет).
Снаряды
Теперь разберем блок ShockGame.XY. Обратите внимание, что у некоторых видов оружия таких разделов больше трех, вот только все «лишние» закомментированы. В каждом блоке вы обнаружите следующие характеристики патронов:
FriendlyName — название боеприпаса, которое используется в игре;
Description — описание зарядов;
VisualAmmoModel — модель патронов;
DamageStimuliSetName — наносимый урон. Здесь указывается название соответствующего раздела (из модуля STIMULI SETS ), в котором задаются виды и величина повреждения;
NumRoundsUsedPerShot — количество патронов, которое расходуется за один выстрел;
NumBurstShots — сколько раз ствол стреляет после нажатия на спусковой крючок;
MaximumStackSize — максимальное количество патронов данного типа, которое вы можете одновременно носить с собой;
AttackRange — дальность атаки (используется только для арбалета);
CreditValue — стоимость боекомплекта.
Следующие три атрибута прописаны лишь для арбалета и гранатомета:
ProjectileClass — класс снаряда (смотрите одноименный раздел модуля Projectile Data & Hierarchy);
InitialVelocity — стартовая скорость полета снаряда;
NumProjectilesToFire — число снарядов, которыми одновременно стреляет оружие.
Следующие пять характеристик относятся только к гранатомету:
FuseTime — скорость детонации;
InnerDamageRadius — внутренний радиус взрыва (зона повышенного урона);
OuterDamageRadius — внешний радиус взрыва;
ExplodeOnImpact — взрывается ли самостоятельно снаряд при контакте с какой-либо поверхностью ( true — да, false — нет);
TimeToArm — время (в секундах), которое тратится на переключение на указанный вид боеприпасов.
Разделы вида XStimuliSet (где X — тип снаряда), на которые ссылается параметр DamageStimuliSetName , располагают следующими характеристиками снаряда. Первая из них является составной: Stimulus=(Type=STIMULUS_X,Amount=Y,Chance=Z). X — тип воздействия, оказываемого снарядом на жертву, Y — величина этого воздействия (это либо урон, либо продолжительность действия) и Z — шанс, что оно подействует на жертву ( 1.0 — стопроцентный). Этот атрибут может повторяться, поскольку и жертвы бывают разные, и воздействий может быть сразу несколько.
На месте X могут быть следующие сочетания: AIGenericPiercing (общий урон), AIArmorPiercing (разрушение брони), AIAntiPersonnel (ущерб здоровью), AIBludgeoning (погружение в состояние грогги, т.е. одномоментное резкое ухудшение состояния), AIHeat (жар), AICold (холод), AIElectric (электричество), AIExplosive (взрыв) и AIFalling (падение). Все они задают воздействие снаряда на ваших врагов. Есть у этих девяти вариантов и аналоги без приставки AI — они определяют негативное влияние на игрока. Наконец, существует шесть специфичных видов повреждения, воздействующих и на игрока, и на неприятелей. Это Shocked (шок), Frozen (заморозка), Burning (горение), Diseased (болезнь), Berserk (бешенство), LatentBerserk (скрытое бешенство). Показатель Y в данном случае определяет продолжительность этого влияния, то бишь пребывания жертвы в указанном состоянии.
Еще четыре важных характеристики из блока типа XStimuliSet :
MomentumScale — импульс, который получает жертва. Изменяется от 0 до 10.0f ;
DamageType — тип повреждения от снаряда. Explosive — взрыв, Ranged — огнестрельное ранение, Melee — травма от удара;
DamageStrength — обобщенный ущерб. Light — маленький, Medium — средний, Heavy — большой.
Рассекречивание
В игре пять скрытых видов боеприпасов. Они встречаются сразу у трех видов оружия: арбалета, химической пушки и пулемета (у арбалета и пулемета по 2 варианта, у химической пушки — 1). Загляните в раздел ShockGame.Crossbow и снимите комментарий со следующих двух строк, удалив из них символ ; :
;AvailableAmmoTypes=class’ShockGame.Crossbow_ArmorPiercingBolt’
;AvailableAmmoTypes=class’ShockGame.Crossbow_DiseaseBolt’
То же самое нужно проделать и с целиком закомментированными блоками ShockGame.Crossbow_ArmorPiercingBolt и ShockGame.Crossbow_DiseaseBolt (в общей сложности нужно исправить 32 строки).
Найдите разделы ArmorPiercingBoltStimuliSet и DiseaseBoltStimuliSet (рекомендуем воспользоваться функцией поиска), раскомментируйте их (а это всего 5 строк в первом случае и 6 — во втором). В результате арбалет получит два новых типа стрел: бронебойные (ударно пробивают броню) и несущие болезнь (заражают пострадавшего смертоносной заразой).
Переходим к химической пушке. В раздел ShockGame.ChemicalThrower после строки AvailableAmmoTypes=class’ShockGame.ChemicalThrower_IonicGel’ пропишите похожую строку — AvailableAmmoTypes=class’ShockGame.ChemicalThrower_Accelerant’. Снимите комментарии с 12 строк раздела ShockGame.ChemicalThrower_Accelerant. Кроме того, параметру DamageStimuliSetName необходимо установить значение KeroseneStimuliSet. Теперь можно прожигать тела врагов до костей.
Пулемет можно научить стрелять резиновыми пулями. Но предварительно необходимо зайти в блок ShockGame.MachineGun и удалить точку с запятой из строки ;AvailableAmmoTypes=class’ShockGame.MachineGun_RubberBullet’
Следующий шаг — «открытие» раздела ShockGame.MachineGun_RubberBullet. Снимать комментарий нужно не со всего блока, не трогайте следующие две строки:
; AttackRange=9999
;SpreadOfFire=(Yaw=0, Pitch=0, Roll=0)
После этого раскомментируйте все 5 строк раздела MachineGunRubberBulletStimuliSet.
Резиновые пули — заряды довольно оригинальные. Урон минимален, зато пострадавший от них враг на некоторое время теряет ориентацию, в этот момент его можно атаковать более мощным оружием.
Есть у пулемета и еще один спрятанный тип патронов — замораживающий (аналог соответствующего плазмида). Его можно вставить на место противопехотных пуль. Для этого в блоке ShockGame.MachineGun_FrozenBullet значение показателя DamageStimuliSetName замените на MachineGunFrozenBulletStimuliSet. Снимите комментарий с раздела MachineGunFrozenBulletStimuliSet (нужно «открыть» 8 строк).
Теперь вы можете замораживать врагов пулями! Несколько точных попаданий — и враг уже в ледяном плену. А там уж делайте с ним что заблагорассудится. Правда, пулеметная заморозка, в отличие от плазмидной, срабатывает нечасто, и больно уж она коротка. Зато эти пули наносят жертве еще и ущерб здоровью.
Да, и не забудьте, если уж вы собрались делать полноценный оружейный мод, придумать четырем новым типам патронов подходящие описания (у арбалетного ArmorPiercingBolt оно уже есть). Для этого в блоках ShockGame.Crossbow_DiseaseBolt (заразная стрела), ShockGame.ChemicalThrower_Accelerant (катализаторный заряд) и ShockGame.MachineGun_RubberBullet (резиновая пуля) после параметра FriendlyName вставьте новую строку вида Description=X , где X — текст описания. А в случае с «ледяными» пулями достаточно подредактировать значение атрибута Description в разделе ShockGame.MachineGun_FrozenBullet.
Помимо этого несложно заставить игру использовать новый вид снарядов по умолчанию. Все, что нужно для этого сделать, — исправить значения атрибута DefaultAmmoSelection в блоках ShockGame.Crossbow , ShockGame.ChemicalThrower и ShockGame.MachineGun соответственно на class’ShockGame.Crossbow_ArmorPiercingBolt’ (или class’ShockGame.Crossbow_DiseaseBolt’ ), class’ShockGame.ChemicalThrower_Accelerant’ и class’ShockGame.MachineGun_RubberBullet’.
Мультиракетница
С теорией мы разобрались — изменяя описанные выше характеристики, вы можете сделать оружие с самыми различными характеристиками. Переходим к практике — переделаем гранатомет в мощную мультиракетницу. Она будет стрелять, во-первых, простой одинарной ракетой, во-вторых, тремя ракетами сразу и, в-третьих, убийственным ядерным снарядом.
Отправляемся в раздел ShockGame.GrenadeLauncher и меняем его содержимое следующим образом. Переименуем оружие, исправив значение атрибута FriendlyName на Rocket Launcher или « Ракетница », если у вас русская версия игры. Урежем вдвое обойму, присвоив характеристике BaseMagazineSize число 3. Кроме того, сделаем оружие более медленным в обращении, задав настройкам BaseReloadRate и BaseFireRate значение 2.0.
Ракета
Теперь переходим к «патронным» разделам. В первом из них ( ShockGame.GrenadeLauncher_FragGrenade ) нужно проделать следующие преобразования. Параметру FriendlyName определяем в значение словосочетание Simple rocket (в русской версии « Простая ракета »). Желательно также подобрать снаряду новое описание, подкорректировав текст, расположенный напротив показателя Description.
Рядом с параметром ProjectileClass значение Frag замените на RPG , в результате чего оружие станет стрелять ракетами. Скорость их полета ( InitialVelocity ) следует установить равной 1500. Радиус взрыва лучше уменьшить, придав показателям InnerDamageRadius и OuterDamageRadius значения 450 и 550. Параметрам MaximumStackSize и CreditValue лучше всего подойдут числа 10 и 15. Наконец, атрибуту ExplodeOnImpact ставим значение True.
Далее поработаем над блоком FragGrenadeStimuliSet. Удалим все его содержимое за исключением заголовка: [FragGrenadeStimuliSet] ; итого получается девять строк. На их место мы поставим новые из блока RPGStimuliSet (название раздела опять же не трогаем), параметры же отредактируем следующим образом: в первой строке ( FragGrenadeStimuliSet ) число 400 исправим на 300 , во второй — 75 на 50 , в третьей — 60 на 45.
Тройной выстрел
Что касается второго типа патронов, тройной ракеты, то здесь изменения будут не столь масштабными. Обратимся к разделу ShockGame.GrenadeLauncher_RPG и присвоим в нем следующим характеристикам указанные значения: FriendlyName=Triple rocket (в русской версии « Тройная ракета »); InitialVelocity=750 ; NumBurstShots=3 ; NumProjectilesToFire=3 ; FuseTime=40 ; InnerDamageRadius=350 ; OuterDamageRadius=500 ; MaximumStackSize=15 ; NumRoundsUsedPerShot=3 ; CreditValue=25.
Теперь отыщите блок RPGStimuliSet. В первой его строке число 400 заменяем на 230 , во второй — 75 на 40 , в третьей — 60 на 35. Параметру MomentumScale поставим значение 6.0f. Получившийся тип патронов хорош в сражениях сразу с несколькими противниками. Просто запустите тройную ракету в толпу.
Ядерная боеголовка
А теперь изготовим самое мощное оружие. В раздел ShockGame.GrenadeLauncher_StickyGrenade внесите следующие изменения: FriendlyName=Nuclear Rocket (в русской версии « Ядерная ракета »); ProjectileClass=Class’ShockDesignerClasses.RPGgrenadeProjectile’ ; InitialVelocity=500 ; FuseTime=1000 ; InnerDamageRadius=1000 ; OuterDamageRadius=1400 ; ExplodeOnImpact=True ; TimeToArm=3 ; MaximumStackSize = 2 ; CreditValue=30.
Перейдите к блоку StickyProxStimuliSet. Подмените его содержимое строками из раздела RPGStimuliSet , как мы делали это в случае с блоком FragGrenadeStimuliSet. Подредактируйте обновленные строчки раздела StickyProxStimuliSet , которых отныне восемь (не считая заглавной). В первой из них значение 400 измените на 600 , во второй — 75 на 100 , в третьей — 60 на 90 , в четвертой — 1.0 на 3.0 , а 0.01 на 0.5. Значение параметра MomentumScale увеличьте до 10.0f.
Ядерная боеголовка, которую мы только что соорудили, является незаменимым оружием для зачистки помещений: радиус взрыва — несколько десятков метров. Причем земля после разрыва снаряда покрывается пламенем, которое горит еще три секунды, поджаривая врагов. Только будьте аккуратны: один неточный выстрел — и на тот свет отправитесь вы сами.
* * *
Мы создали с нуля только один вид оружия — мультиракетницу. Но это вовсе не значит, что стоит останавливаться на достигнутом. Изменяя характеристики, перечисленные в самом начале материала, несложно создавать новые виды вооружения в массовом масштабе. Вот только не забывайте о балансе. Разрабатывая ракетницу, мы внимательно следили, чтобы она гармонично дополняла геймплей, а не превращала прохождение игры в безумный забег читера. Если будете усиливать какое-то оружие, то не забывайте, например, уменьшать число патронов к нему.