Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка 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 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Malandrinus 615 Опубликовано 21 Сентября 2011 Автор Поделиться Опубликовано 21 Сентября 2011 (изменено) Artos, Каковы возможности в LUA (применительно к Сталкеру) по работе из скриптов со стеком? В мануале по LUA достаточно куцая информация и практически только для внешнего использования (применительно к С/С+) ... Как мне помнится, не такая уж и куцая. Работа со стеком там в пространстве имён debug. По причине отсутствия этого пространства имён в версии сталкера этих возможностей там нет. Название языка Lua пишется именно так, с большой буквы. Это не аббревиатура, а имя собственное, означает на бразильском "Луна". Разработчики языка особенно настаивают именно на таком написании названия. Теоретически, поскольку Lua в составе сталкера сделан в виде динамической библиотеки, то можно пересобрать эту библиотеку из исходников и добавить туда то, чего не хватает. Изменено 21 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Artos 99 Опубликовано 21 Сентября 2011 Поделиться Опубликовано 21 Сентября 2011 (изменено) Вопрос: Возможно ли по аналогии с перловыми методами из языка 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, хотя и не всегда соответствует многим источника, откуда черпаю ... ;-)) Изменено 21 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 21 Сентября 2011 Автор Поделиться Опубликовано 21 Сентября 2011 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 Ссылка на комментарий
Artos 99 Опубликовано 21 Сентября 2011 Поделиться Опубликовано 21 Сентября 2011 (изменено) malandrinus, задаю вопросы не из теоретический изысканий иль любопытства ради, а все же с учетом практического применения. Мне не столь нужны вариации, что можно сделать иначе, а результат, т.е. оптимизиция как самого кода так и/или времени (второе первично). Просто при своих познаниях и навыках могу чего-то не знать, чего-то упустить/забыть, вот и задаю вопрос к тем, кто может быть нашел/знает решение или наоборот, знает что иначе невозможно. P.S. (подумав) Хотя ... ответ то не только мне предназначен, его и другие читают. Изменено 21 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) 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 Изменено 22 Сентября 2011 пользователем Gun12 Ссылка на комментарий
Artos 99 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) Вопрос из категории "не очевидно, но факт": Возвращаясь в вопросу по способу определения типа таблицы: список или нет (#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, в вопросе по патерну для нескольких строк меня интересовал единый патерн и приоритет был - оптимизиция времени. Оптимизация кода была все же вторичной задачей. Предложенный вариант однозначно проиграет по времени последовательности проверок по каждой строке. :-( Изменено 22 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 Оказалась не лишней в единственном случае. Измени for idx, v in ipairs(t0) do if k~=2 then ... Или другое число, и твоя проверка становится бесполезной. В общем это не панацея. Оператор # вообще ведет себя странно. Скорее всего это связано с тем, что luа (как заявлено) старается любыми путями до последнего сохранять таблицу именно как список а не хэш. Хотя и тут встречаются аномалии. Так что на этот оператор в принципе не стоит делать ставку. Корректно работает только iраirs. Или же писать свой "определитель длины" Ссылка на комментарий
Artos 99 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) 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 А оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд. Изменено 22 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 ...оператор # возвращает номер последнего индекса в таблице, за которым отсутствуют как минимум два следующих индекса подряд. Казалось бы это условие подходит, но... t = {[1] = "111",[2] = "222", [3] = "333", [4] = "444", [5] = "555"} t[4]=nil print(#t) Темное это дело. Когда-то пытался понять закономерность, да плюнул. Наверное стоит признаться. Я знал о казусах с оператором # по отношению к таблицам, но промолчал. Думал пронесет. Не пронесло. Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Итого, с точки зрения гарантированности, достаточности и оптимальности по производительности (по времени) и строк кода, похоже этот вариант наилучший? 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 -и или есть недостатки, оптимальнее? Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 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 Ссылка на комментарий
Nazgool 250 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 malandrinus Насильно никого заставлять использовать тот или иной редактор, те или иные возможности не буду. Я сказал сразу, что настроек много, и каждый вправе использовать нужные. При желании пользователь может не только изменить существующие, но и добавить свои. Как например написать упомянутый тобою скрипт форматирования текста. Считаю главной фичей этого редактора саму возможность что-то изменять во внутренних настройках. Р.S. Поверь, не хотел и больше не хочу упоминать запрещенную тобой тему редакторов. Если кому что то нужно, ссылка уже есть. Достаточно. Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) 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' больше кол-ва разрядов этого же числа в шестнадцатиричной форме. Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 (изменено) В рубордовской версии SciTE так и не нашёл возможности ставить точки останова. Непонятно, как отлаживать программу. Кто-нибудь знает? Добавлено через 16 мин.: Artos, Моя фраза была уже опровергнута постом #30 Gun12 Извиняюсь, невнимательно читал. Достоинство SciTE для данного раздела "Школа модинга" в том, что он имеет встроенный русский мануал по Lua, который неплохо иметь под рукою любому модмейкеру и то, что не теряя времени на запуски/перезапуски целевой программы (той же игры) Я себе давно наладил тестовый полигон для запуска скриптов в игре без перезгарузки. Запуск в игре имеет свою ценность, поскольку скрипт тестируется именно там, где будет реально применяться. Gun12, запрещенную тобой тему редакторов Ощущаю себя исчадием модераторского ада ... Я не запрещал. Во-первых, я не могу ничего запретить, поскольку всего лишь куратор. Во-вторых, я сказал, что буду тереть бессмысленный флуд. То, что навалили здесь в самом начале, не содержало ни грамма информации, сплошное меряние ... редакторами. Добавлено через 15 мин.: Artos, Требуется определить, что десятичное число (любое - целое/дробное/отриыательное) лежит в диапазонах 10...15, 100...255, 1000...4095 и т.д. А почему не хочешь сделать по-простому, с перебором диапазонов и проверкой на вхождение в них? На мой взгляд, это даже будет быстрее работать. Изменено 23 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) 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, а игра вторична или ... наоборот? ;-) Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 Artos, 1. Что мешает поделиться опытом, а не поверхностной 'частной' информацией? ;-) Эээ... два года как это уже сделал 4. В данном топике мы говорим с ориентиром на Lua, а игра вторична или ... наоборот? ;-) игра - это предметная область, которая даёт реальные задачи, решение которых и побуждает изучать Lua. Gun12, у меня просьба. Не мог бы ты завершить свой введение в SciTE и дополнить его краткой информацией о том, как можно запустить написанный скрипт. Вот ты написал: После этого запустить SciTE, написать - print('Hello Word') В открывшейся консоли должно напечатать - Hello Word Написать где, в тексте документа? А почему консоль должна открыться? Что-то надо нажать? Попробуй представить себе, что аудитория нулевая и никаким сторонним багажом не обладает. И, если знаешь, то не мог бы подсказать уже для меня, как в рубордовской версии поставить точку останова? Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 ...точку останова Извини, никак не пойму что это за точка такая? Может я и знаю что это такое, но по-своему. P.S. Попробую дописать про SciTE. Ссылка на комментарий
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) 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 и/или хотя бы организовать типа удобного линка на него? Изменено 23 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Собственно к ответу 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 тоже? Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Сентября 2011 Автор Поделиться Опубликовано 23 Сентября 2011 (изменено) Gun12, Извини, никак не пойму что это за точка такая? Может я и знаю что это такое, но по-своему. Точка останова для отладчика, иначе breakpoint. Это чтобы остановить в нужном месте программу, посмотреть что и как, затем продолжить дальше. Также при наличии отладчика обычно имеется возможность выполнять программу по шагам. В том SciTE, что идёт вместе с Lua, эти команды вынесены прямо на тулбар. А есть отладчик в рубордовском варианте или вообще нет, пока не понял. Artos, Каков ответ координатора о первичности? :-) Зачем так усложнять? Первично то, что будет поддерживать интерес к этой теме. Есть ли способ определить текущий каталог для Lua однозначно и быстро, т.е. не экспериментально? Есть ли способ изменять текущий каталог Lua и/или хотя бы организовать типа удобного линка на него? по большому счёту, кроме как применительно к пространству имён io понятие текущего каталога больше никак и не использовать. Кроме того, в стандартной библиотеке Lua такого и понятия не вводится явно, как нет и средств управления текущим каталогом. Я бы старался избегать использования каталога "по умолчанию" хотя бы в силу того, что он именно в игре неизвестно какой. Вместо этого, лучше использовать явно заданные абсолютные пути. В движке есть класс FS, который позволяет узнать все пути к каталогам игры. В полигоне я использовал текущий каталог, но мог бы вместо этого использовать класс FS, выяснить каталог со скриптами и использовать его полный путь вместо текущего пути "." (точка - текущий каталог). На тот момент использовать текущий путь казалось проще, кроме того на тот момент я вполне возможно не знал ещё, как пользоваться классом FS в полной мере, только и всего =) Gun12, Собственно к ответу Artos-а остаётся только добавить. т.е. для запуска надо нажать F5 или такую зелёную кнопочку со стрелочкой вправо на тулбаре, или из меню "Tools" выполнить команду "Go". Я правильно понял? =) А на хpcall тоже? а, с тех пор много воды утекло, и я уже выяснил, в чём была проблема. Вылет вызывало использование техники выдачи сообщения в лог get_console:execute("text"). Причём, что самое неприятное, вылет происходил не сразу, а позже, и иногда его не было. Поэтому я долго думал, что проблема в чём-то другом. Так что в общем проблемы нет, надо просто использовать вывод в произвольный файл через пространство имён io (благо в ЧН/ЗП оно уже есть). Это в общем и удобнее намного, поскольку можно выводить в разные файлы и в логе нет мусора. В модифицированном движке можно добавить нормальный вывод в лог (а не как побочную реакцию на ошибочную команду). Тоже будет работать. Изменено 23 Сентября 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти