Вот именно. Править исходник - это wrong way, почти всегда.
В целом - да, но при одном условии. Лезть в исходники это плохая идея только если движок предоставляет API для моддинга. Если такого не случилось, то просто нет вариантов. К сожалению в гоззе смешались люди, кони и всё прочее - в норме эта система выглядит примерно так: Есть сами исходники в которые никто не лезет (движок), есть модули с логикой игры ( если хочется радикальной смены геймплея, то вам сюда ), есть глобальные скрипты (добавить нового монстра или итем, подрихтовать ИИ и всякое такое ), и есть редактор карт плюс локальные скрипты ( для мапперов ).
А ещё народ ищет грааль под названием DoomScript, только ищет не там
А как с ним вообще дело обстоит? И что такого особенного может дать дум скрипт по сравнению с обычным ACS?
Скрытый текст:
В ACS невозможно нормально закодировать нелетальные атаки. Например, отравление (монстра), паралич, оглушение, безумие, безмолвие и т.п., чем богаты все РПГ. Как итог, приходится ограничиваться стандартными поверапами, которые не всегда позволяют реализовать задуманное.
У ACS-а самая главная беда в том, что там нет типов данных (он тупо игнорирует, да). Ещё там нет классов для энтити (это как раз в д3 есть), нормальных строк и референсов на экторы в уровне.
Тут немного теории:
1. Что даёт класс для разных видов акторов. Вот, например, есть у нас имп обыкновенный. В ACS у импа какого-то специального класса нет, поэтому самим поведением импа управляет движок, и максимум можно через системные функции этому импу порекомендовать что-нибудь сделать. Что происходит когда класс есть: в скрипте будет описание внутренних данных этого импа - эти данные будут храниться отдельно в каждом экземпляре импа, их можно будет менять из скрипта и всё такое прочее. Кроме того у класса есть функции, и движковое AI может их вызывать (по крайней мере некоторый стандартный набор). То есть в д3 то самое добавление новых флагов или команд в половине случаев просто соответствует дописыванию в класс новых переменных. В ACS такое нельзя вообще.
2. Что дают типы объектов: Doom3 знает, какого типа объект пытаются использовать, а ACS - нет. Соответственно в D3 нельзя "открыть" импа как дверь или "убить" дверь. Впрочем, в ACS нет указателей на объекты и там нельзя сделать ничего из вышеперечисленного ни в каких комбинациях.
3. Указатели на объекты vs. ACS: В ACS есть один "невидимый" указатель на объект (действительно указатель) - это Activator. В D3 их можно создавать в произвольных количествах, заполнять, копировать и так далее. Конечно, в ACS есть доступ через TID, но он фактически не позволяет найти объект у которого нет TID (по разным причинам). Например, довольно затруднительно найти импов, которые смотрят на тебя (теоретически можно, но получится дикая конструкция из прожектайлов, скриптов и декотрейта ). Из за того, что в ACS нет указателей там нет и функций, которые бы эти указатели могли возвращать - трассировка по прямой от точки до точки с целью найти энтити, поиск энтити в закрытом объёме, просто перебрать по отдельности все энтити с некоторым тидом (именно по отдельности, например, их суммарный health посчитать).
4. Строки в ACS и боль: костыль, они, конечно, сделали. Но строки длительного хранения всё ещё вызывают тысячи вопросов. Равно как и ремаппящиеся вникуда числа в ACS библиотеках.
5. Аргументы энтити в D3 vs гозза: В Doom3 реализован ровно такой же набор аргументов для энтити как сейчас в UDMF в гоззе. Но там скрипты позволяют делать с этими аргументами по ходу игры всё что угодно. В гоззе UDMF аргументы работают только на UDMF картах, что очень доставляет. (А так то скрипты могли бы хранить в них свои данные)
6. Во fraggle script были хотяб поинтеры, но кто-то добрый всё испортил.
Наверное, так сложилось исторически. В Doom не было разделения игровой логики и движка, и от этого принципа до сих пор никак до конца не избавятся, несмотря на наличие положительных примеров (от Квейка и новее).
Есть ещё такой момент, что радикальная смена архитектуры движка скорее всего сломает к чертям совместимость с модами, созданными в условиях существующего бардака из фич. Поэтому у создателей популярных движков типа гоззы нет особого выбора в развитии их проектов, кроме как постепенно нанизывать костыли на костыли.
В принципе, судя по тому, что там творит граф, это гоззу уже убило. А способ давно известен. Предположим, захотелось кому-то радикально переделать гоззу на более современный лад, но не убить моды. Берём и переписываем основную часть без лишних заморочек, а всё старое должно просто загружаться специальным слоем конвертеров, которые будут читать тот же ACS\декор и заменять его адекватным скриптом.
Почитал как смог, поиграл в мод, что-то не заработали у меня порталы, только зеркала, а так интересно.
ZZYZX :
Это не мод, это игра. Aliens vs Predator 2. И кстати взлом там не у хищника, а у людей. Взглянуть — утяни с торрента и начни кампанию за хуманов, в первой же миссии всё будет. Правда сама игра за хуманов мне там не нравится, стрёмненький хоррор какой-то.
Спасибо, посмотрю, а то я нагородил чепухи выше
c4tnt :
В гоззе UDMF аргументы работают только на UDMF картах, что очень доставляет.
Интересно почитать, я как-то пробовал что-то сделать с 3д полом на udmf карте через acs, ничего не получилось так и забросил затею ..
[quote="Shadowman"]В ACS невозможно нормально закодировать нелетальные атаки. Например, отравление (монстра), паралич, оглушение, безумие, безмолвие и т.п., чем богаты все РПГ. Как итог, приходится ограничиваться стандартными поверапами, которые не всегда позволяют реализовать задуманное.
А почему не получилось сделать отравление монстра? Ведь монстру можно давать инвентори итем, и если она у него есть дамажить его по чуть? Оглушение это же frozen только для монстра, что мешает переключить монстра на стейт оглушения в котором он ничего не делает?
Или такие варианты не подходят?
А вообще хотелось бы темку в которой можно было бы размышлять по поводу реализации каких бы то нибыло фич, заметил что часто мне в голову приходят идеи когда что-то пытаюсь описать...
c4tnt
Омг, забыл про нее
А вариант взлома замка тот что описал на прошлой странице совсем не то? Я к сожалению не могу скачать игру прям щас, но по скринам примерно понял как оно взламывает, и мне кажется что тот способ мог бы справиться с такой задачей.
Не, я же писал, что это должно работать со стандартными дверями и кнопками, потому как никто вады под мод переделывать скорее всего не станет
А вот оно что, ну тогда да.. довольно сложно. Хотя ради такой фичи\возможности думаю не составило бы труда для автора мода расставить такие SwitchableDecoration у дверей которые можно взламывать.. иначе что же это за модер такой который уже готовую систему замков в мод не добавит и свою не сделает..
Вот есть же мод платформы ну или точнее код, так-же с помощью SwitchableDecoration сделано и ничего, кому надо тот добавлял в мод.
Такие варианты требуют написания кучи скриптов и выверения связки "декорэйт"-ацс. Плюс нужно еще учитывать возможные плюшки, навешенные на игрока или монстров (за них отвечают уже другие скрипты) и всю такую комбинацию. FROZEN вроде делает имунным к урону, а в случае оглушения-парализации урон должен наноситься, только монстр не может реагировать. Опять же сам принцип "оглушения" будет завязан на прожектайлы, которые должны еще и попасть в цель (оглушить всех в радиусе зрения игрока - такого гозза не предусматривает, надо все равно чем-то выстрелить сначала).
Средствами одного только декорэйта такие вещи не делаются, а жаль.
Короче, трудозатраты начнут возрастать в геометрической прогрессии...
Shadowman
Достаточно неплохой вариант - использовать ACS функции с возвращаемым значением в декорейте. Это значение можно подставлять прямо в декорейте куда следует, да и вообще хорошая вещь.
Такие варианты требуют написания кучи скриптов и выверения связки "декорэйт"-ацс.
Так вся сложность в том что надо юзать acs? Или что нет таких проперти как DamageThingPoison, DamageThingCurse и т.д.? Вообще да, не помешало бы иметь такое по дефолту, но и самому можно замутить..
Вобщем вот мини пример, сделан за мин. 15-20, грубо не отесано, но работает... Ссыль
Слева пушка белая "глушитель моба", справа зеленая "ядометатель" в принципе так прикинул, можно и без acs обойтись, но зачем?
Если получше подумать, можно сделать 1 большой скрипт который будет следить за такими дебафами и выполнять действия такие как если моб отравлен забирает оз, если он отравлен и оглушен, то забирает оз и моб не двигается при этом можно навесить иконки дебафа сверху монстра или в цвет другой перекрасить ну это дело вкуса.
Прожектайлы не юзал.. вариант c4tnt помоему еще лучше.
Кстати кастомный AI так-то можно тоже с ацс запилить... просто долго, и геморройно. Я как-то ради эксперимента накодил скрипт, который спавнит BFGBall, который летает вокруг, старается держаться подальше от игрока (дабы не сдохнуть, т.к. класс BFGBall я не трогал, он по прежнему был проджектайлом), периодически стреляет ракетами и уворачивается от ракет игрока (да, пришлось делать собственный декорейт класс от Rocket, чтобы на Spawn направление движения в скрипт отправлялось)
Но вот если бы в ацс был способ по акторам проходить списком, было бы куда проще, да.
Минимум изменений, кстати. Для моддинга на первое время хватило бы 4 функций винапи-стайл:
int search_handle = FirstActor();
while ((int actor_id = NextActor(search_handle)) > 0)
{
SetActivatorToActor(actor_id);
/* ... */
// (actor_id можно вынести отсюда и юзать в другом месте)
}
EndSearch(search_handle); // ну и если прогер не закрыл хендл, то делать это при закрытии скрипта
По стенам и прочему итерироваться не надо, всегда есть SetActorPosition чтобы проверить можно идти или нет. И SetActorPosition в цикле чтобы проверить линию огня между двумя точками.
Я даже об этом как-то говорил девелоперам зандра, например, но получил ответ в духе "ацс не для этого".
По стенам может итерироваться и не очень то нужно, но какой-нибудь id-доступ нужен всяко. Плюс во всех адекватных домах уже давно есть Hit test, для которого не нужно никуда акторов таскать. То есть та история с телепортом лост-соулов в д3 бы выражалась одним вызовом с получением в ответ точного расстояния до ближайшей стены. Ну и заодно с нормалью столкновения - в ACS при ихнем подходе даже если нормаль захотят отдать, то каким макаром - не ясно.
А вот оно что, ну тогда да.. довольно сложно. Хотя ради такой фичи\возможности думаю не составило бы труда для автора мода расставить такие SwitchableDecoration у дверей которые можно взламывать.. иначе что же это за модер такой который уже готовую систему замков в мод не добавит и свою не сделает..
Вот есть же мод платформы ну или точнее код, так-же с помощью SwitchableDecoration сделано и ничего, кому надо тот добавлял в мод.
Щас покажу вам магию....
1.Делаем PK3 файл, в нем создаем папку xlat, создаем там текстовый файл с любым названием
2.В текстовом фале пишем include "xlat/doom.txt" (может и что другое можно написать, я не пробовал).
3.Открываем этим же редактором (G)ZDOOM.PK3, ищем xlat/base.txt.
4.С помощью этого файла находим нужные нам номера. Пример:
Примечание: параметр MONST можно и убрать, ХЗ зачем разрабы здума дали монстрам возможность щупать закрытые двери. Также неуверен, может быть можно прописать USE|SHOOT (чтобы дверь реагировала на выстрелы и на тыканье).
5.Теперь вместо ванильных функций (открыть дверь какого-то там цвета) будет активироваться наш скрипт. Я в этом не мастер, извините. Мне пока такое было не нужно. Желаю удачи!
Скажите такое как Set, Get и Unset можно прописывать только в alias_aх KEYKONF ? Прочитал CVAR control
, но так и не понял где еще можно это применять.. в CVarInfo не работает =( этот лумп как понял вообще нужен только что бы пользователь мог записать свою команду и значение по умолчанию.
Так же интересует, как работает exec "<file> Executes a series of commands stored in the script-file as if they had been typed in at the console directly." читал там же.. CVAR control
Правильно ли я понимаю что можно записать в тхт файл команды, положить в pk3 архив, и с помощью keykonf alias применить эти команды когда игрок нажмет кнопку?
Еще интересует чего такое iwadinfo.txt, можно ли из него извлечь пользу для своего мода.. любую?
MasterMind :
Щас покажу вам магию....
Буду иметь ввиду, спасибо.
Добавлено спустя 1 час 32 минуты 4 секунды:
Забыл, еще меня интересует что можно загрузить с помощью lumpa GAMEINFO?
LOAD = "<file1>"[, "<file2>"[, "<file3>"[, ...]]] Пробовал тут прописать загрузку своего тхт файла, в котором были -command, в консоле написало что не нашло такого тхт файла.
Добавлено спустя 6 часов 8 минут 25 секунд:
Ну и еще вопрос, захотел я добавить STARTUP (типо ENDOOM только из HEXEN), при загрузке мода он показывается только если подключить мод к Hexen, если запустить с Doom, 0 реацкии, собс-но в этом и вопрос.. как STARTUP заставить работать с DOOM если это возможно и как его изменить(судя по всему это не простая картинка)?