IPB

Добро пожаловать, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Kyrandia 1/2 DIALOGS, формат .EMC
-=CHE@TER=-
Jul 24 2006, 18:21
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,353
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Я когда-то написал к нему редактор, но тех полей, которые я редактировал, было явно мало, как оказалось в последствии работы над переводом, для нормальной работы игры.
Вот, что я когда-то писал товарищу 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. Прошу не обращать особого внимания на слова в описании записанные ЗАГЛАВНЫМИ буквами - у меня привычка так выделять важные места. (*улыбается*)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Aug 1 2006, 10:31
Сообщение #2


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Я не перестаю удивляться тому, что порой всё так рядом лежит, а найти не можешь. Совершенно случайно наткнулся на одном форуме: http://www.republika.pl/minniatian/Dune2/INDEX.HTM

-=CHE@TER=-
Сможешь посмотреть и разобраться?!
Я пробовал декодировать файлы из первой Кирандии, он много всего делает, но декодированный файл так и не создаёт =(
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Aug 1 2006, 16:03
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,353
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Siberian GRemlin!
Как время появится. Увы, в сутках по прежнему 24 часа - я уже хронически не высыпаюсь... А мне ещё редактор шрифтов домучить нужно. Вчера до 5 часов правил гостевую CTPAX-X и админку. А в 8 - встал... Выспался, что называется. Кхех...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Aug 12 2006, 03:30
Сообщение #4


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 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.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Aug 12 2006, 07:43
Сообщение #5


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,353
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



QUOTE(Siberian GRemlin @ Aug 12 2006, 03:30 AM) *
-=CHE@TER=-
Вроде бы ничего не было упущенно при написании твоего редактора. Вот информация:

Угу, кстати, в твоём описании написано "TEXT A list of \0 terminated text strings", т.е. списко ASCIIZ строк. А на самом деле перед ним ещё идут их смещение - что тут не упомянуто. Возможно форматы немного разные.
Вот - на уже упомянутом в разделе "Ссылки" форуме сайта SCUMM я пытался попросить описание формата .EMC от первой Кирандии (они сделали её римейк под Windows):
http://forums.scummvm.org/viewtopic.php?p=11969
Увы, видимо, меня никто не услышал.
В принципе, там есть исходные коды в свободном доступе - но рыться в них... нет уж - увольте.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Aug 12 2006, 15:30
Сообщение #6


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Думаю, толку от SCUMM нет, т.к. они читают из EMC и не более, а это мы и так умеем...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
May 21 2007, 07:26
Сообщение #7


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Я решил проблему и написал заново редактор. Проблема была в том, что когда меняем длину строк и секция DATA после сохранения начинается с нечётной позиции в файле игра виснет. Решение: Надо просто писать нулевой байт перед ней, не меняя никакие заголовки и таблицы в начале файла, и всё.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 28th March 2024 - 14:45