Wake of Gods Forum | Форум Во Имя Богов

Full Version: Lua скрипты
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
(17.08.2011 20:05)garretdrazor Wrote: [ -> ]ассемблер(который мне хотелось бы забыть)
и зря. очень хороший и полезный язык.
garretdrazor Wrote:ассемблер(который мне хотелось бы забыть)
Видать, так учил. Sm Вообще, им стоит хоть немного владеть, хотя бы для общего развития.
A new language to learn? cool)
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
Поддержка хуков будет? Например, если картоделу понадобиться расширить таблицы для добавления новых героев в ERA (пример из WoG 3.59):
Не увидил хуков. Увидел только выделение памяти под новые структуры (такая функциональность есть, 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, добавлю. Глобальная таблица расширенных структур и несколько удобных методов для патчинга адресов.
Добавил в ЭРЕ функции для внесения заплаток в секции кода.

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-строки в точку входа исполняемого файла
Что насчет именованных геройских констант и адекватного представления геройских структур (без ритуалов с ffi через строчку или, прости господи, динамического ерм)?
feanor, работать нужно в этом направлении через ритуал ffi-структуры + ffi.metatype либо через обёртки модуля erm-подобного и get/set методы: erm.hero(3):setName().
Это библиотечные файлы, которые нужно писать. Готовых взять негде. Для начала планирую ерм-функционалу давать обвязку, структур-то много. Хотелось бы camelCase выдержать, а так можно пробовать из HD-мода конвертировать для начала. Любые начинания приветствуются и очень желательны.
(05.01.2018 22:29)Berserker Wrote: [ -> ]***
    erm.y[2] = i
    erm('HEy1:C0/y2/?y3/?y4')

    if y3 == NO_MON then
    ***

Между erm('HEy1:C0/y2/?y3/?y4') и if y3 == NO_MON разве не надо строку:
y3 = erm.y[3]
Или что-то вроде этого? Переменные y3, у4 сами "материализуются" в контексте выполнения?
Надо, пропустил.
(20.03.2022 18:22)Berserker Wrote: [ -> ]wessonsm, пожалуйста. Жаль, так и не успел с Lua сделать аналогичное.

прозвучало, как будто ты все планы по ЛУА на базе ERA полность свернул и более не планируешь?!
Не мы такие, жизнь такая ) На текущий момент просвета не видно.
Pages: 1 2
Reference URL's