1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Разработка (боль и страдания)

Автор: id0 · 21 май 2025 · ·
Кодим на QUAKEC
  1. progs.jpeg

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

    А копаюсь я сейчас в коде кваки. И честно сказать, кодер из меня такой себе. Но так даже лучше, ощущения свежи и все ошибки ещё в памяти - новичкам будет проще. Сейчас будет буквально пошаговая инструкция:

    Итак quakec. Что это такое? По ссылке есть информация, но если в двух словах - это не код движка - это код игры. Язык похож на С, что понятно из названия, и его тоже нужно компилить, специальным компилятором (слава богу не Visual Studio). Тут почти безальтернативно - fteqcc, а ещё лучше fteqccgui (у него есть рабочий интерфейс, а не просто командная строка).

    Допустим, мы прямо сейчас решили покодить для кваки. Качаем исходники Quake (игры, не движка), это специальная версия, почищенная от говна, сохраняем куда нибудь на хард (рекомендую создать отдельную директорию, типа: С://QSources, потому что если уж вы начнёте, всяких исходников и примеров там будет море). Клонируем все файлы оттуда в какую нибудь новую папку, чтобы путь выглядел как ниубдь так:
    С://QSources/yoursourcename/qc
    Копируем в ту же папку (папку qc) fteqccgui. Он работает очень просто, можно проверить прямо сейчас. Открываем его, нажимаем кнопочку Сompile, прога должна написать DONE (если пишет error, значит очевидно что-то не так), и в директории выше (yoursourcename) должен создаться файлик progs.dat.

    Далее, сделаем простой мод. Создадим в папке игры Quake ...у вас её ещё нет? Тогда инструкция:

    Качаем движок в любое место, например C://Engines/VKQuake, распаковываем, и кидаем в папку с движком, папку id1 из LibreQuake. Можете даже запустить поиграть, правда ванильных карт там нет, какие-то свои, и огр сделан забавной заглушкой, но это всё мелочи.

    Создаём в той же директории папку с любым названием, например как у меня npc. Чем короче название тем лучше, вам с этим ещё работать и работать. Должно получится что-то вроде C://Engines/VKQuake/npc. В эту же папку нужно будет кидать файл progs.dat, но сейчас в этом мало смысла.

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

    Создаём в папке с исходниками файл NPC.qc (я пишу новые файлы большими буквами, чтобы сразу их видеть, но компилятору на это наплевать). Открываем его любым текстовым редактором, лучше всего Notepad++, и вставляем туда этот код:

    Далее создаём там-же файл NPC_MENUS.qc и копируем туда это:
    //////////////////////////////////////////////////////////////////////////////////

    Но это ещё не всё. В коде добавлены переменные, которых ещё нет. Создаём файл GAMEDEFS.QC (чтобы не забивать родной defc.qc ерундой) и копируем туда вот это:
    //////////////////////////////////////////////////////////////////////////////////

    Сохраняем всё это, и можно закрыть.

    Затем открываем файл weapons.qc и находим блок:

    Добавляем сразу под этим блоком ещё один:

    void() SecondImpulse =
    {
    if (self.impulse == 1)
    Select(1);
    };


    Сохраняем и закрываем.

    ////////////////////////////////////////////////////////////////

    Далее в файле client.qc
    ищем блок кода:
    void() PlayerPreThink =
    и добавляем в самом низу, перед };

    //id0
    //Здесь мы хардкодом добавлям кпоку e для "использовать"
    //По хорошему нужно делать более изящно, но пока так.

    stuffcmd(self,"alias use \"impulse 13\"\n");
    stuffcmd(self,"bind e use \n");


    Теперь ищем там же
    void() PlayerPostThink =
    и так же внизу добавляем, после CheckPowerups();
    и перед закрывающей скобкой.
    // Dr. Shadowborg was here. No unnecessary centerprint spamage here boy!
    if(self.npc_menutime < time)
    Select(0); // don't forget to give a void that normally request a value a value. Or the compiler monster will eat you.


    Сохраняем и закрываем.

    //////////////////////////////////////////////////////////////////////////////////

    Но и это ещё не всё, надо рассказать движку о нашем неписе. Для этого открываем файл progs.src

    и добавляем сразу после строки:

    defs.qc.
    строку
    gamedefs.qc

    затем добавляем в самом низу ещё две строчки:

    npc_menus.qc
    npc.qc


    Сохраняем всё и компилим.

    Если не скомпилилось - смотрим в код ошибки, и смотрим мои комменты, например почему-то в некоторых исходниках, в файле weapons.qc вместо CycleWeaponReverseCommand (); идёт CycleWeaponBack(); или наоборот.

    Если-же всё скомпилилось, всё жёлтенькое или беленькое, а не красненькое, значит в папке выше создался файл progs.dat. Это хорошо, но сначала некоторые пояснения:

    В файле npc.qc прописаны харкодом моделька персонажа, анимации и звуки, например:

    setmodel (self, "progs/uma.mdl");
    precache_sound ("npc/_reitanna__euh3.wav");

    и другие.

    Можно сделать, чтобы у каждого объекта на уровне могли быть свои звуки и модели, но сейчас у меня не было такой задачи. Можно либо закомментить это всё, но тогда бы будете видеть пустое место, либо прописать свои пути в коде, например (progs/knight.mdl) - моделька рыцаря из самой кваки. анимацию она будет играть другую, но это неважно для теста.

    Звуки, если что, должны лежать в папке мода /sound и далее подпапки, здесь это /npc. Движок сразу ищет там, писать sound/ не нужно. В то время как модели могут лежать в любой папке мода, например models/итд...
    Звуки тоже можно прописать родные, например precache_sound ("buttons/switch02.wav");

    Прописываем что надо, сохраняем и компилим. Если результат успешный, копируем созданный progs.dat в папку мода. Она пока пустая, но это неважно. Можете положить туда свои ассеты, если хотите.

    Дальше самое интересное.

    Сначала качаем вот эту штуку. Это компилятор для первой кваки. Распаковываем куда нибудь.

    Теперь открываем любой редактор, который может делать уровни для первой кваки, TrenchBroom например. По хорошему он должен быть настроен, все пути должны быть прописаны в fgd файле, но сейчас это не столь важно. Открываем редактор, new map, выбираем игру Quake 1.

    Редактор открылся. Создаём куб, (вообще он там уже есть, просто выбираем его), шифтом растягиваем побольше (500 хватит), затем делаем из него комнату (ctrl-shift-k). Оставляем его в покое, он нам больше не нужен. Устанавливаем лампочку, чтобы хоть чего то видеть в игре. Правая кнопка, create point entity/ light/ light. Таскаем в окне боковой проекции повыше, чтоб он не на полу лежала. Не забудем создать точку спавна игрока:

    f.jpg

    Теперь, точно так же создаём пустой объект (на самом деле неважно какой, всё равно переименуем). Правая кнопка, create point entity/ info/ null. Тоже поднимем повыше, чтоб сквозь пол не провалился. Переименовываем его в npc_test, вот так:

    1.jpg
    2.jpg

    Затем создаём новую строку, и называем message. Пишем туда что угодно, например:

    I am cutiepie\n Press 1 to exit\n

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

    Сохраняем карту в папку maps в директории мода, например npc/maps/x1.map

    Компилим карту. Сначала открываем Run/Compile map, создаём новый профиль, и выставляем все пути как на картинке, нужно указать путь к компилятору, который вы недавно скачали:

    p.jpg

    Первым назначаем exportMap с параметром ${WORK_DIR_PATH}/${MAP_BASE_NAME}-compile.map
    Второй указываем runTool назначаем путь к qbsp.exe с параметром ${MAP_FULL_NAME}
    Далее идёт vis.exe с параметром ${MAP_BASE_NAME}.bsp
    И последним light.exe . Тут вообще можно указать уйму параметров, но сейчас важно чтобы уровень просто скомпилился. Указываем просто ${MAP_BASE_NAME}.bsp

    Нажимаем Compile. Если всё правильно указано - уровень скомпилится.

    Далее можно указать параметры запуска. Это необязательно, зато очень удобно. Нажимаем Launch (внизу, слева), Configure Engines, и создаём новый профиль. Называем его как угодно, главное после не запутаться, и указываем путь к исполняемому файлу, например vkQuake.exe.

    4.jpg

    Закрываем окошко, нажимаем на наш профиль, и указываем параметры запуска, к примеру -game npc +map x1
    npc - папка мода, x1 - название карты:

    5.jpg

    Тыркаем Launch. Если всё правильно, то вы увидите примерно это:

    npc20250521175458-00.jpg

    Подходим к неписю, тыркаем E, должно произойти вот это:

    npc20250521175515-00.jpg
    Уррррааа!

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

    И на всякий случай, вот мои исходники.

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

    Вложения:

    • npc_3.zip
      Размер файла:
      1.017,1 КБ
      Просмотров:
      21
    Метки:
    GoldSrcFreeman, Leiji, Revolter и 7 другим нравится это.

Комментарии

  1. GreenEyesMan
    И стока кода надо написать, что бы получить фразу: "Я есть мелкочелик"?

    Вопрос, на богомерзком Юнити на такое сколько уходило времени?
    1. Просмотреть предыдущие ответы...
    2. id0
      Хочется годот, бери годот, про него мало могу сказать, разве что был скандальчик, из за чего там откололись форки:
      Redot Engine - новый форк Godot
      GreenEyesMan нравится это.
    3. id0
      Там щас тоже куча ассетов и туториалов, он после косяков юнити взлетел.
    4. id0
      А вообще любой движок сгодится, для того, что ты хочешь, это я так понял 2д скролл шутер? В этом вообще ничего сложного нету.
  2. Кишмиш
    Полезняшки, спасибо!

    Вдруг когда-нибудь тоже решусь...
      id0 нравится это.
    1. Просмотреть предыдущие ответы...
    2. id0
      Для второй кваки меньше портов и всяких приколюх. К тому же динамика не та, что-то есть в мувменте первой кваки, что вторая похерила. А так смысла мало, те же mdl, так-же нет физики, а дизайн дело наживное.
    3. GreenEyesMan
      Source габеновский? Или это анальное рабство под Габеном?
    4. id0
      Source не опенсоурс (круглая фразочка)). Не, там даже вот то что человек советовал, свободные порты PrimeXT, Xash3d, я почитал, даже там проблемы с лицензией какие-то.
Чтобы оставить комментарий просто зарегистрируйтесь и станьте участником!
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление