LINUX.ORG.RU
ФорумTalks

[бред?] Солиптическая(?) «Цивилизация»


0

0

Навеяно темой про "Цивилизацию".

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

А что если от этого отказаться? Пускай элемент карты генерируется в момент его открытия. Сделал шаг — открыл море. Перезагрузился, повторил шаг — на месте моря — болото. Разумеется, вероятность получить болото или море определяется соседними квадратами и площадями болот и морей, заданными для карты.

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

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

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

Смысл в этом? Кому-то эта задачка будет интересна.

Пробовал ли кто-нибудь когда-нибудь создать подобную игру? Приходилось ли вам с такой игрой сталкиваться?

★★★★★

>Результат?

Баланс идет лесом.

>Приходилось ли вам с такой игрой сталкиваться?


Не то, но близкое - герои 3 с вогификацией - рандомные войска, объекты рандомно вогифицируются.

redgremlin ★★★★★
()

>С одной стороны, становится невозможен чит, открывающий всю карту. Нельзя и посмотреть карту в файле сохранённой игры.

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

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


Вот это гуд, но общие правила все равно будут. Все го лишь время на разгадывание алгоритма. (И да, случайные карты есть, просто они генерятся сразу, а не потом)

А так все это круто конечно, но ты представляешь себе сколько это будет жрать ресурсов? А теперь подумай что стоит у среднестатистического хоумюзера..

delilen ★☆
()
Ответ на: комментарий от anonymfus

Сколько раз ее перигрыал, что-то не заметил, чтб карты отличались...

delilen ★☆
()
Ответ на: комментарий от anonymfus

> А в Диабло первой разве не так?

По-моему там как в Rogue — уровень генерируется при входе на него. Но единожды сгенерированный уровень неизменен, хоть и полностью невидим вначале. Да, идея навеяна "рогаликами". Но (в терминах рогаликов) я говорю про генерацию не всего уровня сразу, а по несколько квадратов за шаг (или по одной комнате). Не уверен, можно ли в Дьябло сделать это в реальном времени, а в походовых такая проблема не стоит.

question4 ★★★★★
() автор топика

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

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

Всё это жило в реальном времени (и по законам реальной физики и небесной механики) на ранних 286-х машинах с мегабайтом памяти :)

...

Потому что все параметры всех элементов не задавались заранее, а высчитывались исходя из прочих данных. Даже имена звёзд :)

...

И, вообще, 20 лет назад на программируемых калькуляторах я писал по тем же, но более примитивным технологиям, случайные лабиринты неограниченных размером, со всякой фигнёй, хранящейся в них ;)

KRoN73 ★★★★★
()
Ответ на: комментарий от redgremlin

> Баланс идет лесом.

Балансировать можно, только гораздо сложнее. Учитывая, что в первых 3 "Цивилизациях" (в 4-ю не играл) тупой AI компенсируется производственными бонусами, о балансе и так говорить сложно.

> Не то, но близкое - герои 3 с вогификацией - рандомные войска, объекты рандомно вогифицируются.

Как вогификация называлась по-английски? Это свойство движка, или мод? Распространялась ли она на карту и клады?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>По-моему там [...] уровень генерируется при входе на него. Но единожды сгенерированный уровень неизменен, хоть и полностью невидим вначале.

Да, так. Уровни случайные, но генерируемые заранее.

Аналогично - в UFO, Civilization... Ещё где-то было, забыл уже...

KRoN73 ★★★★★
()
Ответ на: комментарий от question4

Это мод. In Wake of Gods ("Во имя богов") - WoG .
Буквально месяца четыре назад можно было с торрентов скачать свободно, но всякие копирасты прикрывают раздачи.

Terrens
()
Ответ на: комментарий от delilen

> А так все это круто конечно, но ты представляешь себе сколько это будет жрать ресурсов? А теперь подумай что стоит у среднестатистического хоумюзера..

Сама генерация "на лету" — всего лишь на каждом квадрате вызвать random(). Баланс — да, сложнее. Но прогоны всех невидимых армий в той же Ц3 на старой машине тоже длятся по полчаса на большой карте на старой машине.

question4 ★★★★★
() автор топика
Ответ на: комментарий от Terrens

> И во второй то же самое, исключая последнюю миссию в городе на букву Х :)

А что в городе X? Заранее задана карта, или..?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Там рандомны только подземелья, ЕМНИП. А сам город и территория вплоть до ледяной равнины (как-то так она называется, по-моему. Туда надо подниматься на каменной лестнице) заданы изначально.

Terrens
()
Ответ на: комментарий от KRoN73

> Во Вселенной Frontier были десятки тысяч (если не сотни тысяч - не думаю, что кто-то считал или расшифровывал код)

Можно прокрутить карту в любом направлении — через каждые 65536 парсек расстояния до звёзд сбрасываются в 0 :) Но на дальних звёздах нет ни колоний, ни именованных планет, ни даже пиратов.

> Потому что все параметры всех элементов не задавались заранее, а высчитывались исходя из прочих данных. Даже имена звёзд :)

Но они были жёстко заданы какой-то формулой. И каждый раз считались по ней. Была ещё игра "Rescue on Fractalus" от LucasFilms. С очень сложным горным рельефом всего в 64К памяти. Я сам когда пытался писать "рогалик" сделал подобный генератор карт. В random() в стартовое число подставлял координаты точки :)

> И, вообще, 20 лет назад на программируемых калькуляторах я писал по тем же, но более примитивным технологиям, случайные лабиринты неограниченных размером, со всякой фигнёй, хранящейся в них ;)

Именно. Генерировать на каждомм шагу — не проблема. Проблема — правила по которым генерировать, и алгоритм подстройки этих правил под уже имеющийся результат.

question4 ★★★★★
() автор топика
Ответ на: комментарий от Terrens

> Это мод. In Wake of Gods ("Во имя богов") - WoG .

Спасибо.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>Как вогификация называлась по-английски? Это свойство движка, или мод?

мод In the Wake of Gods (WoG)

>Распространялась ли она на карту и клады?


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

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Разве генератор карт встроен в Героев? Я его заметил только после установки WoG.
Я мегапупервнимательный?)))

Terrens
()
Ответ на: комментарий от Terrens

> Там рандомны только подземелья, ЕМНИП. А сам город и территория вплоть до ледяной равнины (как-то так она называется, по-моему. Туда надо подниматься на каменной лестнице) заданы изначально.

Понятно. А я уже надеялся на какой-нибудь фортель :(

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>Как вогификация называлась по-английски? Это свойство движка, или мод?

мод In the Wake of Gods (WoG)

>Распространялась ли она на карту и клады?


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

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Разве генератор карт встроен в Героев? Я его заметил только после установки WoG.
Я мегапупервнимательный?)))

Terrens
()
Ответ на: комментарий от KRoN73

> Аналогично - в UFO

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

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>Сама генерация "на лету" — всего лишь на каждом квадрате вызвать random().

Самое смешное, что если использовать инициацию random от координат клетки, то потом полученный квадрат можно и не сохранять. Всю игру можно задать одним стартовым числом.

Собственно, так и работала вселенная в том же Frontier :) (random + физические законы)

KRoN73 ★★★★★
()
Ответ на: комментарий от DNA_Seq

Значит, генератор карт - это всё-таки часть WoG-а. Фух... (=

Terrens
()
Ответ на: комментарий от KRoN73

Ну ладно если у тебя не так много всего.

>random + физические законы


А если объектов овер 9000 и это не просто точка на экране, а достаточно мощный(тяжелый) объект. Сколько по времени пройдет генерация?

delilen ★☆
()
Ответ на: комментарий от KRoN73

> Самое смешное, что если использовать инициацию random от координат клетки, то потом полученный квадрат можно и не сохранять. Всю игру можно задать одним стартовым числом.

Именно. Но для рогалика с перетаскиванием предметов и разрушаемыми стенами всё равно надо было сохранять уровень, либо "историю изменений" :)

question4 ★★★★★
() автор топика
Ответ на: комментарий от delilen

>А если объектов овер 9000 и это не просто точка на экране, а достаточно мощный(тяжелый) объект. Сколько по времени пройдет генерация?

На современных машинах? Тысячные доли секунды :)

...

А во Frontier там всё ещё веселее было. Там объекты и генерить-то в массе своей не надо было. Такой-то объект, такое-то свойство? Вот оно, посчитанное, а не сгенерённое/сохранённое :)

KRoN73 ★★★★★
()
Ответ на: комментарий от question4

>Но для рогалика с перетаскиванием предметов и разрушаемыми стенами всё равно надо было сохранять уровень, либо "историю изменений" :)

Если предметы таскать - то да, для них хотя бы координаты и принадлежность хранить надо.

Если лабиринт ломать/строить - то да, история изменений со сверкой по ней. И с зачисткой при возвращении к исходному состоянию (например, когда починил предварительно сломанную стену ;) )

KRoN73 ★★★★★
()
Ответ на: комментарий от Terrens

>Разве генератор карт встроен в Героев?

Был запилен в AB, выпилен в SoD, вернут в хрониках. Но так как я AB ставил всегда, то у меня он всегда был :)

redgremlin ★★★★★
()
Ответ на: комментарий от KRoN73

>На современных машинах?

На современных _десктопах_ Даже не хайэнд, а что там у среднестатистического геймера стоит?

>Тысячные доли секунды :)


Что-то мне подсказывает, что ты лжешь=)

delilen ★☆
()
Ответ на: комментарий от delilen

>> random + физические законы

> А если объектов овер 9000 и это не просто точка на экране, а достаточно мощный(тяжелый) объект. Сколько по времени пройдет генерация?

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

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

question4 ★★★★★
() автор топика
Ответ на: комментарий от delilen

> Что-то мне подсказывает, что ты лжешь=)

Не, правда там написана.
Тысячи же этих тысячных долей будут =)

Terrens
()
Ответ на: комментарий от KRoN73

> Если предметы таскать - то да, для них хотя бы координаты и принадлежность хранить надо.

> Если лабиринт ломать/строить - то да, история изменений со сверкой по ней.

Я ещё забыл упомянуть планировавшихся монстров с инвентарём :)

> И с зачисткой при возвращении к исходному состоянию (например, когда починил предварительно сломанную стену ;) )

А вот об этом не подумал :)

question4 ★★★★★
() автор топика
Ответ на: комментарий от delilen

>>Тысячные доли секунды :)

>Что-то мне подсказывает, что ты лжешь=)

L2Fortress сервер. Java. 40 тыс. сложных NPC инициализируются на Celeron-1700 секунд за 20-30. Ы?

KRoN73 ★★★★★
()
Ответ на: комментарий от question4

>и передвинуть их по орбите на текущую дату

Вот в этом ошибка привыкших к сегодняшним методам программирования :) Не нужно ничего передвигать. Просто ты спрашиваешь «какие [полярные] координаты у такой-то планеты в такую-то дату?». И получаешь ответ по формуле :) Кстати, по примитивным формулам сегодня посчитать может оказаться как бы не быстрее, чем из памяти прочитать...

KRoN73 ★★★★★
()
Ответ на: комментарий от question4

>Я ещё забыл упомянуть планировавшихся монстров с инвентарём :)

Если монстры с инвертарём - то уже зависит от степени солиптичности :) Живут ли они, когда их не видит игрок. В L2Fortress у нас сегменты, которые были вне видимости игроков, погружались в спячку :) (выключался AI мобов и NPC, для которых это было допустимо и они выводились из списков видимых объектов мира).

KRoN73 ★★★★★
()
Ответ на: комментарий от guest024664

>Предвижу: "сохранился, сделал шаг, непонравилось, загрузился, сделал шаг ..."

Так rand() будет инициироваться связкой уникального номера игры и координат :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Вот в этом ошибка привыкших к сегодняшним методам программирования :) Не нужно ничего передвигать. Просто ты спрашиваешь «какие [полярные] координаты у такой-то планеты в такую-то дату?». И получаешь ответ по формуле :)

Подставление в формулу я и имел в виду под "передвинуть".

> Кстати, по примитивным формулам сегодня посчитать может оказаться как бы не быстрее, чем из памяти прочитать...

Только если идти по длинной цепочке указателей.

question4 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

> Если монстры с инвертарём - то уже зависит от степени солиптичности :)

:)

> Живут ли они, когда их не видит игрок.

До этого я не дошёл. Хотел, чтобы монстры жили по-настоящему, пока игрок на их уровне, и в виде статистики, отражающей движение монстров между уровнями и их столкновения друг с другом, когда на уровне никого нет.

> В L2Fortress у нас сегменты, которые были вне видимости игроков, погружались в спячку :) (выключался AI мобов и NPC, для которых это было допустимо и они выводились из списков видимых объектов мира).

И много это ресурсов экономило?

question4 ★★★★★
() автор топика
Ответ на: комментарий от guest024664

>Если после каждой загрузки сохранения картина будет той же, то цель топикстартера не будет достигнута.

Э... А по-моему - достигнута :) Он же хочет просто избежать предварительной генерации, а сделать генерацию по ходу игры. Или я не понял?

Слово топикстартеру! :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>>Предвижу: "сохранился, сделал шаг, непонравилось, загрузился, сделал шаг ..."

> Так rand() будет инициироваться связкой уникального номера игры и координат :)

Нет, тогда опять всё получится детерминированным. Только с необычным алгоритмом генерации.

Но и полностью случайной эта карта не будет. Вероятности того или иного результата будут определяться соседними открытыми квадратами, расстоянием до полюса и пр. Или можно генерировать не отдельные квадраты, а блоки, например "равнина 10х10 с 10% лугов и 1 коровой".

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>И много это ресурсов экономило?

Дохренища :) 40к мобов - это под 70Мб памяти (или даже 200Мб?? уже не помню точно) + высокая загрузка CPU. Они же ходят, проверяют окружающие объекты (подбирают предметы, кидаются друг другу на помощь, если агрессивные - кидаются на игроков - всё это требует периодического сканирования местности). А выгрузка ненужных позволяла на мелких серверах почти всех мобов выгружать из памяти и не грузить CPU. В самом деле, если игровое поле состоит из ~88x60 максимальных дистанций видимости. Более 5000 «квадратов видимости» :) Если там бегают, скажем, сотня игроков максимально удалённых друг от друга, они перекрывают только 900 таких зон (где он находится + соседние. Условно, конечно). Значит >80% территории (на самом деле даже больше) вне зоны видимости. А уж когда сервер мелкий, и там только 10-20 человек бегает... :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> 40к мобов ... игровое поле состоит из ~88x60 максимальных дистанций видимости ... сотня игроков ... А уж когда сервер мелкий, и там только 10-20

Понятно. Спасибо.

> Они же ходят, проверяют окружающие объекты (подбирают предметы, кидаются друг другу на помощь, если агрессивные - кидаются на игроков - всё это требует периодического сканирования местности).

А если наоборот? Бросаемый предмет кричит всем в пределах видимости "подберите меня". Избиваемый кричит "помогите". Игрок на каждом шаге приглашает агрессивных мобов подраться. Или так никто не делает?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>А если наоборот? Бросаемый предмет кричит всем в пределах видимости "подберите меня".

Там хитрая система. Моб (а особенно - NPC) потенциально может телепортироваться, например. Вообще, в итоге так и было примерно сделано. Но предмету всё равно надо сканировать вокруг монстров. А так - предметы тоже «уходят в спячку» :) И этот метод не помогает при перемещении мобов. Монстр идёт куда-нибудь по ареалу своего обитания и должен анализировать обстановку. Что-то пришло новое в поле зрения, что-то ушло и больше не учитывается. Всё это жрёт процессор.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> И этот метод не помогает при перемещении мобов. Монстр идёт куда-нибудь по ареалу своего обитания и должен анализировать обстановку

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

В общем, понятно.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>Если маршруты патрулирования большинству заданы заранее

Нет, случайные :) И маршруты случайные, и темпы движения. И, вообще, моб может за тобой убежать очень далеко от дома и потом неторопливо возвращаться назад (если ты убежал или он победил) :)

...

В любом случае проще выгружать/загружать ;)

KRoN73 ★★★★★
()

>В таком случае для игроков задаются только координаты

Это тоже существенные знания. Интересно было бы варить их в независимых системах координат, и определять взаимное расположение "при встрече". Только не понятно как определить факт таковой :).

>С другой стороны, можно перезагрузками добиваться желаемой карты

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

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.