Опубликовано: 29 ноября, 2013 Как я заметила, кампании, созданные самими игроками, пользуются большой популярностью на нашем сайте. Однако, несмотря на то, что большое количество новых любительских карт регулярно появляется у нас в обмене, никто из нас еще не пытался создать собственную кампанию. Думаю, основной причиной отсутствия кампаний, сделанных "местными умельцами" является то, что мы просто не знаем как это делать. Поэтому я решила перевести инструкцию по созданию кампаний, выложенную на англоязычном сайте CIMExchange http://www.cimexchange.com/tutorials/article/6-how-to-create-a-campaign/ Автором ее является известный моддер RBBoT . Искренне надеюсь, что кому-то пригодится эта инструкция, и в результате мы все-таки сможем поиграть в нашу собственную "родную" камапнию Заранее извините за возможные не совсем верные интерпретации специфических терминов, используемых программистами. Итак, сама инструкция: Как создать свою кампанию Здесь описаны основные действия, необходимые для того, чтобы добавить кампанию и сценарии в игру, используя как уже имеющиеся в игре карты, так и те, что созданы игроками. Для написания статьи была использована карта, созданная Splott. А называться наша кампания будет «Rule Britannia!» («Управляй Британией!», или, как минимум, ее транспортной системой). Сначала мы создадим очень простую кампанию, в которой будет использована одна карта, и в которой содержится всего 2 сценария по 2 задания в каждом. Задания будут простейшими, чтобы облегчить понимание того, как все это нужно делать. Где нужно разместить файл кампании Сначала создаем папку нашей кампании в папке addons. В нашем случае он будет называться «gbcampaign». Внутри нее создаем еще несколько следующих папок («под-папок»): campaigns Кампании: здесь будет находиться определение нашей кампании scenarios Сценарии: здесь будут определяться отдельные сценарии кампании strings Строки: здесь будут размещены все тексты, которые увидит пользователь в процессе игры maps Карты: по желанию. Здесь мы размещаем файлы карты, если собираемся использовать свою собственную. Карты Существует 3 варианта возможности размещения и использования различных карт в кампании: В первом случае мы не используем собственную карту, а просто даем ссылку на карту, которая включена в игру разработчиками, или же потребуем, чтобы игрок скачал и установил карту, созданную пользователями, самостоятельно. В этом случае, он должен установить ее в папку addons именно в то место, куда мы укажем. Нельзя использовать папку “Maps”, содержащую карты, созданные пользователями, и находящуюся в папке «Мои документы» для размещения карт, используемых в нашей любительской кампании. Использование карт, созданных пользователями и содержащихся в папке «Карты» (расположенной в директории игры, не в «Моих документах»!):Просто копируем в нее 4 файла нужной карты и готово! Это даст возможность использовать данную карту, как в нашей кампании, так и для игры в песочнице. Но если игрок уже установил эту карту перед тем, как скачал нашу кампанию, то в списке карт, доступных для игры в песочнице, у него появится два одинаковых названия. Можно использовать различные варианты карт, созданных пользователями, и находящиеся в отдельной «под-папке» «Карты», размещенной в папке нашей кампании. Помещая карту в эту папку, вы делаете ее недоступной для игры в песочнице. Технология использования карт, созданных разработчиками, подразумевает размещение этих карт непосредственно в папку «Карты». Но иногда слегка видоизмененные варианты этих карт размещают в отдельную «под-папку» внутри папки соответствующей кампании. Вот почему мы не можем играть в «Разделенный Берлин» в песочнице. Однако если мы извлечем оттуда эту карту и разместим в папку, содержащую карты, созданные пользователями, она станет доступной для игры в песочнице. Примечание: Файл сценария нашей карты, который содержит задания, автоматически генерируемые самой игрой (построить дорогу на ферму или приостановить работу какого либо маршрута на несколько дней и т.д.), также будет использоваться в кампании, поэтому, возможно Вы захотите удалить его содержимое, а также всплывающие сообщения. Файлы Strings Файлы под названием «строки» - это файлы, содержащие тексты сценариев, который игрок увидит на экране монитора в процессе игры. Давайте рассмотрим в качестве примера один из файлов с заданиями для второго сценария нашей кампании (задание номер 4): Этот файл содержит по одному отдельному файлу для каждого языка, который поддерживает наша версия игры. Каждый из этих файлов содержит 3 группы текстов для сценария: Название и описание кампании, которые высвечиваются на первой странице кампании. Они имеют определенное название, зависящее от того, как называется файл нашей кампании в папке «Кампании» Название сценария, город, где будут развиваться события, и дата. Также содержит текст, появляющийся при загрузке сценария. Далее следует с кратким описанием сценария, текст приветствия и текст, следующий после завершения каждого из сценариев. Название задания, его краткое описание, непосредственно само задание и текст, следующий после выполнения каждого из заданий в сценарии. Не зная ни одного языка, кроме английского, я просто копировал английский текст во все 4 языковые файлы в нашем «учебном» варианте кампании. Однако если мы создаем настоящую рабочую кампанию нам обязательно надо создать файл en_US.strings, т.е. файл, содержащий все тексты на английском. Полезный совет: протестируйте английскую версию кампании перед тем, как переводить ее на другие языки, т.к. вам обязательно понадобится что-то исправлять, и это избавит вас от необходимости делать эти исправления во всех остальных языковых файлах. /* Campaign description Описание кампании -------------------- Эти две переменные содержат название нашей кампании в списке кампаний, доступных в игре и ее описание, появляющееся тогда, когда пользователь выбирает ее из списка остальных кампаний. ВНИМАНИЕ! Эти переменные должны начинаться с названия файла вашей кампании, в нашем случае это campaign_gb */ $campaign_gb_name_text = "Rule Britannia!"; $campaign_gb_название_текст= «Управляй Британией!»; $campaign_gb_description_text = "Well, maybe not the whole country, but can you rule it's public transportation?"; $campaign_gb_описание_текст= «Хорошо, может не всей страной, но хотя бы системой ее общественного транспорта можно?» /* First scenario Первый сценарий -------------- Здесь содержится название и описание первого сценария. Здесь строки начинаются с сокращения "gb01" которым обозначено внутреннее название первого сценария. Это название будет использовано позднее в файле нашей кампании (.campaign file). */ $gb01_name_text = "Steel Yourself"; $gb01_название_текст="Будь как сталь! "; $gb01_location_text = "Sheffield 1946-1960"; $gb01_местоположение_текст= «Шеффилд 1946-1960»; $gb01_animation_text = "Now that the war is over, there is a declining demand for Steel in the UK. Can you manage Sheffield's transportation as the priorities change from industry to other areas?" ; $gb01_анимация_текст= «Сейчас, когда война закончилась, в Великобритании ощущается острая нехватка стали. Сумеете ли Вы наладить работу системы общественного транспорта в Шеффилде, когда приоритетными становятся другие, не связанные с промышленностью, отрасли?» ; $gb01_briefing_short = "Help Sheffield move on from its industrial roots."; $gb01_содержание _краткое = "Помогите Шеффилду избавится от преобладания промышленной отрасли в производстве товаров."; $gb01_briefing_text = "Greetings. I am Mr. Thompson, head of the city council. I'll be honest with you: I voted against your appointment as transport commissioner - my nephew was for more suitable for the job, but I won't hold that against you. Now, lets see if you can get this city's transport system back in good order."; $gb01_briefing_text = "Здравствуйте! Меня зовут мистер Томсон. Я - мэр Шеффилда. Сказать по правде, я голосовал против Вашего назначения на должность уполномоченного по вопросам транспорта. Я считаю, что мой племенник гораздо больше подходит для этой должности. Но не переживайте, я не буду предпринимать какие-либо действия против Вас, раз Вас уже назначили. А сейчас мы проверим, насколько хорошо Вы сумеете наладить систему общественного транспорта в нашем городе."; $gb01_completed_text = "Damn you. Thanks to your messed up transport policies I've lot the election."; $gb01_completed_text = "Чтоб Вы провалились! Благодаря Вашей странной политике по руководству нашим общественным транспортом, я проиграл на этих выборах!."; /* Далее идут строки с текстом, содержащим название задания, его описание, цель задания и то, что увидит на экране игрок после выполнения этого задания. Внимание! {0:%0} в описании первого задания это - то место, куда вставляется ссылка на стадион, на которую можно кликнуть, где первый 0 означает, что координаты его месторасположения будут содержаться в переменной $task["pos0] в скрипте (т.е. сценарии) нашего сценария. А второй %0 означает, что название объекта будет прочтено из $task["arg0]. */ $gb01_task01_name = "Uniting the Fans"; $gb01_задание01 _название = "Объединение фанов"; $gb01_task01_text = "The managed of Sheffield United has just been on the phone, complaining that his crowds are too small. Build a line there to stop this fool wasting my time."; $gb01_task01_текст = "Глава фанов команды Шеффилд Юнайтед только что позвонил мне, и жаловался на то, что их группа слишком малочисленна. Проведите для них маршрут, и сделайте так, чтобы этот дурень больше не докучал мне!"; $gb01_task01_short = "Build a line to {0:%0} stadium."; $gb01_task01_кратко = "Проведите маршрут любого вида транспорта до {0:%0} stadium."; $gb01_task01_passed = "Thank god for that. Now I can get on with some real work."; $gb01_task01_пройдено = "Спасибо Вам за все! Теперь я смогу заняться чем-то, что действительно заслуживает внимания!"; $gb01_task02_name = "Lack of Education"; $gb01_задание02 _название = "Недостаточно образованные"; $gb01_task02_text = "The professors at the local university say their students aren't attending lectures due to poor transportation. I need you to transport 5 students there and prove these idiots don't know what they are talking about."; $gb01_task02_текст = "Преподаватели местного университета жалуются на то, что студенты пропускают занятия из-за невозможности добраться до университета на общественном транспорте. Мне нужно, чтобы Вы доставили туда 5 студентов, чтобы я смог доказать этим идиотам, что они сами не знают о чем говорят!"; $gb01_task02_short = "Transport 5 students to {0:%0}."; $gb01_task02_кратко = "Перевезите 5 студентов к {0:%0}."; $gb01_task02_passed = "Excellent! I made those professors look complete fools in the council meeting."; $gb01_task02_пройдено = "Великолепно! Они выглядели полными дураками на заседании городского совета!"; /* Second scenario Второй сценарий ---------------- */ $gb02_название _текст = "Snookered"; $gb02_название _текст = "Чемпионат по бильярду"; $gb02_location_text = "Sheffield 1977-2010"; $gb02_месторасположение _текст = "Шеффилд 1977-2010"; $gb02_animation_text = "Sheffield has just won the rights to host the world snooker championships at the crucible theatre. Can you build a transport system that can cope with the influx of visitors every April?"; $gb02_анимация _текст = "Наш город получил право ежегодного проведения чемпионата мира по бильярду. Сумеете ли Вы создать систему общественного транспорта таким образом, чтобы она смогла без труда справляться с ежегодным наплывом туристов в апреле? "; $gb02_briefing_short = "Build a transportation system for the world snooker championships."; $gb02_описание _краткое = "Создайте систему общественного транспорта, способную принять гостей чемпионата мира по бильярду."; $gb02_briefing_text = "Greetings. I am Mr. Walters, head of the World Professional Snooker & Billiards Association. We have decided to host our annual championships in Sheffield, and as the city's transport commissioner, we need you to build a system that get the crowds to the matches."; $gb02_приветствие _текст = "Приветствую Вас! Меня зовут Мистер Волтерс. Я – глава Международной Ассоциации Профессиональных Игроков на Бильярде. Наша организация приняла решение, что отныне чемпионат мира по бильярду будет ежегодно проводиться в Шеффилде. Так как Вы являетесь Уполномоченным по вопросам транспорта, то именно Вам предстоит наладить работу общественного транспорта таким образом, чтобы гости нашего чемпионата без труда могли добираться туда, куда им нужно."; $gb02_completed_text = "Thank you, thank you! You get 147 out of 147."; $gb02_выполнено _текст = "Огромное Вам спасибо! Вы набрали 147 из 147 очков!"; $gb02_task01_name = "Tramulous"; $gb02_task01_название = "Все на трамвай!"; $gb02_task01_text = "In order to attract sponsors for the championships we want to show Sheffield as being a forward thinking city. We can jump the curve on the environmental front by adding some tram lines. A fleet of 5 trams should be sufficient to start."; $gb02_задание01_текст = "Чтобы привлечь спонсоров на наш чемпионат, нам необходимо показать им, что Шеффилд имеет благоприятный инвестиционный климат. Мы можем произвести хорошее впечатление, показав им, что мы заботимся об экологии. Для этого нам нужно проложить несколько трамвайных маршрутов. Думаю, для начала 5 трамваев будет достаточно."; $gb02_task01_short = "Buy 5 trams."; $gb02_task01_кратко = "Приобретите 5 трамваев."; $gb02_task01_passed = "Well done. Now I can work on finding some sponsors."; $gb02_task01_пройдено = "Отлично! Теперь можно начинать искать спонсоров!"; $gb02_task02_name = "VIP Visitors"; $gb02_задание02_название = "Очень важные гости"; $gb02_task02_text = "I think I've found some potential sponsors, but I need to ensure that they can get from their private jets to The Crucible in the style they are accustomed to. Build a helicopter line from the airport to the theatre, and transport 5 potential sponsors."; $gb02_task02_текст = "Думаю, мен удалось найти несколько потенциальных спонсоров, но мне нужно быть уверенным в том, что они смогут добраться до места проведения чемпионата привычным и удобным для них способом. Итак, они прилетают в наш аэропорт на своих частных самолетах, далее мы должны доставить их в театр. Предлагаю провести туда вертолетный маршрут из аэропорта. Как минимум, 5 из наших гостей воспользуются этим маршрутом. Это и будут наши спонсоры!"; $gb02_task02_short = "Transport 5 VIPs by helicopter from {0:the airport} to {1:the theatre}."; $gb02_task02_кратко = "Перевезите 5 пассажиров из {0:аэропорта } в {1:театр } на вертолете."; $gb02_task02_passed = "Excellent! We should be able to line up sufficient sponsorship for the championships now."; $gb02_task02_пройдено = "Великолепно! Похоже, нам удалось получить необходимые средства для проведения чемпионата от наших спонсоров!"; /* Внимание! В кратком описании мы использовали переменную {0:the airport}. Это означает создать связь между названием «аэропорт» и местоположением в задании $task["pos0] */ Файл кампании Папка «Кампании» должна содержать по одному файлу со следующим названием <название >.кампании для каждой из кампаний в вашем аддоне (однако, при желании, вы можете разместить несколько кампаний в один аддон (т.е. создать пак кампаний). Первые 2 строчки содержат внутренне название первого сценария и путь к файлу этого сценария. Рекомендуется обозначать внутренне название сценария краткими и простыми алфавитными символами без пробелов, так как они отображаются в различных переменных сценария, как это можно увидеть из следующего текста: $current = "gb01"; $текущее = "gb01"; $filename = "addons/gbcampaign/scenario/gb01.scenario"; $название файла = "addons/gbcampaign/scenario/gb01.scenario"; Следующая часть (блок памяти), в основном, не слишком важна, и может быть использована в кампании по желанию ее создателя. Они не имеют особого значения, так как пользователь все равно может их изменить, выбрав что-либо иное в UI или в файле сценария. $ chunk = false; $ блок памяти=неверно; $companyColor = 0xFFFF0000; $цвета кампании = 0xFFFF0000; $companyLogo = ""; $логотип кампании = ""; $companyName = ""; $название кампании = ""; $difficultyLevel = 1; $уровень сложности = 1; $bankLevel = 3; $количество банков = 3; $demolishCost = -50; $возврат средств при сносе объектов = -50; $privateCars = 80; $частный транспорт = 80; $customData = map []; $карта игрока = map []; $saveDate = 0; $сохранение дата = 0; $saveTime = 0; $сохранение время = 0; $saveVersion = "0"; $сохранение версия = "0"; $finished = false; $закончено = неверно; $singleScenario = false; $один сценарий =неверно; $scenarioTitle = expandPattern(MAIN.$strings.$scenario_title_scenario_pattern, 1); $название сценария = расширенная версия(ГЛАВНАЯ.$тексты.$сценарий_название _сценарий _версия, 1); $startDate = 0; $дата начала = 0; $startMoney = 0; $стартовый капитал = 0; $startGrid = ""; $стартовая транспортная сеть = ""; Последняя часть файла содержит функцию для каждого сценария кампании, которая указывает игре каким образом загрузить следующий сценарий. Название этой функции должно быть указано следующим образом "завершено_"следующий название следующего сценария». Если в нашей кампании будет 10 сценариев, то она должна содержать 9 следующих функций: function completed_gb01() { функция завершено _gb01() { //Открываем сценарий для повторного прохождения через меню MAIN.$campaign.unlockScenario($filename); ГЛАВНАЯ.$кампания.открытьСценарий ($название файла); //Устанавливаем внутреннее название сценария, который нужно загрузить следующим $current = "gb02"; $текущий = "gb02"; $filename = "addons/gbcampaign/scenario/gb02.scenario"; $название файла = "addons/gbcampaign/scenario/gb02.scenario"; //Загружаем название сценария из файла strings $scenarioTitle = expandPattern(MAIN.$strings.$scenario_title_scenario_pattern, 2); } $сценарийНазвание=расширеннаяВерсия(ГЛАВНАЯ.$тексты.$сценарий _название _сценарий _версия, 2); } Внимание! ,2 означает загрузить название сценария 02 Кодировка последнего сценария несколько отличается от остальных тем, что там говорится, что кампания закончена: function completed_gb02() { задание выполнено_gb02() { MAIN.$campaign.unlockScenario($filename); ГЛАВНАЯ.$кампания.открытьСценарий ($название файла); $current = ""; $текущее = ""; $finished = true; $окончено =верно; } Файлы сценария Файлы сценария определяют, какая карта будет использована в игре и задают последовательность заданий в каждом сценарии. Давайте рассмотрим пример первого сценария. Обычно первым идет ряд установок по конфигурации: //Устанавливаем файл используемой карты $levelName = "addons/gbcampaign/maps/Sheffield.grid"; $уровеньНазвание = "addons/gbcampaign/maps/Sheffield.grid"; //Дату начала сценария $currentDate = mkdate(6,7,1946); $нынешняяДата = mkdate(6,7,1946); //Начальный капитал ( * 100 ) $money = 20000*100; $деньги = 20000*100; //Задаем ссылку на язык, который будет использоваться файлами strings $nameText = MAIN.$strings.$gb01_name_text; $названиеТекст = ГЛАВНАЯ.$строки.$gb01_название _текст; $locationText = MAIN.$strings.$gb01_location_text; $месторасположениеТекст= ГЛАВНАЯ.$строки.$gb01_месторасположение_текст; $animText = MAIN.$strings.$gb01_animation_text; $анимацияТекст = ГЛАВНАЯ.$строки.$gb01_анимация _текст; $briefingShort = MAIN.$strings.$gb01_briefing_short; $описаниеКраткое = ГЛАВНАЯ.$строки.$gb01_ описание_краткое; $completedText = MAIN.$strings.$gb01_completed_text; $выполненоТекст = ГЛАВНАЯ.$строки.$gb01_выполнено_текст; //Задаем чей портрет будет использоваться для описания сценария $briefingPortrait = "metro/ui/portraits/mentor.dds"; $описаниеПортрет = "metro/ui/портереты/куратор.dds"; //Загружаем «обои» для сценария $illustration = "addons/gbcampaign/maps/Sheffield.dds"; $иллюстрация = "addons/gbcampaign/maps/Sheffield.dds"; //Даем задание игре вызвать функцию «Начать Сценарий» как только загрузится карта $currentThreads = [["startScenario", 0]]; $нынешниеФункции = [["начатьСценарий", 0]]; // Задаем, что эти данные следует инициализировать $objectives = map []; $задачи = карта[]; $currentTime = mktime(8,30,0); $текущееВремя = mktime(8,30,0); $companyColor = 0xFFFF0000; $цветаКампании = 0xFFFF0000; $customData = map []; $данныеКарты = карта[]; Далее следует функция startScenario («начать сценарий»). Название здесь не имеет значение, так как оно совпадает с тем, что указано строчкой выше в $currentThreads («Текущих функциях»). Эта функция ожидает некоторое время, пока загрузится UI, а потом использует метод «Добавить функции» addThread () для того, чтобы дать игре вызвать функцию, запускающую первое задание. Для того чтобы задать определенную дату появления задания можно использовать функцию «изменить дату» dateChanged() function startScenario($param) { фунцкия стартСценарий ($параметры) { wait 2.0; ждать 2.0; MAIN.$scenario.addThread(this, "start_gb01_task01"); ГЛАВНАЯ.$сценарий.добавитьФункцию (эту, "начать_gb01_задание01"); } И, наконец, мы должны создать задания. Каждое задание задается с помощью 3 функций: старт_<название задания >: используем метод «Добавить «функцию» чтобы начать задание . Мы уже рассматривали это на примере функции startScenario (начать Сценарий). условие_<название задания>: игра регулярно вызывает эту функцию, чтобы проверить выполнено ли задание. Это подтверждается с помощью true «верно» или false «не верно». Панель целей задания также можно обновлять, чтобы предоставить отчет о результатах. выполнено_<название задания >: игра вызывает эту функцию, когда задание выполнено. Эту функцию можно использовать для того, чтобы: 1) начать следующее задание после того, как предыдущее было выполнено; 2) создать премию за выполненное задание в виде обновления транспортных средств или изменения цен на энергоносители; 3) и чтобы указать, что сценарий пройден. Как и сценарии, задания имеют простые внутренние названия, состоящие из букв и цифр, на которые дается ссылка в текстах файлов strings, чтобы присоединить к ним правильные названия, краткие описания и т.д. Начнем с обычного задания – проведем маршрут в определенное место: function start_gb01_task01($param) функция начало _gb01_task01($параметры) { //Сначала находим на карте стадион $a = MAIN.$grid.findItem("Bramall Lane"); $a = ГЛАВНАЯ.$сеть.найти объект ("переулок Брэмол"); //Создаем задание $task = MAIN.$scenario.addTask("gb01_task01", false); $задание = ГЛАВНАЯ.$сценарий.добавитьЗадание("gb01_задание01", не верно); //Задаем портрет персонажа $task["portrait"] = "metro/ui/portraits/mentor.dds"; $задание ["портрет"] = "metro/ui/портреты/куратор.dds"; //Подставляем название здания для сообщения, содержащего цель задания. Это создает взаимосвязь между панелью с целями заданий и стадионом. Давайте вернемся к рассмотрению файлов strings, чтобы понять каким образом это происходит: $task["arg0"] = MAIN.$scenario.getBuildingName($a); $задание ["аргумент0"] = ГЛАВНАЯ.$сценарий.получитьНазваниеСтроения($a); //Устанавливаем в качестве заданного месторасположения местоположение стадиона $task["pos0] = $a.position; $задание ["месторасположение0"] = $a.месторасположение; //Устанавливаем размер вознаграждения. $1000 $task["rewardCash"] = MAIN.$economy.getReward(1000*100); $задание ["вознаграждениеНаличные"] = ГЛАВНАЯ.$экономика.получениеВознаграждения (1000*100); } function condition_gb01_task01($task) функция условие_gb01_задание01($задание) { //Чтобы проверить выполнено ли задание, нужно посмотреть следующую строку, в конце которой должно появиться pos0 return MAIN.$grid.lines.routeExists(TRANSPORTLINE_MASK_ALL, $task["pos0"]); вернуться ГЛАВНАЯ.$сеть.строки.маршрутСуществует(МАРШРУТ ТРАНСПОРТА_СКРЫТЬ_ВСЕ, $задание ["pos0]); } function completed_gb01_task01($task) функция выполнена _gb01_задание01($задание) { //Когда задание01 выполнено, начните задание 02. Убедитесь, что вы правильно задали название этой функции. Если вы допустили какие-либо ошибки, следующее задание просто не запустится. MAIN.$scenario.addThread(this, "start_gb01_task02", true); ГЛАВНАЯ.$сценарий.добавитьФункцию (эта, "начать_gb01_задание02",верно); } Если во время игры вы заметите, что это задние не выполняется, и желтая точка, указывающая то место, куда следует перевозить пассажиров или провести маршрут, находится не над стадионом, где бы ей, по сути, следовало бы находиться, это означает, что мы допустили ошибку. Рассмотрим, в чем она заключается. Итак, на нашей карте есть 2 объекта, имеющие одинаковые названия: стадион «Брэмол Лайн» и дорога «Брэмолл Лайн», и функция «findItem» («Найти объект») выбирает неверный объект. Мы рассмотрим альтернативные способы, как можно указать нужные объекты на карте далее. Сейчас могу сказать лишь то, что наилучшим способом избежать подобных ошибок будет просто присвоить используемым в заданиях объектам названия, которые больше нигде не используются и не повторяются. Второе задание немного более сложное: в нем требуется перевезти определенное количество пассажиров. Также за выполнение этого задания в качестве награды мы предоставляем не только денежную компенсацию, но и улучшение репутации игрока. function start_gb01_task02($param) { функцию начать _gb01_задание02($параметры) { //Создаем 10дневный перерыв между моментом выполнения задания 01 и запуском задания02 MAIN.$scenario.waitForDate(MAIN.$mainClock.date + 10); ГЛАВНАЯ.$сценарий.ждатьДату(ГЛАВНАЯ.$главныеЧасы.дата + 10); //Указываем в качестве объекта в задании университет $a = MAIN.$grid.findItem("Sheffield Uni"); $a = ГЛАВНАЯ.$сеть.найтиобъект("Шеффилдский университет"); //Создаем задание $task = MAIN.$scenario.addTask("gb01_task02", false); $задание = ГЛАВНАЯ.$сцеарий.добавитьЗадание("gb01_задание02", неверно); //Задаем портрет персоноажа $task["portrait"] = "metro/ui/portraits/mentor.dds"; $задание ["портрет"] = "metro/ui/портеты/куратор.dds"; //Задаем название университета на панели задач $task["arg0"] = MAIN.$scenario.getBuildingName($a); $задание ["аргумент0"] = ГЛАВНАЯ.$сценарий.получитьНазваниеЗдания($a); //Задаем позицию точки на карте, где будет находиться курсор, указывающий на нужное здание на карте $task["pos0] = $a.position; $задание ["положение0"] = $a.положение; //Задаем радиус, в пределах которого нам нужно доставить пассажиров $task["radius] = 150.0; $задание ["радиус"] = 150.0; //Задаем количество пассажиров, которых требуется перевезти $task["targetNumber] = 5; $задание ["цельКоличество"] = 5; //Размещаем указатель цели для подсчета пассажиров, однако его местоположение будет несколько отличаться от того, где располагается курсор, указывающий, куда перевезти пассажиров, и о котором мы уже говорили ранее. $task["targetPos0] = $a.position; $задание ["цельПоложение0"] = $a.положение; //Задаем размер денежного вознаграждения. $1000 $task["rewardCash"] = MAIN.$economy.getReward(1000*100); $задание["вознаграждениеНаличные"]= ГЛАВНАЯ.$экономика.получениеВознаграждения1000*100); //Задаем сколько процентов репутации игрок получит в качестве вознаграждения $task["rewardReputation] = 5; $задание ["вознаграждениеРепутация"] = 5; //Задаем первоначальное количество пассажиров, которые уже были перевезены $task["arrived] = 0; $задание ["прибыли"] = 0; } //Задаем функцию, которая будет проверять, выполнено ли задание function condition_gb01_task02($task) { функция условие _gb01_задание02 ($задание) { //Это задание считается выполненным, когда количество прибывших пассажиров (игра постоянно обновляет для нас этот параметр) будет равняться заданному нами количеству. return $task["arrived"] >= $task["targetNumber"]; возвратиться $задание ["прибыли"] >= $задание ["цельКоличество"]; } function completed_gb01_task02($task) функция выполнена _gb01_задание02 ($задание) { /* Теперь зададим, что после того, как это задание будет выполнено, весь сценарий будет завершен */ MAIN.$scenario.scenarioCompleted(); ГЛАВНАЯ.$сценарий.сценарийЗавершен (); } Вы также можете рассмотреть примеры более сложных заданий в файле the gb02.scenario file, который прилагается к этой инструкции. Помимо всего вышесказанного, могу добавить, что когда мы играем в какой-либо сценарий, на самом деле игра загружает 3 отдельных файла сценария и запускает кодировку из всех этих файлов: Файл сценария, который был создан нами ранее (MAIN.$scenario.$scenario) (ГЛАВНАЯ.$сценарий.$сценарий) Сценарий из файлов карты, который имеет такое же название, как и карта в папке, из которой загружаются эти файлы(MAIN.$scenario.$level) (ГЛАВНАЯ.$сценарий.$уровень) Файл «дефолтного» сценария, который загружается из файла inside metro.gs до тех пор, пока вы не предпримете какие-то действия, чтобы избежать этого (MAIN.$scenario.$default) (ГЛАВНАЯ.$сценарий.$дефолтный) Общие рекомендации: Задайте установки конфигурации, имеющие значение для вашей карты, во всех сценариях вашей кампании, а также в файле сценария вашей карты, находящейся в «песочнице» (например, если нужно изменить ценообразование на различные виды транспорта). Задания следует размещать внутри файлов со сценариями вашей кампании. Вы можете детально изучить разнообразные примеры более сложных заданий в scenarios/sandbox.scenario внутри файла игры metro.gs file или в любительских кампаниях, созданных пользователями. Для того чтобы извлечь необходимые для этого файлы, нужно использовать мод Use the GS File Viewer. 5. Ошибки Вы обязательно допустите опечатки или ошибки, когда будете создавать файлы для собственной кампании. Если что-то идет не так, это обязательно отобразится в файле log_metro.txt, который находится здесь: My Documents\Cities in Motion. Однако будьте внимательны, т.к. иногда настоящая ошибка находится на несколько строчек выше, чем это указывается в отчете об ошибках. Особенно часто так происходит тогда, когда причиной ошибки являются несовпадающие кавычки. 6. Как протестировать вашу кампанию My Enhanced Console mod contains 3 commands to help you test your campaign without having to play it all the way through every time, and to allow you to examine the current state of each incomplete task: Мод Enhanced Console содержит 3 командные строки, которые помогут протестировать вашу кампанию, не играя в нее. Он также даст нам возможность изучить состояние каждой невыполненной задачи: completetask <internal name>: complete a pending task from the current scenario выполнить задание <внутреннее название >: выполнить тестируемое задание из текущего сценария starttask <internal name>: start a named task from the current scenario начать задание <внутренне задание >: запустить указанное задание из текущего сценария tasks: display the state of all incomplete tasks задания: показать состояние всех невыполненных заданий 7 . Дополнительные примеры заданий (файл прилагается) gbcampaign.zip 6 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Опубликовано: 29 января, 2014 Можно использовать различные варианты карт, созданных пользователями, и находящиеся в отдельной «под-папке» «Карты», размещенной в папке нашей кампании Я извиняюсь за вопрос,я просто никогда так не делал,а как найти эту папку? 0 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Опубликовано: 29 января, 2014 Где нужно разместить файл кампании Сначала создаем папку нашей кампании в папке addons в директории игры. В нашем случае он будет называться «gbcampaign». Внутри нее создаем еще несколько следующих папок («под-папок»): campaigns Кампании: здесь будет находиться определение нашей кампании scenarios Сценарии: здесь будут определяться отдельные сценарии кампании strings Строки: здесь будут размещены все тексты, которые увидит пользователь в процессе игры maps Карты: по желанию. Здесь мы размещаем файлы карты, если собираемся использовать свою собственную. То, что выделено жирным шрифтом поможет понять, где это нужно размещать, а потом искать 0 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Опубликовано: 30 января, 2014 Где нужно разместить файл кампании Сначала создаем папку нашей кампании в папке addons в директории игры. В нашем случае он будет называться «gbcampaign». Внутри нее создаем еще несколько следующих папок («под-папок»): campaigns Кампании: здесь будет находиться определение нашей кампании scenarios Сценарии: здесь будут определяться отдельные сценарии кампании strings Строки: здесь будут размещены все тексты, которые увидит пользователь в процессе игры maps Карты: по желанию. Здесь мы размещаем файлы карты, если собираемся использовать свою собственную. То, что выделено жирным шрифтом поможет понять, где это нужно размещать, а потом искать Ну это понял,а я другое совсем узнать хотел,как вытащить карту разработчиков,Берлин например? 0 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Опубликовано: 30 января, 2014 В директории игры (папка Cities in Motion) находишь файл maps.gs. Он находится ниже всех основных папок. Открываешь его с помощью GSFileViewer http://transport-games.ru/index.php/files/file/220-gs-file-viewer/ и тащи оттуда все, что душа пожелает (Берлин в том числе) 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Опубликовано: 31 января, 2014 @julbobr, Благодарю,очень хорошая помощь,обязательно попробую. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах