Current time: 25.09.2018, 20:20 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Lua скрипты. Помощь и обсуждение
Author Message
Valery Offline

Posts: 1917
Post: #1

A new language to learn? cool)


Era mods and utilities
05.01.2018 20:19
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 10593
Post: #2

Lua is used in most games, like HMM 5 or Fallout. It's quite fast and expressive. All ERM features remain still. With Lua there is no border between scripts and plugins.

Code:
local NO_MON = -1

-- Given hero ID. Returns slot without creatures or false on failure
function findFreeSlot (heroId)
  erm.y[1] = heroId  

  for i = 0, 6 do -- repeat from 0 to 6
    erm.y[2] = i
    erm('HEy1:C0/y2/?y3/?y4')

    if y3 == NO_MON then
      return i
    end
  end

  return false
end

local freeSlot = findFreeSlot(0) -- find free slot for Orrin

if freeSlot then
  print('Found ' .. freeSlot)
else
  print('Not found ((')
end


Скачать Герои 3 Эра и всё, что с ней связано
05.01.2018 22:29
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline

Posts: 92
Post: #3

Поддержка хуков будет? Например, если картоделу понадобиться расширить таблицы для добавления новых героев в ERA (пример из WoG 3.59):

Code:
local function f_MainStructHeroes(define)
    SetCount(156)

    Array{0xA4}.array(0x334).u1  'HeroSetup'
    Ref{0x485C58, 0x485CB0, 0x4CDC31, 0x4CE581, 0x5029D9, 0x62C921, 0x62CAE1, 0x4CAAE2+2}
    
    Array{0x21620}.array(0x492).u1  'Heroes'
    Ref{0x402480, 0x40315E, 0x4035E2, 0x40625E, 0x406287, 0x4062A9, 0x4062BE, 0x407B1C, 0x407FFD, 0x4080EF, 0x408BFD, 0x408E2E, 0x408EA5, 0x40909A, 0x409264, 0x409A8D, 0x409B7F, 0x40A7F7, 0x40A9CC, 0x40AF7F, 0x40AFF8, 0x40B129, 0x40BBD7, 0x40DF89, 0x40E0F7, 0x40E4B0, 0x40E586, 0x40E5FF, 0x40E60A, 0x40E9A7, 0x40EC34, 0x40F10E, 0x40FCAB, 0x40FDBD, 0x41024D, 0x412CE3, 0x413787, 0x414558, 0x416530, 0x4165BD, 0x4167E2, 0x4168D3, 0x416FAE, 0x417120, 0x417641, 0x417B77, 0x417B7F, 0x418DE4, 0x418E4F, 0x419185, 0x4192D7, 0x419440, 0x4199F1, 0x4199F8, 0x41C4F1, 0x41C63F, 0x41C6B5, 0x41C7A7, 0x41C865, 0x41C946, 0x41CA59, 0x41D037, 0x41D25C, 0x41D547, 0x428178, 0x42980A, 0x42986F, 0x42B142, 0x42BB03, 0x42DEEB, 0x42EFB9, 0x42F6FA, 0x43145D, 0x4315CD, 0x431636, 0x4316ED, 0x4317EE, 0x431EEC, 0x43204B, 0x4331A6, 0x433B05, 0x4518D4, 0x453196, 0x4534D9, 0x453555, 0x47F120, 0x47F1DE, 0x47F4BC, 0x47F69D, 0x47FB8A, 0x47FF5B, 0x4801BD, 0x4803CD, 0x480647, 0x4806D5, 0x480B0D, 0x480FFD, 0x48124D, 0x4812E8, 0x4814CF, 0x4814D6, 0x4817CD, 0x48181F, 0x481911, 0x481981, 0x481AAF, 0x483C42, 0x483C49, 0x483C8C, 0x483CD1, 0x483F8E, 0x4860EB, 0x486BB3, 0x487655, 0x4896AF, 0x48971E, 0x49A2ED, 0x49B0E0, 0x49D449, 0x49D4AF, 0x49E042, 0x49E08B, 0x4A24A2, 0x4A3CAF, 0x4AA738, 0x4AAD36, 0x4AAE0F, 0x4AAF70, 0x4AAFFE, 0x4B262E, 0x4B8AC6, 0x4B9CCE, 0x4BA76A, 0x4BA7BE, 0x4BA8C9, 0x4BA93C, 0x4BA9A2, 0x4BAA08, 0x4BB185, 0x4BB307, 0x4BB49E, 0x4BC925, 0x4BD0AD, 0x4BE503, 0x4BF5A8, 0x4BF63C, 0x4BF862, 0x4BF94A, 0x4BFB49, 0x4BFDAA, 0x4BFF38, 0x4C0047, 0x4C6772, 0x4C6D12, 0x4C6D19, 0x4C709F, 0x4C70F2, 0x4C7163, 0x4C7922, 0x4C7D91, 0x4C7EF9, 0x4C8039, 0x4C80A1, 0x4C817B, 0x4C81C5, 0x4C820D, 0x4C824A, 0x4C82A8, 0x4C83A2, 0x4C83DC, 0x4C83E2, 0x4C8425, 0x4C8833, 0x4C89E1, 0x4C941F, 0x4C94BF, 0x4C94E5, 0x4C9EA8, 0x4CD8EA, 0x4CD9D6, 0x4CDE36, 0x4CE4FB, 0x4DA469, 0x4DE57F, 0x4DE61D, 0x4E18C8, 0x4E1ADA, 0x4E7718, 0x4E7FB8, 0x4E86DB, 0x4E87BF, 0x4E87D9, 0x4E8AC2, 0x4E8ADC, 0x4F1A4E, 0x4F26A9, 0x4F313D, 0x4F3192, 0x4F4A14, 0x4F4EDB, 0x4F53B6, 0x4F540F, 0x4F5484, 0x4FD246, 0x4FD2A8, 0x4FD2F6, 0x4FD381, 0x4FD4A4, 0x50609E, 0x5060EF, 0x51C910, 0x51CBB6, 0x51D5B9, 0x51F3C3, 0x51F68A, 0x51FA13, 0x51FAB0, 0x51FB2C, 0x52137E, 0x521641, 0x521744, 0x5217AC, 0x52189F, 0x5218D7, 0x52210E, 0x5222C0, 0x522982, 0x522ADA, 0x525744, 0x5257FE, 0x525953, 0x525E8A, 0x526529, 0x5267F8, 0x526C03, 0x526F45, 0x526FC3, 0x526FCA, 0x5270EA, 0x527E87, 0x52A1CC, 0x52A8B0, 0x52B1A7, 0x52B372, 0x52B492, 0x52B5DA, 0x557099, 0x5683A9, 0x569DB3, 0x56A899, 0x56E47B, 0x56E57C, 0x56E9A7, 0x5721AB, 0x5722AC, 0x572474, 0x582657, 0x582869, 0x58D57C, 0x58D69A, 0x5AEEFE, 0x5AEF26, 0x5BE412, 0x5BE4AB, 0x5BE685, 0x5BE68C, 0x5BE7C1, 0x5BE7F2, 0x5BE87E, 0x5BE89E, 0x5BE9A9, 0x5BF5AA, 0x5BF5F1, 0x5BFD45, 0x5BFD6C, 0x5BFE12, 0x5C1740, 0x5C17D5, 0x5C188E, 0x5C69E8, 0x5C6A15, 0x5C7256, 0x5C7294, 0x5C7376, 0x5C76A4, 0x5C76C4, 0x5C7E0D, 0x5C7EF0, 0x5C9BF0, 0x5CE9A0, 0x5CE9C4, 0x5D1D65, 0x5D223B, 0x5D31E9, 0x5D320C, 0x5D323B, 0x5D33E0, 0x5D34F2, 0x5D3516, 0x5D449C, 0x5D4519, 0x5D7DAC, 0x5D7E87, 0x5D80C6, 0x5D8442, 0x5D8483, 0x5D84F6, 0x5D8541, 0x5D8776, 0x5D8865, 0x5D89D9, 0x5D8AAE, 0x5DE4AE, 0x5DE510, 0x5DEF20, 0x5DF3E2, 0x5DF463, 0x5EA234, 0x5EA3B1, 0x5EA4AB, 0x5F1BA0, 0x5F1D0E, 0x5F1DE4, 0x5F1F6B, 0x5F7838, 0x5F78DD, 0x5F7CDD, 0x62C9C4, 0x62CB60}
    Ref{0x4BEF70, 0x4C76D9, 0x4C776A, 0x4CABA1, 0x4CAC57, 0x513ACC, 0x513CEA}
    Ref{0x4BFE10+2, 0x4BFE16+2, 0x4C9E87+3, 0x4D90A0+3, 0x4DA4FE+2, 0x4DA50F+3}
    
    Array{0x4DF18}.u1  'HeroOwner'
    Ref{0x412F1C, 0x485F40, 0x485F47, 0x485FE7, 0x4868E4, 0x486D34, 0x48752E, 0x4A3B38, 0x4A3CD5, 0x4BB192, 0x4BB20F, 0x4BB319, 0x4BB4B1, 0x4BD135, 0x4BD167, 0x4BD199, 0x4BE561, 0x4BFC46, 0x4BFDBA, 0x4C81D2, 0x4C821A, 0x4C8257, 0x4C8291, 0x4C83CC, 0x4C8714, 0x4C9E54, 0x4CE042, 0x4D7BBF, 0x4DA414, 0x4DA48C, 0x4DA495, 0x4DA4C2, 0x4DA500, 0x4DA512, 0x4F1A7C, 0x4F1A86, 0x502FC6, 0x502FDB, 0x56AF42, 0x577A51, 0x577A5F, 0x580A7E, 0x58360C, 0x5838C9, 0x583A25, 0x583CEB, 0x58C0A7}
    Ref{0x4BEF45, 0x4C2190, 0x4C4B2E, 0x4C4B38, 0x4CAB6A, 0x4CABBC}
    EndRef{0x4BD19F, 0x577A57}
    
    Array{0x4DFB4}.i4  'HeroMayBeHiredBy'
    Ref{0x4868FB, 0x486D4B, 0x4A3CE6, 0x4BB18B, 0x4BB208, 0x4BB30F, 0x4BB4A4, 0x4BD1C7, 0x4BE593, 0x4CDE4F, 0x4CE07C, 0x4D7BCF}
    Ref{0x4BEF5E, 0x4C4B87}
end
06.01.2018 00:53
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 10593
Post: #4

Не увидил хуков. Увидел только выделение памяти под новые структуры (такая функциональность есть, malloc, ffi.new и иже с ним из стандартной поставки luajit) и замена старых адресов новыми с глобальным реестром (?) структур по имени. Возможно, у Сергея был ещё какой-то побочный функционал.

Что касается перехватчиков/хуков в коде, то таковые поддерживаются. Реальный пример из era.lua:

Code:
-- установили перехватчик по адресу, когда окно уже создано и базовые ресурсы загружены
era.bridge(0x4EEEA5, function (context)
  -- Redirect message boxes to native game dialog system
  era.msg  = nativePrint
  era.ask  = era.showNativePrompt
  _G.print = era.msg
  
  era.trigger('OnGuiStart') -- сгенерировали новое именованное событие
  
  return 1 -- выполнили код по умолчанию
end)

Будет реальный запрос на модуль с синтаксисом вроде 3.59, добавлю. Глобальная таблица расширенных структур и несколько удобных методов для патчинга адресов.


Скачать Герои 3 Эра и всё, что с ней связано
06.01.2018 01:13
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 10593
Post: #5

Добавил функции для внесения заплаток в секции кода.

function mem.writeHex (ptr, data)
function mem.writeByte (ptr, value)
function mem.writeWord (ptr, value)
function mem.writeInt (ptr, value)


Пример:
Code:
local buf = ffi.new(mem.pu8, 1000)    -- создали новый массив на 1000 байт для хранения неясной структуры
mem.writeInt(0x4035E2, mem.addr(buf)) -- пропатчили обращение к массиву
mem.writeHex(0x701000, 'abcdef')      -- записали 3 байта hex-строки в точку входа исполняемого файла


Скачать Герои 3 Эра и всё, что с ней связано
06.01.2018 03:28
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 494
Post: #6

Что насчет именованных геройских констант и адекватного представления геройских структур (без ритуалов с ffi через строчку или, прости господи, динамического ерм)?
(This post was last modified: 06.01.2018 21:26 by feanor.)
06.01.2018 21:25
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 10593
Post: #7

feanor, работать нужно в этом направлении через ритуал ffi-структуры + ffi.metatype либо через обёртки модуля erm-подобного и get/set методы: erm.hero(3):setName().
Это библиотечные файлы, которые нужно писать. Готовых взять негде. Для начала планирую ерм-функционалу давать обвязку, структур-то много. Хотелось бы camelCase выдержать, а так можно пробовать из HD-мода конвертировать для начала. Любые начинания приветствуются и очень желательны.


Скачать Герои 3 Эра и всё, что с ней связано
07.01.2018 00:24
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2018 MyBB Group