DTerritory это мой team deathmatch мод для GZDoom, вдохновленный Splatoon. Это скорее шуточный мод, просто подумал как бы это было в DOOM и что смешно было бы залить все SP_FACE1
Требуется 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 секунд результаты (какая команда больше закрасила секторов)
Было бы круто, если бы кто-нибудь это протестировал в настоящем мультиплеере, т.к. у меня была возможность тестировать только так
Естественно никакого геймплейного баланса наверно нет и единственная карта уродливая.
Я вряд ли его буду сильно доделывать, возможно сделаю еще одну версию если будет что поправить в результате обратной связи Но вообще код под BSD лицензией, если кто захочет развить идею, пожалуйста. Можно сделать его совместимым с любыми картами, возможно даже закрашивание и подъем по стенам, ...
Также приветствуются любые комментарии и критика по поводу кода т.к. я хочу возможно сделать еще как минимум один мод с ZScript.
Да, возможно что-то подобное с грязными хаками можно было бы сделать даже на ACS+DECORATE
Ура, я не один в русскоязычном сообществе изучаю ZScript!
Если серьёзно, то задумка неожиданная — и для движка *ZDoom, насколько знаю, уникальная. Однозначно лайк.
Так как мод идёт минимум под GZDoom 4.10.0, который не поддерживается у абсолютного большинства людей, с которыми можно поиграть в такой Deathmatch, то выиграл пару битв в одиночку со следующим разрушительным результатом:
Очень скоро стрельба начинает бить по ушам. Звук "keen/death" я за ним не признал, к слову. Интересная находка.
Также приветствуются любые комментарии и критика по поводу кода т.к. я хочу возможно сделать еще как минимум один мод с 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 задаются константы. Не критично, так как мало у кого сейчас остались такие экраны, но отметить стоит.
Насчёт использования ACS не говорю. Соглашусь только, что да, на нём тоже можно.
Если делать подобное, то там я нашел только ChangeFloor, которая требует тег, соответственно надо задать всем раскрашиваемым секторам теги, а потом в actor-е проверять циклом все сектора ThingCountNameSector, или как-то так
- Если в начале ещё не выбрана команда, то при попытке посмотреть таблицу лидеров (scoreboard который) игра вылетает с SIGSEGV:
Это проблема GZDoom? Наверно потому что мало кто играет в team dm в нем вообще. Я, когда понял что команду всегда должен игрок сам выбирать, вообще хотел уже забросить все, но потом как-то придумалась эта конструкция со свитчами
- Строки "ZScript.lmp:130" и "ZScript.lmp:161". На них игра также потенциально может вылететь, так как проверка на существование указателя "SecToPaint" производится дальше.
Я не всегда уверен, когда проверки нужны, в принципе когда до инстанса этого класса дойдет, секторы уже будут наверняка существовать?
Всех приветствую! В особенности передаю привет автору данного топика и мода под ником 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 копеек)
EarKiller6002 Это некоммерческий проект же.
Баллончик это граффити на стенах больше подошло бы рисовать.
Тут одна из задумок мода была в том, чтобы использовать стандартные ресурсы.
Понятно. Можно хотя бы подобие баллончика сделать, чтобы чисто для секторов (для флэтов). К тому же, я просто прикинул, как можно такое преобразовать из некоммерческого проекта в действительно настоящий товар интеллектуального труда, который можно купить за N-ное количество денег.
Это проблема GZDoom? Наверно потому что мало кто играет в team dm в нем вообще. Я, когда понял что команду всегда должен игрок сам выбирать, вообще хотел уже забросить все, но потом как-то придумалась эта конструкция со свитчами
Нет, проблема не в ядре — ни GZDoom 4.11.3, ни LZDoom 3.87c, ни ZDoom 2.81 без модификации не вылетают. К слову, в крайнем случае можно своё разделение на команды написать...
Я не всегда уверен, когда проверки нужны, в принципе когда до инстанса этого класса дойдет, секторы уже будут наверняка существовать?
Формально не факт, но фактически да, на движке GZDoom у каждого актора без флага +NOSECTOR поле "cursector" есть всегда. Хотя я всё равно проверку делаю в местах, не сверхкритичных по скорости, ради общности и совместимости: это поле у актора открыто для записи, а значит, сторонняя модификация его в теории может заменить и на NULL.
Сам мод по описанию и скриншотам весьма хорош как для коммерческой публикации, так и для изучения его исходного кода новичками.
Почему-то звучит как автоматический ответ бота, вроде "У тебя получаются хорошие видео, продолжай в том же духе!" Не знаю насчёт коммерческой разработки, редко какие модификации Doom идут под закрытой лицензией. В любом случае, GZDoom предназначен в первую очередь не для мультиплеера.
Честно сказать я даже пока не совсем все понял <...>
Когда говорил "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." );
}