Как создать собственные сценарии игры Обращаю ваше внимание на то, что данный продукт является лишь интерпретатором ВАШИХ сценариев и вы сами себе хозяева в ваших сценариях. Какой сценарий напишете – такой квест и получите. 1) имеются следующие файлы, содержащие в себе сценарий: message - файл с сообщениями; map - файл с описанием местности и вообще с “картой”; actions - файл с описанием реакций на различные команды; items - файл с описанием предметов; intro - файл с начальным текстом, появляющимся при запуске игры. А теперь подробнее о формате данных в каждом файле. Предупреждаю, что неверное воспроизведение синтаксиса может привести к тому, что ваш сценарий будет пониматься некорректно, поэтому внимательно следуйте данным инструкциям. 2) файл MESSAGE служит для определения различных сообщений, которые иногда необходимо выдать пользователю, например, информация о том, сколько у вас денег или ещё что-либо – то, что вы считаете нужным, по вашему сценарию, сообщить пользователю. Разумеется, некоторые сообщения можно давать ещё на уровне описания комнаты, но не все. Выдача сообщения с некоторым номером инициируется санкцией M<номер_собщения> (M1 M2 …) в поле санкций. Таким образом, сообщения можно давать при некотором условии (см. ниже УСЛОВИЯ), встраивая их в санкции. Чтобы выдать сообщение пользователю на экран, нужно его вызвать: Mx, а перед этим нужно его описать в этом файле message так: 00001В лампе осталось &V1 литров горючего. 00001Побеспокойтесь о горючем. 00002Сообщение 2… Первые 5 цифр – порядковый номер сообщения (<номер_собщения>), по этому номеру вы можете указать это сообщение (достать его). Одно сообщение может занимать несколько строк. Как указано выше, сообщение M1 выводится в 2 строки = “В лампе осталось &V1 литров горючего.” и “ Побеспокойтесь о горючем.” Сразу за ними (без пробела) следует текст сообщения, который может включать конструкции типа: &V1 … &V50 (значок & служит для отличия такой конструкции от просто текста сообщения). По бокам этой конструкции – пробелы (не забудьте). Это переменные, в которых можно хранить численное значение какого-либо параметра. Между прочим, все предметы, все переменные, все флажки, все сообщения в сценарии кодируются цифрами, – привыкайте. Таким образом, можно закодировать 65536 сообщений (хотите больше?). Этого вполне достаточно для сценария. 3) файл описания места MAP Этот файл используется только при вызове системных функций #10 и #11, но имеет важнейшее функциональное назначение: он описывает комнаты квеста. Описывает текстовыми фразами в D-строках интерьер и игровую обстановку. (Комната понимается в широком смысле: это может быть лес, луг, пещера номер 1…) А функциональность комнаты описывается G-строками. Вообще, вся функциональность игры задаётся, с помощью G-строк в файле map и A-строк в файле actions. G-строками удобно проверять комнато-зависимые условия. Файл map состоит из последовательных блоков, описывающих каждую комнату: \\137 D <условие> =Вы попали в красивое место. Это идёт описание места, в которое вы попали. D <условие> = Можно применять условие, при котором данное описание будет выводиться. G <условие> = <санкция> G <условие> = <санкция> G <условие> = <санкция> \\138 … После символов \\ находится номер комнаты – её код. Всё что расположено после этой строки и до следующей – относиться к данной комнате, т.е. исполняется, если вы находитесь в данной комнате и вызываете системные функции #10, #11. Т. е. между строками “\\137” и “\\138” идет описание комнаты 137 в виде, так называемых, D-строк и G-строк. Комната с номером 0 – это особая комната, она зарезервирована для особой функции. В неё не нужно переходить. Она содержит те условия и сообщения, которые выполняются в какой бы вы комнате ни были. Её следует использовать для проверки глобальных флагов и выдачи глобальных сообщения… В файле map условия встречаются в двух видах строк: D-строки и G-строки: Строка, начинающаяся с символа ‘D’ (description…) – это D-строка, строка описания комнаты. При описании комнаты (при выполнении системной функции #10), эта строка для текущей комнаты выбирается, проверяется её условие. Если условие в ней выполняется (истинно), то на экран выводится эта строка (“Вы попали в красивое место…”). По задумке, вы предусматриваете в сценарии команду, которой пользователь просит вас описать текущую комнату (“где”, “опиши”…), или, при переходе из комнаты в комнату, автоматически выдаётся её описание. В файле actions вам следует указать в строке санкций, санкцию #10 для всех ситуаций, когда на экран нужно выдать описание комнаты. Итак, D-строки – описания комнат и прочие текстовые сообщения, выдаваемые в конкретных игровых ситуациях в данной комнате. Строка описания выдаётся на экран, если условие истинно и вызывается функция #10. ВНИМАНИЕ: В строке описания файла map недопустимы ссылки на переменные, типа &V1, как в сообщениях файла message. Парсинг таких конструкций не осуществляется, строка выдаётся “как есть”. Строка, начинающаяся с символа ‘G’ (go…) – G-строки – имеют конкретное целевое назначение – используются при переходе из данной комнаты в другую (хотя, при некоторой изобретательности, можно приспособить их выполнять и другую работу). Перебор этих условий и выполнения этих действий инициируется при выполнении системной функции #11. Поэтому санкцию #11 тоже следует указывать, в строке санкций в файле actions для команды, инициирующей переход в другую комнату или другое, привязанное к конкретной комнате действие. G-строки пишутся не просто так, а привязанные к конкретной комнате, и рассматриваются они, только если вы находитесь этой комнате (строки 0-комнаты рассматриваются в любом случае). Подробнее о механизме условий смотри ниже. 4) команды и действия, файл ACTIONS Синтаксис этого файла похож на П.3, но имеет некоторые особенности: \\иди сходи пойди A <условие> = <санкция> A <условие> = <санкция> A <условие> = <санкция> A <условие> = <санкция> A = <всегда исполняемая санкция (если надо)> \\ возьми бери возьми … После символов \\ находится уже не номер комнаты, а команда с её синонимами (какими вам угодно). Синонимы понимаются также как и команда и облегчают понимание, т.к. расширяют словарный запас игры (плохо, если машина понимает, например, только слово “залезь” и не знает слова “лезь” и др.). Далее идут строки с условиями, относящимися к данной команде. Эти условия могут включать аргумент команды или варианты его в круглых скобках, значения флагов, переменных, иметь некоторую вероятность выполнения (см. УСЛОВИЯ). Примечание: рекомендуется использовать повелительное наклонение в командах (сядь иди ползи …). Примечание: программа имеет некоторое количество встроенных, наиболее общеупотребимых команд (‘exit’ или ‘выход’ – выход из программы); встроенную проверку цензуры (не на все случаи конечно); системные функции (#1 - #11), к которым можно получить доступ. Например, если в строке санкции употребить конструкцию #3, то это – вызов третьей системной функции. Пользователю не разрешается непосредственно инициировать сохранение и загрузку командой. Предусмотрите сценарием специальные команды, типа “сохрани” / “загрузи” для команд #2 и #3. Так вы сможете управлять сохранением и загрузкой пользователя: может вы захотите организовать участки квеста, на которых нельзя сохраниться (для усложнения задачи ;). Если пользователь попросил сохранения, проверьте некоторое условие, и если здесь можно сохраняться, то вызовите санкцию #2 из сценария (из map или action). Так вы можете принудительно заставлять пользователя сохраниться/загрузиться на некоторых этапах… Часть системных функций (#1, #4, #6, #7, #8) пользователь может вводить непосредственно в строке команд, в процессе игры. 5) файл описания предметов ITEMS В этом файле находятся описания предметов, которые используются в игре. Предметами могут считаться и люди, с которыми вы будете встречаться. Т.е. предметом считается то, что можно передать как аргумент команды. Примечание, не все аргументы команд обязательно должны быть предметами, чтобы их использовать в качестве аргументов. Незначительные аргументы-предметы - можно не описывать в этом файле, а обрабатывать, указав их в круглых скобках в условии, в качестве подусловия, “(лошадь конь)” и т.д. Но предметы могут выступают в условиях, как конструкции типа: t+10;0 - предмет номер 10 находиться в месте 0 (карман)? t-2;1 - предмет номер 2 не находиться в комнате номер 1? t+3;r - предмет номер 3 находиться в текущей комнате? Присваивание же текущего места расположения некоторого предмета осуществляется следующей конструкцией в санкции: t20;r - перекладывание предмета номер 20 в текущую комнату (например, при выкладывании из кармана); t3;2 - предмет номер 3 - в комнату номер 2 (например, появление определённого предмета на каком-то этапе игры в произвольном месте карты); Начальное же положение предметов задаётся в этом файле: \\1 C ржавая кастрюля 13 века N кастрюля L 0 \\2 C связка ключей N ключи L 10 \\3 … Где после \\ располагается номер (код) предмета, по которому в сценарии распознаётся сей предмет. Буква C указывает, что дальше идёт название предмета такое, каким оно будет выводится в диалоге на экран. Буква N указывает, что дальше идёт название предмета такое, каким его вводит пользователь (упрощённое). Буква L указывает, что дальше идёт код начального места расположения предмета: 0 - карман 1 … - в комнате номер 1 … Примечание: рекомендуется использовать неопределённую форму названий предметов (конь кастрюля банан…), НО НЕ (банана коню …). 6) синтаксис описания условий и соответствующих им санкций УСЛОВИЯ применяются в файлах map и actions. Если условие не указывать, то, по-умолчанию, оно считается истинным. Условие состоит из подусловий, истинность которых влияет на истинность всего условия. Условие считается истинным, если истинны все его подусловия. Если же хоть одно из подусловий не выполняется, т.е. ложно, то всё условие – ложно. Подусловия в строке условия разделяются пробелами. Одно подусловие это неразделённая пробелами строка. Подусловия это конструкции вида: (<список аргументов> &t1 &t3) - если аргумент, указанный пользователем в текущей команде входит в этот список аргументов, то подусловие считается истинным. b1 b2 –b3 - значения флажков определены так: b1=правда и b2=правда и b3=ложь r+137 r-10 - мы находимся в комнате 137 (r=137) и не находимся в комнате 10 (r<>10). r-переменная, содержащая код текущей комнаты. t+10;0 t-2;1 - местоположение предметов следующее: предмет &t10 лежит в 0-комнате, т.е. в кармане, а предмет &t2 не находится в комнате 1. (Для предметов 0-комнату можно использовать как карман, т.е. то, что ВСЕГДА несём С СОБОЙ.) Примечание: только t-переменные можно сравнивать с текущей комнатой: t+10;r – лежит ли предмет t10 в текущей комнате. V-1;20 - значение переменных установлены таким образом: переменная V1<>20. Конструкция: V-1;r неверна. С V-переменными допустимы только числовые присвоения и условия. %50 - задание некоторой вероятности (100% по умолчанию). Если в условии встречается конструкция вида %x, то такое условие, при истинности всех прочих подусловий, всё равно будет считаться истинным, только в x случаях из 100. Удобно, если вы хотите, чтобы злой людоед съедал вашего героя в %1 случаев, когда вы проходите мимо него – мелочь, а неприятно. :-F~ :) Примеры условий. Файл actions: \\бери возьми подними A (метёлка &1) t+1;r = M8 t1;0 ## Жирным указано условие. Подусловия здесь: 1) (метёлка &1) 2) t+1;r Условие истинно и санкция выполниться, если (аргумент команды = “метёлка” или “&1”) и предмет t1 лежит в текущей комнате room – r (t1 = r). Файл map: \\0 D %30 = Здесь тепло. \\1 D = Вы находитесь в коридоре… G (слева лево с в налево) = M1 M2 #4 G (право направо ю з) = r2 M2 ## Жирным указано условие. Условие указанное в D-строке проверяется при выполнении команды #10, а указанное в G-строке проверяется при выполнении команды #11. В условии в описании комнаты подусловие аргумента команды можно использовать для важной цели! Пусть у вас есть команда “опиши”, которая описывает комнату, если ей не указан аргумент, и описывает некоторый предмет в комнате (например, часы), если пользователь говорит “опиши часы”, тогда: \\1 D (часы) = Часы старые настенные ## D (диван) = Диван новый напольный ## D = Описание комнаты Здесь очень важна функция санкции ##. Смотри её описание. После условия и знака равно следует санкция. САНКЦИЯ – это последовательность инструкций, которая выполняется при истинном условии. Это строка с разделёнными пробелом инструкциями. Инструкции выполняются последовательно в строке санкции, одна за другой. Примеры санкций (выделено жирным): A (метёлка &1) t+1;r = M8 t1;0 ## Вывести сообщение M8, затем предмет t1 переложить в 0-комнату (карман), затем прервать разбор данного файла. G (право направо ю з) = r2 M2 ## Перейти в комнату 2 (Переменной r, от слова room, присвоить значение 2. Это переменная в программе которая хранит код текущей комнаты.) Затем вывести сообщение M2, затем прервать разбор данного файла. Описание инструкции ## см. ниже. Инструкции бывают вида: b1 –b2 - переприсвоение значений флажкам (b1=правда b2=ложь). r10 - значению текущей комнаты присвоить номер 10, т.е. перейти в комнату 10. t20;r t3;0 - переложить предметы: предмет t20 в текущую комнату, а предмет t3 – в карман. V2;10 V2++ V4-- - переприсвоить значения переменным: V2=10, V2 увеличить на 1, V4 уменьшить на 1. M13 - вывести на экран сообщение номер 13. #3 #10 - вызов системных функций номер 3, затем - 10. 7) Список системных функций: #1 – вызов пользователем помощи о синтаксисе #2 – запись состояния в игре в файл #3 – загрузка сохранённого состояния из файла (в сценарии, после вызова этой функции, рекомендуется вставлять инструкцию ##, чтобы разбор немедленно прекращался. Условия игры то ведь изменяются!) #4 – выход из игры по желанию пользователя #5 – выход из игры победителем #6 – показать содержимое “карманов” #7 – вывод списка запрограммированных глаголов-команд #8 – вывод системной статистики: идентификатор комнаты room, в которой я нахожусь (это может очень помочь заблудившемуся пользователю идентифицировать комнату, в которую попал); и количество набранных по игре очков score=V100 #9 – рассказать о наличии предметов в этом месте #10 – описать данную комнату (читается файл map и для комнат 0 и текущей выбираются D-строки, проверяются их условия и выводятся текстовые описания комнат) #11 – покинуть данную комнату или выполнить специфические, привязанные к комнате действия (читается файл map и для комнат 0 и текущей выбираются G-строки, проверяются их условия и выполняются санкции) Для программиста лабиринта будут полезны следующие команды отладки: debugon – включить режим отладки; debugoff – выключить режим отладки. 8) Работа с переменными и флагами Переменная это ячейка памяти, которая хранит числовое значение в диапазоне 0…32767. Всего можно использовать 100 пользовательских переменных с именами V1..V100. В переменной можно хранить, например, кол-во горючего в лампе или кол-во денег в вашем кошельке… С этими 100 переменными допустимы различные действия, такие как: В санкциях, в качестве инструкций применяются такие операции: Присваивание числового значения переменной: V1;20 - ячейке V1 присвоить значение 20; V34;10 - ячейке V34 присвоить значение 10; Изменение значения переменной: уменьшение значения переменной на единицу: V1-- ; (Значение переменной не может быть меньше 0. Поэтому производится проверка: V1<0 ? Если да, то V1:=0; Т.е. переменная форсированно обнуляется, чтобы не выходить за рамки значений) увеличение значения переменной на единицу: V1++ ; В условиях, в качестве подусловий, применяются : проверка на неравенство некоторой величине: V-1;20 что эквивалентно: V1<>20; проверка на равенство некоторой величине: V+1;20 что эквивалентно: V1=20; Есть системная переменная r (от слова room), присвоение значения которой меняет положение вашего героя в лабиринте. Пример: r20 – перейти в комнату 20, r1 – в комнату 1. Переменная V100 – тоже системная, значение переменной хранит набранное вами количество очков. Количество этих набранных очков выводится системной функцией #8 – статистика. Предметами, описанными в файле items, также можно манипулировать как с переменными: перекладывание предмета осуществляется переприсваиванием переменной, связанной с ним t1, t2…, нового значения – кода комнаты. Пример: t20;r t3;0 - переложить предметы: предмет t20 в текущую комнату, а предмет t3 – в карман. Проверить значение этой t-переменной, значить проверить текущее нахождение данного предмета. Вот только начальные значения t-переменным задаются так, как указано в файле items (см. п. 5). Предметы можно перемещать в текущую комнату (t20;r) и проверять в условиях наличие предмета в данной комнате (t+3;r). Присваивать и сравнивать со значением r можно только t-переменные. Флаг – это переменная булевского типа, равна истина или ложь. Можно использовать до 500 флагов, по именам: b1..b500. Переприсвоение значений флажкам: b1 –b2 означает b1=правда b2=ложь. Их можно использовать в качестве подусловий: b1 b2 –b3 означает: если b1 = правда и b2 = правда и b3 = ложь… В начале игры переменные и флаги устанавливаются в такие начальные значения: r = 1; – игра начинается из комнаты с номером 1. (Не помещайте пользователя в 0-комнату); V1..V100 = 0; b1..b500 = ложь. 9) Типовые приёмы программирования лабиринта-квеста: Пользователю не разрешается непосредственно инициировать сохранение и загрузку командой. Предусмотрите сценарием специальные команды, типа “сохрани” / “загрузи” для команд #2 и #3. Так вы сможете управлять сохранением и загрузкой пользователя: может вы захотите организовать участки квеста, на которых нельзя сохраниться (для усложнения задачи ;). Если пользователь попросил сохранения, проверьте некоторое условие, и если здесь можно сохраняться, то вызовите санкцию #2 из сценария (из map или action). Также вы можете принудительно заставлять пользователя сохраниться / загрузиться на некоторых этапах… Комната с номером 0 – это особая комната, она зарезервирована для особой функции. В неё не нужно переходить. В файле map она содержит те условия и сообщения, которые выполняются в какой бы вы комнате ни были. Её следует использовать для проверки глобальных флагов и выдачи глобальных сообщения… Т.е. если вы находитесь в любой комнате квеста и инициируется функция #10 или #11, то из файла map выбираются и выполняются D-строки (при выполнении функции #10) и G-строки (при выполнении функции #11) G-строки файла map используются при переходе из данной комнаты в другую (хотя, при некоторой изобретательности, можно приспособить их выполнять и другую работу). Перебор этих условий и выполнения этих действий инициируется при выполнении системной функции #11. Поэтому санкцию #11 тоже следует указывать, в строке санкций в файле actions для команды, инициирующей переход в другую комнату или другое, привязанное к конкретной комнате действие. Например, у вас есть группа команд, предназначенных для перемещения: “иди”, “ползи”, “лети”. Вы кодируете в файле action, что команду “иди” можно использовать с аргументами (север юг запад восток лес поле…) и тогда вызывать системную функцию #11. В файле actions пишем: \\иди A (север юг запад восток лес поле…) = <изменяет значения переменных и флагов, если нужно> <вызываем функцию #11> <после перехода можно вызвать функцию #10 для автоматического описания комнаты, в которой мы оказались. Хотя в этом месте мы не знаем успешно ли был выполнен переход в прерывании #11> В файле map в G-строках каждой комнаты описываем группу условий: G (север) = санкция 1; иди в комнату r2 ## G (юг) = санкция 2; иди в комнату r3 ## G (восток) = санкция 3 ## G (запад) = санкция 4 ## … Эти санкции будут выполняться, только если пользователь вызвал команду “иди”. И для каждой комнаты санкции на одни и те же аргументы будут разными. Есть же комнаты у которых только одна дверь, а в поле можно идти на все 4 стороны, а по лестнице – только вверх или вниз. ;) Команду “ползи” используют для перемещения ползком в тоннелях с аргументами (вперёд назад влево вправо лаз дыра…). Если пользователь указал её с такими аргументами, то вызывать системную функцию #11. А в файле map в G-строках каждой комнаты описываем группу условий: G (лаз) <плюс, открыта ли дверь в лаз> = иди в комнату “лаз” ## G (дыра) <плюс ещё какие-то ограничения, типа, если у меня с собой верёвка и лампа…> = залезть в дыру ## … Пусть команда “лети” может использоваться только из одной комнаты. Тогда имеет смысл полностью определить её в файле actions: \\лети A <если я в комнате r2> (вверх) = то полетели вверх из комнаты номер 2 ## Инструкция ##, очень полезна в строке санкции, чтобы организовывать последовательность альтернативных условий: если.. то.. иначе если… то… иначе. При выполнении инструкции ## разбор файла (map, actions) прекращается. Если же разбор не прекратить, то программа вычитает очередную строку файла и проверит её условие, если очередное условие истинно, то оно выполнит санкцию, если в этой строке санкции опять не встретится инструкция ##, то оно выберет очередную строку… Формальный синтаксис на примере файла actions: \\команда1 (1) A условие1 = санкция1 (2) A условие2 = санкция2 (3) A условие3 = санкция3 ## (4) A условие4 = санкция4 (5) A условие5 = санкция5 ## (6) A = санкция6 (7) \\команда2 Эквивалентный Pascal-синтаксис: if (условие1) then санкция1 if (условие2) then санкция3 if (условие3) then санкция3 else begin if (условие4) then санкция4 if (условие5) then санкция5 else санкция6 end; Если пользователь указал команду “:> Команда1 аргумент”, то в файле actions будут просматриваться только строки выделенные жирным, т.к. только эти строки относятся к Команде1: - Сначала выберется строка (2), если условие1 истинно, то выполниться санкция1; - Далее, в любом случае выберется строка (3), если условие2 истинно, то выполниться санкция2; - Далее, в любом случае выберется строка (4), если условие3 истинно, то выполниться санкция3 И ДАЛЬНЕЙШИЙ РАЗБОР ФАЙЛА ПРЕКРАТИТСЯ; - Если же условие3 было ложным и санкция3, соответственно, не выполнилась, то выберется строка (5), если условие4 истинно, то выполниться санкция4; - Потом, выберется строка (6), если условие5 истинно, то выполниться санкция5 И ДАЛЬНЕЙШИЙ РАЗБОР ФАЙЛА ПРЕКРАТИТСЯ; - Если же условие3 и условие5 были ложными (остальные условия не важны) и процесс выполнения добрался аж сюда, то выполнится санкция6 (ветвь “иначе”) Пример actions: \\мети A <предмет t-1;0 метла в кармане?> = метла у на есть, подметаем пол ## A = сказать, что метлы нет и нечем подметать Если метла в кармане, то выполним подметание и тут же выйдем. Если метлы нет, то сказать, что т.к. у нас нет в кармане метлы, то подметать мы не будем. В этом примере не используется аргумент команды вообще. Предполагается Пример map: \\1 D = Лес. G (с север) = … ## G (ю юг) = … ## G (в восток) = … ## G (з запад) = … ## G = Вывод: направление выбрано неверно; я могу пойти только на с, в, ю, з. · В файле actions при описании команд (“иди”, “где”…), которые пользователь может использовать, следует проверять аргументы и применять санкции, в случаях, когда условия выполнения данной команды не сильно зависят от места: это, как правило, все команды, которые не связаны с перемещением игрока. Команды связанные с перемещением, сильно зависят от обстоятельств – от места где он находится: команда “иди север” требует гибкой и самой различной реакции, в зависимости от места, где находится сейчас игрок. Такие санкции следует обрабатывать с помощью G-строк в файле map и #11. 10) Заключительные мысли Главное – команда, т.к. аргумент без команды быть не может, а команда без аргумента – может. Пользователь вводит инструкции, выглядящие так: <что сделай> <с чем> Причём, на первом месте стоит глагол в повелительном наклонении – действие, а на втором – существительное в неопределённой форме – аргумент. С помощью представленных средств можно обыгрывать самые различные игровые ситуации, главное – правильно обыгрывать, правильно составлять условия, соблюдать синтаксис. Помните: только человек может найти логическую ошибку в сценарии. Файлам сценария следует ставить атрибут ReadeOnly, чтобы случайно их не запортить. Человеку, который проходит лабиринт, в отличие от того, кто его пишет, не следует заглядывать в файлы сценария, - ему просто будет неинтересно. ;) Поэтому читай следующий пункт. 11) Зашифровка сценариев Программа quest.exe понимает только зашифрованные по определённому альгоритму файлы сценария. Такие файлы нечитабельны в текстовом редакторе – это чтобы у конечного пользователя не возникало искушения найти в них себе подсказку. Если quest.exe подсунуть незашифрованные сценарии, то игра работать не будет, т.к. quest.exe будет пытаться их расшифровать и сам будет видеть в них абракадабру. Разработчик лабиринта квеста может пользоваться программой quest_debug.exe, которая понимает наоборот незашифрованные файлы сценария: (message, map, actions, items, intro). Чтобы при отладке лабиринта их не нужно было компилировать после каждой отладки, компилировать, и подставлять quest.exe, чтобы тот мог их интерпретировать. Это утомительно – каждый раз компилировать. Таким образом, усли quest_debug.exe подсунуть зашифрованные сценарии, то игра тоже работать не будет, т.к. quest_debug.exe не будет их расшифровать и будет видеть в них абракадабру, как и пользователь. Так что следует различать. Когда вы отладили и написали весь лабиринт, то сохраните эти файлы в надёжном месте, как и исходные тексты программы. Это ваша исключительная прерогатива – иметь исходники лабиринта, чтобы их смотреть, исправлять… Конечному пользователю следует предоставить папку с файлами: quest.exe, зашифрованными файлами сценария: message, map, actions, items, intro и, может быть, с каким-то вашим readme файлом. Чтобы из нормальных читабельных файлов (исходников лабиринта) получить зашифрованные, нужно их откомпилировать. Для этого: 1) поместите в одну папку quest.exe и все 5 исходных текстовых файлов лабиринта : (message, map, actions, items, intro). 2) Запустите quest.exe с ключиком командной строки compile: .\> quest.exe compile 3) Все 5 исходных файлов будут автоматически откомпилированны и помещени соответственно в файлы: message.enc, map.enc, actions.enc, items.enc, intro.enc, текст в который уже нельзя читать глазами, но только quest.exe. 4) Далее следует удалить файлы message, map, actions, items, intro из этой папки и переименовать message.enc, map.enc, actions.enc, items.enc, intro.enc в message, map, actions, items, intro. 5) Всё. Вы получили рабочую распространяемую версию вашего квеста.