Переходы между уровнями
Кооперативный режим
Здесь описано создание последовательности тестовых камер для кооперативного режима.
Создание карты
Во-первых, создайте кооперативную карту . Добавьте экземпляр func_instance , задав его файл VMF на instances/coop/coop_lighting_ents.vmf. (All we're using is the point_servercommand inside.)
Изменение Endlevel
Логика конца карты находится в экземпляре instances/coop/coop_endlevel_room.vmf. Загрузите эту карту в Hammer и сохраните ее как копию-- например, my_coop_endlevel_room.vmf.
В маленькой комнатке в этой карте есть logic_script под именем transition_script. (Для его выбора можете воспользоваться командой поиска энтити (Find Entities).) Его свойству Entity Scripts задано значение debug_scripts/mp_coop_transition_list.nut.
Не изменяйте этот файл! Это часть Portal 2, и трогать его не следует. Вместо этого в свойстве Entity Scripts укажите свой собственный скрипт-- например, debug_scripts/my_mp_coop_transition_list.nut. Затем сохраните карту.
Вернитесь в свой кооперативный уровень, выберите func_instance, содержащий комнату конца уровня, и отредактируйте его файл VMF, чтобы он ссылался на измененный вами файл.
Изменение скрипта
Теперь перейдите в scripts/vscripts/debugscripts в папке установки Portal 2 и создайте этот скрипт. (Не трогайте скрипт Valve.) Вам потребуется что-то вроде этого:
// Порядок карт
MapPlayOrder<- [
"mp_coop_easiest",
"mp_coop_easiest_two"
]
function TransitionFromMap()
{
local nextmap = -2
// Прокручивание карт
foreach( index, map in MapPlayOrder )
{
if( GetMapName() == MapPlayOrder[index] )
{
// Это карта, в которой мы сейчас находимся
nextmap = -1
}
else
{
if (nextmap == -1)
{
// Первая карта, идущая после этой
nextmap = index
}
}
}
printl( "nextmap = " + nextmap )
if (nextmap > 0)
{
// Найдена карта; переходим к ней
EntFire( "@command", "command", "changelevel " + MapPlayOrder[nextmap], 1.0 )
}
else
{
// Карта не найдена; больше ничего нет, заврешение
EntFire( "@command", "command", "disconnect", 2.0 )
}
}
Верхний массив, MapPlayOrder, это список ваших карт по порядку. (Тем, кто не знаком с Squirrel, следует иметь в виду, что каждая карта заключается в кавычки, между картами должны стоять запятые. То есть после последней карты запятая не ставится. И не забудьте поставить закрывающую скобку!)
Чтобы после прохождения карт возвращаться в распределитель, добавьте "mp_coop_lobby_2" как последнюю карту в списке (MapPlayOrder).
Проверка
Создайте еще несколько кооперативных карт с использованием своей измененной комнаты конца уровня вместо стандартной. Скомпилируйте все карты.
Теперь вы можете проверить свои карты . Просто загрузите первую карту и сыграйте в нее. По достижении её конца Portal 2 переключится на следующую карту. А в конце последней карты произойдет выход в главное меню.
(Также можно добавить Распределитель как в игре. См. mp_coop_transition_list.nut.)
Одиночный режим
В одиночном режиме все примерно так же.
Изменение переходного уровня
Логика конца карты в одиночном режиме находится в экземпляре (func_instance ) arrival_departure_transition_ents.vmf в папке maps/instances/transitions. Загрузите эту карту в Hammer и сохраните под другим именем, например my_arrival_departure_transition_ents.vmf.
В этом экземпляре в самой маленькой комнате находится логический скрипт (logic_script ) под именем @transition_Script. Его свойство Script Entity указывает на transitions/sp_transition_list.nut.
Не изменяйте этот файл. Вместо этого укажите свой собственный скрипт, например transitions/my_sp_transition_list.nut.
По желанию здесь же вы можете изменить game_text под именем @end_of_playtest_text, отображающий строку текста после последней карты. Просто измените свойство Message Text.
Сохраните измененный файл VMF.
Изменение скрипта
Внутри скрипта описано множество других действий, и несомненно проще было бы создать описание простой серии карт. Здесь приведен необходимый минимум.
В списке найдите карту "demo_paint", последнюю карту в файле. Добавьте свои карты после неё. (Имена карт берутся в кавычки, между ними ставится запятая, но после последней карты запятая не ставится. Не забудьте закрывающую скобку.)
Результат должен выглядеть примерно так:
// ---------------------------------------------------
// Demo files
// ---------------------------------------------------
"demo_intro",
"demo_underground",
"demo_paint",
// ---------------------------------------------------
// Ваше название
// ---------------------------------------------------
"your_first_level",
"your_second_level"
]
Логика смены карт находится в TransitionFromMap. Чтобы в Portal 2 после отображения завершающего текста вышло главное меню, найдите следующие строки
EntFire( "end_of_playtest_text", "display", 0 )
EntFire( "@end_of_playtest_text", "display", 0 )
и добавьте эту строку после них:
EntFire( "@command", "Command", "disconnect", 2.0 )
Сохраните файл (изменённую копию файла .nut - не заменяйте исходный файл Valve!)
Проверка
Создайте и скомпилируйте остальные карты. Загрузите и запустите в Hammer первую карту; Portal 2 загрузится с первой картой. По достижении её конца Portal 2 переключится на следующую карту. А в конце последней карты произойдет выход в главное меню.