Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: yet another repair semi-mod
GAMEINATOR forums > S.T.A.L.K.E.R. > S.T.A.L.K.E.R. Архив > S.T.A.L.K.E.R. Архив по модификациям
Страницы: 1, 2
HikeR
в свете последних бурных обсуждений "про ремнот" решил выложить свое видение подхода к ремонту оружия и брони. принцип взят из Fallout 3, а конкретно - ремонт поврежденного итема возможен при помощи разбирания на запчасти другого аналогичного итема.
простенький фейс:

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

немного про условия. применена простейшая фильтрация по классу объекта, соответсвенно получается, что гадюку можно чинить укороченным калашом и наоборот. любую броню можно чинить любой броней, так как класс у нее везде одинаковый. также нельзя починить объект с состоянием >98% (и так нормальный) и < 10% (хлам восстановлению не подлежит), однако можно использовать эти объекты для разбирания. также применяется ценовой коэффициент, то есть для починки экзы нужно очень много "курток новичка" ;) да, и починябельный объект починяется не больше чем на 10% от состояния разбираемого объекта. и еще, оружие разбирается и выкидывается без учета наличия патронов или прицелов, поэтому что жалко - предварительно снимайте.
по тексту скрипта легко найти где производится проверка и расширить ее, добавив свои условия, также как и автоматическое снятие апгрейдов. меня в первую очередь интересовало сохранение уникального оружия и броников, а не глобальное восстановление всех встреченных стволов с целью последующей продажи, но такой вариант тоже возможен ;)

активация диалога производится из любого места игры вызовом инициализирующей ф-ии, например так:
Код
level.start_stop_menu(ui_repair.repair_dialog(get_hud()),true)

можно привязать вызов к чему угодно, диалог выводится поверх существующих диалогов. если вызов происходит из самой игры (например сопоставлен вхождению в какую-то зону), то худ полностью очищается и остается только окно диалога.
однако текущий вариант рассчитан (просто из-за расположения всех элементов) на вывод поверх окна инвентаря, и срабатывает при использовании какого-либо предмета. то есть быстрого ознакомления с возможностями модуля можно в файле bind_stalker.script найти функцию function actor_binder:on_item_drop (obj) и в конце дописать что-то вроде:
Код
if obj:section() == "energy_drink"
    level.start_stop_menu(ui_repair.repair_dialog(get_hud()),true)
end

тогда диалог появится при выпивании энергетика. "energy_drink" можно заменить на "kolbasa", вобщем что у вас в инвентаре есть съедобного, на то и вешайте. рисовать иконки "молотка и отвертки" я доверю более умеющим людям ;)

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

ну и вот собсно сам модуль:
[delated]
Dusty79
Не стоило "изобретать велосипед" в данном конкретном случае.
Около 3-х недель назад, а может и более, камрад Shredder на основе моего односписочного ремонтного комплекта изготовил двухсписочный, приблизительный аналог которого представлен здесь. Только уже полностью готовый к употреблению.
HikeR
http://www.gameru.net/forum/index.php?show...st&p=795093
с тех пор прошло ровно 2 недели, но никто, включая вас (хотя вы в том топике были), не предоставил ссылочку или хотя бы просто название на что-то похожее.
Kolmogor
Цитата(Dusty79 @ 15.07.2009, 08:37) *
Не стоило "изобретать велосипед" в данном конкретном случае.
Около 3-х недель назад, а может и более, камрад Shredder на основе моего односписочного ремонтного комплекта изготовил двухсписочный, приблизительный аналог которого представлен здесь. Только уже полностью готовый к употреблению.

"велосипед" HikeR`а вижу, а ваш велосипед и мопед Shredder`а не вижу sad.gif
marogor
Простите, что влезаю... smile.gif Но подтверждаю, что данный "велосипед", про который говорит Dusty79, существует, отлично работает и за две недели тестового использования (мной) не вызывает никаких нареканий.
Орион
Аналогично Колмогору - Dusty79, выложите сначало то, о чём говорите.

HikeR, Весьма и весьма любопытно. Рад, что всё-таки появился мод и не в составе какой-то солянки, благодарю за "девайс" smile.gif

P.S. Раз уж вы написали, что проверка идёт по классу предмета - получается несколько нелогично, что любой броник можно починить любой другой бронёй. Можно ли это как-то ограничить, например, сузив проверку до проверки наследуемого объекта (чтобы уники чинить и похожние между собой броники)? Я в скриптах не силён, потому не очень представляю, что именно надо дописать, не хотелось бы неделю возиться с парой строчек кода smile.gif
marogor
Орион, можно. smile.gif Именно так это сейчас и сделано. То есть, для примера: Грозу (простую либо прокачанную) можно починить только при наличии другой Грозы; ЛР300 - только при наличии другого ЛР300 и т.д....
HikeR
Цитата(Орион @ 15.07.2009, 11:02) *
Можно ли это как-то ограничить, например, сузив проверку до проверки наследуемого объекта (чтобы уники чинить и похожние между собой броники)?

проверка по классу универсальна тем, что любой новый нестандартный объект (новое оружие, новая броня и тд) пройдет проверку.
а так как в игре более не к чему прицепится, то остается только вручную прописать все зависимости, типа "если а=куртка новичка и б=бандитская куртка, тогда чиним", и так для каждой пары. то есть любой нестандартный предмет надо добавлять ручками.
с оружием проще, проверка по классам в основном проходит правильно, за исключением гадюк и калашей (ну и невозможности ремонта обычного калаша укороченным). то есть можно добавить несколько исключений и все пройдет.

вот для обхода этого и юзается ценовой коэффициент, скажем обычная "куртка новичка" добавит к состояния "комбинезона сталкера" максимум 100%*0,1*(1000/60000) ~= 0,0017%, то есть практически нифига не добавит ;)
то есть непрактично получается.

вот по поводу "проверки наследуемости" я несколько в затруднении. это в конфигах видно, что один объект содержит ссылку на родительский объект и все его параметры, а вот как это дело определить в самой игре... можно анализировать название объекта или секции, типа "wpn_ak74_m1" понятно что нечто более интересное, чем просто "wpn_ak74", но единой логики ни у разрабов, ни у мододелов не выработалось, сходу и ен определишь, что "outfit_svoboda_m1" есть модификация "svoboda_light_outfit" ;)

вобщем приходит в голову только вариант с матрицей, в которой расписаны все возможные варианты. если кто даст актуальные clsid-ы оружия и броников, то составлю быстро (в lua_help, как выяснилось, clsid-ы нифига неправильные).

Цитата(marogor @ 15.07.2009, 11:24) *
Именно так это сейчас и сделано.

если вы про сабж, то сейчас ту же LR300 можно чинить и гадюками, а "пустынный орел" - обычными ПМ-ами ;)
marogor
Hiker, не про сабж - про то, о чём говорил Дасти.

Или ссылку на "сабж" или прекращаем флудить. Орион
HikeR
ну тогда поделитесь алгоритмом проверки, только если это не заранее составленная матрица.
HikeR
по поводу брони. попробуем метод тупой, но надежный.

под картинкой - ссылка с доступом на редактирование таблички в googledocs. слева - что чиним, сверху - чем чиним. единичка в ячейке - ремонт возможен, иначе невозможен.

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

p.s.
"здесь был вася" просьба не писать ;)
Dusty79
Что касается демонстрации - мой "велосипед" можно было увидеть в действии на скринах в соседней теме..
К сожалению, сейчас не имею физической возможности предоставить сам код.
Что касается алгоритма проверки и сопоставления предметов для ремонта - я делал привязку к каталогу, в котором лежит модель предмета, что гораздо быстрее и проще матриц или списков. Да, это требует сортировки файлов моделей по папкам, но это уже было сделано до того, как я разрабатывал этот девайс под определенный мод. Я просто воспользовался ситуацией.
Впрочем, и от этого я планирую отказаться, сделав ремкомплект легче в переносе под другие моды. Никаких таблиц не планирую - я еще не сошел с ума. smile.gif
Орион
HikeR, Внёс пару правок. В частности, в ремонт Сталкеровского комбеза комбезами Монолита, Долга и Свободы. Ремонт комбеза Туриста - улучшенным комбезом Сталкера.
HikeR
Цитата(Dusty79 @ 15.07.2009, 13:00) *
я делал привязку к каталогу, в котором лежит модель предмета

не совсем понял.
оружие - название каталога с моделью (в \meshes\weapons )
обычный калаш: ak74
укороченный калаш: ak-74u

лежат в разных каталогах, то есть у вас тоже разные калаши друг другом не чинятся? или ПМ обычный, и ПМ с глушителем - тоже несовместимы?
Орион
HikeR, Кстати, идея с таблицей очень хороша тем, что легко можно будет добавлять свою новую броню, не редактиуя скрипты, а просто расширяя таблицу конфиг-файла smile.gif
Dusty79
Я же сказал, что сортировка моделей по папкам уже была проведена. Сходное оружие лежит в одной папке.
Что касается совместимости того же ак-74 и ак-74у... При всей схожести механизма детали конструкции одного не подходят к другому. Факт. Так что они действительно несовместимы для ремонта. В условиях игры, конечно. Да и оружие это разных весовых категорий. Зато любую модификацию ак-47 можно починить, разобрав любой другой ак-47. Лично я был против подобного, но тестеры настояли на этом, дабы не портить юзабельность ремкомплекта. Краткое описание девайса я передавал Вам в личном сообщении.
HikeR
Цитата(Орион @ 15.07.2009, 13:31) *
не редактиуя скрипты, а просто расширяя таблицу конфиг-файла

именно. и не надо проводить сортировку моделей по каталогам, если человек захочет добавить в игру свой собственный ствол ;)

ну а что касается калашей... в реальности АКМСУ действительно имеет несколько иную конструкцию, чем АКМС (более короткие поршень и газовая трубка), однако в игре используются аналоги АКС-74У и АК-74, которые имеют практически полностью идентичные механизмы.
поэтому взаимопочинка этих автоматов вполне реальна, дойду до оружия - поставлю еденички в соответсвующих ячейках ;)
HikeR
итак, добавлен файлик misc\repair_dependences.ltx, который содержит:
- названия секций всей брони, которая встречается в оригинальной игре
- матрицу, по которой проходит проверка возможности ремонта
- внешний коэффициент ремонта для брони

коэф. ремонта показывает, сколько %% максимум добавится к ремонтируемой броне от состояния разбираемой брони.
матрица проста для понимания, но неудобна для реактирования ;) слева - что чиним, сверху - чем чиним, на пересечении - возможность (при желании можно добавить и вероятность :)

для добавления новой брони достаточно в секции [all_outfits] дописать к параметру outfits свою броню, обязательно в конце. затем, в секции [outfit_dependences] опять же в конце создать параметр с совпадающим именем и строкой разрешения/запрещения ремонта, и не забыть добавить к остальным строкам одну цифру.
я делал в табличном редакторе, там ошибится значительно сложнее.

самое главное, чтобы количество значений в каждой строке совпадало с общим количеством разной брони перечисленном в секции [all_outfits]. в скрипте происходит проверка на равенство, в противном случае происходит принудительный вылет с записью в лог, так сказать, во-избежании.


с оружием поступлю аналогично, но немного попозже, матрицы рисовать весьма утомительно ;)

p.s.
вспоминая разбирательства с деревом апгрейдов в чистом небе для ответа на вопрос "как разблокировать все апгрейды для дробовика" работа с матрицей начинает казаться простой и увлекательной ;)

p.p.s.
кто-нить может нарисовать красивую иконку для этого "набора отверток", во избежание, так сказать, претензий?
Орион
Немного оптимизировал таблицу для простоты обращения с ней. Подписи - сокращения от названий комбезов. Порядок в текущем файле такой же, как и список слева по вертикале. Т.е. если что-то не понятно - смотрим на список слева.

P.S. Файл переименовать в .ltx - влом было архивировать.
[delated]
HikeR
Цитата
для быстрого ознакомления с возможностями модуля можно в файле bind_stalker.script найти функцию function actor_binder:on_item_drop (obj) и в конце дописать что-то вроде:

кстати, при таком способе вероятны вылеты после ремонта, сохранения и последующей загруки с ошибкой вида:
log
Код
Клиент: Синхронизация...
* phase time: 11 ms
* phase cmem: 322966 K
* [win32]: free[3224172 K], reserved[97808 K], committed[872260 K]
* [ D3D ]: textures[63067 K]
* [x-ray]: crt heap[322407 K], process heap[8414 K], game lua[21473 K], engine lua[245 K], render[1037 K]
* [x-ray]: economy: strings[5037 K], smem[28210 K]
stack trace:


[error][      87]    : Параметр задан неверно.

какого-то фига происходит сброс всего инвентаря именно перед загрузкой, что активирует попытку вывода диалога в момент когда выводить диалог просто некуда ;)

так что для ознакомления такое вполне проходит, а для нормального использования - не очень.
HikeR
такс, вылет достигается таким образом:
- выкидываем (а не съедаем/выпиваем) предмет, на который завязан вызов диалога
- закрываем диалог
- подбираем этот предмет
- сохраняемся
- загружаемся... вылетаем

дабы обезопасится при такой активации диалога достаточно немного изменить его вызов из ф-ии bind_stalker.actor_binder:on_item_drop (obj) (спасибо Ориону, что не спал в это время :)
Код
if obj:section() == "energy_drink" and
db.actor:has_info("ui_inventory") then
    level.start_stop_menu(ui_repair.repair_dialog(),true)
end

то есть диалог откроется только при наличии открытого инвентаря, при загрузках/сохранениях он срабатывать не будет.

по поводу оружия. в оригинале всего больше 50-ти разных стволов, поэтому делать такую гигантскую таблицу, а особенно потом ее редактировать, слишком запарно. для добавления нового ствола придется помимо добавления одной строчки с этим стволом сразу изменить остальные 50 с фигом. вобщем, про табличку придется забыть.
поэтому начал делать что-то вроде динамического сканирования конфига, в котором перечислены только те пары оружия, которые совместимы по ремонту, ибо таких пар намного меньше, чем (кол-во_всех_стволов)^2. достаточно будет в любом порядке прописать названия секций в качестве параметров и перечислить все совместимые секции как значения (через запятую, если несколько). отсутсвие секции будет означать, что данный ствол чинится только самим собой.

по поводу уникальных стволов сначала хотел просто отрезать окончание _m1, _m2 от названия секции, чтобы получилось имя родителя, однако разрабы и тут накосячили:
wpn_wincheaster1300 - оригинал
wpn_winchester_m1 - уникальный ствол
а каких правил именования придерживаются остальные моддеры - я вообще не представляю.
Орион
Цитата(HikeR @ 16.07.2009, 02:09) *
по поводу оружия.

Что есть вроде дополнительного параметра ввести в конфиг оружия и по нему сканить скриптом "можно или нет" чинить оружие и чем именно?
HikeR
оригинальные конфиги трогать не хочется. просто в конфиге repair_dependences.ltx добавляются строки вида:
Код
...
set_1 = ak74, ak74_m1, ak74u, ak74u_m1
set_2 = fort, fort_m1
set_3 = mp5, mp5_m1, mp5_m2
set_4 = pb, pm
...

затем скрипт проверяет пару (ремонтируемое и разбираемое оружие) на вхождение в какой-либо набор, если такой набор найден - значит ремонт возможен.

сейчас пытаютсь как-нить оптимизировать проверку, ибо сейчас даже списки выводятся с подтормаживанием, проверка просто в лоб проводится ;) но это решаемо, а вот какой-то другой, более удобный способ записи соответсвий, пока в голову не приходит.
Lekzd
Цитата(HikeR @ 16.07.2009, 15:03) *
а вот какой-то другой, более удобный способ записи соответсвий, пока в голову не приходит.


а ты не пробовал для КАЖДОГО оружия отдельно прописать тип для ремонта - тогда даже цикл запускать не нужно
dev1ce
Цитата
и тут накосячили

Ну приведи к общему виду, в чем проблема?

Цитата
оригинальные конфиги трогать не хочется

Зря, удобнее.
Орион
Цитата(dev1ce @ 16.07.2009, 15:07) *
Зря, удобнее.

Как вариант, можно начёркать файлег, по типу weapons.ltx и туда приинклудить все вепоны, а в самом файлике уже расписать новые команды, которые бы дёргались самим скриптом, в зависимости от имени секции вепона.
HikeR
Цитата(dev1ce @ 16.07.2009, 16:07) *
Зря, удобнее.

честно говоря, не вижу ничего удобного в добавлении одной строчки в 40-50 файлов, вместо того чтобы дописать эти же 50 строчек в один файл.
Цитата(dev1ce @ 16.07.2009, 16:07) *
Ну приведи к общему виду, в чем проблема?

я даже когда только для себя что-то делаю - не залезаю в оригинальные конфиги, максимум - дополняю их. поэтому всегда могу сказать, что именно добавлено и на что это влияет.
фразы подобные этой: "Для начала, расписывать сотню мелких пунктов типа "увеличили/уменьшили рост главного героя" не будем – это смешно." обычно следует читать как: "Мы не будем расписывать сотню мелких пунктов, так как сами не помним что они делают, а некоторые даже не знаем". а все потому, что идет бездумная правка всего и вся без какой-либо системы откатов или отслеживания изменений. но это уже лирика ;)
Цитата(Lekzd @ 16.07.2009, 15:23) *
а ты не пробовал для КАЖДОГО оружия отдельно прописать тип для ремонта

если вы имеете ввиду запись подобную этой:
Код
ak74 = 1
ak74_m1 = 1
ak74u = 1
ak74u_m1 = 1
fort = 2
fort_m1 = 2
mp5 = 3
mp5_m1 = 3
mp5_m2 = 3
pb = 4
pm = 4

то она несколько монструозна ;) первоначальный вариант более компактный, и к тому же позволяет делать, например, так:
Код
set_1 = ak74, ak74u
set_2 = ak74, ak74_m1, ak74_m2
set_3 = ak74u, ak74u_m1, ak74u_m2
set_4 = pm, pb, mp5_m1

то есть обычный калаш можно ремонтировать укороченным, но уникальные стволы - только своими прототипами. либо, например, гадюку под патрон 9х18 ремонтировать обычными ПМ-ами, разница в цене сделает дельту улучшения намного меньше. а чтобы обычный ПМ в этом случае нельзя было полностью восстановить за один заход при помощи модифицированной гадюки ценовой коэффициент будет работать только в сторону уменьшения ;)
dev1ce
Цитата
честно говоря, не вижу ничего удобного в добавлении одной строчки в 40-50 файлов, вместо того чтобы дописать эти же 50 строчек в один файл.

Можно поспорить, но дело барское.

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

Ну ок.

Цитата
"Для начала, расписывать сотню мелких пунктов типа "увеличили/уменьшили рост главного героя" не будем – это смешно." обычно следует читать как: "Мы не будем расписывать сотню мелких пунктов, так как сами не помним что они делают, а некоторые даже не знаем"

Так уже полтора года как не делают, не?

Цитата
а все потому, что идет бездумная правка всего и вся без какой-либо системы откатов или отслеживания изменений. но это уже лирика wink.gif

Да блин, пущай делают, я к тому клоню, что содержать в одной секции ствола всю инфу о нем гораздо лучше, нежели плодить левые секции с ней. Это лирика, да.

Если судить с позиции "Хочу четко видеть что нового добавлено", то пожалуй я согласен. Правда работает это все только до определенного момента.
HikeR
Цитата(dev1ce @ 16.07.2009, 16:47) *
Можно поспорить, но дело барское.

если еще сомнения, то вот вам еще довод ;) распостранять и устанавливать мод из 3-х файлов несколько легче, чем мод из 50-ти файлов. в первую очередь из-за минимальных трудностей с совмещением с другими модами.
а если у кого-то стоит так называемый "оружейный мод"? возлагать на юзера ручную правку полсотни файлов не есть гуд, а патчеры никто не использует :(
Цитата(dev1ce @ 16.07.2009, 16:47) *
Так уже полтора года как не делают, не?

не пишут такие фразы, или все все прекрасно помнят где меняли?
Орион
Хватит оффтопить.
Dusty79
Блин... Давайте оставим описание OGSE, а. Чего попусту цепляться?
История изменений ведётся. На ресурсе развёрнута система управления версиями.

По поводу внесения изменений в файлы. Вы спорите с совершенно разных и несовместимых позиций и ни один из вас не не мыслит в нужном направлении, продолжая беспочвенный спор.
На самом деле всё просто, на мой взгляд.
Если разрабатывается отдельный мини-мод, то, конечно, во главу угла ставится простота адаптации. И в данном конкретном случае HikeR прав, т.к. у него на руках именно такой случай.
Другое дело, когда разработка ведётся под конкретный большой мод. Тут уже важнее простота внесения изменений в процессе разработки. Удобнее править тот же самый конфиг ствола, когда всё, что к нему относится находится в одном файле. И не надо лазить ещё куда-то, если приспичило добавить или удалить пушку.

Да и вообще... отвлеклись от темы...
dev1ce
Цитата
и ни один из вас не не мыслит в нужном направлении,

Вообще-то один делает мод и считает нужным делать его легким для адаптации, другой делает большую и страшную хероту.

Вчитался-бы шоле для начала.
Dusty79
biggrin.gif
Да ну вас в баню...
По ходу кроме себя никого не воспринимаете.
Один/другой...
В чём суть темы? Демонстрировать ход разработки данного конкретного мини-мода или спорить до хрипоты непонятно о чём?
HikeR
Цитата(Dusty79 @ 16.07.2009, 21:39) *
В чём суть темы?

обратная связь с общественностью, которая наставляет на путь истинный.
Цитата(Dusty79 @ 16.07.2009, 21:15) *
Другое дело, когда разработка ведётся под конкретный большой мод. Тут уже важнее простота внесения изменений в процессе разработки. Удобнее править тот же самый конфиг ствола, когда всё, что к нему относится находится в одном файле. И не надо лазить ещё куда-то, если приспичило добавить или удалить пушку.

если есть хоть какое-то понятие о "координации проекта", то проблема с тем "куда надо лазить ещё" отпадает сама собой. менеджер проекта составляет дерево зависимостей, после этого каждый участник сразу видит, от чего зависит какая-либо часть кода/конфига, над которой он работает, либо на что она может повлиять и как этого избежать. если избежать не удается, менеджер ставится в известность, после чего решает, вносить ли глобальные изменения с последующим оповещением всех участников, либо объяснить вносителю, что другие не могут отвлекаться на всякую ерунду и такие правки нужно делать по-другому.
если над одним проектом работает больше двух человек и время разработки тянется больше месяца, то отсутствие такого дерева автоматом превращает проект в нечто ужасное. оно вроде и работает, но если что-то не так, то концов обычно не найти.
Dusty79
Вы уже участвовали в подобном проекте, чтобы так уверенно и свысока в менторском тоне об этом рассуждать?
Допустим, в профессиональной разработке такое положение вещей нормально. А в любительской, когда вместе работают "столяр Федя" и "водитель Петя", которым просто хочется что-то "сбацать" для игры? Они представления не имеют о подобной бюрократии и просто "бацают". Я утрирую, конечно, но на деле так и бывает чаще всего.

Цитата
обратная связь с общественностью, которая наставляет на путь истинный.

Да что-то речь-то пошла не о текущей разработке.
centrino
Dusty79, ну не нужно ерничать, давайте по существу, если у вас есть подобный опыт разработки - выкладывайте все в мельчайших подробностях, в каких проектах участвовали, сколько завершили, мы вас внимательно слушаем smile.gif
Dusty79
Не в тему будет совершенно.
Кстати, вышеописанная схема в управлении проектом - не единственно возможная.
Что касается меня, то я если и разрабатывал проекты, то небольшие, кратковременные и в одиночку. (Постановка и управление ролевым процессом группы участников). В разработке коллективных проектов начал участвовать только в OGSE, где схема взаимодействия объективно упрощена.
HikeR
Цитата(Dusty79 @ 16.07.2009, 22:54) *
в менторском тоне об этом рассуждать?

да не было никакого тона, специально самым мелким шрифтом написал.
однако вопрос об удобстве внесения исправлений вами был поставлен таким образом, что имел ввиду удобство для одного человека, а не для команды. а удобств работы в команде всегда будет меньше, так как нужно координировать свои действия с другими, а не только делать так, как себе любимому удобно.


теперь к делу. добил таки второй вариант для оружия. вобщем в сам скрипт теперь можно вообще не залезать, практически все правится в конфиге. конфиг откоментирован, но повторюсь по порядку:

  • [repair_config]
    2 коэффициента ремонта, для оружия поменьше, для брони побольше. если цена разбираемой брони меньше, то коэфф. уменьшается, если цена больше - коэфф. остается таким же. сделано для того, чтобы дорогой, но раздолбаной броней нельзя было за один присест починить более дешевую
  • [repair_clsids]
    прежде чем попасть в список кандидатов для ремонта весь инвентарь проходит отбор по классу, сейчас ремонтируется только оружие и броня. если захотите чинить колбасу, то надо просто добавить ее clsid в параметр repair_items
  • [all_outfits]
    первый вариант представления зависимостей ремонта, сделан только для брони. в параметрах outfits_* перечислены все названия секций брони (game_object:section()) которую хочется ремонтировать.
    можно добавлять новые параметры для своей броньки в виде outfits_5, outfits_6, главное чтобы цифра увеличивалась последовательно.
  • [outfit_dependences]
    ужасная таблица, порядок параметров должен строго повторять порядок следования их в секции [all_outfits]


теперь самое интересное.
[weapon_dependences]
параметры называются set_a(1...n) и set_b(1...n).
каждый параметр set_a(1...n) содержит названия секций оружия которое может использоваться для ремонта друг друга.
во второй группе параметров set_b(1...n) немного по-другому, только первый ствол можно починить остальными, но не наоборот. вот пример:
Код
set_a2    = ak74, ak74_m1
set_a3    = ak74u, ak74u_m1

set_b1    = ak74, ak74u
set_b2    = mp5_m1, pb, pm, fort

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

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

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

или давайте так, прошу помощи в добавлении разряжания ствола и снятия прицелов и глушителей, если есть, а также в управлении активным слотом игрока.
Сахаров
Цитата(Dusty79 @ 16.07.2009, 21:15) *
во главу угла ставится простота адаптации

зря, на завтра же после релиза он появится в очередной мегапупер солянке.
я бы наоборот все усложнил бы на радость соляночникам fuck.gif
HikeR
угу, прогнать через обфускатор, получить на выходе что-то вроде
Код
function asadas(boioubc,vbkjzljo) local weriuvix=weresh:condidtion() if lsdkfjlsf<oiuoiu then return end

откусил бы все провода от компов тех, кто так делает ;)
Орион
Цитата(HikeR @ 17.07.2009, 02:04) *
или давайте так, прошу помощи в добавлении разряжания ствола и снятия прицелов и глушителей, если есть, а также в управлении активным слотом игрока.

Под рукой оказался только скрипт рем.кита из ОГСЕ мода. Вот, что нашёл в нём:

Скрипт рем.кита
Код
function use_repair_kit(repaired_slot, destr_item)
local result = "without_changes"
if db.actor:item_in_slot(repaired_slot) ~= nil then
    local repair_item = db.actor:item_in_slot(db.repaired_slot)
    local repair_item_section = repair_item:section()
    local repair_item_condition = repair_item:condition()
    local destr_item_section = destr_item:section()
    local destr_item_condition = destr_item:condition()
    
    local actor_rank = db.actor:character_rank()
    if actor_rank > 1000 then actor_rank = 1000 end
-- amk.send_tip("Ранг: " .. actor_rank)

    local tech_complication = technical_complication(repair_item)
-- amk.send_tip("Сложность: " .. tech_complication)
    local amendment = (math.random((actor_rank - tech_complication), (actor_rank - tech_complication + 300)))/1000
    if amendment > 0 then amendment = 0 end
    if repair_item_section == destr_item_section then amendment = amendment*0.7 end
-- amk.send_tip("Поправка: " .. amendment)

    local size_of_repair = (destr_item_condition - 0.15) * (1 - ((1 - db.cond_rk) / 3))
    local repared_condition = repair_item_condition + size_of_repair
    local dif_repared_condition = repared_condition + amendment

    if repared_condition > 0.95 then
        repared_condition = 0.95
        size_of_repair = repared_condition - repair_item_condition
    end

    if dif_repared_condition > 0.95 then
        dif_repared_condition = 0.95
    elseif (dif_repared_condition > 0) and (dif_repared_condition < 0.95) then
        if dif_repared_condition < repair_item_condition then
-- amk.send_tip("Похоже, мы испортили вещь...")
            dif_repared_condition = repair_item_condition - ((repair_item_condition - dif_repared_condition)*((1000 - actor_rank)/1000))
            if dif_repared_condition < 0 then dif_repared_condition = 0 end
        end
    elseif dif_repared_condition <= 0 then
        if dif_repared_condition < repair_item_condition then
-- amk.send_tip("Ты сломал это!!!")
            dif_repared_condition = repair_item_condition - ((repair_item_condition + dif_repared_condition)*((1000 - actor_rank)/1000))
            if dif_repared_condition < 0 then dif_repared_condition = 0 end
        end
    end

    if dif_repared_condition > repair_item_condition then
--        amk.send_tip("Вам удалось улучшить состояние предмета.")
        result = "success"
    elseif dif_repared_condition == repair_item_condition then
--        amk.send_tip("Вам не удалось улучшить состояние предмета.")
        result = "without_changes"
    else
--        amk.send_tip("По неопытности Вы ухудшили состояние предмета.")
        result = "failure"
    end

    repair_item:set_condition(dif_repared_condition)

    if system_ini():r_string(destr_item_section, "slot") == "1" or system_ini():r_string(destr_item_section, "slot") == "2" then

    if system_ini():line_exist(destr_item_section, "ammo_class") then
-- Разрядим оружие и снимем с него аддоны
-- amk.logf("Разрядим разбираемое оружие")

        local destr_item_state = get_weapon_data(alife():object(destr_item:id()))

        local w_ammo_num = destr_item:get_ammo_in_magazine()
-- amk.logf("Оружие снаряжено " .. w_ammo_num .. " патронами")
        local w_ammo_type = destr_item_state.ammo_type
        local ammo_list = system_ini():r_string(destr_item_section, "ammo_class")
        local num = nil
        local ammo_tbl = {}
        for num in string.gfind(ammo_list,"([%w_%-.\\]+)%p*" ) do
            table.insert(ammo_tbl, num)
        end
        local w_ammo_name = ammo_tbl[w_ammo_type+1]
        amk.spawn_ammo_in_inv(w_ammo_name, w_ammo_num)

-- Разберёмся с аддонами
        local scope = 0
        local launcher = 0
        local silence = 0

        if     system_ini():line_exist(destr_item_section, "scope_status") then
            scope = system_ini():r_u32(destr_item_section, "scope_status")
        end
        if     system_ini():line_exist(destr_item_section, "grenade_launcher_status") then
            launcher = system_ini():r_u32(destr_item_section, "grenade_launcher_status")
        end
        if     system_ini():line_exist(destr_item_section, "silencer_status") then
            silence = system_ini():r_u32(destr_item_section, "silencer_status")
        end

        if scope == 2 and bit_and(destr_item_state.addon_flags, 1) == 1 then
            local inst_scope = system_ini():r_string(destr_item_section,"scope_name")
            amk.spawn_item_in_inv(inst_scope)
        end
        if launcher == 2 and bit_and(destr_item_state.addon_flags, 2) == 2 then
            local inst_launcher = system_ini():r_string(destr_item_section,"grenade_launcher_name")
            amk.spawn_item_in_inv(inst_launcher)
        end
        if silence == 2 and bit_and(destr_item_state.addon_flags, 4) == 4 then     
            local inst_silence = system_ini():r_string(destr_item_section,"silencer_name")
            amk.spawn_item_in_inv(inst_silence)
        end
    end
    end
    amk.remove_item_from_inventory(destr_item)
    db.cond_rk_dif = size_of_repair * repair_item_condition
    play_repair_sound()
end
    return result
end

И, соответственно, смежные функции из библиотеки xStream'a, которые дёргаются скриптом:
amk.script
Код
-- Спавним объекты в инвентарь
function spawn_item_in_inv(spawn_item,npc)
    if npc==nil then
        npc=db.actor
    end
    return alife():create(spawn_item,    
            npc:position(),
            npc:level_vertex_id(),    
            npc:game_vertex_id(),
            npc:id())
end


-- Спавним патроны в инвентарь
function spawn_ammo_in_inv(spawn_item,number,npc)
    if npc==nil then
        npc=db.actor
    end
    if number > 0 then
        return se_respawn.create_ammo(spawn_item,    
                npc:position(),
                npc:level_vertex_id(),    
                npc:game_vertex_id(),
                npc:id(),
                number)
    end
end


-- Удаляем объект из игры
function remove_item(remove_item)
    if remove_item~=nil then
        alife():release(alife():object(remove_item:id()), true)
        return true
    end
    return false
end


-- Выбрасываем объект из инвентаря, применимо к ГГ
function drop_item(npc,item)
    if item~=nil then
        npc:mark_item_dropped(item)
    end
end
HikeR
то есть все дороги ведут в амк и чтению состояния объекта через пакеты :(
громоздко...

да, и как быть, если есть полностью заряженный автомат, переключаемся на подствольник, заряжаем и пускаем автомат на запчасти? одна граната в инвентарь попадет, а полный магазин улетучится.
Dusty79
Да. Так и есть. В оригинальной игре в инвентаре из контекстного меню также разряжается только то, что заряжено при текущем режиме оружия. Я тоже не стал морочиться. Хотя рецепт есть: сначала разрядить то, что при текущем режиме, затем перевести оружие в другой режим (опять нет-пакет sad.gif ) дождаться апдейта и разрядить ствол снова. Гемор. blink.gif

Орион, ты б слил HikeR'у тот архивчик, что я тебе дал, мож чего интересного найдёт. Не жалко же.
Сталкероненавистник
Спасибо за старания! Очент пригодится!
HikeR
тут вот под утро пришла мысль, что заряженное оружие весит больше, чем разряженное, а ствол с аддонами весит еще больше. попробую в этом направлении покопать.
хотя, конечно, получить сразу все необходимые цифры из пакета проще (оставшиеся патроны, их тип, флаги аддонов), но это неинтересно ;)
Орион
Интересно, как успехи в этом направлении, удаётся ли сканить впн по весу без нет-пакетов?
HikeR
в комбинациях случается облом, образно говоря, иногда вес патронов + вес прицела = вес подствольника. то есть что там на самом деле - фиг знает ;)
хотя если забить на патроны, то почти всегда правильно определяется. думаем дальше...
Орион
Если попробовать сканить отдельно вес аддонов и после этого сканить заряжен/разряжен и если заряжен - разряжать, ну и снимать аддоны? Или не прокатит? smile.gif
HikeR
неее, с весом полный облом. я играю с поправленным конфигом оружия, правки касались в основном веса патронов, ибо ситуация в оригинале когда бронебойные патроны весят в 2 раза меньше, чем обычные дико напрягала.
поэтому все патроны подверглись тотальному исправлению (инфы когда-то перерыл море по этому поводу). вобщем, когда поставил оригинальную игру - вся затея дико провалилась, ибо тип патронов стал определятся абы как.
с аддонами проще, их всего 4 штуки, однако накачав кучу "оружейных модов" понял, что для некоторых прицел в килограмм и подствольник на 200 грамм - совершенно нормально, а для высчитывания всевозможных вариантов веса оружия нужно слишком много действий (вес с аддонами и без, с полным магазином и неполным...), намного больше, чем введение одной ф-ии чтения состояния ;)

то есть заточить под определенный конфиг весовой расчет вполне реально, довольно компактно получается, но как только начинаешь иметь ввиду то, что вес - величина непостоянная, а зависит только от фантазии мододела, то вся компактность летит к черту.

а разрабы тоже нехорошие люди, ф-ию get_ammo_in_magazine() они оставили, а что-то вроде get_ammo_type_in_magazine(), или get_addon_on_active_weapon() отсутсвует напрочь. вот и лезут неписи против калаша с заряженной в подствольник гранатой, а ведь могли бы и прочухать, что можно получить в лоб ;)


в итоге дописываю полное чтение состояния, подсветку активного оружия (чтобы свой любимый ствол не пустить на запчасти). может еще и запрет ввести на разбирание активного ствола и уникальных стволов?
да, к тому же выяснилось, что если ствол прописан как имеющий несъемный глушитель (типа ПБ), то на текущий момент этот глушитель довольно легко снимается при разборке ;) придется еще и проверку делать на "несъемность".
Орион
Цитата(HikeR @ 20.07.2009, 22:25) *
может еще и запрет ввести на разбирание активного ствола и уникальных стволов?

Вот это стоит. Всё-таки модификат - повышенной сложности, сделаный, как правило, умельцами. Кстати, можно сделать ранговую починку wink.gif Сделать 5-8 рангов (лучше больше). На определённом можно будет чинить уники АК/Гадюки, потом уники Абаканов, и так по возрастной... было бы инетерсно smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.