Перейти к содержимому


San'OG

Регистрация: 29 Dec 2009
Offline Активность: 12 Jan 2011 01:08
-----

Мои темы

Mafia 2 - разбор ресурсов

13 August 2010 - 17:59

Поиграл в демо версию, понравилось. Кстати копался в ресурсах игры. Почти все ресурсы хранятся в sds файлах, которые запакованные в zlib формат потоком по 16 КБ. Также в конце каждого sds файла содержиться XML файл, содержаший информацию о типах, именах и размерах ресурсов. Особый интерес к файлам в папке "\pc\sds\missionscript". Там в sds-файлах есть скомпилированные Lua скрипты версии 5.1. Движок использует открытые библиотеки Physfs, Zlib, Lua. Разархивировав файл, попробывал декомпилировать скрипт M05ListOfParts.luac из файла m05main.sds, но возникали ошибки, так как оказалось, что там используется слегка измененная модификация Lua. Первое отличие, которое пока что удалось установить, что тип Number использует не double, а float. Вот сижу правлю исходники декомпилятора luadec. Кстати вот кусок кода, который удалось получить из файла M05ListOfParts.luac:

DecompiledFunction = function(l_1_0)
  if game.datastore:IsVariableExist("CON_DEMO") == false then
	player = game.game:GetActivePlayer()
	player:InventoryAddItem(55)
	game.speech:LoadStage(60)
	idMessages = common.messages.Id
	questComM05 = Lokace.Create(idMessages.Distillery, idMessages.QuestDirector)
	game.datastore:SetBool("tempDemoStart", true)
	kteryPartik = game.datastore:GetNumber("missionPart")
	kteraJeMise = game.datastore:GetNumber("missionNumber")
	player:SetFightAbility(false, enums.FightAbility.COUNTER)
	player:SetFightAbility(false, enums.FightAbility.COMBO)
	if kteryPartik == 1 then
	  M05Part1(l_1_0)
	elseif kteryPartik == 2 then
	  M05Part2(l_1_0)
	elseif kteryPartik == 3 then
	  M05Part3(l_1_0)
	elseif kteryPartik == 4 then
	  M05Part4(l_1_0)
	elseif kteryPartik == 5 then
	  M05Part5(l_1_0)
	elseif kteryPartik == 6 then
	  M05Part6(l_1_0)
	elseif kteryPartik == 7 then
	  M05Part7(l_1_0)
	elseif kteryPartik == 8 then
	  M05Part8(l_1_0)
	elseif kteryPartik == 9 then
	  M05Demo(l_1_0)
	elseif kteryPartik == 10 then
	  M05DemoDistFlat(l_1_0)
	end
  end
end)

Там в демке много таких скриптов (336).
Скачать их все можно отсюда:
http://www.mediafire...0z4b0ktomibb1yx

Так вот может у кого есть опыт работы с Lua скриптами и их модификациями. Может кто увидит в них чью-то модификацию с открытым кодом? Или поможет написать декопмилятор?