PDA

Просмотр полной версии : Модификации -- как и что



vlud
21.11.2003, 16:02
Предполагается, что это место может стать местом обсуждения того, как и с каким результатом можно модифицировать скрипты Ударной Силы

vlud
21.11.2003, 16:26
Я придумал -- мы сюда будем информацию о скриптах складывать... по мере ее появления. Наверное, начнем с объяснения того, что за что отвечает в скрипте вертолета.

Vadifon
22.11.2003, 17:05
жизненно необходимое начинание!

OPEX
24.11.2003, 15:47
Интересен каталог \Units.
В нем куча скриптов, описывающих юниты. В первую голову интересны вертолеты. Распаковываем, к примеру Ka50Unit.script и открываем его в редакторе.
Первый интересный класс: CKa50CollisionExplosion
Описывает повреждения, наносимые вертолету при столкновении. Хардкорщики, ставьте здесь тыщщу! ;o)
Далее, интерес представляет 30мм пушка. За нее отвечает класс CKa50Gun. Что там можно поменять? Гм...
Переменная InitBulletSpeed описывает, с какой скоростью в м/с полетит наш снаряд.
Переменная FireDeviation описывает, каково будет случайное отклонение визира пушки при стрельбе. Чем больше коэффициент, тем сильнее будет болтать пушку и снаряды будут лететь мимо. Значение в градусах отклонения.
Переменная Ammunition указывает общее кол-во выстрелов к пушке.
Переменные LockAngleHMin, LockAngleHMax, LockAngleVMin, LockAngleVMax указывают углы сопровождения пушкой цели от линии визирования вертолета: по горизонтали, по вертикали.
Переменная BlockedLockAngle указывает фактически рамку вокруг маркера цели, куда нужно поставить маркер пушки для автозалпа. Т.о. блокируем пушку, зажимаем спуск, выбираем цель и наводим маркер пушки на цель. Как только маркер пушки совмещается с маркером цели +- BlockedLockAngle (в градусах) получаем очередь.
Переменная TargetingRange указывает дистанцию, на которой пушка "захватит" цель.
Коль скоро дистанцию огневого контакта мы планируем увеличить (например, до 4 км), то необходимо в классе CKa50GunBulletControl всадить переменную float MaxDistance, присвоив ей значение 4000.0 (в метрах). В обратном случае наш снаряд будет самоликвидироваться на дистанции 2000 метров, не долетая до цели.
Соответственно, все это корректно будет работать, если в классе CKa50Unit поставить значения дальности оптики RadarRange на дистанцию свыше 4 км.

orthodox
24.11.2003, 22:00
А можно ли в 6-й миссии первой кампании сделать так, что б на событие "уничтожение гражданского объекта" транслировался не один единственный звуковой файл, как сейчас, а один из нескольких, специально подготовленных? Т.е. случайная фраза из, скажем, трех подготовленных?

И вообще, как менять или готовить скрипты под озвучку?

OPEX
25.11.2003, 14:30
Необходимо будет объявить массив сообщений (текстовых и звуковых), после чего в скрипте миссии вызывать на событие сообщение с индексом, генерируемым функцией случайного числа из ренжа (от 1 до 3, к примеру).
Или в лоб. Например, у нас есть три звуковых сообщения msg_NeutralBuildingLost1, msg_NeutralBuildingLost2, msg_NeutralBuildingLost3. И общее текстовое сообщение str_NeutralBuildingLost.
Тогда можно создать конструкцию для вывода случайного сообщения:
SendPersonalCockpitMessage(_LeaderID, CC1M6Mission_Strings::str_NeutralBuildingLost, CCockpitColorMap::m_BadNewsColor, "msg_NeutralBuildingLost"+new string(randnum(3)+1));
Т.о. конструкция "msg_NeutralBuildingLost"+new string(randnum(3)+1) вызовет сообщение msg_NeutralBuildingLost c номером, сгенерированным случайно от 1 до 3. На экране появится в виде от первого, третьего лиц сообщение об уничтожении гражданского объекта, а в ухи гавкнет сообщение, выбранное из трех.
Только в шестой миссии первой кампании я че-то не нашел воспроизведение сообщения о неправомерном уничтожении гражданских объектов.
Понятно, что метод описан поверхносто. Но, если интерес не угас, можно будет пошагово изложить.

orthodox
25.11.2003, 19:49
Я ошибся с указанием миссии...

OPEX
25.11.2003, 19:59
В любом случае, данная конструкция имеет виды на жизнь. Тонкости лишь в правильном идентифицировании звуковых файлов и корректном их "протаскивании". На досуге можно посмотреть Sounds.script из \Common

orthodox
25.11.2003, 20:50
Благодарю, покопаюсь.

orthodox
26.11.2003, 21:01
Значит так. Помогите разобраться с конкретным случаем. Скрипт 7-й миссии первой кампании.

Array GetVoiceSoundTable()
{
return
[
[ "str_ArtillerySupport_Disagree", "Resources/C1M7_str_ArtillerySupport_Disagree.wav" ],
[ "str_ArtillerySupport_Agree", "Resources/C1M7_str_ArtillerySupport_Agree.wav" ],
[ "str_ArtillerySupport_OpenFire", "Resources/C1M7_str_ArtillerySupport_OpenFire.wav" ],
[ "str_ArtillerySupport_OpenAllFire", "Resources/C1M7_str_ArtillerySupport_OpenAllFire.wav" ],
[ "str_ArtillerySupport_Incorrect", "Resources/C1M7_str_ArtillerySupport_Incorrect.wav" ],
[ "msg_BildingKill", "Resources/C1M7_msg_BildingKill.wav" ],
[ "msg_Message01", "Resources/C1M7_msg_Message01.wav" ]
];
}

Это, как я понимаю, объявлен массив звуковых сообщений, пользуемых в игре. Как в нем указать вместо единственного значения
переменной "msg_BildingKill", равного "Resources/C1M7_msg_BildingKill.wav",
массив значений Resources/C1M7_msg_BildingKill-1.wav, Resources/C1M7_msg_BildingKill-2.wav и Resources/C1M7_msg_BildingKill-3.wav ?

Далее. Вот, как я понимаю, алгоритм вызова сообщения на событие Уничтожение Объекта.

event void OnObjectDestroyed( String _ObjectID )
{
CSPMission::OnObjectDestroyed(_ObjectID);
logMessage("WARNING! Game object " +new String(_ObjectID)+ " has been destroyed");

Component DeadThing = GetObject(_ObjectID);
if ( checkMask(DeadThing, ["CIVIL"], []) )
{
// logError("[skunkie sez] and the offender is... " + DeadThing.GetLastDamager() + "!");
m_BildingsKill++;
if (m_BildingsKill < m_BildingsMax)
{
fireEvent(0.0, [], "SendCockpitMessage", [msg_BildingKill + new WString(m_BildingsKill), CCockpitColorMap::m_BadNewsColor, "msg_BildingKill"]);
// SendBroadcastCockpitMessage(new String(m_BildingsKill) + msg_BildingKill , CCockpitColorMap::m_BadNewsColor);
}
else if (!m_CivilTooMuch)
{
m_CivilTooMuch = true;
DelayedFailMission();
}
}

Где здесь описывается вызов текстового сообщения на экран, а где - звукового?


Ну или если на пальцах сложно объяснить - вышлите мне (если просьба не слишком нахальна) скрипт 7-й миссии, измененный под такую фичу:

На уничтожение n-ного гражданского объекта вызывается сообщение Resources/C1M7_msg_BildingKill-n.wav

Желательно с комментариями, что и как измененно.

OPEX
27.11.2003, 11:36
По крайней мере, шутка со звуковыми сообщениями здесь похиляет. Только, с учетом изменившихся условий придется отказаться от случайного значения, но прописывать строго-заданное значение убитых гражданских объектов.
Для изменения звуковых сообщений:
- создаем звуковые файлы C1M7_msg_BildingKill_2.wav, C1M7_msg_BildingKill_3.wav и т.д. сколько надо.
- переформировываем массив идентификаторов звуков до вида:
Array GetVoiceSoundTable()
{
return
[
[ "str_ArtillerySupport_Disagree", "Resources/C1M7_str_ArtillerySupport_Disagree.wav" ],
[ "str_ArtillerySupport_Agree", "Resources/C1M7_str_ArtillerySupport_Agree.wav" ],
[ "str_ArtillerySupport_OpenFire", "Resources/C1M7_str_ArtillerySupport_OpenFire.wav" ],
[ "str_ArtillerySupport_OpenAllFire", "Resources/C1M7_str_ArtillerySupport_OpenAllFire.wav" ],
[ "str_ArtillerySupport_Incorrect", "Resources/C1M7_str_ArtillerySupport_Incorrect.wav" ],
[ "msg_BildingKill1", "Resources/C1M7_msg_BildingKill.wav" ],
[ "msg_BildingKill2", "Resources/C1M7_msg_BildingKill_2.wav" ],
[ "msg_BildingKill3", "Resources/C1M7_msg_BildingKill_3.wav" ],
[ "msg_Message01", "Resources/C1M7_msg_Message01.wav" ]
];
}

Соответственно, в вызовеfireEvent(0.0, [], "SendCockpitMessage", ... произойдет изменение в последнем передаваемом аргументе до вида
fireEvent(0.0, [], "SendCockpitMessage", [msg_BildingKill + new WString(m_BildingsKill), CCockpitColorMap::m_BadNewsColor, "msg_BildingKill"+new String(m_BildingsKill)]);
Т.о. конструкция ""msg_BildingKill"+new String(m_BildingsKill)" зашлет в ухи идентификатор звука "msg_BildingKill1", если будет уничтожен первый объект, "msg_BildingKill2", если второй гражданский объект будет поражен и так далее.
Текстовое сообщение, соответственно, пырвый аргумент функции SendCockpitMessage. В нашем случае - "msg_BildingKill + new WString(m_BildingsKill)". Указатель на текстовое сообщение "msg_BildingKill" уложен в MissionC1M7Strings.script. Одно "но" при работе со стрингами сообщений - они не String - они WString.
Т.е. в нашем конкретном случае текстовое сообщение "msg_BildingKill + new WString(m_BildingsKill)" будет выглядеть, как "Уничтожено гражданское здание. Всего уничтожено <число уничтоженных объектов из переменной m_BildingsKill>".

SVM-Nafigator
28.11.2003, 00:58
Хым... А сделать внешнюю прогу, которая меняет скрипты (имя звукового файлика). Перед запуском игры/после/когда кнопку нажмешь/по таймеру. Это слишком сложно? Или слишком криво :)
Так пожалуй и компанию сделать можно...

OPEX
28.11.2003, 11:18
Хым... А сделать внешнюю прогу, которая меняет скрипты (имя звукового файлика). Перед запуском игры/после/когда кнопку нажмешь/по таймеру. Это слишком сложно? Или слишком криво
Так пожалуй и компанию сделать можно...
====================================
Внешняя прога, которая меняет скрипты? С какой целью? Менять скрипты? Эта прога есть. Называется скрипт-мастер, получает з/п и работает полный день. Только его вряд ли когда-нибудь называли прогой.
А теперь серьезно: нельзя ли почетче изложить вопрос? Пока не могу уловить сути.

SVM-Nafigator
29.11.2003, 02:12
Это не вопрос был. Совет из категории - нормальные герои всегда идут в обход. Поскольку игрушку до нас еще не довезли, а демка качается со скоростью 0.5к/с :( ,совет носит несколько абстрактный характер. Если нельзя чего-то сделать средствами языка скриптов, (чего-то там говорили о случайных гражданских объектах) можно внешней програмкой менять отдельные строчки в тексте скриптов. Совсем как скрипт-местер. И з/п можно съэкономить :D
Кстати, кто-то обещал выложить конвертор для 3DS или Х форматов. От безделия уже дурацкие мысли в голову лезут - а вот добавлю я свой крафт. Tie-fighter например :D он, кажется, без щитов был. Только вот как сделать перезаряжаемвые пушки? Сразу узнаем кто круче к50 или...? Помоему, старине Лукасу ничего не светит :D

Tui
02.12.2003, 17:17
террайн сдк в студию!

т.е. мануал как ландшафты клепать...

OPEX
02.12.2003, 17:32
Там надо думать.
Скажем так, ландшафт характеризуется картой высот, картой зон, текстурой с освещением, уровнем моря, и еще рядом второстепенных значений.
Озновная засада - осветить вновь созданный ландшафт.
Надо подумать.

Tui
02.12.2003, 18:39
ну типа подумаем...

мануал в студию

vlud
02.12.2003, 19:42
Originally posted by Tui
ну типа подумаем...

мануал в студию

Ну давайте попробуем :)

http://www.fair-strike.com/rus/Files.Html

Tui
03.12.2003, 18:48
дороги и столбы хых клепать давольна проста :)

Tui
03.12.2003, 19:10
Как уже ландскейпы клепать?
Хочецца попробовать какую нить реальную карту замутить...
и заставить ея столбами, и пересеч напрочь дорогами хыхы,
и пару деревень воткнуть 8)
И лес такой - дремучий-дремучий 8))
Посредине озеро какое-нить, а там - авианосец 8() хыхы

vlud
03.12.2003, 19:20
Originally posted by Tui
Как уже ландскейпы клепать?
Хочецца попробовать какую нить реальную карту замутить...
и заставить ея столбами, и пересеч напрочь дорогами хыхы,
и пару деревень воткнуть 8)
И лес такой - дремучий-дремучий 8))
Посредине озеро какое-нить, а там - авианосец 8() хыхы

Берешь из Terrains RAW файл. Сохраняешь резервную копию. Грузишь фотошопом. Соглашаешься на предлагаемые параметры. Видишь перед собой карту высот. Извращаешь ее как хочешь. Сглаживаешь пару раз чтобы не получить триллион граней в один кадр и записываешь обратно.

Вот.

Текстуру менять сложнее и для этого нужна утилита.

orthodox
03.12.2003, 20:30
Ну что, спасибо, получилось. Т.к. максимальное кол-во зданий, кот. можно уничтожить, равно 10, то я сделал (пока тестовых) 10 разных сообщений.

Внимание, вопрос! (с) "Что? Где? Когда?"

Т.к. уничтожаются здания зачатую пачками, то думаю будет целесообразно озвучивать не каждое уничтожение, а через 3, например.
В этом случае для меня проще сделать несколько пустых файлов, т.е. звуковых файло с тишиной.
Но хотелось бы знать, как в скрипте поменять математику для такого случая (типа шаг массива звуковых сообщений не 1, а 3), при сохранении единичной дискретности массива текстовых сообщений на экране?

SVM-Nafigator
14.12.2003, 23:22
Хто то обещал конвертер моделей для УС выложить. Уже давно, однако. Я тут уже две модельки из разных мест наковырял. А то на тех что в игре, как на танке... Броня крепка...

vlud
15.12.2003, 20:22
Originally posted by SVM-Nafigator
Хто то обещал конвертер моделей для УС выложить. Уже давно, однако. Я тут уже две модельки из разных мест наковырял. А то на тех что в игре, как на танке... Броня крепка...

Как только, так сразу. С патчами разберемся для начала. Вы пока продолжайте конструктивно ругать -- мы уже много полезного для себя извлекли. Постараемся воплотить то, что легко сделать.