эхх, у меня тут загруз небольшой, но я-таки нашел время покопаться немного с декомпилером =)
кстати, на К3 он работает не очень стабильно:
- не распаковывает TLK (что объяснимо - у них теперь другой формат, не PAK - без имен файлов внутри)
- при попытке распаковать fmc/gmc: говорит о Exception RestoreAllObjectBackgrounds(System.Collections.Generic.List`1[System.String]) != 5 args
- почему-то остаются push-и в скриптах MR (например, в darms_emc.c):
- Код: Выделить всё
push 198
setGameFlag();
push 199
resetGameFlag();
push 200
resetGameFlag();
push 201
resetGameFlag();
А из пожеланий - было бы круто, если бы было автоопределение типов параметров авто-функций. Например, в таком участке кода
- Код: Выделить всё
auto func_033C(...)
{
if ((((CountItemInInventory(unk: 0, item: arg1) || CheckForItem(Scene.Bridge, item: arg1)) || CheckForItem(Scene.Tree, item: arg1)) || CheckForItem(Scene.Foot, item: arg1)) || CheckForItem(Scene.Tram, item: arg1))
{
return 1;
}
return 0;
}
auto func_0388(...)
{
if (!gVar5)
{
if (!func_033C(168) && !QueryGameFlag(Flag.477))
{
DefineItem(Item.Pinecone, x: 173, y: 55, Scene.Tree);
}
}
return;
}
можно, проанализировав аргументы каждой функции, посмотреть, какой тип имеет этот аргумент при обращении к системному вызову: в func_033C видно, что есть один аргумент, причем в сисколлы он передается на месте параметра "item", имеющий, очевидно, тип Item. Так что прототип func_033C() можно зарегистрировать как func_033C(item), а не func_033C(short), и тогда при декомпилинге func_0388() вызов func_033С(168) в if-е можно будет упростить, подставив туда что-то из набора Items.
А, вот еще)) сравнения типа GetZanthiaScene() == 8 можно маппить к названиям сцен =)
Теперь о том, что я планировал сделать и что сделал)
до tim-скриптов я пока не добрался, зато проглядел все глобальные переменные и места, где они встречаются.
Вот какие переменные есть в скриптах (кроме gScene и подобных):
K1: 3, 6, 7, 8, 15-19
K2: 3, 5, 6, 15-20, 27, 28
K3: 3, 5, 6, 15-25
gVar3 - это очень часто используемый bool. Вероятно, он как-то связан с диалогами или видео, например, блокирует действия пользователя во время диалога или что-то подобное;
gVar5 в К2 - bool, похоже, это shareware-режим, но не факт;
gVar5 в К3 - bool, проверяется только в одном месте - в тюрьме, где зачем-то перекладываются ножницы в их исходное место;
gVar6 в К1 - это нажатый камень на амулете, имеет 4 значения: Heal, Invis, Will-o-Wisp, Dispell;
gVar6 в К2 - bool, если при старте игры не 0, то блуберрей в доме и вне дома не будет. Зачем это нужно, я не знаю));
gVar6 в К3 - bool, в зависимости от него, если он 0, то в начале игры генерятся ножницы, резак в тюрьмах, флакончик где-то и мачете в форте; при load game делается 1, во всех остальных случаях - 0;
gVar7 в K1 - bool? Никогда ничего не присваивается в emc; всегда ноль, но в scumme упоминается как некое brandonAlive, меняется в enterNewScene;
gVar15 и более - это, например счетчики, чтобы персонаж говорил разные слова при кликании на один предмет, или вот например gVar18 в alley.emc (но не в других файлах - там он reused) запоминает, что было положено осьминогу в ракушку. gVar27 определяет реакцию Занции на ножницы, а gVar28 - объект, соответствующий одному из Фаунов в доме Занции (их там 4, но одновременно есть только один). В K3 gVar21-25 используются только на пиратском корабле, 17-20 редко, особо широко юзаются 15 и 16.
gVar8 в K1 - это тоже счетчик, используется при смерти в пещерах.
Насчет TRE/TRF/TRG: формат я описывал выше (там short кол-во элементов, затем таблицы ID, смещений и собственно asciiz-строк), и в следующих функциях (это выдержка из моего kyra_funcs.txt):
- Код: Выделить всё
o3_showSceneFileMessage i ; (string_id) may be mapped to _scenesFile[id]
o3_objectChat i ; (string_id) may be mapped to _actorFile[id] (only for _ACTOR.EMC) or _sceneStrings[id] (any other script)
o3_npcChatSequence ii ; (seq_id?, string_id) - last may be mapped to _sceneStrings[id]
o3_badConscienceChat i ; (string_id) can be mapped to a string in some buffer
o3_updateScore rii ; (score_id, score_string_id) last parameter could be mapped to strings in SCORE.TRE(TRF,TRD); returns 1 if score is o3_showSceneStringsMessage i ; (string_id) can be mapped to _sceneStrings[id]
o3_goodConscienceChat i ; (string_id) may be mapped to _actorFile[id] (only for _ACTOR.EMC) or _sceneStrings[id] (any other script)
o3_customChat ii ; (string_id, object) - first may be mapped to _sceneStrings[id]
строки подставляются по ID в соответствующих параметрах.
Еще пока я не успел разобраться с TIM-файлами, а также задумался над форматом DAT-файлов (они явно задают какие-то параметры сцен), но пока не разобрался с ним.