Перейти к контенту
Dennis_Chikin

Gameplay - как сделать ЭТО, чтобы ОНО всем нравилось ;)

Рекомендуемые сообщения

Тема предназначена для разработчиков, а не для пользователей. Модерирование будет крайне жестким. Прежде, чем что-либо писать - прочитайте первый пост и примеры обсуждения. Изменено пользователем Dennis_Chikin
  • Не нравится 1
Ссылка на комментарий

Собственно, а почему нужно обязательно вокруг игрока плясать? Т.е. я так понял ты вообще противник данного модуля?

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

Их и не может быть.

Вводить оффлайн-алайф был-бы смысл если-бы Игрок смог в нём активно оффлайн-участвовать. Если нет - смысла в оффлайн-алайфе нет. Вменяемая задача для alife вообще - это (огромная) экономия человеко-часов скриптеров и повышение качества реализации сцен в сценариях...

 

В целом, для Сталкера, в роли оффлайн-алайфа достаточно "симулятора", эмуляция будет лишней...

 

ЗЫ

Опять перепутал эмулятор и симулятор... :) - поправился.

 

И как раз неправильно. Но, в принципе,  все поняли. dc

Изменено пользователем Dennis_Chikin

всё легко

Ссылка на комментарий

Ладно, позиция тут присутствующих мне ясна. Ну и как хотите, а я себе сделаю :).
 
Следующий вопрос:
 
Никто еще не оттяпал оллспавн (желательно полностью) от игры? 
 
А куда оно денется ? Не теоретически, а вполне практически. dc

Чего денется? Пути куда денутся? Никуда.
 
В смысле, почему бы монстрам по локациям и не бегать куда надо ? dc

Действительно.

"Ты хочешь все заспавнить скриптами?" - взять контроль скриптами над объектами, а не олспавном, но с сохранением возможности писать пути. А спавнить - да, все скриптами, проще же.

"ИМХО ПЫС знали что делали, когда создавали спавн, может это и не лучшее решение." - это не лучшее решение, скриптами можно сделать даже динамическую перезагрузку логики без перезагрузки игры, ну или конечно, напротив, с уверенностью что ПЫС молодцы, перераспаковывать алл.спавн десятки раз пока пишешь логику.

Изменено пользователем Struck
Ссылка на комментарий

желательно полностью

Ты хочешь все заспавнить скриптами?

взять контроль скриптами над объектами, а не олспавном

Представь, что ктото захочет добавить локу в середину списка, все графпойнты полетят. Можно конечно сделать чтото типа глобального оффсета, если надо, то и локального, но это будет жесть, десяток метров скриптов? А кастом дата? ИМХО ПЫС знали что делали, когда создавали спавн, может это и не лучшее решение.

перераспаковывать алл.спавн десятки раз пока пишешь логику

Для этого ее выносят в конфиги. Вообще спавн не связан со скриптами, т.к. это "порождение" компиляторов, которые берут данные по сбилденным локам, которые делаются в редакторе, а в нем значительно проще расставлять статические спавн-объекты, т.е. которых поставили там то и больше не трогают. Это просто подход к созданию конечной игры. Хотите написать "перегонятор" из спавна в скрипты? Ваше право, может что путное и выйдет. Возможно будет лучше создать "свой" спавн, которого будут читать скрипты и при запуске игры генерировать функции для спавна, но я сомневаюсь. Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Вообще забавно, что слово "олспавн" до сих пор сохраняет свою магию.

А ведь обыкновенные конфиги, просто приведенные в нечитамый человеком вид. Тот же обфускатор, вид в профиль.

 

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

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

 

 

То есть, пути при таком раскладе не нужны вообще. Как таковые. Это чисто так вот написаны скрипты под приведенные в нечитаемый вид конфиги.

Изменено пользователем Dennis_Chikin
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

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

Для этого ее выносят в конфиги.

Я вообще-то про пути говорил.

@Dennis_Chikin, не-а. Вот просто нет. Сделай это на деле, и посмотри сам где будет косячить ;). Но косячить будет, ты думаешь я такой безбашенный портянки путей сохранять без острой надобности? (спойлер: что-бы не косячило нужно править локацию)

Изменено пользователем Struck
Ссылка на комментарий

не нужны вообще. Как таковые

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

приведенные в нечитаемый вид конфиги

Слабо понимаю, о чем это ты. Пример с пояснением можно?

Я вообще-то про пути говорил.

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

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий
@Desertir, а ничего что сначала люди локации делают, аи-сетку и прочее, а уже потом сюжет и спавн? ;) Да и кто черт возьми мешает парсить сам олспавн в скрипт? Мы же не убер-аи-схеммы собираемся писать где сталкеры сами выбирают куда им ходить, если писать какую-то систему для самонахождения поинтов, тут я согласен, лучше не стоит этого делать (на неготовых локациях).
Ссылка на комментарий

а ничего что сначала люди локации делают, аи-сетку и прочее, а уже потом сюжет и спавн

Где это ты такое увидел. В модах может быть, так как выхода нету, но в играх нет. Сначала сюжет, потом контент, двиг делается попутно с сюжетом, если двигла нету. Как только сюжет и двиг готовы, вступают различные дизайнеры, в том числе левелдизайнеры, которые говорят "ога вот тут будет АТП и по сюжету мы туда попремся стрелять бандюков". Это все огромная совместная работа, но никогда в нормальной игре сюжет не делается после создания контента. Если это конечно не фриплейная ММО или еще чтонибудь. Сначала идея потом реализация, сначала думать потом делать. Наоборот не всегда работает и не всегда как надо, да здравой логике противоречит.

 

К слову о левелвертексах, когда я делал свою схему выброса, пытался найти ЛВ по координатам, т.к. в чистом ТЧ такого функционала нет. Без полного перебора нодов - та еще морока.

Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Гм. Однако, проблема курицы и яйца.

Очевидно, где-то какие-то опорные точки придется задавать.

 

Но тут в любом случае будут, скажем, или таблицы вертексов, скажем, костров, или таблицы строк типа "points = p0
p0:name = name00
p0:position = 108.319999694824,19.0499992370605,165
p0:game_vertex_id = 240
p0:level_vertex_id = 409887"

 

свернутые в слабочитаемую абракадабру "aver_otshelnik_camp_center    S                7"

 

Как бы в любом случае эту абракадабру надо снимать руками, и вбивать руками.

А дальше в скрипте все равно будет

    local p = st.patrol_path; self.patrol = p
    local c = p:level_vertex_id( 0 ); self.center = c
    local c_pos = level.vertex_position( c )

 

Ы ?

 

А ведь можно ничего и не снимать, и ни куда не забивать, а просто получить вертекс непосредственно костра, не ? И неписям так и говорить, что kamp у них - костер с именем "koster_tri_po_pyat_sem_ha_vosem"

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Однако, проблема курицы и яйца.

Нет тут этой проблемы. К команде пришел сценарист и говорит - "Значит по сюжету центр Зоны находится на севере, туда прорываемся с юга, т.е. снизу вверх по карте", а ему отвечают - "Шиш тебе без масла, центр Зоны мы сделали на западе, там же и ГГ уже заспавнили, он у нас будет слева на право идти, а монолитовцы будут вокруг чайника хороводы водить и поклоняться ему". Как считаешь, бред?

Ы ?

Я чот опять не скурил, p0:name и далее - это просто средство представления данных из бинарного олспавна, по факту это не конфиг, и ПЫСы в глаза это не видели, у них был SDK для этого и все исходники. Если именно про это, то это просто промежуточный этап для вынужденной правки олспавна, и опять же только в модах. Но я так понимаю не про эти конфиги речь? Что нечитаемо на твой взгляд? Или ты про нахождение вертекса по координатам? Я так укрытия делал :)

вертекс непосредственно костра, не ?

Логическим центром является не только костер, но и какая нибудь статическая бочка, или кучка мусора, или вообще ничего - поляна. Так что это весьма частный случай.

Ну ищи вертекс в поле, кто не дает?

Все дают, но речь шла про костер. Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

@Dennis_Chikin, не-не, я не о стоячих, а о ходячих. Со стоячими/сидячими/лежачими проблем нет.

 

Так что это весьма частный случай.

Ну ищи вертекс в поле, кто не дает? Их в принципе много, но сбоят редко, но все же бывает.

 

"Там и левелвертекса не будет" - в общем-то да, причем тут тогда и олспавн?

Изменено пользователем Struck
Ссылка на комментарий

Вот про "сценаристов", которые "у нас сюжет целый год целых трое писали, а потому работа еще 300 человек идет на север", а потом выясняется, что "сценарий" лучше бы было взять тот самый, где "свою суковатую дубину, обмазанную я дом и провернул два раза, чтобы тот больнее обстрадался ! Ибо !" - у меня много слов есть. Ну да ладно.

 

Сценарист говорит: "Хачу, чтоб неписи водили хоровод вокруг костер_сэм_восым !"

Замечательно. obj = alife():object( "костер_сэм_восым" ); lvid = obj.level_vertex_id()

 

Усе. А куда этот костер засунуть - пусть пальцем ткнет.

 

"Хочу что бегали от костер_сэм_восым к лужа_сэм_па_пять !" ?

Ну и в чем проблемы ? alife():object() далее по тексту.

 

Или кто-то думает, что xr_kamp чем-то принципиально отличается от xr_patrol ? Да пущай хоть танец маленьких лебедей танцуют.

 

upd:

"а дерево, что тогда?" - ну и как здесь поможет оллспавн ?

 

upd2:

И только что выше показывал, что потом занимается этими путями.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Хачу, чтоб неписи водили хоровод вокруг костер_сэм_восым

А скажет не костер, а дерево, что тогда? Там и левелвертекса не будет, ибо уровневая статика, которую по всем правилам АИ-сетка обогнет, иначе начнется веселье. Я к тому, что костер не является универсальным, если вы конечно не хотите, чтобы неписи только у них и кучковались в кампе.

"Хочу что бегали от костер_сэм_восым к лужа_сэм_па_пять !" ? Ну и в чем проблемы ? alife():object() далее по тексту.

Ага, только сейчас этим занимаются пути. Эту замену я в корне не понимаю.

ну и как здесь поможет оллспавн

А имя коста как в поле поможет? Если его там нету и не будет. Конкретно с деревом - про прогиб под движок я уже говорил. Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

А имя коста как в поле поможет? Если его там нету и не будет.

Ты издеваешься? Вертексы в поле тоже внезапно пропали?

 

upd:

"как ты получишь вертекст без костра" - как-бы вектором, не?

upd2:

"У тебя ничего нету для того," - апф, почему нет ничего? А чего там надо-то? Я по прежнему говорю, вектором.

Изменено пользователем Struck
Ссылка на комментарий

А ты читаешь сообщения? Речь шла про получение вертекса по имени костра, как ты получишь вертекс без костра? Рандомом?

как-бы вектором, не?

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

И неписям так и говорить, что kamp у них - костер с именем "koster_tri_po_pyat_sem_ha_vosem"

Которые как-то надо задавать, и отнюдь не путями.

Оу, ну как вам угодно, я бы добрую половину вещей в X-Ray переделал, но чем тебе пути не угодили? Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Про прогиб под движок - а вот надо ли ? Ни рестриктор не поставить, ни шмотку уронить, зато получаем пачки Invalid vertex for object и не помню что там еще с живностью на ту же тему.

Да и в путях как бы, точку тоже не указать.

 

На самом деле не знаю, как эти дыры в картах лечить, но радости они не приносят.

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

 

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

По тому что иначе все это выглядит либо позорно (как монстры, сгущающиеся из воздуха в час x или по событию прямо на глазах игрока), либо вообще ни как.

 

В общем, лечить надо, а не выдавать нужду за добродетель.

 

 

И, да, только что показал ссылку на скрипт, где вертексы получаются через смещение от того костра, ага. Внимательнее надо. Вот же продолжение:

 

function CKampManager:__init( path, st )
	-- log( "info", "CKampManager(%s):__init ...", path )
	self.kamp_name = path

	local p = st.patrol_path; self.patrol = p
	local c = p:level_vertex_id( 0 ); self.center = c
	local c_pos = level.vertex_position( c )
	local pos = {
		{ ["dir"] = vector():set( 1, 0, 0 ) },
		{ ["dir"] = vector():set( 1, 0, 1 ) },
		{ ["dir"] = vector():set( 0, 0, 1 ) },
		{ ["dir"] = vector():set( -1, 0, 1 ) },
		{ ["dir"] = vector():set( -1, 0, 0 ) },
		{ ["dir"] = vector():set( -1, 0, -1 ) },
		{ ["dir"] = vector():set( 0, 0, -1 ) },
		{ ["dir"] = vector():set( 1, 0, -1 ) } }
	self.position = pos
	local n = #pos
	self.vused = { [c] = -1 }	-- в кострах не сидеть !

	self.story_last, self.story_max = 0, 0	-- от греха
	self.story_played = {}	-- лекарство от затыка и попугайства, см. комментарий в апдейте
	self.npc = {}
	self.population = 0
	self.kamp_state = "idle"
	
	-- распарсим патрульный путь и проапдейтим вектор позиций.
	-- 0 вершина - центр лагеря, 1 - сектор занят, можно сидеть, 2 - нельзя сидеть.
	local lvid, f1, dir

	for i = 1, p:count() - 1 do
		-- log( "info", "CKampManager(%s):__init, path-pt: %s", path, i )
		f1 = p:flag( i, 1 )
		lvid = p:level_vertex_id( i )
		if f1 or p:flag( i, 2 ) then	-- отметить сектор как занятый
			dir = vector():sub( level.vertex_position( lvid ), c_pos )
			for ii, v in ipairs( pos ) do	-- проверяем имеющиеся на близость к пути
				if v.dir and ( 23 >= yaw_degree( dir, v.dir ) ) then
					v.used = -1; break	-- близко, помечаем занятым
			end	end
			if f1 then n = n + 1; pos[n] = { ["vertex"] = lvid } end	-- точка для сидения
	end	end

И

 

function CKampManager:getDestVertex( npc_id, radius )
	local v = npc_id and self.npc and self.npc[npc_id]
	if v then v = v.position	-- индекс таблицы доступных мест
		if v then
			local p = self.position[v]
			v = p.vertex	-- variable re-used
			if v then return v end
			-- посчитанный ранее
			if self.npc[npc_id].vused then return self.npc[npc_id].vused end
			-- иначе высчитываем по направлению
			v = level.vertex_in_direction(
				level.vertex_in_direction( self.center, p.dir, radius ),
				vector():set( math_random( -1, 1 ), 0, math_random( -1, 1 ) ),
				math_random( 0, 0.5 ) )
			if self.vused[v] then return level.vertex_in_direction(
				level.vertex_in_direction( self.center, p.dir, radius + 2 ),
				vector():set( math_random( -1, 1 ), 0, math_random( -1, 1 ) ),
				math_random( 0, 0.5 ) )
			else
				self.vused[v], self.npc[npc_id].vused = npc_id, v
				return v
			end
	end	end
	return nil	-- опять магия ?
end

 

А вот, кстати, скрины того, как работает фикс "битвы за место": https://dl.dropboxusercontent.com/u/27871782/screenshots.7z

Детям не смотреть ! Ибо отбирались кадры как раз того - не самых лучших вариантов. ;)

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

где вертексы получаются через смещение от того костра, ага

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

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

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

 

lv = npc:vertex_in_direction( lv, diff, len )

Изменено пользователем Dennis_Chikin
  • Согласен 1
Ссылка на комментарий

Я по прежнему говорю, вектором.

Ок, ищи левелвертекс по вектору, я так делал. Напомню, на всякий случай, непися нельзя отправить по координатам, нужна нода.

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...