Welcome to U.A.C. [O.S.A.]
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
[GZDoom][Multiplayer][Proof of concept] DTerritory
   Список разделов - Проекты и идеи - [GZDoom][Multiplayer][Proof of concept] DTerritoryОтветить
АвторСообщение
BKRItal
- Lance Corporal -
Next rank: = Lance Corporal = after 20 points
140

Doom Rate: 1.61

Posts quality: +79
Ссылка на пост №1 Отправлено: 20.02.24 15:03:36
DTerritory это мой team deathmatch мод для GZDoom, вдохновленный Splatoon. Это скорее шуточный мод, просто подумал как бы это было в DOOM и что смешно было бы залить все SP_FACE1 :mrgreen:
Требуется GZDoom версии 4.11.0 и выше, и IWAD DOOM2.WAD.
Ссылка для скачивания: https://doomshack.org/uploads/dter.pk3
SHA256(dter.pk3)= 71bc633768b5ec76b092841eab29b46a8bf264bec09ec039d3797de916714251
Скрытый текст:

Ссылка для скачивания: https://doomshack.org/uploads/dterritory.pk3 (старая версия с ошибкой)
SHA256(dterritory.pk3)= 75b26de424a7eaf6c4f36cdb0160dc60e65feae2516dcb878046ff173205207a


Скрины:

В данном виде мод работает только со специальной картой с большим количеством маленьких секторов. Он выглядит так:
* Игроку предлагается выбрать команду
* Из единственной пушки можно красить сектора/ы "текстурой команды"
* При нахождении на секторе с текстурой вражеской команды игроку наносится урон
* Через три минуты отображатся 30 секунд результаты (какая команда больше закрасила секторов)

Было бы круто, если бы кто-нибудь это протестировал в настоящем мультиплеере, т.к. у меня была возможность тестировать только так
gzdoom.exe -config gz1.ini -host 2 -file dterritory +map map01 -deathmatch
gzdoom.exe -config gz2.ini -file dterritory -join localhost

:mrgreen: Естественно никакого геймплейного баланса наверно нет и единственная карта уродливая.

Я вряд ли его буду сильно доделывать, возможно сделаю еще одну версию если будет что поправить в результате обратной связи :mrgreen: Но вообще код под BSD лицензией, если кто захочет развить идею, пожалуйста. Можно сделать его совместимым с любыми картами, возможно даже закрашивание и подъем по стенам, ...
Также приветствуются любые комментарии и критика по поводу кода т.к. я хочу возможно сделать еще как минимум один мод с ZScript.
Да, возможно что-то подобное с грязными хаками можно было бы сделать даже на ACS+DECORATE :mrgreen:

Рейтинг сообщения: +3, отметил(и): JSO x, Endoomer, EarKiller6002
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №2 Отправлено: 23.02.24 00:15:53
Ура, я не один в русскоязычном сообществе изучаю ZScript!

Если серьёзно, то задумка неожиданная — и для движка *ZDoom, насколько знаю, уникальная. Однозначно лайк.

Так как мод идёт минимум под GZDoom 4.10.0, который не поддерживается у абсолютного большинства людей, с которыми можно поиграть в такой Deathmatch, то выиграл пару битв в одиночку со следующим разрушительным результатом:


Очень скоро стрельба начинает бить по ушам. Звук "keen/death" я за ним не признал, к слову. Интересная находка.



BKRItal пишет:
Также приветствуются любые комментарии и критика по поводу кода т.к. я хочу возможно сделать еще как минимум один мод с ZScript.

Ну, тогда по неточностям.

- Минимальная версия ZScript установлена аж в 4.10. Честно говоря, не вижу ничего, что нельзя было сделать даже старейшим ZScript 3.3.0 (GZDoom 3.3.0+, LZDoom 3.60+, QZDoom 2.1pre+). А совместимость рушится...
Насчёт использования ACS не говорю. Соглашусь только, что да, на нём тоже можно.

- Основная структура подсчёта. Для мини-игры выглядит вполне себе ничего, но, как мне кажется, она не особо расширяема.
Критикуя — предлагай. Так что: можно создать параллельный массив размером "level.sectors.Size()", в соответственную ячейку переходить через "cursector.Index()". Изменение принадлежности сектора через "secdata[ cursector.Index() ].team = GetTeam();" (также и установка текстуры), проверка на соответствие команде — через зеркальный "secdata[ cursector.Index() ].team != GetTeam()". Такой подход решает проблему расширяемости на более чем две команды и игроков-одиночек, позволяет показывать процентаж во время игры, убирает вопрос финального подсчёта по строго определённым текстурам, а также практически не занимает процессорного времени — каждый игровой такт информация будет обновляться только для изменённых секторов.

- Если в начале ещё не выбрана команда, то при попытке посмотреть таблицу лидеров (scoreboard который) игра вылетает с SIGSEGV:
Скрытый текст:


- Интересно, что в "DTSpawn.zs:67" ("override void WorldLineActivated()") в проверке на команду используется номер игрока, а не, собственно, команды.

- Строки "ZScript.lmp:130" и "ZScript.lmp:161". На них игра также потенциально может вылететь, так как проверка на существование указателя "SecToPaint" производится дальше.

- "TexMan.CheckForTexture()" ищет индекс текстуры по хэш-таблице, в то время как "TexMax.GetName()" (обратное действие) проходит по индексу напрямую. Несомненно, и у того, и у того временная сложность — O(1), но всё-таки ".GetName()" быстрее... Хотя, если использовать структуру, которую я описал выше, то ни то, ни то в основном цикле игры не понадобится, всё можно закэшировать перед началом.

- Не используется оптимизирующая конструкция "if () {} else if () {} else if () {} else {}". И это, наиболее вероятные варианты лучше размещать ближе к началу.

- В "DTGameOver.zs" вполне себе целочисленные переменные "DTCUnp", "DTCFac", "DTCSku" и "DTCAll" объявлены как с плавающей точкой. Это для деления? Если так, то ZScript позволяет явно привести тип переменной: "int current = 5; int total = 100; double percent = current / double( total );" поместит в "percent" значение 0.05.

- Нет выравнивания надписей по центру. На более мелких экранах части содержимого видно уже не будет, так как в "screen.DrawText()" на месте X/Y задаются константы. Не критично, так как мало у кого сейчас остались такие экраны, но отметить стоит.

Рейтинг сообщения: +2, отметил(и): Michael63, BKRItal
2 7 1
BKRItal
- Lance Corporal -
Next rank: = Lance Corporal = after 20 points
140

Doom Rate: 1.61

Posts quality: +79
Ссылка на пост №3 Отправлено: 23.02.24 14:31:06
JSO x
Спасибо большое за такой подробный отзыв! Честно сказать я даже пока не совсем все понял, ну я не профессиональный программист к тому же.

JSO x пишет:
Очень скоро стрельба начинает бить по ушам. Звук "keen/death"

Ну он ускоренный. Я не знаю, какой из стандартных звуков приспособить, чтобы менее раздражающий получился.

JSO x пишет:

- Минимальная версия ZScript установлена аж в 4.10. Честно говоря, не вижу ничего, что нельзя было сделать даже старейшим ZScript 3.3.0

Я просто поставил версию из GZDoom на котором начинал делать, на всякий случай.

JSO x пишет:
Насчёт использования ACS не говорю. Соглашусь только, что да, на нём тоже можно.

Если делать подобное, то там я нашел только ChangeFloor, которая требует тег, соответственно надо задать всем раскрашиваемым секторам теги, а потом в actor-е проверять циклом все сектора ThingCountNameSector, или как-то так :mrgreen:

JSO x пишет:
Так что: можно создать параллельный массив размером "level.sectors.Size()",

Да, наверно, если развивать этот мод, то нужно что-то такое.

JSO x пишет:
- Если в начале ещё не выбрана команда, то при попытке посмотреть таблицу лидеров (scoreboard который) игра вылетает с SIGSEGV:

Это проблема GZDoom? :mrgreen: Наверно потому что мало кто играет в team dm в нем вообще. Я, когда понял что команду всегда должен игрок сам выбирать, вообще хотел уже забросить все, но потом как-то придумалась эта конструкция со свитчами :)

JSO x пишет:
- Интересно, что в "DTSpawn.zs:67" ("override void WorldLineActivated()") в проверке на команду используется номер игрока, а не, собственно, команды.

ААААааа... Это ошибка конечно, надо поправить.

JSO x пишет:
- Строки "ZScript.lmp:130" и "ZScript.lmp:161". На них игра также потенциально может вылететь, так как проверка на существование указателя "SecToPaint" производится дальше.

Я не всегда уверен, когда проверки нужны, в принципе когда до инстанса этого класса дойдет, секторы уже будут наверняка существовать?

JSO x пишет:
Это для деления?

Да.

JSO x пишет:
- Нет выравнивания надписей по центру.

Пока не разбирался, я думал с DTA_320x200 оно будет более менее масштабировать одинаково везде ?

Рейтинг сообщения: +1, отметил(и): JSO x
EarKiller6002
= UAC Gunner =
Next rank: - Corporal - after 20 points
60

Doom Rate: 2.61

Posts quality: +17
Ссылка на пост №4 Отправлено: 23.02.24 14:52:06
Всех приветствую! В особенности передаю привет автору данного топика и мода под ником BKRItal!

Я прочитал основной пост, с которого и началось обсуждение данной модификации, и хочу сказать, что данный проект имеет свою перспективу и может потом набить собственную оскомину в огромной по своему количеству игр, созданных на базе игр Doom и Doom II, библиотеке модификаций. Сам мод по описанию и скриншотам весьма хорош как для коммерческой публикации, так и для изучения его исходного кода новичками. Однако я могу предложить такие идеи для данного проекта:
1) Добавить в качестве основного оружия вместо стандартного Doom-овского арсенала лишь один его вид - баллончик с краской, закрашивающий сектор уровня текстурой, информация о которой "берёт" из переменной, хранящей название одной из двух команд. Спрайты баллончика можно позаимствовать из моего разрабатываемого мода по веб-сериалу "The Walten Files" (в данном случае, как сиквел к нему).
2) Нарисовать отдельные текстуры определённых цветов, которые будут присутствовать в них вместе с двумя, тремя, а может и четырьмя командами: красного, жёлтого, синего, зелёного и т. д.

В принципе, у меня всё, что могу предложить.

Добавлено спустя 14 минут 57 секунд:

Ах да, забыл ещё добавить. Если вам захочется продавать свою модификацию в Интернете или на физических носителях (CD/DVD диски, SD-карты малых объёмов), то:
1) Продумайте сюжет или художественный мир мода. Для этого можно уделить хотя бы 5 минут. Если этого мало, то хотя бы 10, а то и 15-20 минут.
2) Нарисовать как можно больше собственных текстур и спрайтов объектов, игроков и т.д.
3) Поработать в конфигурационных lump-ах вашего .pk3-файла, а в отдельный от него .wad-файл собрать кучу таких, как ваша, специальных карт.
4) Придумать и написать на каком-либо ЯП (к примеру, на Python-е с использованием библиотеки PyQt5), а затем скомпилировать программу для запуска вашей модификации (т. е. лаунчера), в котором можно будет отконфигурировать управление, выбрать порт для запуска мода и настройка сетевой игры (относительно сервера, клиента и т. д.) c возможностью поиска и подключения к другим серверам. Главное не забыть продумать систему защиты от нелицензионного копирования если вы смогли на юридической основе зарегистрировать авторские права на вашу модификацию.
5) Создать мастер установки вашего мода с портами и лаунчером к нему, который можно будет залить в Интернет.

После этого можно будет распространять вашу видеоигру на базе игр Doom и Doom II как на физических носителях, так и в Интернете на таких площадках, как itch.io или gamejolt (ибо Steam вам без всяких лазеек не будет доступен, и даже если вы сможете опубликовать свою игру, то вам придётся заплатить аж целых 100 "зелёных президентов", что по нынешнему курсу составляет 9330 рублей и 80 копеек)
1
BKRItal
- Lance Corporal -
Next rank: = Lance Corporal = after 20 points
140

Doom Rate: 1.61

Posts quality: +79
Ссылка на пост №5 Отправлено: 23.02.24 15:22:33
EarKiller6002
:) Это некоммерческий проект же.
Баллончик это граффити на стенах больше подошло бы рисовать.
Тут одна из задумок мода была в том, чтобы использовать стандартные ресурсы.
EarKiller6002
= UAC Gunner =
Next rank: - Corporal - after 20 points
60

Doom Rate: 2.61

Posts quality: +17
Ссылка на пост №6 Отправлено: 23.02.24 15:54:54
Понятно. Можно хотя бы подобие баллончика сделать, чтобы чисто для секторов (для флэтов). К тому же, я просто прикинул, как можно такое преобразовать из некоммерческого проекта в действительно настоящий товар интеллектуального труда, который можно купить за N-ное количество денег.
1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №7 Отправлено: 24.02.24 00:05:37
BKRItal пишет:
Это проблема GZDoom? :mrgreen: Наверно потому что мало кто играет в team dm в нем вообще. Я, когда понял что команду всегда должен игрок сам выбирать, вообще хотел уже забросить все, но потом как-то придумалась эта конструкция со свитчами :)

Нет, проблема не в ядре — ни GZDoom 4.11.3, ни LZDoom 3.87c, ни ZDoom 2.81 без модификации не вылетают. К слову, в крайнем случае можно своё разделение на команды написать...

BKRItal пишет:
Я не всегда уверен, когда проверки нужны, в принципе когда до инстанса этого класса дойдет, секторы уже будут наверняка существовать?

Формально не факт, но фактически да, на движке GZDoom у каждого актора без флага +NOSECTOR поле "cursector" есть всегда. Хотя я всё равно проверку делаю в местах, не сверхкритичных по скорости, ради общности и совместимости: это поле у актора открыто для записи, а значит, сторонняя модификация его в теории может заменить и на NULL.

BKRItal пишет:
Пока не разбирался, я думал с DTA_320x200 оно будет более менее масштабировать одинаково везде ?

Ну более-менее да, но не везде:
Скрытый текст:

Соотношение сторон 5:4, разрешение 1280x1024.



EarKiller6002 пишет:
Сам мод по описанию и скриншотам весьма хорош как для коммерческой публикации, так и для изучения его исходного кода новичками.

Почему-то звучит как автоматический ответ бота, вроде "У тебя получаются хорошие видео, продолжай в том же духе!" Не знаю насчёт коммерческой разработки, редко какие модификации Doom идут под закрытой лицензией. В любом случае, GZDoom предназначен в первую очередь не для мультиплеера.

P. S.: список — личный опыт?

BKRItal пишет:
Честно сказать я даже пока не совсем все понял <...>

Когда говорил "if () {} else if () {} else if () {} else {}", имел в виду такой код; он позволяет пропустить проверку условия в ветках, идущих после исполненной:
if ( str == "Some" || str == "thing" ) {
    console.printf( "Something..." );

} else if ( x > 10 ) {
    console.printf( "%i is greater than 10.", x );

} else if ( str == "ClassName" ) {
    console.printf( "Class name: \"%s\"", GetClassName() );

} else {
    console.printf( TEXTCOLOR_FIRE .. "Warning: unrecognized." );
}

Рейтинг сообщения: +1, отметил(и): BKRItal
2 7 1
EarKiller6002
= UAC Gunner =
Next rank: - Corporal - after 20 points
60

Doom Rate: 2.61

Posts quality: +17
Ссылка на пост №8 Отправлено: 24.02.24 01:38:58

P. S.: список — личный опыт?


Практически, да, не учитывая того, что я официально ещё не зарабатывал, а свой лаунчер я только собираюсь написать.
1
BKRItal
- Lance Corporal -
Next rank: = Lance Corporal = after 20 points
140

Doom Rate: 1.61

Posts quality: +79
Ссылка на пост №9 Отправлено: 28.02.24 17:30:35
Добавил в первый пост темы новую версию с исправленной ошибкой в проверке команды и другими небольшими изменениями.

Рейтинг сообщения: +1, отметил(и): JSO x
Страница 1 из 1Перейти наверх
   Список разделов - Проекты и идеи - [GZDoom][Multiplayer][Proof of concept] DTerritory