Программирование

Вся троица онлайн-рогаликов написанных на языке программирования ANSI C (~ стандарт C89-C99), так как изначально все они были основаны на исходном коде Angband

Итак, для всех, кто хочет глубже понять, как работают онлайн-рогалики, или хочет помочь с их разработкой, я хочу поделиться несколькими полезными ссылками для начала:
 
1) вики: язык C, ANSI C
2) репозитории исходного кода онлайн-рогаликов:

3) Прочитайте книгу о C. Существует множество книг о ANSI C; моя личная любимая — «C Primer Plus» от Stephen Prata. C — это язык, который не следует изучать в спешке, так как вам необходимо понять множество глубоких внутренних аспектов. Не торопитесь 🙂

 
Итак… Чтобы включиться в процесс разработки, вам следует:
 
1) изучить основы ANSI C (подойдёт книга или онлайн-руководство)
2) создать самостоятельно очень простую рогалик-игру (хорошее руководство — RogueLulz, часть I: Рисование карты, передвижение, базовые монстры и атаки)
3) ‘прочитать’ исходный код и понять, как он работает
4) добавить небольшую функцию и заставить её работать. Например: изменить цвет UI, добавить индикатор баффа/дебаффа, добавить новое окно с миникартой и т.д.
5) присоединиться к нашему Discord и участвовать в процессе разработки вместе с нами! 🙂
 
Пожалуйста, не стесняйтесь добавлять дополнительную информацию, полезные ссылки, руководства или любые материалы по этой теме в наш discord, чтобы я мог добавить их туда.
 

FAQ по программированию:

Объясните, почему ваш ATTR 16-битный? Я понимаю, что вам нужно больше значений, чем 127, но не могли бы вы пояснить? Также, это в V?

Да, потому что тайлсеты могут быть больше, чем 128×128. Также клиент GCU использует специальные атрибуты больше 128 из-за фронтенда Necklace of the Eye. Например: невозможно использовать символы @, потому что NotEye использует @ для отслеживания позиции игрока, поэтому вместо этого можно использовать смайлик (0x263A).

Дайте общий обзор того, как уровни подземелья выстроены в памяти в V/PWMA сейчас? (например, в mang это ужасный массив cave[-4096 to 127], с индексами дикой местности, закручивающимися в отрицательных измерениях (как вы хорошо знаете))

Теперь уровни хранятся в массиве [x/y/z]. Дикая местность прямоугольная. Города или области дикой местности находятся на (x,y,0). Затем в локации (x,y) вы можете иметь подземелье с этажами от 1 до 127 по оси z.

Есть ли также функция вроде get_player_level(struct player*p), которая использует p->world_x, p->world_y, p->depth или что-то подобное? и есть ли такие средства доступа?

Нет, только get_cave.

Монстры/объекты всё ещё хранятся глобально со ссылками на уровни, или теперь они являются частью структуры уровня?

Часть уровня. Теперь всё в cave: мобы, объекты, ловушки.

Как отлаживать сервер?

Установите C++Builder Community Edition

Есть два способа сделать это — через готовое решение или вручную:
1) решение: скачайте файл проекта для сервера (ПКМ → ‘Сохранить как…’)
2) вручную:

  1. создайте новый проект
  2. консольное приложение → C
  3. укажите исходный код проекта, выберите «main.c» в /src/server
  4. сохраните проект с именем: mangband в /src/bcb6 (сначала он сохранит .h файл; а затем появится новое окно с *.cbproj) // имя важно, т.к. оно будет генерировать исполняемый файл сервера как mangband.exe
  5. теперь настроим игру: вкладка проекта → попробуйте найти «options»
  6. Building →
    C++ Shared Options → Final output directory → выберите PWMAngband (основную папку исходников)
  7. C++ Compiler → ‘Use classic Borland compiler’ → true
  8. Directories and Conditionals → conditional defines:
    _DEBUG;STRICT;BCC_IDE;WINDOWS
  9. Directories and Conditionals → Include file search path нам нужно добавить ..\win и ..\common
    для этого нажмите на «…» чтобы добавить строку
  10. Directories and Conditionals → Object file output directory → PWMAngband
  11. Pre-compiled headers → cache: true
  12. теперь нам нужно добавить все файлы в проект; сначала файлы в «common», все .c файлы
    щелкните правой кнопкой мыши на project.exe и нажмите «добавить»
    в /common
    .c
    добавьте всё, кроме net-unix.c
    они появятся в папке проекта (разверните, чтобы увидеть файлы)
  13. теперь добавьте все файлы из /server, кроме main.c
  14. последний файл для добавления — «angband.rc» из /win
  15. project -> make … если он выполняет связывание — всё хорошо 🙂
  16. проверьте, сгенерированы ли .exe файлы (должны быть в папке PWMAngband)
  17. выполните (зелёная стрелка)
  18. теперь откройте «game-world.c»
  19. найдите «void exit_game_panic(void)» (Ctrl+f должен открыть окно поиска)
  20. поставим здесь точку останова: нажмите на полях слева на этой строке (появится красная точка маркера)
  21. теперь закройте окно сервера (которое запущено после выполнения); используйте ctrl+c для закрытия (закрытие с помощью «x» может вызвать сбой)
  22. теперь запустим сервер в режиме отладки: нажмите на кнопку рядом с зелёной стрелкой (Run)
  23. он теперь в режиме отладки: «exit_game_panic» — это функция, которая вызывается при сбое; так что когда игра вылетает, отладчик остановится на этой строке
  24. откройте окно под названием «stack view» в меню отладки: view → call stack (оно появится слева)
  25. когда программа остановится, вы получите строку, где произошёл сбой, так что вы можете сразу исправить код!

Как отлаживать клиент?

Решение: скачайте файл проекта для клиента (ПКМ → ‘Сохранить как…’)

В основном то же самое, но вам следует добавить переменные из PWMAngband\src\bcb6\<file>.bpr в файл проекта вашей IDE.

  1. посмотрите в mangclient_sdl.bpr и вместо серверного _DEBUG;STRICT;BCC_IDE;WINDOWS (Directories and Conditionals → conditional defines:), используйте:
    STRICT;BCC_IDE;WINDOWS;SOUND_SDL;USE_SDL;_DEBUG

  2. добавьте путь к библиотеке в свойства проекта:
    D:\GitHub\Tangaria\PWMAngband\src_SDL

  3. также добавьте файлы .._SDL\SDL.lib .._SDL\SDL_ttf.lib .._SDL\SDL_image.lib .._SDL\SDL_mixer.lib непосредственно в проект (щелкните правой кнопкой мыши project.exe и нажмите «добавить»)

Как изменить поврежденные данные (англ. язык)

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.