Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

Artos,

Каковы возможности в LUA (применительно к Сталкеру) по работе из скриптов со стеком?

 

В мануале по LUA достаточно куцая информация и практически только для внешнего использования (применительно к С/С+) ...

Как мне помнится, не такая уж и куцая. Работа со стеком там в пространстве имён debug. По причине отсутствия этого пространства имён в версии сталкера этих возможностей там нет.

 

Название языка Lua пишется именно так, с большой буквы. Это не аббревиатура, а имя собственное, означает на бразильском "Луна". Разработчики языка особенно настаивают именно на таком написании названия.

 

Теоретически, поскольку Lua в составе сталкера сделан в виде динамической библиотеки, то можно пересобрать эту библиотеку из исходников и добавить туда то, чего не хватает.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Вопрос: Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов?

 

Т.е. имеем несколько масок: Masks = ("one", "two", "three")

Возможно ли составить единый патерн, а не использовать три:

 

if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка

 

 

P.S. По стеку - ясно, что практических возможностей никаких.

(хорошо, раз бразильцы-разработчики настаивают - уважим, буду употреблять Lua, хотя и не всегда соответствует многим источника, откуда черпаю ... ;-))

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos,

Возможно ли по аналогии с перловыми методами из языка Perl составить патерн в Lua для парсинга по нескольким кускам слов?

 

Т.е. имеем несколько масок: Masks = ("one", "two", "three")

Возможно ли составить единый патерн, а не использовать три:

 

if string.match(s,"one") or string.match(s,"two") or string.match(s,"three") then --/< 's' - исходная строка

 

Вроде в общем случае никак. То что в Perl - это регулярные выражения, там возможностей гораздо больше. Была бы возможность заменить библиотеку в сталкере, можно было бы и регулярные выражения прикрутить. Библиотеки для Lua уже есть.

 

С другой стороны есть ограниченная возможность делать такое в string.gsub. Там можно производить замену на один из вариантов, перечисленных в таблице. В этом случае найденный по шаблону элемент используется как ключ в таблице для получения значения, на которое заменяем. Не совсем то, что надо было, но именно при замене можно получить похожий эффект.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

malandrinus, задаю вопросы не из теоретический изысканий иль любопытства ради, а все же с учетом практического применения.

Мне не столь нужны вариации, что можно сделать иначе, а результат, т.е. оптимизиция как самого кода так и/или времени (второе первично).

Просто при своих познаниях и навыках могу чего-то не знать, чего-то упустить/забыть, вот и задаю вопрос к тем, кто может быть нашел/знает решение или наоборот, знает что иначе невозможно.

 

P.S. (подумав) Хотя ... ответ то не только мне предназначен, его и другие читают.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos

Можно написать свою функцию.

Например (прототип)

function string.pegexp(s, ...)
    local t = {...}
    for i = 1, #t do
        if s:match(t[i]) then return true end
    end
end

str=bla-bla
w = str:regexp('one', 'two')

 

Добавлено через 13 мин.:

Это для Сталкера. Для luа ещё проще, через родную таблицу аrg :

function string.pegexp(s, ...)
    for i = 1, arg.n do
        if s:match(arg[i]) then return true end
    end
end

 

Изменено пользователем Gun12
Ссылка на комментарий

Вопрос из категории "не очевидно, но факт":

 

Возвращаясь в вопросу по способу определения типа таблицы: список или нет (#2765)

 

Имеем две таблицы:

local t1 = {[2]="222",[3]="333",[4]="444"}

и вторую получаем из сторонней:

local t0 = {[1]="111",[2]="222",[3]="333",[4]="444"} --/ сторонняя таблица
local t2 = {} --/ заготовка 2-ой таблицаы

for idx,v in ipairs(t0) do
  if idx ~= 1 then --/ пропускаем 1-й индекс
    t2[idx] = v --/ в таблицу запоминаются 2, 3 и 4
  end
end

Распечатка обеих таблиц одинакова (по сути, хотя и различается порядком):

2=222

3=333

4=444

Собственно вопрос(!): Чем различаются t1 и t2 ?

(попробуйте найти различие/ответ не заглядывая под спойлер)

Пишем код:

local t1 = {[2]="222",[3]="333",[4]="444"}
for idx,v in pairs(t1) do
  print(idx.." = "..v)
end
print("#t1=", #t1)
local is_list1 = #t1 > 0 and not next(t1,#t1)
print("is_list1=", is_list1)

local t0 = {[1]="111",[2]="222",[3]="333",[4]="444"}
local t2 = {}
for idx,v in ipairs(t0) do
  if idx ~= 1 then --/ пропускаем 1-й индекс
    t2[idx] = v --/ в таблицу запоминаются 2, 3 и 4
  end
end
for idx,v in pairs(t2) do
  print(idx.." = "..v)
end
print("#t2=", #t2) --/ получаем 4 - странно это

local is_list2 = #t2 > 0 and not next(t2,#t2)
print("is_list2=", is_list2) --/> получаем 'true' - странно, получается что это список?
--/ добавляем проверку на наличие элемента с индексом 1
local is_list = #t2 > 0 and not next(t1,#t2) and next(t2) == 1
print("is_list=", is_list) --/> получаем 'false' - оказывается это НЕ индесированный список!!!

 

Результат:

3=333

2=222

4=444

#t1= 0

is_list1= false --/ т.е. хеш-таблица

 

2=222

3=333

4=444

#t2= 4 --/?

is_list2= true --/ это список???

is_list= false --/ все же нет!

 

Т.о. Gun12, излишняя подстраховка next(t2) == 1 - оказалась не лишней.

 

Но вот в чем разница ответа не имею. Кто подскажет? Заранее спасибо.

 

 

 

Добавлено через 6 мин.:

Gun12, в вопросе по патерну для нескольких строк меня интересовал единый патерн и приоритет был - оптимизиция времени. Оптимизация кода была все же вторичной задачей.

Предложенный вариант однозначно проиграет по времени последовательности проверок по каждой строке. :-(

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Оказалась не лишней в единственном случае.

Измени

for idx, v in ipairs(t0) do

if k~=2 then

...

Или другое число, и твоя проверка становится бесполезной.

В общем это не панацея.

Оператор # вообще ведет себя странно.

Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш.

Хотя и тут встречаются аномалии.

Так что на этот оператор в принципе не стоит делать ставку.

Корректно работает только iраirs.

Или же писать свой "определитель длины"

Ссылка на комментарий

Gun12

Чтобы не углубляться, в вопросе не привел все иные варианты, когда оператор # возвращает не нулевую длину для таблиц с пустыми индексами.

Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш

В том то и дело, и с чем и связан вопрос выше - ведь заведомо таблица создается НЕ как список, а как хеш. Ведь начальный первый индекс с самого рождения таблицы не ракен единице.

Ну а для исключения любых подобных неочевидностей сделал подстраховку так:

    iCntIdx = #tTbl --/ длина индексированной части таблицы
    bList = iCntIdx > 0 and not next(tTbl,iCntIdx) --/ флаг списка (true|false)
    if bList then
      for i=1,iCntIdx do --/ цикл проверки на отсутствие 'пустых' индексов
        if tTbl[i] == nil then --/ пустышка?
          bList = false --/ не список
          break --/ прерываем по первой пустышке
        end
      end
    end

А оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
...оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

 

Казалось бы это условие подходит, но...

t = {[1] = "111",[2] = "222",
[3] = "333",
[4] = "444",
[5] = "555"}
t[4]=nil
print(#t)

Темное это дело. Когда-то пытался понять закономерность, да плюнул.

Наверное стоит признаться. Я знал о казусах с оператором # по отношению к таблицам, но промолчал. Думал пронесет. Не пронесло.

Ссылка на комментарий

Итого, с точки зрения гарантированности, достаточности и оптимальности по производительности (по времени) и строк кода, похоже этот вариант наилучший?

function is_List(tbl)
  local count = #tbl --/ длина индексированной части таблицы
  if count > 0 then --/ есть элементы списка?
    --/ индексы начинаются с 1 и за 'списком' отсутствует хеш-элемент
    if next(tbl) == 1 and not next(tbl,count) then
      for i=2,count-1 do --/ цикл перепроверки: 'отсутствуют пустые элементы?'
        if tbl[i] == nil then --/ пустышка?
          return false --/> не список
        end
      end
      return true --/> флаг: это список!
    end
  end
  return false --/> не список
end

-и или есть недостатки, оптимальнее?

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Gun12,

при наборе выскочит окошко с возможным макросом, который вставляется по нажатию клавиши Enter/

Имея привычку пользоваться данным инструментом можно не беспокоится о "забытом" end-е

Я всё пытался понять, что же именно мне не нравится. После этого поста мысль наконец-то оформилась. Дело в том, что существенная часть подобных фишек создана и продвигается исходя из абсолютно ложной предпосылки, будто программисту нужна помощь при наборе программы. Отсюда появляются что-то вроде вставки даты или автозавершение блоковой синтаксической конструкции.

 

Между тем, в реальной жизни программист проводит 9/10 времени отнюдь не создавая новый текст. Основное время занимает поиск ошибок, отладка, внесение изменений любого рода и с самыми разными целями: исправление, оптимизация, расширение возможностей и т.п. Часть "созидательных" фишек при этом бесполезны, часть - попросту будут мешать (в том числе и загромождая рабочее пространство).

 

По-поводу end-ов. На самом деле мало-мальски опытному программисту не нужна помощь в завершении блоковых конструкций. Вот я к примеру выработал в себе привычку набивать первым делом пустую рамочную конструкцию уже очень давно. Руки пишут завершающую скобку или end просто на автомате. Я бы даже сказал, что попытки редактора сделать это за меня будут мне мешать, и я это по-любому отключу.

 

Пока искал автоматический форматировщик текста Lua (так и не нашел, кстати) вдосталь начитался мнений типа "научись пользоваться табом и ентером, кретин, и не будет проблем с отступами". Примерно так и пишут, я не преувеличиваю. Между тем, я могу назвать как минимум три причины для использования такого инструмента:

1. Потеря форматирования при изменениях. Код может остаться корректным, но ручное проставление табуляций в километровом тексте может быть утомительно.

2. Возможность искать ошибки потерянных/отсутствующих скобок/завершителей. Такие ошибки легко вносятся при изменениях. Никакие инструменты этого не в состоянии предотвратить, а уже отформатированный код при этом даже в каком-то смысле скрывает ошибку.

3. Форматирование чужого кода. В реальной жизни приходится читать и использовать чужой код. В каком он может быть состоянии, не мне вам рассказывать.

 

Исходя из сказанного, могу сформулировать перечень жизненно важных для программисткого редактора фишек:

1. Моноширинный шрифт

2. Подсветка синтаксиса

3. Поддержание текущей позиции табуляции

4. Изменение уровня табуляции фрагментов текста

5. Блоковое выделение (это обычно с зажатым Alt-ом) и операции с блоками - удаление, перемещение и пр.

6. Outlining (сворачивание текста)

7. Авторазметка (автоформатирование) текста по запросу

 

Из этого перечня разве только п.3 относится к первичному набиванию текста и то имеет применение также и при редактировании. Остальное предназначено в основном для удобства работы с уже существующим кодом, в частности для лучшего его понимания. Вот этим программист и пользуется 90% всего времени. Остальное - вторично и стоит при первом знакомстве оставить за кадром.

 

Добавлено через 51 мин.:

Artos,

оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд.

Почему два? Возвращает индекс n, такой что "t[n] не равен nil, а t[n+1] равно nil". Т.е. такой, за которым идёт "дырка" в значениях. Одной вполне хватит.

 

Однако, выходит так, что это правило не соблюдается для "таблиц, рождённых массивами". Т.е. к примеру в этом случае

t = {1, 2, nil, 4}

мы получим 4 в качестве длины. В принципе, это можно понять, если рассмотреть реализацию таблиц, описанную автором в статье The implementation of Lua 5.0. В каждой таблице есть часть "линейный массив" и часть"хэш-массив". При создании с помощью конструкции {a, b, c, d, e} очевидно всё попадает в часть линейного массива, а оператор длины видимо в этом случае оптимизирован и вместо перебора просто берёт длину массива.

Если же создавать массив вразнобой, типа такого:

t = {}

t[4] = 4

t[2] = 2

t[1] = 1

то в этом случае элементы попадут в хэш-таблицу. Оператор длины сначала посмотрит линейную часть, ничего там не найдёт и затем уже начнёт перебирать оставшиеся элементы из хэш-части, а там уже чёстно найдёт разрыв в значениях и до индекса 4 не дойдёт. В общем всё логично, хотя и выглядит как недокументированная фича. Причём именно фича, а не баг, поскольку это даёт возможность таки перебирать элементы массива пусть и со значениями nil.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

malandrinus

Насильно никого заставлять использовать тот или иной редактор, те или иные возможности не буду. Я сказал сразу, что настроек много, и каждый вправе использовать нужные. При желании пользователь может не только изменить существующие, но и добавить свои. Как например написать упомянутый тобою скрипт форматирования текста.

Считаю главной фичей этого редактора саму возможность что-то изменять во внутренних настройках.

Р.S. Поверь, не хотел и больше не хочу упоминать запрещенную тобой тему редакторов. Если кому что то нужно, ссылка уже есть. Достаточно.

Ссылка на комментарий

malandrinus

В отличии от модераторов/кураторов у обычных пользователей отсутствует возможность вносить правки (редактировать) в свои посты спустя 15 мин после его опубликования.

Моя фраза была уже опровергнута постом #30 Gun12, и то, что я не отреагировал на нее в своем ответном посте - означает согласие (молчание знак согласия). Там же, в моем ответе приведен вариант, качающийся исходного вопроса с учетом всех особенностей (включая и тобою упомянутых познее) применения оператора # в общем алгоритме. Вот критика всего конечного алгоритма способа опредеоения типа таблицы была бы полезна.

Вероятно не стОит задаваться вопросом "Почему два?" по поводу некорректности/неправильности фразы, как уже один раз опровергнутой. Иначе придется каждый раз писать поправки/подтверждения/опровержения ранее сказанному по каждому поводу.

 

По редактору: В самом начале мною было высказано мнение, что каждый выбирает себе инструмент "по руке и по задаче". Можно много на эту оффтопную тему высказывать мнений и пр., но ... большей частью все это будет в пустоту, потому что каждому из нас, твоими же словами, "как-то лениво" съезжать с насиженного и переезжать на малоизвестное и пока неудобное.

Единственное все же хотелось бы тут упомянуть в дополнение к перечисленному тобою "перечню жизненно важных для программисткого редактора фишек":

Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры), т.е. непосредственно в редакторе и даже не записывая чего-либо на диск, можно писать и перепроверять локальные небольшие куски функций/формул, чего не дают иные редакторы.

 

====================================================

Добавлено через 56 мин.:

Вопрос: Нет ли каких "подводных камней" или иных "недокументированных фич" в применяемых ниже операторах/методах, которые могут повлиять не корректность результата?

local Number = 9 --/ 10,16,100, ...
local abs = Number == math.modf(Number) and math.abs(Number) --/ модуль целочисленного числа

if abs then --/ целочисленное?
  local n = math.floor( math.log10( abs + 1) ) --/ степень ближайшего к модулю бОльшего числа кратного 10-ти
  if abs >= 10^n and abs < 2^(4*n) then
    return true --/> кол-во разрядов 'dec' > 'hex'
  end
end

Пояснение: Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д.

т.е. тогда, когда количество разрядов десятичного значения числа 'Number' больше кол-ва разрядов этого же числа в шестнадцатиричной форме.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

В рубордовской версии SciTE так и не нашёл возможности ставить точки останова. Непонятно, как отлаживать программу. Кто-нибудь знает?

 

Добавлено через 16 мин.:

Artos,

Моя фраза была уже опровергнута постом #30 Gun12

Извиняюсь, невнимательно читал.

 

Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры)

Я себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки. Запуск в игре имеет свою ценность, поскольку скрипт тестируется именно там, где будет реально применяться.

 

Gun12,

запрещенную тобой тему редакторов

Ощущаю себя исчадием модераторского ада :shok: ... Я не запрещал. Во-первых, я не могу ничего запретить, поскольку всего лишь куратор. Во-вторых, я сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами.

 

 

Добавлено через 15 мин.:

Artos,

Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д.

А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них? На мой взгляд, это даже будет быстрее работать.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
malandrinus: А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них?
Потому что:

- этот вопрос в первую очередь преследует цель получить информацию по применяемым функциям/операторам и возможным их 'закидонам' (по аналогии с оператором #) ...

- в данном случае, даже если и имеется потеря некоторой доли скорости выполнения, то а) вычисления в игре производятся в моменты (в основном создание сэйвов), когда лишняя пара милисекунд не важны, и б) компактность кода и универсальность формул также немаловажные критерии. Учитывая диапазон разрядов применяемых в игре (float -> 10 разрядов), то использование проверок 2х9-ти диапазонов (считая отрицательные) далеко не всегда будет выигрышным по скорости;

Вот это полная функция:

--/ конвертер числа (number) в 'dec' или 'hex' строку (string)
function Num2Str(iNum) --/< любое число, применяемое в игре Сталкер
  if iNum == math.modf(iNum) then --/ целочисленное?
    local iAbs = math.abs(iNum) --/ модуль числа
    if iAbs > 9 then --/ число 2-x и более разрядное?
      --/ степень ближайшего к модулю бОльшего числа кратного 10-ти
      local iLv = math.floor(math.log10(iAbs+1))
      if iAbs >= 10^iLv and iAbs < 2^(4*iLv) then --/ разрядность 'dec' > 'hex'?
        if iNum >= 0 then --/ не отрицательное?
          return string.format('%X', iAbs) --/> 'hex'-строка
        end
        --/ отрицательное - упаковываем со знаком
        return "-" .. string.format('%X', iAbs) --/> 'hex'-строка со знаком
      end
    end
  end
  return tostring(iNum) --/> 'dec'-строка
end

 

malandrinus: ... себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки
1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-)

2. Ну ... это как бы:

malandrinus: ...сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами.
И хотя ранее никакого меряния ... редакторами не было (ИМХО), а некоторая дискуссия о предпочтениях и ненавязывании ... Предлагаешь померять(ся) ... чей/какой способ отладки 'на лету' лучшЕЕ? ;-).

Повторю: "на вкус и цвет ..." и "инструмент выбирается по руке и по задаче". Могу привести немало примеров, когда отладка "из игры" невозможна и ... не даром упомянул о 'целевой программе'? которая может быть любой, а не только игрою Сталкер.

Да и 90% читателей/модмейкеров портала не имеют ни того и ни другого. Скачав и установив оедактор (SciTE) - любой получает возможность писать и проверять коды "на лету" за минуты.

 

3. Полностью согласен, что запуск 'из игры' имеет свою ценность, о чем и говорил ранее в "бессмысленном флуде".

4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos,

1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-)

Эээ... два года как это уже сделал

 

4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-)

игра - это предметная область, которая даёт реальные задачи, решение которых и побуждает изучать Lua.

 

Gun12,

у меня просьба. Не мог бы ты завершить свой введение в SciTE и дополнить его краткой информацией о том, как можно запустить написанный скрипт. Вот ты написал:

После этого запустить SciTE, написать - print('Hello Word')

В открывшейся консоли должно напечатать - Hello Word

Написать где, в тексте документа? А почему консоль должна открыться? Что-то надо нажать? Попробуй представить себе, что аудитория нулевая и никаким сторонним багажом не обладает.

 

И, если знаешь, то не мог бы подсказать уже для меня, как в рубордовской версии поставить точку останова?

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
...точку останова

Извини, никак не пойму что это за точка такая?:blush:

Может я и знаю что это такое, но по-своему.

P.S. Попробую дописать про SciTE.

Ссылка на комментарий

malandrinus

По п.4: Это все же НЕ ответ координатора (ИМХО).

- или Lua первичен, остальное вторично - в этом случае дефолтно в вопросах/ответах подразумеваются общее именно для Lua контента и уже потом для конкретной частности;

- или Игра первична - в этом случае вопрос/ответ подразумевает в первую очередь именно контент и особенности Игры, а не всевозможности/извраты/недоступности всего/чистого Lua;

- или 'демократия' - каждый говорит о своем, кто про чистый Lua, кто про портированный кусок квази-Lua в Игре, кто просто про игру ...

Каков ответ координатора о первичности? :-)

 

По полигону: Для Игры (и то с тобою же высказанными ограничениями и частностями) вариант вполне возможен, но ... для вероятно 70% игроков/модмейкеров неприемлем/затруднителен (ЧН/ЗП, нет второго компа, коды именно 3-й категории ошибок, ...). Для изучения Lua - практически не пригоден (более схожь с "чесать ногою ухо"). ИМХО.

 

Пока Gun12 не написал введение по SciTE, отвечу для тех, кто пока не понял:

- Писать код (print('Hello Word')) нужно конечно же в документе. Однако, дефолтно открытое первичное окно ("Безымянный") не имеет расширения, что не дает интерпретировать какие команды допустимы ... Следует этот дефолтно открытый документ сохранить с требуемым расширением и тогда - доступны все свойства данного документа/файла.

- Консоль открывается автоматически при наличии информации предназначенной для вывода из кодов в консоль.

 

Добавлено через 27 мин.:

malandrinus

Из твоего описания "полигона":

Путём экспериментов я выяснил, что текущим каталогом Lua считает папку bin

Вероятно да. Однако, в том же NLC6 (использован Lua-перехватчик by aplet), фокус передается в корень игровой папки (т.е. на верхний уровень относительно 'bin').

Вопросы: (касательно Lua в игре Сталкер)

Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально?

Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него?

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Собственно к ответу Artos-а остаётся только добавить.

 

При выполнении файла с расширением .lua, в SciTE выполняется команда из lua.properties :

command.go.*.lua=lua "$(FilePath)"

Т.е. запускается командная консоль lua, находящаяся по адресу, например, C:\Program Files\Lua\5.1\lua.exe

Эта консоль показана в виде окна в нижней части редактора и в ней отображается результат работы скрипта или вспомогательных действий.

Например при выполнении команды "Поиск в файлах" в ней выводятся все файлы с найденным вхождением.

Двойной клик на найденном результате открывает файл, содержащий искомую строку.

Консоль можно открывать/закрывать принудительно "горячей" клавишей F8.

 

Вы можете открыть и сам файл C:\Program Files\Lua\5.1\lua.exe. Появится окно, аналог CMD. Набирать код и получать результат можно и в этом окне.

SciTE как бы разделяет эти операции. Код пишется в окне текстового (скриптового) редактора, а результат в описанном выше окне консоли.

Удобство работы с кодом CMD и тем же кодом в SciTE не подлежит сравнению.

Благодаря этой возможности, любители работы в CMD могут вызвать оную, и работать в окне консоли в режиме обычного текстового редактора.

Напишите в файле *.lua :

os.execute('cmd')

И нажмите F5.

 

Добавлено через 17 мин.:

 

Чуть не забыл. Если Вы работаете в CMD, или Ваш скрипт "завис" можно принудительно остановить его выполнение комбинацией Ctrl+Break.

 

Добавлено через 34 мин.:

И ещё. Это всё работает для ТЧ. Для ЧН мне наладить такой же полигон не удалось. Что-то там изменено в движке, что вызывает у него аллергию на функцию pcall.

А на хpcall тоже?

Ссылка на комментарий

Gun12,

Извини, никак не пойму что это за точка такая?:blush:

Может я и знаю что это такое, но по-своему.

Точка останова для отладчика, иначе breakpoint. Это чтобы остановить в нужном месте программу, посмотреть что и как, затем продолжить дальше. Также при наличии отладчика обычно имеется возможность выполнять программу по шагам. В том SciTE, что идёт вместе с Lua, эти команды вынесены прямо на тулбар. А есть отладчик в рубордовском варианте или вообще нет, пока не понял.

 

Artos,

Каков ответ координатора о первичности? :-)

Зачем так усложнять? Первично то, что будет поддерживать интерес к этой теме.

 

Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально?

Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него?

по большому счёту, кроме как применительно к пространству имён io понятие текущего каталога больше никак и не использовать. Кроме того, в стандартной библиотеке Lua такого и понятия не вводится явно, как нет и средств управления текущим каталогом. Я бы старался избегать использования каталога "по умолчанию" хотя бы в силу того, что он именно в игре неизвестно какой. Вместо этого, лучше использовать явно заданные абсолютные пути. В движке есть класс FS, который позволяет узнать все пути к каталогам игры.

 

В полигоне я использовал текущий каталог, но мог бы вместо этого использовать класс FS, выяснить каталог со скриптами и использовать его полный путь вместо текущего пути "." (точка - текущий каталог). На тот момент использовать текущий путь казалось проще, кроме того на тот момент я вполне возможно не знал ещё, как пользоваться классом FS в полной мере, только и всего =)

 

Gun12,

Собственно к ответу Artos-а остаётся только добавить.

т.е. для запуска надо нажать F5 или такую зелёную кнопочку со стрелочкой вправо на тулбаре, или из меню "Tools" выполнить команду "Go". Я правильно понял? =)

 

А на хpcall тоже?

а, с тех пор много воды утекло, и я уже выяснил, в чём была проблема. Вылет вызывало использование техники выдачи сообщения в лог get_console:execute("text"). Причём, что самое неприятное, вылет происходил не сразу, а позже, и иногда его не было. Поэтому я долго думал, что проблема в чём-то другом. Так что в общем проблемы нет, надо просто использовать вывод в произвольный файл через пространство имён io (благо в ЧН/ЗП оно уже есть). Это в общем и удобнее намного, поскольку можно выводить в разные файлы и в логе нет мусора.

 

В модифицированном движке можно добавить нормальный вывод в лог (а не как побочную реакцию на ошибочную команду). Тоже будет работать.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...