Как я Quake в браузере делал


    2 месяца назад я выложил на GitHub первую бета-сборку WebQuake — порта первого Quake, работающего в браузере через WebGL.

    В этом посте я бы хотел вам рассказать о подробностях разработки и реализации движка: как сделана графика, как работает звук, и так далее.

    Как всё началось


    Разработку WebQuake в текущем его виде я начал в сентябре 2012 года. Но идея у меня зародилась задолго до этого.

    Первый раз я решил сделать что-то подобное летом 2011 года, когда я ничего не соображал в JavaScript. Тогда я делал порт «на глаз», не глядя на код Quake, и сделал только небольшой кусок меню игры. В той версии я работал с двоичными данными через строки (а в парсере чисел с плавающей запятой вообще использовал Math.pow и биты хранил в строке из символов 0 и 1). Очень хорошо, что непонимание сути работы с буферами и шейдерами в WebGL уберегло мир от такой струи блевотины.

    Затем ради прямого доступа к файлам я хотел сделать WebQuake десктопным приложением. Стал выбирать между HTA и XUL. Но ни один из них не поддерживает WebGL. Поэтому от этой идеи я тоже отказался.

    В итоге я перешел на чистый HTML5.

    Разработка


    От начала до первой беты прошло 6 месяцев. Если мне не изменяет память, на создание GWT Quake 2 у Google ушло 2 месяца, но Google делали свой порт втроём, и у них была база в виде Jake2, а я переписывал весь код вручную.

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

    Но у такого подхода есть и недостатки. Иногда получались опечатки, а из-за неправильного оператора мне дважды (в первый раз скользил по стенам с бешеной скоростью из-за && вместо ||, а во второй были ужасные дергания в сетевой игре из-за !== вместо ===), пришлось потратить 3 недели на перекапывание всей системы.

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

    Подсистемы


    А теперь перейдем к деталям самого движка.

    Графика


    Отрисовка графики, естественно, реализована через WebGL.

    Но WebQuake портом GLQuake назвать нельзя. Практически вся графическая подсистема была переписана с нуля.

    Главным отличием WebQuake от GLQuake является использование шейдеров и буферов вместо фиксированного набора функций OpenGL. В WebQuake шейдеры используются везде, для каждого типа объектов: BSP-модель, полигональная модель, игрок, спрайт, частица, небо — написан свой шейдер.

    Через шейдеры были возвращены эффекты, присутствующие в DOS Quake/WinQuake, но убранные из GLQuake из-за ограничений старых версий OpenGL, например, текстуры с освещенными участками и яркий свет.


    Начало E1M1 в GLQuake. Лампочки не горят.


    То же место в WebQuake.

    Некоторые особенности движка Quake позволили мне повысить производительность графики. Например, так как полигон может освещаться одновременно только 4 динамическими источниками света, а карты освещения черно-белые, удалось отрисовку мира векторизовать через цветовые каналы одной текстуры. Пиксельный шейдер мира в порте выглядит вот так:
    precision mediump float;
    uniform float uGamma;
    uniform sampler2D tTexture;
    uniform sampler2D tLightmap;
    uniform sampler2D tDlight;
    uniform sampler2D tLightStyle;
    varying vec4 vTexCoord;
    varying vec4 vLightStyle;
    void main(void)
    {
    	vec4 texture = texture2D(tTexture, vTexCoord.xy);
    	gl_FragColor = vec4(texture.rgb *
    		mix(1.0, dot(texture2D(tLightmap, vTexCoord.zw), vec4(
    			texture2D(tLightStyle, vec2(vLightStyle.x, 0.0)).a,
    			texture2D(tLightStyle, vec2(vLightStyle.y, 0.0)).a,
    			texture2D(tLightStyle, vec2(vLightStyle.z, 0.0)).a,
    			texture2D(tLightStyle, vec2(vLightStyle.w, 0.0)).a)
    		* 43.828125) + texture2D(tDlight, vTexCoord.zw).a, texture.a), 1.0);
    	gl_FragColor.r = pow(gl_FragColor.r, uGamma);
    	gl_FragColor.g = pow(gl_FragColor.g, uGamma);
    	gl_FragColor.b = pow(gl_FragColor.b, uGamma);
    }
    


    Как вы видите, dot здесь используется для слегка необычной для него задачи — перемножение 4 карт освещения на их текущую яркость для данного источника освещения, которая находится в текстуре 64x1 как значения от 0 до 25 или от 0.0 до 0.0980392.

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


    Небо в GLQuake.

    Двухмерные изображения тоже рисуются через WebGL (через quad с длиной 1, умножающийся в вершинном шейдере). Изначально планировалось использовать для этого 2D Canvas, но при высоком разрешении FPS падало до 15.

    Также, в отличие от оригинального Quake (и GWT Quake 2), WebQuake никак не зависит от размера окна браузера. Для этого также используется и так называемый Hor+vert+ FOV, о котором я писал ранее на Хабрахабре.

    Звук


    Звук реализован сразу двумя способами.

    По умолчанию используется Web Audio API, поддерживающий стереозвук и плавный повтор звука.

    Если браузер не поддерживает Web Audio API, включается HTML5 Audio, но звук в таком случае одноканальный и повторяется с некоторой задержкой.

    В ранних бета-релизах использовался только HTML5 Audio, но из-за этого вылетал Chrome сначала на Android, Linux и Mac, а затем и на Windows, поэтому была добавлена поддержка Web Audio.

    Музыка тоже присутствует, но проигрывается не с диска, а из OGG-файлов на сервере через HTML5.

    Сетевая игра


    Так как браузер не может быть сервером WebSocket, сделать listen-сервер было невозможно.

    Выделенный сервер работает через Node.js и использует крупную часть кода WebQuake.

    В выделенном сервере поддерживаются одновременно и WebSockets, и UDP, поэтому на серверах WebQuake можно играть через обычный клиент Quake (не QuakeWorld). Возможно, в будущем я напишу прокси для подключения к уже существующим серверам обычного Quake.

    Информацию о сервере можно запросить как HTTP-запросами на тот же адрес и порт, на котором запущен сервер (данные возвращаются в формате JSON), так и уже существующими способами через UDP.

    Управление


    Поддержка мыши на данный момент работает только в Chrome. Несмотря на то, что в Firefox pointer lock тоже есть, там он требует полноэкранного режима для самого canvas, что создает некоторые неудобства для игрока и для разработчика.

    Файловая система


    Доступ к файлам сделан через синхронный XMLHttpRequest.

    Да, синхронный XHR — это, может быть, «не модно», но это реализуется гораздо проще, не приводя к callback hell'у, и возможно, даже приятнее для пользователя, чем видеть повсюду временные текстуры наподобие тех, что используются в GWT Quake 2.

    Во время загрузки появляется (по крайней мере в Firefox) картинка «loading» посередине экрана, поэтому игрок понимает, что идет загрузка.

    Записываются сохранения, настройки и демки в Local Storage. Сохранения, находящиеся в Local Storage, можно удалить кнопкой Delete в меню загрузки/сохранения.

    В отличие от GWT Quake 2, WebQuake не требует конвертирования файлов и может загружать файлы прямо из .pak'ов (через HTTP 1.1 Range), а значит, присутствует полная поддержка модов.

    Производительность


    Тестировал я WebQuake на разных устройствах и браузерах.

    Что было несколько удивительно, так это то, что приемлемой производительности (не знаю, сколько FPS, но не меньше 30) можно было добиться даже на телефоне (LG Optimus L9) через бета-версию Chrome, хоть стены и черные (не знаю точную причину этого, к тому же работает динамическое освещение).

    На моем предыдущем компьютере WebQuake работал на максимальных 60 FPS, в отличие от 5-10 FPS в GWT Quake 2. При разработке я неявно учел ошибки GWT Quake 2, например, использовал ArrayBuffer/Typed Arrays/DataView где мог, и возможно это помогло добиться высокой скорости.

    На чём были огромные тормоза, так это на старом компьютере с NVIDIA GeForce 5200 и на нетбуке Samsung N130. На ASUS Transformer Pad TF300T работает довольно гладко.
    Метки:
    Поделиться публикацией
    Комментарии 116
    • +29
      у браузера сейчас достаточно мощности для запуска серьёзных 3D-игр


      Quake: Release date(s) MS-DOS NA June 22, 1996

      Я не оспариваю процитированную фразу, но она не к месту по-моему:)
      • +4
        Ну хотя да, зря написал, удалил.
      • +12
        Вы уж не обижайтесь, но данный проект сам по себе очень похож на реализацию анекдота о том, что какой бы мощный компьютер не был выпущен — программист всегда найдет, чем его занять.
        • +9
          А где поиграть?)
          • +2
            webquake.quaddicted.com
            На странице на GitHub же есть ссылка на online demo.
            • +1
              Через гитхаб вышел на ссылку webquake.quaddicted.com
              Через релиз хрома на андроид не стартует-жалуется на отсутствие WebGL
              • +1
                Через бету Chrome (com.chrome.beta ищите в Google, на Play бета скрыта) надо с флажком в chrome://flags. Ну или через бету Firefox, но там 12 FPS.
                • –1
                  Оказывается уже в релизе можно включить WebGL и просмотр FPS.
                  Но игра выдает ошибку «id1/pak0.pak is not pak file»
                  • –1
                    Все запустилось, но дальше меню и видеодемки игры по тапу в любое место уйти не удалось.
                    Планшет Nexus7 выдает около 20фпс, судя по показаниям хрома. Картинка плавная, черных стен нет.
                    • 0
                      Нужна Windows-совместимая клавиатура.
                      • 0
                        А не планируется адаптация к сенсорным устройствам?
                        • 0
                          Нет, я не хочу добавлять отсебятины, хватит меню по центру (хотя это не совсем отсебятина — было в Q2) и круглых частиц.
                          Даже схему наименования файлов музыки и строку, появляющуюся при удалении сохранения, я взял из Half-Life.
                    • +1
                      Кнопки «назад» и «вперед» желательно не нажимать, они кеширование с заголовком Range в браузере ломают, из-за этого возникает «is not a pack file».
                  • 0
                    И ещё не советую играть без USB-клавиатуры, так как на клавиатуре Transformer нет Esc и F1-F12, всё через консоль надо делать.
                  • 0
                    Вот тут демо есть — webquake.quaddicted.com/
                    • 0
                      Веб-страница недоступна
                      • +2
                        5 минут грузится, кроме надписи Starting Quake… ничего не происходит, видимо все ломанулись вспоминать детство
                      • 0
                        По первой же ссылке в статье.
                        • +3
                          Подключайтесь, я создал! :)
                        • +4
                          Офигенно! Правда, меня быстро убили (сноровку потерял много лет назад)…

                          И вот это тоже круто.
                          • 0
                            А что у вас за ОС и браузер? У меня на Windows и Android таких полосок между строками нет.
                            • +1
                              OS X 10.8.3, FF 20
                              Но я не про полоски, я про саму картинку, ностальгия…
                              • +22
                                Классика жанра:
                                — У тебя менюха поехала
                                — Какой браузер?
                                — FF
                                — Я же пофиксил там все!
                                — Под Макосью…
                              • –1
                                Кстати, на iPad (iOS 5.0.1) не запускается почему-то. «Starting Quake...» и всё.
                                • 0
                                  В iOS'овском Safari не поддерживается WebGL. Ну он есть, но только для рекламы. По идее должен alert об ошибке выскочить, но значит там ещё другая ошибка появилась.
                              • –4
                                Мсье SiPlus, что-то на данной картинке, которая мне тоже встретилась при выходе из игры, я не вижу ваших инициалов Виталий Кузьмин. Разъясните пожалуйста ситуацию. Где указано, что вы имеете какое-то отношение к квейку в браузере? Наличие у вас в гитхабе файлов ничего не доказывает — вы могли взять их в открытом доступе.
                                • +1
                                  Во-первых, это титры первого Quake, а не порта. Я старался добавлять как можно меньше отсебятины, чтобы сделать близкий к оригиналу порт. В DarkPlaces, например, LordHavoc упоминается только в комментариях к шейдерам.
                                  Во-вторых, воровать просто нагло и неэтично, и программирование, как и большинству людей на этом сайте, интересно как процесс.
                                  Если вы уж совсем не верите, могу скинуть бекап какой-нибудь стадии разработки.
                                  • 0
                                    мне интересно как процесс *

                                    И вы где-нибудь видели эти файлы в открытом доступе до того, как я их опубликовал у себя на GitHub?

                                    И вот ещё скриншоты разработки: steamcommunity.com/id/SiPlus/screenshots/?appid=sc_171572&sort=newestfirst&browsefilter=myfiles&view=grid
                                    • –3
                                      Воровать нагло и неэтично, согласен с Вами. Но все же воров немало.
                                      К сожалению, у меня не хватит квалификации разобраться в бэкапе. К тому же, бэкапы тоже могут быть в открытом доступе. Файлов в открытом доступе я не видел. Но это, конечно, не доказывает, что они принадлежат Вам.
                                      Впрочем, если общество верит, что это сделали Вы, значит Вы действительно очень толковый человек. Поверю вам на слово и я. Удачи Вам.
                                      ...
                                      Не верится, что вам 16 лет. У меня в 16 лет интернета даже не было, а вашей квалификации и подавно.
                              • +17
                                Круто! Всегда поражался людям, которые ничего не понимают в какой-то технологии берутся за серьезную разработку и доводят ее до конца, причем с великолепным результатом!
                                • +17
                                  Особенно если учесть что этому товарищу всего 16 лет. Я в 16 лет в Кваку ИГРАЛ и на Паскале программки писал.
                                • +2
                                  Круто! А как включить m_look и прицел? ;)
                                  • +2
                                    Прицел — crosshair 1 в консоли.
                                    Мышь работает в Chrome. Чтобы смотреть вверх-вниз, либо зажмите колесо, либо введите +mlook (именно с плюсом) в консоли.
                                    • +1
                                      в линуксе мышь работать не хочет…
                                      • 0
                                        В Chrome 26.0.1410.63 — работает.
                                  • +3
                                    Так как браузер не может быть сервером WebSocket, сделать listen-сервер было невозможно.


                                    Не рассматривали WebRTC data channels для этих целей? Пока что работает только в Chrome Canary/Firefox Nightly, но вещь весьма перспективная для мультиплеера в реальном времени
                                    • 0
                                      WebRTC на сколько мне известно всего лишь 640 на 480 способен выжать.
                                    • 0
                                      Возможно и прикручу, но при переходе на другую вкладку снижается частота цикла событий (до 5 или 10 выполнений в секунду, как я понял), а сервер Quake по умолчанию работает на 20 кадрах в секунду. Я на 10 пробовал играть (sys_ticrate 0.1), подлагивает, а на 5 — слайдшоу.
                                    • +2


                                      :(
                                      • 0
                                        Всё нормально, на сервере файлы распакованы для кеширования, вот и нет .pak'ов.
                                        Сервер не мой, мне админ сказал, что надо распаковывать.
                                      • 0
                                        Поностальгировал, спасибо)

                                        p.s. иногда подвисает скрипт при загрузке и вываливается диалог на прекращение выполнения скрипта =/
                                        • 0
                                          Виновата реализация синхронного XMLHttpRequest в Firefox. В Chrome такого нет, если не ошибаюсь.
                                          • 0
                                            Проверял в FireFox последнем, да и зависло всего один раз. Если нажать «ждать выполнения скрипта», то он выполнится, и всё в порядке)

                                        • 0
                                          Ох, помню времена были. Долгие дни геймлея и атмосфера кваки…
                                          Когда я играл десмач по сети (на ком портах), за этим наблюдал младший брат и когда я брал Quad Damage (синенький пак, который увеличивал повреждения), младший брат говорил «о, квач-дамач» тем самым выдавая меня противнику по десмачу по голосовой связи.
                                          Противник, услышав комментарий брата (микрофон был весьма чувствительный), прятался по тёмным углам от меня, пока я «светился».
                                          </Минутка ностальгии>

                                          И вопрос — а как вам удалось переписать из Си на ЖС столько кода?
                                          • 0
                                            Долгим, иногда нудным переписыванием кода из одной колонки в другую.
                                            Но прямо переписывал я чуть больше половины. Многое (отрисовка, звук, консоль, сеть) написано по-своему.
                                          • +7
                                            Спасибо за подробный и познавательный рассказ, за впечатляющий и плодотворный труд.
                                            • +3
                                              Спасибо!

                                              Ваще супер!
                                              • 0
                                                У вас webquake.quaddicted.com открывается?
                                              • 0
                                                W.LoadWadFile: couldn't load gfx.wad

                                                GET pak0.pak 403 Forbidden webquake.quaddicted.com 185 B 85.13.140.204:80 65ms GET pop.lmp 403 Forbidden webquake.quaddicted.com 186 B 85.13.140.204:80 48ms GET gfx.wad 403 Forbidden webquake.quaddicted.com 184 B 85.13.140.204:80 65ms
                                                • 0
                                                  Такая же проблема. Неужели Zenimax так быстро реагируют?
                                                  • +1
                                                    Хабраэффект. Походу хост заблокировал WebQuake. Я не могу на FTP зайти даже.
                                                  • +7
                                                    Автору — выведите ДЕМО ссылкой жирно!

                                                    Этот пост должен войти в лучшие месяца
                                                    • +1
                                                      Вы убили демо. =(
                                                      • +1
                                                        Я только начал входить во вкус )=
                                                        • +1
                                                          Поставьте на локалхост, это не трудно, просто файлы порта и игры на веб-сервер с поддержкой HTTP/1.1 закиньте. Тут ничего конвертировать, как в GWT Quake 2, не надо.
                                                          • +1
                                                            А почему бы на GitHub pages не залить? Для сингла самое то, а сервер свой разгрузите.
                                                            • 0
                                                              GitHub по DMCA-запросам закрывает репозитории.
                                                              • 0
                                                                Открыть фейковый реп на момент хабраэффекта?)
                                                            • 0
                                                              Да, так работает, спасибо (пробовал на сто-килобайтном shttps).
                                                      • 0
                                                        А никто похостить дезматч или кооп не желает? Я не могу, у меня NAT.
                                                        • +1
                                                          У всех nat!
                                                          • 0
                                                            А еще у меня DIR-632 (типа IPv6 Ready) с корявой прошивкой без IPv6…
                                                            Кстати, ставить американскую прошивку на русский роутер через emergency recovery не опасно?
                                                        • +2
                                                          Хм, у меня не может загрузить файлы.
                                                          • +2
                                                            У всех так. Хабраэффект, а сервер не мой.
                                                        • 0
                                                          А в Firefox Nightly похоже не работает:
                                                          Error: TypeError: Not enough arguments to AudioContext.createBuffer.
                                                          Source File: localhost/WebQuake/S.js
                                                          Line: 809
                                                          • 0
                                                            Видимо еще не добавили createBuffer(ArrayBuffer, bool).
                                                            • 0
                                                              Да, действительно. Отключил media.webaudio.enabled и заработало.

                                                              // В 20 фоксе у меня немного подлагивало, но там открыта пара десятков страниц, а вот в найтли всё нормально.
                                                              // Прошёл три уровня :)
                                                          • 0
                                                            В инструкции по установке написано:
                                                            Get Quake resource files. The demo version containing only the first episode is enough.

                                                            А где их взять эти «resource files».
                                                            • 0
                                                              Демку на www.idsoftware.com/games/quake/quake
                                                              Полную на old-games.ru или торрентах.
                                                              • 0
                                                                На 64-битной Windows демка не устанавливается (установщик для DOS), так что гуглите
                                                                "pak0.pak" 17m "index of"
                                                                и кидайте в папку id1.

                                                                Полная, как и DLC, есть в Steam.
                                                                • +1
                                                                  > демка не устанавливается
                                                                  WinRar, Total Commander и т.п. распаковывают файл resource.1. (это sfx lzh архив)
                                                            • +6
                                                              Залил демо себе на сервер:

                                                              вкусноиполезно.com/quake/
                                                              • 0
                                                                GET pak2.pak

                                                                404 Not Found
                                                                поправьте.
                                                                • 0
                                                                  Скачал 3 версии quake. pak2.pak ни в одной нет.
                                                                  • +1
                                                                    Его и не должно быть. Quake загружает pak-и от нулевого, пока не дойдет до несуществующего.
                                                                    • 0
                                                                      Уже 2ой уровень проходите? :)

                                                                      А вообще у меня в хроме не ругается и работает. Попробую ещё поискать ресурсных файлов.
                                                                      • 0
                                                                        Ругается в Файрбаге. Это ошибочный код ответа на HTTP-запрос, а не ошибка в коде.
                                                                        • 0
                                                                          мм у меня просто не загружается почему то. Скорее это опять бага. Почему то у меня в винде 8 часто страницы не догружаются, в любом браузере. В линуксе все ок. Потом в нем попробую.
                                                                    • 0
                                                                      HUD не вписывается.
                                                                      • 0
                                                                        В настройках «размер экрана» как раз для исправления таких неприятностей.
                                                                        • +1
                                                                          Я имею в виду, что HUD, нарисованный в Paint, не вписывается в общую тематику.
                                                                    • +4
                                                                      Вот еще демо Mission pack присутствует
                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                        • +18
                                                                          Апплодирую стоя, вы — явный гений. Буду давать ссылку на этот пост всем, кто плохо отзывается о молодом поколении в стиле «при Сталине трава была зеленее»
                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                            • +1
                                                                              А смысл? К тому же, в вебе Web Audio API уже есть, а биндинг для OpenAL никто добавлять не планирует.
                                                                            • 0
                                                                              Молодец! Привет от бывших форумчан с cs-mapping.com.ua ;)
                                                                              • +1
                                                                                А я лет 5-6 назад по его постам на форуме нашалайф (потом как-то и не видел его, да и сам я оттуда ушел) и не сказал бы что до такого человек дойдет. Действительно молодец. :)
                                                                              • 0
                                                                                Очень круто! Респект и уважуха! :)

                                                                                Какой у вас опыт программирования до WebQuake?

                                                                                Кодили рилтайм 3D?
                                                                                • 0
                                                                                  Начал со скриптов для Garry's Mod. Возможно, вы когда-нибудь видели мои Valkyrie Rockets на Toybox. Потом попробовал на Си сделать унылую игру (с текстурами не больше 256x256, чтобы на Voodoo 2 работала) про разноцветные кубы, к которой даже внутриигровой редактор сделал, но забросил из-за того, что под такую идею (переключение между белым «слоем» и черным «слоем») было невозможно придумать нормальные уровни, и это был OpenGL Immediate Mode. Потом решил сделать WebQuake.
                                                                                • +1
                                                                                  Восхитительно! Для меня в 16 лет был предел — кривой wolfenstein-подобный движок на паскале )
                                                                                  Поностальгировал, даже сразу вспомнил +mlook )
                                                                                  • +1
                                                                                    Так как сервер вы убили, хост теперь перенаправляет с webquake.quaddicted.com на старое расположение, но там немного нестандартные config.cfg и progs.dat, поэтому желательно в консоли написать unbindall и exec default.cfg. «Player exited the level» — это делает модифицированный progs.dat. Я ничего не могу с этим поделать.
                                                                                    • 0
                                                                                      И читы там на некоторых кнопках стоят.
                                                                                    • 0
                                                                                      Очень круто!
                                                                                      • 0
                                                                                        Серьезно. Я в 16 ковырял ядра всяких nix-like систем… до 3д руки так и не дошли =)
                                                                                        • 0
                                                                                          Я просто позавидую тут. Надеюсь, когда нибудь и я так смогу…
                                                                                          • 0
                                                                                            Супер, что тут еще говорить! Ждем адаптации для всех браузеров :)
                                                                                            • +1
                                                                                              Все прекрасно, замечательно и круто, прям как в детстве, НО(!) — у меня у одного в четвертом эпизоде 4й уровень не проходится?
                                                                                              т.е. пройти то его можно, показывается время уровня, скольких убито, сколько секретов… А дальше, нажимаем что-нибудь, чтобы грузить следующий уровень, и все, пустота :(
                                                                                              • 0
                                                                                                Да, на e4m5 двери пересекаются. Буду код ещё раз проверять.
                                                                                                • 0
                                                                                                  спасибо. но плюсануть не могу, уж извините :)
                                                                                                  • 0
                                                                                                    Там, оказывается, не только двери пересекаются, ещё и мультиплеерная перегородка у выхода, видимо там ещё какая-то мультиплеерная дверь есть. Буду искать.
                                                                                                    • 0
                                                                                                      не знал этого. когда я в кваку играл у меня был 100й пентиум, и никакого намека даже на интернет :)
                                                                                                      но в целом, очень понравилась игра, прошел с удовольствием еще раз!)
                                                                                                      • 0
                                                                                                        Исправил. Я вместо >= 2 по ошибке написал === 2 в коде удаления энтитей по spawnflags, из-за этого энтити с флагом not in hard не удалялись на nightmare.

                                                                                                        Спасибо за то, что заметили.
                                                                                                        • 0
                                                                                                          аа… черт, да, я даже не догадался попробовать другую сложность.

                                                                                                          Абсолютно не за что, Вам спасибо за такой порт!
                                                                                                          • 0
                                                                                                            блин, все равно никак(
                                                                                                            или старое сохранение безвозвратно запорото и надо заново проверять?
                                                                                                            у меня сейв прям перед выходом, загружаюсь, вхожу в дверь — все тоже самое. (кеш браузера почистил раза 3 уже).

                                                                                                            консоль говорит —
                                                                                                            Uncaught Error: Host.abortserver Host.js:27
                                                                                                            Host.Error Host.js:27
                                                                                                            PF.objerror PF.js:22
                                                                                                            PR.ExecuteProgram PR.js:810
                                                                                                            SV.Physics_Pusher SV.js:1402
                                                                                                            SV.Physics SV.js:1722
                                                                                                            SV.SpawnServer SV.js:783
                                                                                                            Host.Changelevel_f Host.js:542
                                                                                                            Cmd.ExecuteString Cmd.js:207
                                                                                                            Cmd.Execute Cmd.js:29
                                                                                                            Host._Frame Host.js:210
                                                                                                            Host.Frame
                                                                                                            • 0
                                                                                                              Старое сохранение не запорото, но E4M4 в этом сохранении будет выглядеть, как в сетевой игре, пока не перейдете на нём на другой уровень. А вы скачали обновленные файлы и Ctrl+F5 нажимали? В консоли build должен быть 41.

                                                                                                              А Host.abortserver — не ошибка, а остановка выполнения скрипта до следующего кадра.
                                                                                                              • 0
                                                                                                                на вкладке network, где должны быть имена файлов ПКМ -> Clear browser cache.

                                                                                                                Ctrl+F5 не всегда адекватно чистит кеш почему-то. Да и конкретно в той вкладке работать не будет, откроет настройки мультиплеера.

                                                                                                                Ни в консоли браузера, ни в консоли игры не нашел build, но надел его при начальной загрузке — (webQuake build 38). Открыл в другом браузере, в котором раньше не открывал, там тоже 38.
                                                                                                                • 0
                                                                                                                  38 — это ооооочень старая версия.

                                                                                                                  Вот здесь на данный момент последняя версия — quaddicted.com/stuff/WebQuake/Client/WebQuake.htm (но конфиг слегка нестандартный). Увы, у меня нет доступа ни к одному из имеющихся серверов, на которых расположен WebQuake, поэтому обновлять версии на сайтах вовремя я не могу, но на Quaddicted админ обновляет довольно часто.

                                                                                                                  А Ctrl+F5, как и другие горячие клавиши браузера, надо нажимать в строке адреса, так как там нажатия не перехватываются.
                                                                                                                  • 0
                                                                                                                    да, я там и играл. теперь обновилось, 41я, и на том же сейве все загрузилось.

                                                                                                                    Про строку браузера не подумал, в теле нажимал))
                                                                                                                    • 0
                                                                                                                      Добавил про строку адреса в readme.md.
                                                                                                  • 0
                                                                                                    да, MAP E4M4 не находится на серве просто. MAP E4M5 уже на месте, но все равно не приятно, пришлось перепроходить с 5го уровня 4го эпизода, т.е. с последней руны начинать. А дальше, когда все руны собраны, в полу открывается проход, но он закрыт стеной. Не помню, чтобы такое раньше было.
                                                                                                    Стену прошел noclip'ом конечно, но все равно, без читов в данный момент игру не пройти :(
                                                                                                    • 0
                                                                                                      Пройти можно было, но не на nightmare. Как я выше написал, уже можно и на nightmare пройти.
                                                                                                  • 0
                                                                                                    Открыл сервер на 16 игроков (больше не могу), не знаю, долго ли протянет.
                                                                                                    quaddicted.com/stuff/WebQuake/Client/WebQuake.htm?+connect%20ws://webquakedm-7637.onmodulus.net
                                                                                                    В Петербурге лагает, пинг 130.

                                                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.