Ещё один проект рогалика на Python:заметки, вопросы, идеи

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 01 фев 2015, 21:39

karagy писал(а):У Бискупа в Адоме посаженые травы плодятся по правилам Конвеевского автомата Life.
Да, это я знаю.
Oreyn писал(а):В катаклизме звуки, который ты слышишь вне пределов видимости рисуются знаками вопросов по черному фону в приблизительной точке откуда идет звук. Верю что там алгоритмом специально случайно сдвигают знак. Весьма удобно и наглядно.
Немного играл, но не обратил внимания. Тоже хорошая мысль, но всё-таки хочется порисовать красивые стрелочки. Может подойти на первое время, до появления нормальной графики.

Сейчас доделываю разделение/объединение. На нём будет основываться боевая система. Также чуть-чуть порефакторил и добавил соответствующие флаги. Немного забил кодом на идею делать несколько существ в одной клетке.

Оно будет сделано специально не очень свободным: у первой собаки вначале будет список существ, которые она может отделять от себя, начиная с последнего (просто создаётся новое существо). Это делается для того, чтобы во время боя можно было не думать об оптимальной конфигурации списка, а просто воспринимать его как данность.

Дочерние существа обычно не будут делиться дальше.

На отделение существ будут тратиться свободные очки деления очки деления, при присоединении существа обратно они будут возвращаться (пропорционально доле hp присоединяемого существа от его max_hp, остальные очки высвобождаются, и медленно регенерируют в дальнейшем). При смерти отделённого существа очки на его создание просто медленно востановятся (как будто оно присоединилось с 0% hp).

Список существ (лучше называть их ботами) можно будет менять (когда ни одно из существ не отделено и количество очков полное). Существа в списке могут быть разными, но их характеристики будут основываться на характеристиках игрока. Управлять ими будет либо простой бот, либо игрок (но более управляемое существо будет стоить дороже, да и вряд ли я будут делать какого-то бота с прямым управлением, кроме разведчика).

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

У мобов будет всё то же самое, только, конечно, не у всех и в меньшем масштабе.

Думаю, стоит уже делать какое-то наполнение и код для его быстрого написания (к примеру, можно записывать всех существ в коде, а можно вынести их описание в файл). Порталы до сих пор как-то некрасивым образом ставятся. Нужно будет, кстати, сделать ограничения для мобов на проход через порталы.
Сейчас профиль существа автоматически дополняется (можно сделать существо, задав ему только силу атаки, но тогда все остальные параметры будут взяты из базового профиля). Интересно, сколько существ будет тянуть компьютер? И будет ли лучше, если каким-то образом сокращать ненужные флаги и параметры? И сколько времени на это уйдёт? Узнаю.


UPD: про клеточные автоматы. Цитата отсюда:
It is an old and fairly well documented trick to use cellular automata to generate cave-like structures. The basic idea is to fill the first map randomly, then repeatedly create new maps using the 4-5 rule: a tile becomes a wall if it was a wall and 4 or more of its eight neighbors were walls, or if it was not a wall and 5 or more neighbors were. Put more succinctly, a tile is a wall if the 3x3 region centered on it contained at least 5 walls. Each iteration makes each tile more like its neighbors, and the amount of overall "noise" is gradually reduced:
Это старый трюк — использовать клеточные автоматы. Основная идея — заполнить поле случайным образом, и применить к нему клеточный автомат… клетка становится стеной, если в квадрате 3 на 3 с центром в этой клетке не меньше пяти стен.
45% случайных стен в начале, 5 шагов:

Код: Выделить всё

############################################################
###....####################################.....############
##......######################..#########.........##########
##......#####################....#######...........####.####
##......###################.........................##...###
##......##################..........................###...##
#........##############.............................###...##
#........#############...............................#....##
##.......##############..................................###
##.......###..############..............................####
##.......##....############.............................####
#..............############...###........................###
#...............###########..#####...............##.......##
#................#################...............##.......##
##.....#####..........###########....#..........###.......##
##....#######...........########....###.........####......##
##....#######............######....####........#####......##
##....#######.............####....#####.......#####......###
#......######..............###....####........####......####
#.......######.............###...####.........###.......####
#........#####.............###..####.....................###
##........####..............#...####.....................###
#####......##...................####.....................###
######...........................##.....................####
######..................................................####
######.........###.....................####.............####
######......#########.................######............####
#######....#############.......##############.....###..#####
##############################################..############
############################################################

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Oreyn » 02 фев 2015, 07:55

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

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 02 фев 2015, 09:08

Там дальше описывается, весьма красивый алгоритм получается.

Очевидные простые пути не слишком хороши:
"найти наибольшую связную компоненту и замуровать остальные" - на большой карте наибольшая компонента часто маленькая.
"генерировать, пока не появится связная карта (с одной компонентой)" - на большой карте такое маловероятно.
"связать компоненты вручную" - уже лучше, но простым алгоритмом получается некрасиво, а красивый, думаю, будет дольше и не очень быстрым

Да и порой карта получается очень пустой.

Поэтому делают так: добавляют к автомату для заполнения различных пустот (несвязанных с лабиринтом и центральных ещё одно условие: клетка в почти пустой окрестности Мура (ход короля) радиуса 2 (то есть квадрат 5*5) заполняется стеной. После этого получается как-то узко (ведь нет больших свободных пространств) и обшарпано, какие-то одиночные стенки, зато более связно.

Для для получения сглаженных границ и нормальной ширины применяют уже такой алгоритм:

Winit(p) = rand(0,100) < 40 # вероятность стены меньше
Repeat 4: W'(p) = R1(p) >= 5 || R2(p) <= 2 # здесь R2(p) <= 1 заменено на R2(p) <= 2 для того, чтобы избавиться от одиночных блоков
Repeat 3: W'(p) = R1(p) >= 5 # а здесь над лабиринтом работает исходный автомат

Код: Выделить всё

############################################################
###...###########..#############################.....#######
##..........####....################..#########.........####
##...........##.....####..#########.......####..######...###
##.......#..........###....###.................########..###
##......###........###........................#########..###
##.......##.........#........................##########...##
##.......###...........##.............###....#########.....#
##.......######.......####...........#####....#####........#
###.....#########....#####...........######...#####........#
###########################...........#####...#######.....##
#############...###########.............##....########....##
############.........#######...................#######....##
###########...........########......###............##....###
###..#####.............#########...##########............###
##....###...............######################..........####
###..........................######..#########..........####
####..........................###.....#######...........####
####.................##................##................###
####...###..........####...............#..................##
###...#####.........####..............##......##...........#
##....########......#####............####....####..........#
##....#########.....#####............####....####..........#
##.....######.......#####.............##.....####...##.....#
##......##..........#####....................####..####....#
###.................####.........###........############..##
###............##..######.###...############################
####..........##############################################
######..####################################################
############################################################
Упоминается проблема наличия несвязных компонент. Проверка на их наличие идёт FloodFill ом. Убирать либо вручную, либо просто генерировать заново карту, что неудобно для карт большого размера. Ещё один оригинальный путь борьбы с делением на компоненты - после заполнения карты случайными блоками вырезать в середине горизонтальную узкую полоску в 3-4 клетки. Она будет защищать от вертикальных перегородок.

Почти перевод статьи :)

Там дальше описывается, весьма красивое решение получается. Очевидные простые пути не слишком хороши:
"найти наибольшую связную компоненту и замуровать остальные" - на большой карте наибольшая компонента часто маленькая.
"генерировать, пока не появится связная карта (с одной компонентой)" - на большой карте такое маловероятно.
"связать компоненты вручную" - уже лучше, но простым алгоритмом получается некрасиво, а красивый, думаю, будет дольше и не очень быстрым

Да и порой карта получается очень пустой.

Поэтому делают так: добавляют к автомату для заполнения различных пустот (несвязанных с лабиринтом и центральных ещё одно условие: клетка в почти пустой окрестности Мура (ход короля) радиуса 2 (то есть квадрат 5*5) заполняется стеной. После этого получается как-то узко (ведь нет больших свободных пространств) и обшарпано, какие-то одиночные стенки, зато более связно.

Для для получения сглаженных границ и нормальной ширины применяют уже такой алгоритм:

Winit(p) = rand(0,100) < 40 # вероятность стены меньше
Repeat 4: W'(p) = R1(p) >= 5 || R2(p) <= 2 # здесь R2(p) <= 1 заменено на R2(p) <= 2 для того, чтобы избавиться от одиночных блоков
Repeat 3: W'(p) = R1(p) >= 5 # а здесь над лабиринтом работает исходный автомат

Код: Выделить всё

############################################################
###...###########..#############################.....#######
##..........####....################..#########.........####
##...........##.....####..#########.......####..######...###
##.......#..........###....###.................########..###
##......###........###........................#########..###
##.......##.........#........................##########...##
##.......###...........##.............###....#########.....#
##.......######.......####...........#####....#####........#
###.....#########....#####...........######...#####........#
###########################...........#####...#######.....##
#############...###########.............##....########....##
############.........#######...................#######....##
###########...........########......###............##....###
###..#####.............#########...##########............###
##....###...............######################..........####
###..........................######..#########..........####
####..........................###.....#######...........####
####.................##................##................###
####...###..........####...............#..................##
###...#####.........####..............##......##...........#
##....########......#####............####....####..........#
##....#########.....#####............####....####..........#
##.....######.......#####.............##.....####...##.....#
##......##..........#####....................####..####....#
###.................####.........###........############..##
###............##..######.###...############################
####..........##############################################
######..####################################################
############################################################
Упоминается проблема наличия несвязных компонент. Проверка на их наличие идёт FloodFill ом. Убирать либо вручную, либо просто генерировать заново карту, что неудобно для карт большого размера. Ещё один оригинальный путь борьбы с делением на компоненты - после заполнения карты случайными блоками вырезать в середине горизонтальную узкую полоску в 3-4 клетки. Она будет защищать от вертикальных перегородок.


Почти перевод статьи :)

P.S.Один неочевидный минус таких клеточных автоматов: очень большие карты, говорят, выглядят странно, если алгоритм не настроить особо.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 02 фев 2015, 09:55

Читая про алгоритм Дейкстры, неожиданно понял, что немного ошибся в реализации кучи (только на уровне кода, так что всё легко исправимо).

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Uvadzucumi » 02 фев 2015, 16:30

Если бы я делал звуки и запахи, то показывал бы только их уровень. Во всяком случае с зарахами. если, например, направление звука, еще както можно определить - звук идет из правой двери (хотя моб кашлянул в коридоре слева от героя но толстая стенка заглушила) то с запахами - тут сильно воняет, или не сильно. А игрок передвигаясь уже определяет направление
Меня окружали милые, добрые люди... медленно сжимая кольцо

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 03 фев 2015, 06:30

Я тоже хотел сделать такой механизм запахов, но он может сделать геймплей менее интересным.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 03 фев 2015, 12:52

Разобрался с ошибкой со временем. В чём была проблема: питоновский модуль heapq везде традиционно используется так: с помощью определенных его функций пихаем в кучу tuple (priority, object). У меня же определена операция сравнения мобов между собой (которая сравнивает их время и id-шники, чтобы определить, кто раньше ходит), и в куче лежат просто мобы. Оказывается, всё работает и так.
UPD: Интересная модификация алгоритма А* (для того, чтобы избежать медленных скоплений монстров) (изначально монстры рассматриваются как проходимые клетки):

Код: Выделить всё

Monsters have a simple counter for how long they've been stopped in the same tile ("idle time"). This should be 0 when moving. When pathfinding, if a walkable tile has a monster on it, its cost is proportional to the monster's idle time.

Код: Выделить всё

Монстр имеет счётчик, отсчитывающий, как долго он стоит на клетке ("время ожидания"). При передвижении он равен 0. Во время поиска пути, если тайл содержит монстра, его цена равна времени ожидания монстра.

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Oreyn » 03 фев 2015, 14:56

Если изначально учитывать стоимость "прохода" через клетку - хорошее решение.
Я подобную проблему решал тем, что монстры считаются непроходимыми только в упор. И путь искал волновым алгоритмом, потому как радиус поиска пути был 8-10 клеток.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 08 фев 2015, 19:25

Сделал слияние, пока в примитивном виде. Отрефакторил инвенарь и немного "стэк деления".
Деление реализуется чем-то вроде посылки сообщений (можно было бы полезть в приватные методы, но это нехорошо). Т.е. существо, желающее слиться с другим, выясняет, кто из них отделившийся, посылает отделившемуся сообщение, и оно посылает своему хозяину ещё сообщение. Возможно, понадобится сделать ещё какую-то механику, связанную с этим, но это уже позже.
Научился нормально пользоваться bookmarks в notepad++. :)

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

Ещё думаю о механизме событий, допустим, взрыве гранаты или чём-то подобном. Получается, что будет очень удобным класть их в time_heap.
Задумался об облегчении интеллекта далёких монстров...

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 11 фев 2015, 16:18

Написал немного функций для облегчения генерации мира. Испытываю некоторый недостаток мотивации, возможно, связанный с тем, что рогалик пока не запускал.

Аватара пользователя
Apromix
Мастер
Сообщения: 1188
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Apromix » 12 фев 2015, 10:52

Поиграй в Wander - будет мотивация :lol:

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 14 фев 2015, 02:25

Поиграл немного. Потом покодил свой проект, написал простенькую систему зелий, дописал систему dp и чуть-чуть переписал код для стрельбы — так, чтобы потом можно было дописывать стрелковое оружие и разрущение внешней среды. Всё. Чувствую себя как человек, окружённый многими колёсами, соединёнными друг с другом: можно крутить их и совершать работу, но толку от этого немного.
Думаю, стоит заняться рефакторингом. Хотя бы исправить имена некоторых функций и переменных на более единообразные.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Tookser » 20 фев 2015, 01:53

Пока всё не очень интересно. Реализовал почти полностью систему надеваемых предметов и модификации статов при этом. Стадия стагнации.

Аватара пользователя
Apromix
Мастер
Сообщения: 1188
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Apromix » 20 фев 2015, 21:57

Опять нужна мотивация :)? Почитай книгу, посмотри фильм....

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Ещё один проект рогалика на Python:заметки, вопросы, иде

Сообщение Jolly Roger » 21 фев 2015, 06:59

Tookser писал(а):Пока всё не очень интересно. Реализовал почти полностью систему надеваемых предметов и модификации статов при этом. Стадия стагнации.
Это нормально, просто продолжай работать.
Дело в том, что получаемая в начале эйфория, мы это как раз обсуждали с BreakMT, даётся немного авансом.
В самом начале работы, соотношение код/результат наибольшее, но, естественно, наступает момент, когда нужно допиливать уже имеющиеся фичи, доделывать каке то запчасти движка, внутренние алгоритны.
Когда несколько дней работы вообще никак не отражаются внешне. Дебаг добавляет ещё.
Самомотивация при создании рогалика, это имхо, один из самых важных ресурсов. :wink:
Хитростей немало, сделай мааааленькую вичу, которая сразу появится на экране, может одно единственное информационнное сообщение. Может пойти по принципу домино.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость