Компилятор EMC

Творчество, посвященное Кирандии.

Компилятор EMC

Сообщение Reflector » 16 ноя 2014, 04:45

Итак, свершилось :) Пока в очень усеченном варианте, но сегодня я смог скомпилировать самый простой скрипт из K1 - _startup.emc. В нем была только одна глобальная функция(и несколько локальных, но они не использовались, потому были выкинуты, а скрипт похудел в 2 раза), потому можно было обойтись вообще без функций, и в нем нет условных операторов или циклов, которые пока не работают. Также я запихнул в вазу ключ вместо яблока и проверил, что в игре все работает. А вот и сам код:

Код: Выделить всё
int gScene, gCursorX, gCursorY, gVar3, gCursorItem, gVar5, gAmuleteState, gVar7, gVar8;

SetItemInMarbleVase(38);
SetGameFlag(55);
SetGameFlag(57);
SetGameFlag(172);
gVar8 = 0;
PlaceCharacterInOtherScene(2, 7, 224, 95, 5, 88);
PlaceItemInOffScene(0, 248, 86, 0);
PlaceItemInOffScene(27, 128,128, 30);
PlaceItemInOffScene(25, 115, 115, 17);
PlaceItemInOffScene(22, 120, 102, 110);
PlaceItemInOffScene(4, 78, 58, 113);
PlaceItemInOffScene(4, 216, 104, 113);
PlaceItemInOffScene(57, 200, 78, 198);
PlaceItemInOffScene(38, 82, 134, 37);
PlaceItemInOffScene(102, 158, 92, 129);
PlaceItemInOffScene(102, 158, 92, 153);
PlaceItemInOffScene(102, 301, 111, 110);
PlaceItemInOffScene(102, 158, 92, 161);
PlaceItemInOffScene(102, 159, 92, 184);
SetBirthstoneGem(0, 12);
SetBirthstoneGem(1, GetRand( 0, 3));
SetBirthstoneGem(2, GetRand( 7, 11));
SetBirthstoneGem(3, 6);
PlaceItemInGenericMapScene(8, GetRand(0, 1));
PlaceItemInGenericMapScene(1, GetRand(0, 1));
PlaceItemInOffScene(0, 92, 94, 112);
PlaceItemInOffScene(0, 117, 101, 112);
PlaceItemInOffScene(0, 213, 109, 112);
PlaceItemInOffScene(0, 239, 96, 112);
SetIdolGem(0, 0);
SetIdolGem(1, 0);
SetIdolGem(2, 0);
SetGameFlag(0);
SetGameFlag(1);
SetGameFlag(2);
SetGameFlag(3);
SetGameFlag(4);
SetGameFlag(72);
SetGameFlag(73);
SetGameFlag(74);
SetGameFlag(75);
SetGameFlag(17);
SetGameFlag(18);
SetGameFlag(19);
SetGameFlag(20);
SetGameFlag(21);
SetGameFlag(22);
SetGameFlag(23);
SetGameFlag(24);
SetGameFlag(25);
SetGameFlag(26);
SetGameFlag(27);
SetGameFlag(28);
SetGameFlag(29);
SetGameFlag(30);
SetGameFlag(31);
SetGameFlag(32);
SetGameFlag(33);
PlaceItemInOffScene(56, 28, 93, 226);
PlaceItemInOffScene(34, 67, 79, 223);
PlaceItemInOffScene(45, 160, 29, 225);
PlaceItemInOffScene(36, 240, 118, 208);
return;


Думаю в течении нескольких недель добавлю функции, локальные переменные, условия и циклы, тогда и выложу. После этого займусь перечислениями, чтобы можно было писать Item.Apple, а не 38...

ps. Принимаются списки известных багов которые можно исправить ковырянием в скриптах :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Siberian GRemlin » 18 ноя 2014, 00:31

Молодец!
Siberian GRemlin
(1) Пират с острова Котов
 
Сообщения: 60
Зарегистрирован: 12 апр 2009, 10:24
Откуда: г. Красноярск
Любимая часть Кирандии: каждая
Любимые персонажи Кирандии: Зантия и многие другие
Почему Вы любите Легенду о Кирандии?: я не смог устоять перед волшебным миром

Re: Компилятор EMC

Сообщение Reflector » 18 ноя 2014, 21:26

Заработали функции, с аргументами и прототипами. Строки, русские и английские. Выражения теперь максимально сворачиваются, т.е. "10 * 5 - 4" превратится в 46, но из "a + 10 * 5 - 4" получается "a + 50 - 4", т.к. сложение и вычитание левоассоциативное. Оригинальный компилятор так делать не умел и мой декомпилятор иногда десятки инструкций сворачивает в одно число :) Теперь очередь за if_else и while, в принципе с ними уже можно скомпилировать любой кирандийский скрипт...

Код: Выделить всё
int rand(int val);

int sum(int a, int b)
{
   return a + b;
}

void test()
{
   int a, b, c;
   
   a = 10;
   b = 6;
   c = sum(a * a, b * b);
}

extern int OnSceneStart()
{
   int delay;
   
   delay = rand(5) + 100 * 5;
   CharacterSays(9, "Must be fixed now!", 0, -2);
   Message(21, "Лесной алтарь", 179);
   return QueryGameFlag(28);
}

int rand(int val)
{
   return GetRand(0, val);
}
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Reflector » 22 ноя 2014, 04:00

Выкладываю первый публичный билд, добавлены enum и include, для K1 в хедере прописана большая часть известных констант. Теоретически если прописать другие константы и функции, то можно скомпилировать хоть скрипт от Dune, в самом компиляторе ничего менять не придется. Также с компилятором идет обновленная версия декомпилятора и _startup.с, который запускается один раз в начале игры и в котором гранат на столе у Каллака заменен статуэткой. После компиляции _startup.emc нужно положить рядом с Main.exe и тогда DosBox должен его подхватить... Если меня не будут сильно отвлекать, то к концу следующей недели должен доделать остальное, останутся только багофиксы :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Reflector » 24 ноя 2014, 17:03

Добавлены if, else, while, break и continue, перекомпилирован street.emc(перекресток перед тюрьмой в K2), убран известный баг с ходьбой. Также если задокументировать опрос QueryGameFlag(3) в обоих функциях CursorIntersect, то включается обводка прямоугольниками активных областей. На очереди цикл for и elif, но уже должно компилировать все, т.к. декомпилятор его все равно пока не понимает, как и break с continue. Ну и нормальная обработка ошибок пока слабое место...

Качаем и вспоминаем какие еще баги в игре хотелось исправить :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Reflector » 26 ноя 2014, 16:09

Добавил else if.
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Reflector » 27 ноя 2014, 22:35

Заработал for, похоже в оригинале только этот цикл и был. Дальше разве что косметические изменения, может сделаю чтобы можно было объявлять переменные в любом месте, а не только в начале функции...
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Малкольмович » 02 дек 2014, 09:01

Я уже писал в соседней теме - но повторюсь) я о таком даже и не мечтал (ну вернее, мечтал, но был уверен, что это не сбудется =)

Вот интересно, какие возможности теперь перед нами открываются - если взять старые арты, но тотально переработать скрипты (придумав новую последовательность квестов) и сделать все на том же движке - это, пожалуй, можно будет назвать (вожделенной) четвертой кирандией =)

Кажется, я знаю, чем я займусь, когда допереведу Heroine's Quest =)
Аватара пользователя
Малкольмович
(4) помощник Мистика
 
Сообщения: 293
Зарегистрирован: 22 дек 2011, 22:09
Любимая часть Кирандии: Hand of Fate, а точнее, Darkmoor Swamp из неё =)
Любимые персонажи Кирандии: Занечка всех порулит =)
Почему Вы любите Легенду о Кирандии?: это мир, в котором можно жить, а не в который играть)

Re: Компилятор EMC

Сообщение Reflector » 02 дек 2014, 14:44

Малкольмович писал(а):Вот интересно, какие возможности теперь перед нами открываются - если взять старые арты, но тотально переработать скрипты (придумав новую последовательность квестов) и сделать все на том же движке - это, пожалуй, можно будет назвать (вожделенной) четвертой кирандией =)

Я думал о том, что в той же К1 можно немного улучшить графическую составляющую ближе к концу игры, когда одни и те же фоны повторяются по десятку раз и анимация практически отсутствует. В одном месте даже переходишь на следующий экран, а там точно такой же фон, можно же на него хоть какой-то камень положить :) Или в замке, где все статично, повесить на стены горящие факелы. Так же в обоих частях есть заблокированные участки кода. В K1 на некоторых сценах Брендон должен произносить некоторые фразы и там все прописано и есть соответствующие звуки, но эти точки недостижимы, т.к. глобальный скрипт все перехватывает на себя. Еще, возможно, стоит заблокировать использование зелья не дающее возможности вернуться с острова, если в наличии не все предметы нужные для прохождения...

ps. Вчера выложил апдейт, заработали ++, -- и все операции из серии +=, *=. Также была задействована новая инструкция установки возвращаемого из функций значения, которая в оригинальных скриптах не использовалась. Если возвращается байт, то его можно записать в retValue одной командой, вместо более универсальной последовательности push и pop.
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Малкольмович » 23 янв 2015, 01:03

Ну это да, мега-патч к Кирандиям, который бы блочил dead-end-ы - очень хорошая идея =) (наверное, пожалуй, все умудрялись кидать ложку в лаву в Вулкании и потом уныло летать над дорожками в попытках хоть что-то сделать =))

И фоны, кстати, тоже да (хотя, вон в Heroine's Quest в Свартальфхейме та же самая ситуация - да и вообще, кажется, в любом квесте, где встречаются лабиринты, мало кто рисует уникальный фон для каждой точки лабиринта)... Впрочем, эти фоны надо еще нарисовать, причем, в том же стиле.
Факелы - крутая идея =)
Аватара пользователя
Малкольмович
(4) помощник Мистика
 
Сообщения: 293
Зарегистрирован: 22 дек 2011, 22:09
Любимая часть Кирандии: Hand of Fate, а точнее, Darkmoor Swamp из неё =)
Любимые персонажи Кирандии: Занечка всех порулит =)
Почему Вы любите Легенду о Кирандии?: это мир, в котором можно жить, а не в который играть)

Re: Компилятор EMC

Сообщение Reflector » 05 фев 2015, 19:58

Малкольмович писал(а):Ну это да, мега-патч к Кирандиям, который бы блочил dead-end-ы - очень хорошая идея =) (наверное, пожалуй, все умудрялись кидать ложку в лаву в Вулкании и потом уныло летать над дорожками в попытках хоть что-то сделать =))

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

И фоны, кстати, тоже да (хотя, вон в Heroine's Quest в Свартальфхейме та же самая ситуация - да и вообще, кажется, в любом квесте, где встречаются лабиринты, мало кто рисует уникальный фон для каждой точки лабиринта)... Впрочем, эти фоны надо еще нарисовать, причем, в том же стиле.
Факелы - крутая идея =)

Рисовать у нас особо некому, но можно скомбинировать части уже имеющихся фонов :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Reflector » 19 фев 2015, 03:11

Небольшой апдейт. Переменные теперь можно объявлять где угодно, а не только в начале функций, и сразу инициализировать. В объявлении функций больше нет необходимости и функции теперь можно перегружать.
А с ложкой все оказалось сложнее, ее еще можно сбросить на лаву сверху или просто кинуть в котел. Бросание предметов на землю теоретически можно заблокировать из скриптов, за что, как выяснилось, отвечает переменная gCursorState(также она отвечает пойдет ли персонаж на клик, если в руках ничего нет), а с котлом вроде как ничего не поделать :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Малкольмович » 07 май 2015, 01:47

а запрет на бросание в котёл, например, алхимического магнита, как я понимаю, это специфика exe-шника?
тогда да, именно этот конкретный вариант прийти к dead-end-у не заблокируешь(
хотя, отыскать в exe таблицу запрещённых предметов и... Впрочем, это, кажется, вряд ли решаемая задача(
Аватара пользователя
Малкольмович
(4) помощник Мистика
 
Сообщения: 293
Зарегистрирован: 22 дек 2011, 22:09
Любимая часть Кирандии: Hand of Fate, а точнее, Darkmoor Swamp из неё =)
Любимые персонажи Кирандии: Занечка всех порулит =)
Почему Вы любите Легенду о Кирандии?: это мир, в котором можно жить, а не в который играть)

Re: Компилятор EMC

Сообщение Siberian GRemlin » 22 май 2015, 10:52

Reflector, у меня такой вопрос или даже запрос. В исполнительном файле первой части зашит сценарий вступительного ролика, в формате слегка отличном от EMC, как я понял. И во вступлении субтитров меньше чем вступительной речи, я бы хотел добавить недостающие строки. Насколько возможно создание компилятора и декомпилятора под этот байт-код?
Siberian GRemlin
(1) Пират с острова Котов
 
Сообщения: 60
Зарегистрирован: 12 апр 2009, 10:24
Откуда: г. Красноярск
Любимая часть Кирандии: каждая
Любимые персонажи Кирандии: Зантия и многие другие
Почему Вы любите Легенду о Кирандии?: я не смог устоять перед волшебным миром

Re: Компилятор EMC

Сообщение Reflector » 23 май 2015, 14:15

В K1 два формата скриптов(вторые в *.dat), делать третий ради вступительного ролика не было никакого смысла. Сабы для вступления зашиты в exe-ик, все остальное наверняка в нем же, так что вряд ли можно что-то сделать... Единственное перспективное направление - доработка самих скриптов, но мне нужен список багов :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Siberian GRemlin » 24 май 2015, 20:57

Что мешает извлечь сценарий вступления изменить и вставить назад? В «ScummVM» он извлечён и лежит в kyra.dat (обычный PAK), который в последних версиях вшит в ехе «ScummVM».
Siberian GRemlin
(1) Пират с острова Котов
 
Сообщения: 60
Зарегистрирован: 12 апр 2009, 10:24
Откуда: г. Красноярск
Любимая часть Кирандии: каждая
Любимые персонажи Кирандии: Зантия и многие другие
Почему Вы любите Легенду о Кирандии?: я не смог устоять перед волшебным миром

Re: Компилятор EMC

Сообщение Reflector » 24 май 2015, 23:24

Проблема как минимум в том, что если я добавлю к скрипту вытянутому из экзе новые команды, то он станет больше и без глобального сдвига я его обратно не вставлю, причем будет и второй сдвиг в месте, куда добавится сам текст новых субтитров.
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Siberian GRemlin » 25 май 2015, 09:00

Там текст идёт отдельно, на него легко правятся указатели. На сам сценарий тоже должен быть указатель, который также легко изменить. В общем, как впихнуть назад это моя забота. Мне главное иметь возможность изменить сам сценарий.
Siberian GRemlin
(1) Пират с острова Котов
 
Сообщения: 60
Зарегистрирован: 12 апр 2009, 10:24
Откуда: г. Красноярск
Любимая часть Кирандии: каждая
Любимые персонажи Кирандии: Зантия и многие другие
Почему Вы любите Легенду о Кирандии?: я не смог устоять перед волшебным миром

Re: Компилятор EMC

Сообщение Reflector » 25 май 2015, 16:34

У тебя четверть экзешника вниз сдвинется, править придется намного больше... В любом случае я уже со скриптами разобрался. В исходниках скумма есть файл lok_dos_cd.h в котором эти вытянутые из экзе скрипты прописаны в виде массивов и я написал простенький парсер для них. Вот нужный тебе скрипт(Malcolm the Jester has broken free!), речь там выводится по индексу из Intro.vrm при помощи команды playVocFile и субтитры там действительно не прописаны. Но они есть в других скриптах:

Код: Выделить всё
// 22 15
playVocFile 21
// 13 18 50 00 2D 05
printTalkText 24 80 0 45 5
...

Первый параметр printTalkText - это индекс для сабов(остальные 4 параметра везде одинаковые), значит нужно дописать к уже существующему блоку с текстом недостающие субтитры и добавить команды printTalkText для каждого playVocFile. Находишь по коду позицию, вставляешь 6 байт, выйдет быстрее, чем мне ради десятка субтитров писать прогу компилирующую все обратно :)
Reflector
(2) Житель Милтонии
 
Сообщения: 163
Зарегистрирован: 11 сен 2010, 16:44
Любимая часть Кирандии: 2
Любимые персонажи Кирандии: Занция
Почему Вы любите Легенду о Кирандии?: Ностальгия...

Re: Компилятор EMC

Сообщение Siberian GRemlin » 27 май 2015, 08:42

Не хочет отображаться. Вставлял сразу после первой фразы (playVocFile 55) и перед ней (думал, вдруг затирается анимацией). Менял индекс строки — не помогло. То что байт-код реально изменён проверил: сделал повтор произведения речи — работает.
Ещё бы знать за что отвечают остальные параметры. По идеи, там должны быть координаты, цвет и продолжительность отображения.
Siberian GRemlin
(1) Пират с острова Котов
 
Сообщения: 60
Зарегистрирован: 12 апр 2009, 10:24
Откуда: г. Красноярск
Любимая часть Кирандии: каждая
Любимые персонажи Кирандии: Зантия и многие другие
Почему Вы любите Легенду о Кирандии?: я не смог устоять перед волшебным миром

След.

Вернуться в Креатив

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1