City of the Damned
Модераторы: Sanja, Максим Кич
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Я подумаю, мысль здравая, конечно.
Вообще для снятия "синдрома поиска последнего алиена", который тут неожиданно всплыл, я думал сделать так, что если ты остался один от фракции, то тебя все враги видят, чтоб не шататься по карте и не искать под какую корягу последний имп спрятался.
Абилка, возможно, даже лучше.
Для следующей версии я все-таки решил запилить одновременные ходы и многопоточность. Посмотрим что получится.
Вообще для снятия "синдрома поиска последнего алиена", который тут неожиданно всплыл, я думал сделать так, что если ты остался один от фракции, то тебя все враги видят, чтоб не шататься по карте и не искать под какую корягу последний имп спрятался.
Абилка, возможно, даже лучше.
Для следующей версии я все-таки решил запилить одновременные ходы и многопоточность. Посмотрим что получится.
Re: City of the Damned
Побегал несколько раз, пожелания/вопросы вот какие:
1. После смерти игра закрывается на эскейп, надо перезапускать, чтобы сыграть еще партию. Может, сделать еще кнопку, чтобы в главное меню можно было выйти?
2. Мужчины, женщины, дети - отличаются по характеристикам? Если да (да и если нет тоже), для них было бы неплохо сделать разные символы (не только @ в смысле)
3. Имп и демон могут атаковать людей, не вселившись в кого-нибудь предварительно? Потому что в своей "первозданной" форме я жму клавишу направления к человеку и вселяюсь в него.
4. Russian language please
1. После смерти игра закрывается на эскейп, надо перезапускать, чтобы сыграть еще партию. Может, сделать еще кнопку, чтобы в главное меню можно было выйти?
2. Мужчины, женщины, дети - отличаются по характеристикам? Если да (да и если нет тоже), для них было бы неплохо сделать разные символы (не только @ в смысле)
3. Имп и демон могут атаковать людей, не вселившись в кого-нибудь предварительно? Потому что в своей "первозданной" форме я жму клавишу направления к человеку и вселяюсь в него.
4. Russian language please
поперёк борозды
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Справедливо, сделаю.aspid писал(а): 1. После смерти игра закрывается на эскейп, надо перезапускать, чтобы сыграть еще партию. Может, сделать еще кнопку, чтобы в главное меню можно было выйти?
У ребенка на 1 HP меньше. Я их честно говоря специально сделал одинаковыми на вид, потому функционально они ничем не отличаются.aspid писал(а): 2. Мужчины, женщины, дети - отличаются по характеристикам? Если да (да и если нет тоже), для них было бы неплохо сделать разные символы (не только @ в смысле)
Нет, если атакующий персонаж, который умеет вселяться, нападает на цель, которая может быть одержима, то автоматически производится не рукопашная атака, а вселение.aspid писал(а): 3. Имп и демон могут атаковать людей, не вселившись в кого-нибудь предварительно? Потому что в своей "первозданной" форме я жму клавишу направления к человеку и вселяюсь в него.
Ох, это прям такая глобальная задача с интернационализацией. Падежи еще это русские...aspid писал(а): 4. Russian language please
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
В общем, по поводу одновременных ходов. Испытываю потребность зафиксироваться письменно, ну и может потом кому для истории пригодиться. С помощью коллективного разума были выработаны следующие идеи.
0. Переделать алгоритмы LOS и pathfinding. В частности для последнего использовать Dijkstra Maps. Окей, отложим на потом.
1. Оставить мультитрединг, убрать одновременность ходов. А именно, из пула актеров выбираются те, ход которых зависит от действий игрока (например, которые его видят и которых видит он), а остальные последовательно обсчитывают свои ходы в отдельном треде. Как только игрок определяется чего он хочет сделать, ИИ допросчитывает всех остальных трех с половиной персонажей и вуаля.
Идея понятна, но алгоритм как это сделать непонятен совершенно. Потому что это выглядит так, будто нужно сохранять состояние мира после каждого просчета актера, чтобы следующий актер считался с учетом хода предыдущего. То есть на 200 актеров я должен 200 раз скопировать этот список из 200 актеров (как минимум) и еще плюс карту 100x100 (как максимум). Что-то мне подсказывает, что такие выкрутасы с выделением памяти будут тормозить не меньше, чем "честная" последовательная симуляция сейчас.
1а. Все то же самое, что и в предыдущем варианте, но ходы актеров считаются независимо от действий других, то есть состояние мира не копируется, а вот выполняются просчитанные ходы таки последовательно. В тупом варианте это будет приводить к ситуациям, когда актер А решает атаковать Б, а Б решает атаковать А, А ходит первым и Б, который в случае последовательной обработки ходов понял бы что HP у него осталось мало и надо валить, все равно самоубийственно атакует А. Можно сделать хак, что если состояние актера после просчета хода поменялось, это означает, что надо пересчитать его ИИ заново. Тут конечно все будет зависеть от того, сколько окажется таких пересчетов.
2. Использовать мультитрединг, использовать одновременность ходов. Все актеры считаются независимо друг от друга в отдельном треде, система определяет конфликтные (А и Б собираются занять одну и ту же клетку) и полуконфликтные (А идет в клетку с Б, но Б из этой клетки уходит) ситуации, решает их каким-то образом и после чего применяет действия к миру. Явно придется писать кучу каких-то кастомных правил, которые бы определяли, что тут у нас назревает конфликт. Для игрока получится сильно непривычно - например, если положить, что А нападает на Б, а Б перемещается из занимаемой клетки, то и атака проходит, и Б перемещается, то в таком случае собираться убегать надо за 2 хода до момента, когда тебе убьют, а не за ход как обычно. Здесь скорее всего тоже придется копировать состояние мира, но один раз (для того, чтобы независимо применить действия каждого актера друг к другу).
3. Не использовать мультитрединг. Вычислять действия ИИ по варианту 1 или 2 в событии SDL idle, то есть пока в окне ничего не происходит. По сути вся та же параллельность обдумывания ходов ИИ и игрока, только без тредов.
Сам пока склоняюсь к одновременности (потому что, по моему, такое никто еще не делал, а выпендриться хочется), ну и мультитредингу, чтоб новые технологии освоить.
Такие дела, как говорится, дискач.
0. Переделать алгоритмы LOS и pathfinding. В частности для последнего использовать Dijkstra Maps. Окей, отложим на потом.
1. Оставить мультитрединг, убрать одновременность ходов. А именно, из пула актеров выбираются те, ход которых зависит от действий игрока (например, которые его видят и которых видит он), а остальные последовательно обсчитывают свои ходы в отдельном треде. Как только игрок определяется чего он хочет сделать, ИИ допросчитывает всех остальных трех с половиной персонажей и вуаля.
Идея понятна, но алгоритм как это сделать непонятен совершенно. Потому что это выглядит так, будто нужно сохранять состояние мира после каждого просчета актера, чтобы следующий актер считался с учетом хода предыдущего. То есть на 200 актеров я должен 200 раз скопировать этот список из 200 актеров (как минимум) и еще плюс карту 100x100 (как максимум). Что-то мне подсказывает, что такие выкрутасы с выделением памяти будут тормозить не меньше, чем "честная" последовательная симуляция сейчас.
1а. Все то же самое, что и в предыдущем варианте, но ходы актеров считаются независимо от действий других, то есть состояние мира не копируется, а вот выполняются просчитанные ходы таки последовательно. В тупом варианте это будет приводить к ситуациям, когда актер А решает атаковать Б, а Б решает атаковать А, А ходит первым и Б, который в случае последовательной обработки ходов понял бы что HP у него осталось мало и надо валить, все равно самоубийственно атакует А. Можно сделать хак, что если состояние актера после просчета хода поменялось, это означает, что надо пересчитать его ИИ заново. Тут конечно все будет зависеть от того, сколько окажется таких пересчетов.
2. Использовать мультитрединг, использовать одновременность ходов. Все актеры считаются независимо друг от друга в отдельном треде, система определяет конфликтные (А и Б собираются занять одну и ту же клетку) и полуконфликтные (А идет в клетку с Б, но Б из этой клетки уходит) ситуации, решает их каким-то образом и после чего применяет действия к миру. Явно придется писать кучу каких-то кастомных правил, которые бы определяли, что тут у нас назревает конфликт. Для игрока получится сильно непривычно - например, если положить, что А нападает на Б, а Б перемещается из занимаемой клетки, то и атака проходит, и Б перемещается, то в таком случае собираться убегать надо за 2 хода до момента, когда тебе убьют, а не за ход как обычно. Здесь скорее всего тоже придется копировать состояние мира, но один раз (для того, чтобы независимо применить действия каждого актера друг к другу).
3. Не использовать мультитрединг. Вычислять действия ИИ по варианту 1 или 2 в событии SDL idle, то есть пока в окне ничего не происходит. По сути вся та же параллельность обдумывания ходов ИИ и игрока, только без тредов.
Сам пока склоняюсь к одновременности (потому что, по моему, такое никто еще не делал, а выпендриться хочется), ну и мультитредингу, чтоб новые технологии освоить.
Такие дела, как говорится, дискач.
Re: City of the Damned
Я призвал весь свой мэдскилл и сделал небольшую картинку на тему:
Скрытый текст: ПОКАЗАТЬ
поперёк борозды
Re: City of the Damned
Насчет одновременности - и в Rayel и в Wizard's Quest на этом форуме что-то похожее.
Ну, как похожее: там сначала тратится время на действие, потом выполняется действие. Всё это однопоточно и детерминировано, но в итоге возникают такие же конфликты как ты описал - один бьет другой из клетки уходит, снадобья надо пить на ход раньше и т.д.
Но в реализации довольно непростая штука, имхо основное неудобство что любые действия надо делать объектами. Правда зачем копировать мир я не понял.
Я бы 1а делал, а на ситуации странного поведения забил - ну да, он не успел осознать что ранен и ударил, а на следующем ходу будет убегать. Но походу всё равно будут такие же конфликты с перемещениями и их надо как-то решать, так что тоже придётся действия объектами делать.
Ну, как похожее: там сначала тратится время на действие, потом выполняется действие. Всё это однопоточно и детерминировано, но в итоге возникают такие же конфликты как ты описал - один бьет другой из клетки уходит, снадобья надо пить на ход раньше и т.д.
Но в реализации довольно непростая штука, имхо основное неудобство что любые действия надо делать объектами. Правда зачем копировать мир я не понял.
Я бы 1а делал, а на ситуации странного поведения забил - ну да, он не успел осознать что ранен и ударил, а на следующем ходу будет убегать. Но походу всё равно будут такие же конфликты с перемещениями и их надо как-то решать, так что тоже придётся действия объектами делать.
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Картинка агонь! Спасибо! Если я когда-нибудь сподоблюсь на графические тайлы, то как-то так оно и должно выглядеть.
Копирование мира нужно для того, потому что действия все равно будут применяться последовательно, из-за чего будут влиять друг на друга. Например, есть у актера Б абилка, которая лечит на 10, если у тебя HP меньше 20, и на 15, если меньше 10. Актер А решает напасть на Б, Б независимо от этого решает применять свою абилку. Мы создали список действий, запихали туда действия от А и Б. И получается, что если мы обработаем А первым, то Б хильнет себя на 15, а если вторым - то на 10. Чтобы этого не было, нам надо создать копию Б и HP от атаки снимать у нее, а у абилки проверять текущие HP у первичного Б, а лечить копию Б. После того как все действия обработаны, копии актеров заменяют оригиналы. Таким образом, достигается независимость действий друг от друга. Как-то так я себе это вижу.kipar писал(а): ↑20 янв 2017, 07:03Правда зачем копировать мир я не понял.
Я бы 1а делал, а на ситуации странного поведения забил - ну да, он не успел осознать что ранен и ударил, а на следующем ходу будет убегать. Но походу всё равно будут такие же конфликты с перемещениями и их надо как-то решать, так что тоже придётся действия объектами делать.
По поводу действий как объектов - мне в Лиспе проще, я могу функцию на лету создать с конкретными значениями переменных внутри и вернуть ее в список, чтобы потом вызвать.
Re: City of the Damned
Но может их и правильно последовательно обрабатывать?
Если А и Б одновременно решили что надо вылечиться\ударить и начали действовать, то число хп будет зависеть от того, ударит ли Б на "миллисекунду" раньше или позже чем у А сработает абилка. Во всяком случае так это работает в системе где сначала проходит время а потом применяется действие.
Но конфликты могут быть что Б ударил а А к тому времени уже умер, или например двое решили идти в одну точку, в этом случае копия по-моему не очень поможет.
Если А и Б одновременно решили что надо вылечиться\ударить и начали действовать, то число хп будет зависеть от того, ударит ли Б на "миллисекунду" раньше или позже чем у А сработает абилка. Во всяком случае так это работает в системе где сначала проходит время а потом применяется действие.
Но конфликты могут быть что Б ударил а А к тому времени уже умер, или например двое решили идти в одну точку, в этом случае копия по-моему не очень поможет.
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Ну не знаю. Надо подумать, пока это выглядит будто мы намеренно усложняем принятие верных решений для игрока и ИИ.
Если один в результате удара умер, это не проблема. Второй тоже наносит удар по первому и можем получить ситуацию, когда оба умрут одновременно.
Вот если им нужно идти в одну точку - то да, тут надо все-таки будет определять кто из них займет ее первым, на это придется делать отдельное правило.
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Вести с полей.
Мне удалось значительно оптимизировать код при последовательной обработке ходов.
На размере карты 300 x 300 (2700 актеров) изначально первый ход считался 35 сек, второй ход - 9,5 сек.
После расчистки авгиевых конюшен неэффективных алгоритмов удалось сократить время расчета хода до 0,8 сек для первого хода и 0,6 сек - для второго хода. Параллелизм тут тоже частично удалось задействовать.
После чего я воткнул таки параллельную обработку и одновременные ходы. Результат мне что-то не очень понравился. Во-первых, все, что связано с движением по карте, стало невероятно сложным. Во-вторых, даже несмотря на то, что весь ИИ считается в отдельном треде, последующий разбор и применение ходов съедает весь выигрыш. В результате первый ход считается 0,7 сек, второй тоже 0,6 сек. В общем, шило на мыло.
Поэтому вынужден констатировать, что тему с одновременными ходами придется закрыть, и вернуться к освященному традицией варианту с последовательными ходами.
Такие дела.
Мне удалось значительно оптимизировать код при последовательной обработке ходов.
На размере карты 300 x 300 (2700 актеров) изначально первый ход считался 35 сек, второй ход - 9,5 сек.
После расчистки авгиевых конюшен неэффективных алгоритмов удалось сократить время расчета хода до 0,8 сек для первого хода и 0,6 сек - для второго хода. Параллелизм тут тоже частично удалось задействовать.
После чего я воткнул таки параллельную обработку и одновременные ходы. Результат мне что-то не очень понравился. Во-первых, все, что связано с движением по карте, стало невероятно сложным. Во-вторых, даже несмотря на то, что весь ИИ считается в отдельном треде, последующий разбор и применение ходов съедает весь выигрыш. В результате первый ход считается 0,7 сек, второй тоже 0,6 сек. В общем, шило на мыло.
Поэтому вынужден констатировать, что тему с одновременными ходами придется закрыть, и вернуться к освященному традицией варианту с последовательными ходами.
Такие дела.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: City of the Damned
Великолепный результат! Ты крут! Прирост 4375%gwathlobal писал(а): ↑27 янв 2017, 00:11Вести с полей.
Мне удалось значительно оптимизировать код при последовательной обработке ходов.
На размере карты 300 x 300 (2700 актеров) изначально первый ход считался 35 сек, второй ход - 9,5 сек.
После расчистки авгиевых конюшен неэффективных алгоритмов удалось сократить время расчета хода до 0,8 сек для первого хода и 0,6 сек - для второго хода.
...
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Версия 1.0.4
- Добавлена снежная погода
- К генератору города добавлены реки и морские порты
- После завершения игры добавлен вариант возврата в главное меню
- Для игрока отображается общее указание направления на ближайшего демона/ангела
- Введена настройка сценариев под себя - можно выбрать желаемый тип города, погоду и фракцию
https://github.com/gwathlobal/CotD/releases/tag/v1.0.4
- Добавлена снежная погода
- К генератору города добавлены реки и морские порты
- После завершения игры добавлен вариант возврата в главное меню
- Для игрока отображается общее указание направления на ближайшего демона/ангела
- Введена настройка сценариев под себя - можно выбрать желаемый тип города, погоду и фракцию
https://github.com/gwathlobal/CotD/releases/tag/v1.0.4
"Эффект низкой базы"
Re: City of the Damned
В замес с кучей народа вроде чаще попадать начал по сравнению с предыдущей версией.
Скрытый текст: ПОКАЗАТЬ
поперёк борозды
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
-
- Сообщения: 68
- Зарегистрирован: 10 май 2013, 16:30
Re: City of the Damned
Версия 1.0.5
- Военные теперь играбельная фракция
- У них есть три юнита: солдат с однозарядным ружьем, сержант с шестизарядным револьвером и капеллан с револьвером, который может приказать окружающим следовать за ним, помолиться о божественной защите для союзников или о развеивании иллюзий со всех персонажей в зоне видимости
- Игрок, присоединившийся к военным, начинает за капеллана. Задача - уничтожить всех демонов (но не надо забывать, что ангелам военные также враждебны)
- К генератору города добавлен лесной и островной город
https://github.com/gwathlobal/CotD/releases/tag/v1.0.5
- Военные теперь играбельная фракция
- У них есть три юнита: солдат с однозарядным ружьем, сержант с шестизарядным револьвером и капеллан с револьвером, который может приказать окружающим следовать за ним, помолиться о божественной защите для союзников или о развеивании иллюзий со всех персонажей в зоне видимости
- Игрок, присоединившийся к военным, начинает за капеллана. Задача - уничтожить всех демонов (но не надо забывать, что ангелам военные также враждебны)
- К генератору города добавлен лесной и островной город
https://github.com/gwathlobal/CotD/releases/tag/v1.0.5
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 45 гостей