Страница 2 из 5

Re: City of the Damned

Добавлено: 18 янв 2017, 18:06
gwathlobal
Я подумаю, мысль здравая, конечно.
Вообще для снятия "синдрома поиска последнего алиена", который тут неожиданно всплыл, я думал сделать так, что если ты остался один от фракции, то тебя все враги видят, чтоб не шататься по карте и не искать под какую корягу последний имп спрятался.
Абилка, возможно, даже лучше.

Для следующей версии я все-таки решил запилить одновременные ходы и многопоточность. Посмотрим что получится.

Re: City of the Damned

Добавлено: 19 янв 2017, 00:16
aspid
Побегал несколько раз, пожелания/вопросы вот какие:
1. После смерти игра закрывается на эскейп, надо перезапускать, чтобы сыграть еще партию. Может, сделать еще кнопку, чтобы в главное меню можно было выйти?
2. Мужчины, женщины, дети - отличаются по характеристикам? Если да (да и если нет тоже), для них было бы неплохо сделать разные символы (не только @ в смысле)
3. Имп и демон могут атаковать людей, не вселившись в кого-нибудь предварительно? Потому что в своей "первозданной" форме я жму клавишу направления к человеку и вселяюсь в него.
4. Russian language please :D

Re: City of the Damned

Добавлено: 19 янв 2017, 13:44
gwathlobal
aspid писал(а): 1. После смерти игра закрывается на эскейп, надо перезапускать, чтобы сыграть еще партию. Может, сделать еще кнопку, чтобы в главное меню можно было выйти?
Справедливо, сделаю.
aspid писал(а): 2. Мужчины, женщины, дети - отличаются по характеристикам? Если да (да и если нет тоже), для них было бы неплохо сделать разные символы (не только @ в смысле)
У ребенка на 1 HP меньше. Я их честно говоря специально сделал одинаковыми на вид, потому функционально они ничем не отличаются.
aspid писал(а): 3. Имп и демон могут атаковать людей, не вселившись в кого-нибудь предварительно? Потому что в своей "первозданной" форме я жму клавишу направления к человеку и вселяюсь в него.
Нет, если атакующий персонаж, который умеет вселяться, нападает на цель, которая может быть одержима, то автоматически производится не рукопашная атака, а вселение.
aspid писал(а): 4. Russian language please :D
Ох, это прям такая глобальная задача с интернационализацией. Падежи еще это русские...

Re: City of the Damned

Добавлено: 19 янв 2017, 20:15
gwathlobal
В общем, по поводу одновременных ходов. Испытываю потребность зафиксироваться письменно, ну и может потом кому для истории пригодиться. С помощью коллективного разума были выработаны следующие идеи.

0. Переделать алгоритмы LOS и pathfinding. В частности для последнего использовать Dijkstra Maps. Окей, отложим на потом.

1. Оставить мультитрединг, убрать одновременность ходов. А именно, из пула актеров выбираются те, ход которых зависит от действий игрока (например, которые его видят и которых видит он), а остальные последовательно обсчитывают свои ходы в отдельном треде. Как только игрок определяется чего он хочет сделать, ИИ допросчитывает всех остальных трех с половиной персонажей и вуаля.
Идея понятна, но алгоритм как это сделать непонятен совершенно. Потому что это выглядит так, будто нужно сохранять состояние мира после каждого просчета актера, чтобы следующий актер считался с учетом хода предыдущего. То есть на 200 актеров я должен 200 раз скопировать этот список из 200 актеров (как минимум) и еще плюс карту 100x100 (как максимум). Что-то мне подсказывает, что такие выкрутасы с выделением памяти будут тормозить не меньше, чем "честная" последовательная симуляция сейчас.

1а. Все то же самое, что и в предыдущем варианте, но ходы актеров считаются независимо от действий других, то есть состояние мира не копируется, а вот выполняются просчитанные ходы таки последовательно. В тупом варианте это будет приводить к ситуациям, когда актер А решает атаковать Б, а Б решает атаковать А, А ходит первым и Б, который в случае последовательной обработки ходов понял бы что HP у него осталось мало и надо валить, все равно самоубийственно атакует А. Можно сделать хак, что если состояние актера после просчета хода поменялось, это означает, что надо пересчитать его ИИ заново. Тут конечно все будет зависеть от того, сколько окажется таких пересчетов.

2. Использовать мультитрединг, использовать одновременность ходов. Все актеры считаются независимо друг от друга в отдельном треде, система определяет конфликтные (А и Б собираются занять одну и ту же клетку) и полуконфликтные (А идет в клетку с Б, но Б из этой клетки уходит) ситуации, решает их каким-то образом и после чего применяет действия к миру. Явно придется писать кучу каких-то кастомных правил, которые бы определяли, что тут у нас назревает конфликт. Для игрока получится сильно непривычно - например, если положить, что А нападает на Б, а Б перемещается из занимаемой клетки, то и атака проходит, и Б перемещается, то в таком случае собираться убегать надо за 2 хода до момента, когда тебе убьют, а не за ход как обычно. Здесь скорее всего тоже придется копировать состояние мира, но один раз (для того, чтобы независимо применить действия каждого актера друг к другу).

3. Не использовать мультитрединг. Вычислять действия ИИ по варианту 1 или 2 в событии SDL idle, то есть пока в окне ничего не происходит. По сути вся та же параллельность обдумывания ходов ИИ и игрока, только без тредов.

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

Re: City of the Damned

Добавлено: 20 янв 2017, 06:45
aspid
Я призвал весь свой мэдскилл и сделал небольшую картинку на тему:
Скрытый текст: ПОКАЗАТЬ
Изображение

Re: City of the Damned

Добавлено: 20 янв 2017, 07:03
kipar
Насчет одновременности - и в Rayel и в Wizard's Quest на этом форуме что-то похожее.
Ну, как похожее: там сначала тратится время на действие, потом выполняется действие. Всё это однопоточно и детерминировано, но в итоге возникают такие же конфликты как ты описал - один бьет другой из клетки уходит, снадобья надо пить на ход раньше и т.д.
Но в реализации довольно непростая штука, имхо основное неудобство что любые действия надо делать объектами. Правда зачем копировать мир я не понял.
Я бы 1а делал, а на ситуации странного поведения забил - ну да, он не успел осознать что ранен и ударил, а на следующем ходу будет убегать. Но походу всё равно будут такие же конфликты с перемещениями и их надо как-то решать, так что тоже придётся действия объектами делать.

Re: City of the Damned

Добавлено: 20 янв 2017, 08:24
gwathlobal
aspid писал(а):
20 янв 2017, 06:45
Я призвал весь свой мэдскилл и сделал небольшую картинку на тему:
Скрытый текст: ПОКАЗАТЬ
Изображение
Картинка агонь! Спасибо! Если я когда-нибудь сподоблюсь на графические тайлы, то как-то так оно и должно выглядеть.
kipar писал(а):
20 янв 2017, 07:03
Правда зачем копировать мир я не понял.
Я бы 1а делал, а на ситуации странного поведения забил - ну да, он не успел осознать что ранен и ударил, а на следующем ходу будет убегать. Но походу всё равно будут такие же конфликты с перемещениями и их надо как-то решать, так что тоже придётся действия объектами делать.
Копирование мира нужно для того, потому что действия все равно будут применяться последовательно, из-за чего будут влиять друг на друга. Например, есть у актера Б абилка, которая лечит на 10, если у тебя HP меньше 20, и на 15, если меньше 10. Актер А решает напасть на Б, Б независимо от этого решает применять свою абилку. Мы создали список действий, запихали туда действия от А и Б. И получается, что если мы обработаем А первым, то Б хильнет себя на 15, а если вторым - то на 10. Чтобы этого не было, нам надо создать копию Б и HP от атаки снимать у нее, а у абилки проверять текущие HP у первичного Б, а лечить копию Б. После того как все действия обработаны, копии актеров заменяют оригиналы. Таким образом, достигается независимость действий друг от друга. Как-то так я себе это вижу.

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

Re: City of the Damned

Добавлено: 20 янв 2017, 08:48
kipar
Но может их и правильно последовательно обрабатывать?
Если А и Б одновременно решили что надо вылечиться\ударить и начали действовать, то число хп будет зависеть от того, ударит ли Б на "миллисекунду" раньше или позже чем у А сработает абилка. Во всяком случае так это работает в системе где сначала проходит время а потом применяется действие.
Но конфликты могут быть что Б ударил а А к тому времени уже умер, или например двое решили идти в одну точку, в этом случае копия по-моему не очень поможет.

Re: City of the Damned

Добавлено: 20 янв 2017, 09:56
gwathlobal
kipar писал(а):
20 янв 2017, 08:48
Но может их и правильно последовательно обрабатывать?
Ну не знаю. Надо подумать, пока это выглядит будто мы намеренно усложняем принятие верных решений для игрока и ИИ.
kipar писал(а):
20 янв 2017, 08:48
Но конфликты могут быть что Б ударил а А к тому времени уже умер, или например двое решили идти в одну точку, в этом случае копия по-моему не очень поможет.
Если один в результате удара умер, это не проблема. Второй тоже наносит удар по первому и можем получить ситуацию, когда оба умрут одновременно.
Вот если им нужно идти в одну точку - то да, тут надо все-таки будет определять кто из них займет ее первым, на это придется делать отдельное правило.

Re: City of the Damned

Добавлено: 27 янв 2017, 00:11
gwathlobal
Вести с полей.

Мне удалось значительно оптимизировать код при последовательной обработке ходов.
На размере карты 300 x 300 (2700 актеров) изначально первый ход считался 35 сек, второй ход - 9,5 сек.
После расчистки авгиевых конюшен неэффективных алгоритмов удалось сократить время расчета хода до 0,8 сек для первого хода и 0,6 сек - для второго хода. Параллелизм тут тоже частично удалось задействовать.

После чего я воткнул таки параллельную обработку и одновременные ходы. Результат мне что-то не очень понравился. Во-первых, все, что связано с движением по карте, стало невероятно сложным. Во-вторых, даже несмотря на то, что весь ИИ считается в отдельном треде, последующий разбор и применение ходов съедает весь выигрыш. В результате первый ход считается 0,7 сек, второй тоже 0,6 сек. В общем, шило на мыло.

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

Такие дела.

Re: City of the Damned

Добавлено: 27 янв 2017, 07:07
Jesus05
gwathlobal писал(а):
27 янв 2017, 00:11
Вести с полей.

Мне удалось значительно оптимизировать код при последовательной обработке ходов.
На размере карты 300 x 300 (2700 актеров) изначально первый ход считался 35 сек, второй ход - 9,5 сек.
После расчистки авгиевых конюшен неэффективных алгоритмов удалось сократить время расчета хода до 0,8 сек для первого хода и 0,6 сек - для второго хода.
...
Великолепный результат! Ты крут! Прирост 4375% :)

Re: City of the Damned

Добавлено: 29 янв 2017, 22:50
gwathlobal
Версия 1.0.4

- Добавлена снежная погода
- К генератору города добавлены реки и морские порты
- После завершения игры добавлен вариант возврата в главное меню
- Для игрока отображается общее указание направления на ближайшего демона/ангела
- Введена настройка сценариев под себя - можно выбрать желаемый тип города, погоду и фракцию

https://github.com/gwathlobal/CotD/releases/tag/v1.0.4
Jesus05 писал(а):
27 янв 2017, 07:07
Великолепный результат! Ты крут! Прирост 4375% :)
"Эффект низкой базы" :lol:

Re: City of the Damned

Добавлено: 30 янв 2017, 05:55
aspid
В замес с кучей народа вроде чаще попадать начал по сравнению с предыдущей версией.
Скрытый текст: ПОКАЗАТЬ
Изображение
вообще, за демонов лучшая тактика шкериться за спинами солдат

Re: City of the Damned

Добавлено: 30 янв 2017, 19:36
gwathlobal
aspid писал(а):
30 янв 2017, 05:55
В замес с кучей народа вроде чаще попадать начал по сравнению с предыдущей версией.
Возможно эффект указателя на ближайшего противника :)
Поздравляю с победой!

Re: City of the Damned

Добавлено: 05 фев 2017, 11:39
gwathlobal
Версия 1.0.5

- Военные теперь играбельная фракция
- У них есть три юнита: солдат с однозарядным ружьем, сержант с шестизарядным револьвером и капеллан с револьвером, который может приказать окружающим следовать за ним, помолиться о божественной защите для союзников или о развеивании иллюзий со всех персонажей в зоне видимости
- Игрок, присоединившийся к военным, начинает за капеллана. Задача - уничтожить всех демонов (но не надо забывать, что ангелам военные также враждебны)
- К генератору города добавлен лесной и островной город

https://github.com/gwathlobal/CotD/releases/tag/v1.0.5