Kyrandia 1/2 DIALOGS, формат .EMC |
Добро пожаловать, гость ( Вход | Регистрация )
Kyrandia 1/2 DIALOGS, формат .EMC |
-=CHE@TER=- |
Jul 24 2006, 18:21
Сообщение
#1
|
Walter Sullivan Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) |
Я когда-то написал к нему редактор, но тех полей, которые я редактировал, было явно мало, как оказалось в последствии работы над переводом, для нормальной работы игры.
Вот, что я когда-то писал товарищу Siberian GRemlin, когда он просил меня разобраться с этим форматом (это мои соображения по формату - могут быть ошибки): QUOTE .EMC формат - сообщения в игре "Kyrandia I" (может в каких других играх Westwood) * Причечание: ВСЕ ЗНАЧЕНИЯ записаны в Motorola формате, т.е. если у тебя есть long значение: C: a = 0x12ABCDEF; Pascal: a:=$12ABCDEF; То при записе в файл оно ОБЫЧНО (Intel Byte Order) записывается так: EFCDAB12 т.е. задом наперёд. Motorola же пишет прямо: 12ABCDEF так что приходится их потом вручную "разворачивать". (не уверен, что не перепутал названия Intel и Motorola, но это не важно - главное понять суть этой записи) Итак, формат: 'FORM' (4 байта) - заголовок файла FSize (DWORD) - размер файла (здесь и далее в этом "развёрнутом" формате) 'EMC2ORDR' (8 байт) - EMC To Order - секция команд (order) (что внутри этой секции - я не знаю, скорее всего там и содержится эти самые координаты шрифта, его цвет, задержка на экране и прочее... я же её просто пропускаю, когда читаю, а когда пишу - тупо и мрачно переписываю из оригинального файла) OSize (DWORD) - её размер 'TEXT' (4 байта) - начало секции с текстом TSize (DWORD) - её размер (WORD) (2 байта) - далее идут 2-х байтовые слова содержащие смещение от начала секции 'TEXT' до каждого сообщения. >>> Небольшое отступление о том, как я считаю сколько строк в секции. >>> Дело в том, что я так и не нашёл ни одного поля, в котором прямо было бы >>> сказано, сколько строк-сообщений в файле. Так что я делаю так: >>> 1) Секция 'TEXT' состоит из слов (WORD - 2 байта), которые содержат >>> смещения каждого сообщения ОТ НАЧАЛА этой секции. >>> 2) Таким образом, нужно взять первое слово - узнаем сколько вообще занимают >>> ВСЕ двойные слова вообще (т.к. первое сообщение начинается СРАЗУ ЗА НИМИ). >>> 3) Теперь, если мы поделим это слово (которое, как стало видно, указывает >>> на количество ВСЕХ двойных слов) на 2, то получим количество ВСЕХ >>> СООБЩЕНИЙ в ней (и, естесственно, всех двойных слов, но тут нужно помнить >>> такую тонкость, что ПЕРВОЕ слово мы уже прочитали, так что неплохо было бы >>> для начала сделать Seek по файлу назад на 2 байта от текущей позиции). ASCIIZ - затем идут ASCIIZ строки (строки с завершающим нулём). --- Не забывай, что в ХВОСТЕ файла идёт секция 'DATA' (похоже она тоже несёт часть нагрузки секции 'EMC2ORDR'), так что НЕ ЗАБЫВАЙ добавить её в конец файла, который записываешь (сколько взял, столько и положи обратно). Секция 'DATA' в таком же формате - строка ('DATA') + размер секции (DWORD), но я предпочитаю не заморачиваться, а просто смотреть - есть у файла хвост (хвост - всё, что идёт после секции 'TEXT') или нету, и если есть - то неважно что там лежит - просто копирую в конец выходного файла --- ЕЩЁ ОДНО ВАЖНОЕ ЗАМЕЧАНИЕ: кое-каких секций в файле может не быть. Например, 'TEXT' - тогда в файле редактировать нечего. The End. -=CHE@TER=- 27.07.2005 Вот оригинальные английские тексты в формате .EMC вметсе с .EXE файлом игры от первой части (тоже мне когда-то выслал Siberian GRemlin): kyr1eng.zip (198.291 байт) Если хоть чем-то сможете помочь - будет очень здорово! P.S. Прошу не обращать особого внимания на слова в описании записанные ЗАГЛАВНЫМИ буквами - у меня привычка так выделять важные места. (*улыбается*) |
Siberian GRemlin |
Aug 1 2006, 10:31
Сообщение
#2
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
Я не перестаю удивляться тому, что порой всё так рядом лежит, а найти не можешь. Совершенно случайно наткнулся на одном форуме: http://www.republika.pl/minniatian/Dune2/INDEX.HTM
-=CHE@TER=- Сможешь посмотреть и разобраться?! Я пробовал декодировать файлы из первой Кирандии, он много всего делает, но декодированный файл так и не создаёт =( |
-=CHE@TER=- |
Aug 1 2006, 16:03
Сообщение
#3
|
Walter Sullivan Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) |
Siberian GRemlin!
Как время появится. Увы, в сутках по прежнему 24 часа - я уже хронически не высыпаюсь... А мне ещё редактор шрифтов домучить нужно. Вчера до 5 часов правил гостевую CTPAX-X и админку. А в 8 - встал... Выспался, что называется. Кхех... |
Siberian GRemlin |
Aug 12 2006, 03:30
Сообщение
#4
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
-=CHE@TER=-
Вроде бы ничего не было упущенно при написании твоего редактора. Вот информация: QUOTE Description of file format Contrary to most file formats, all words in emc-files are read in human readable order. So the value 141h is stored as 0141 instead of 4101. Header: offset length description 0h 4h always 'FORM' 4h 4h File length 8h 4h always 'EMC2' After that different sections follow. Each section starts with a name of 4h bytes, followed by a section length of 4h bytes. Section name description ORDR a list of script offsets , each of size 2h. Each offset is relative to the data section and has to be multiplied by 2h. The first offset is in most cases larger than zero because the first part of the script is reserved for functions called by the event scripts. TEXT A list of \0 terminated text strings DATA Containts the opcodes for the scripts The DATA section contains codes chunked in groups of two bytes. Based on the code the command and parameter are determined. condition command parameter bit Fh is set 0h code & 7FFFh bit Eh is set (code >> 8h) & 1Fh code & FFh bit Dh is set (code >> 8h) & 1Fh (next code) The command/parameter pairs form a script of opCodes: command parameter pseudo-assembler statement description 0h - jmp <param> Jumps to DATA offset (<param> * 2h). Also used as call-statement, if proceded by command 2h (param = 1h). 1h - mov returnValue, <param> Sets the return value to <param>. Normally called before a return statement. 2h 0h push returnValue Used after a function call to retrieve the function's return value 2h 1h push returnLocation Used just before a function is called so that the interpreter will know where to return to after the function has returned. 3h / 4h - push <param> Push <param> on the stack. 5h - push global_var[<param>] Push a global variable on the stack 6h - push local_var[<param>] Push a local variable on the stack 7h - push arg[<param>] Push an argument passed to a function on the stack 8h 0h pop returnValue Get the returned value of a function right after the function call. 8h 1h retf Used at the end of a function. Returns to the position after the function call. If it's already at the highest level, the script will end. 8h >1h - Ends the script. 9h - pop global_var[<param>] Sets a global variable with a value from the stack. Ah - pop local_var[<param>] Sets a local variable with a value from the stack Bh - pop arg[<param>] Sets an argument passed to a function with a value from the stack. So arguments passed to a function are not read only. Ch - dec SP, <param> Used at the start of a function to reserve <param> stack space for local variables. Dh - inc SP, <param> Used at the end of a function to free <param> stack space disposing the local variables. Eh - call function[<param>] Calls an internal function (can be basically everything), using the parameters currently in the stack. See {A list of functions} Fh - pop tmp cmp tmp, 0 jz <param> Jump if the value from the stack equals 0h. 10h 0h pop tmp push !tmp Reverse the validity of the top stack value 10h 1h pop tmp neg tmp push tmp Reverse the sign of the top stack value 10h 2h pop tmp not tmp push tmp Apply a logical NOT to the top stack value 11h 0h pop x pop y push x && y Apply a logical AND 11h 1h pop x pop y push x || y Apply a logical OR 11h 2h pop x pop y push x == y Compare two values 11h 3h pop x pop y push x != y Compare two values and negate the result 11h 4h pop x pop y push x > y Check if the first value is greater than the second 11h 5h pop x pop y push x >= y Check if the first value is greater than or equal the second 11h 6h pop x pop y push x < y Check if the first value is less than the second 11h 7h pop x pop y push x <= y Check if the first value is less than or equal the second 11h 8h pop x pop y push x + y Add two values 11h 9h pop x pop y push y - x Substract two values 11h Ah pop x pop y push x * y Multiply two values 11h Bh pop x pop y push y \ x Divide two values 11h Ch pop x pop y push y >> x Shift y, x positions to the right (equals y / 2^x) 11h Dh pop x pop y push y << x Shift y, x positions to the left (equals y * 2^x) 11h Eh pop x pop y push y & x Perform a bitwise AND 11h Fh pop x pop y push y | x Perform a bitwise OR 11h 10h pop x pop y push y % x Calculate the remainder of a division of y / x 11h 11h pop x pop y push y ^ x Perform a bitwise XOR 12h - pop tmp mov returnValue, tmp pop tmp jmp tmp Return and pass a value back. |
-=CHE@TER=- |
Aug 12 2006, 07:43
Сообщение
#5
|
Walter Sullivan Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) |
-=CHE@TER=- Вроде бы ничего не было упущенно при написании твоего редактора. Вот информация: Угу, кстати, в твоём описании написано "TEXT A list of \0 terminated text strings", т.е. списко ASCIIZ строк. А на самом деле перед ним ещё идут их смещение - что тут не упомянуто. Возможно форматы немного разные. Вот - на уже упомянутом в разделе "Ссылки" форуме сайта SCUMM я пытался попросить описание формата .EMC от первой Кирандии (они сделали её римейк под Windows): http://forums.scummvm.org/viewtopic.php?p=11969 Увы, видимо, меня никто не услышал. В принципе, там есть исходные коды в свободном доступе - но рыться в них... нет уж - увольте. |
Siberian GRemlin |
Aug 12 2006, 15:30
Сообщение
#6
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
Думаю, толку от SCUMM нет, т.к. они читают из EMC и не более, а это мы и так умеем...
|
Siberian GRemlin |
May 21 2007, 07:26
Сообщение
#7
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
Я решил проблему и написал заново редактор. Проблема была в том, что когда меняем длину строк и секция DATA после сохранения начинается с нечётной позиции в файле игра виснет. Решение: Надо просто писать нулевой байт перед ней, не меняя никакие заголовки и таблицы в начале файла, и всё.
|
Упрощённая версия | Сейчас: 22nd September 2024 - 14:41 |