Все посты %s в %S - AMK Team
Перейти к контенту

Сборочный цех


Zander_driver

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

Ф-ция для записи в файл "свободных" story_id. Написано под ТЧ, можно доработать для ЗП (добавить сканирование по спавн-секциям)

Код:

Скрытый текст

function wr_free_sids()
	local obj, gini = false, game_ini() 
	for i=1,65534,1 do  
		obj = alife():story_object(i)
		if not obj then
			if gini:line_exist("story_ids", tostring(i)) then
				nt.logfile(string.format("In_list as: %s > %d", gini:r_string("story_ids", tostring(i)), i), "free_sids.txt")
			else
				nt.logfile(string.format("Free: %d", i), "free_sids.txt")
			end
		else
			nt.logfile(string.format("%s > %s", tostring(obj:name()), i), "free_sids.txt")
		end
	end
end

 

Для функции nt.logfile - Нужен модуль nt.script, это скриптовый модуль из мода "Новое время".

Если Вы не хотите устанавливать модуль, то вот ф-ция:

Скрытый текст

function logfile (lgtext, fname) -- запись текста в файл
lgtext = tostring(lgtext)
local file = getFS():update_path("$game_data$", fname or "mylog.txt")
   f = io.open(file,"r") -- Пытается открыть файл в режиме "чтения/записи"
   if f == nil then  -- Если файл не существует
      f = io.open(file,"w") -- Создает файл в режиме "записи"
	  if f then 
		f:close();-- Закрывает файл
		f = io.open(file,"a")-- Открывает уже существующий файл в режиме "чтения/записи"
      end
   end
   f = io.open(file,"a")
   if f then
		f:write(lgtext.."\n")
		f:flush()
		f:close()
	end
end

 

Для работы этого всего нужно что бы у LUA игры были открыты области видимости: io, file! Для этого можно скачать расширения Lua  от разных авторов или такой функционал может быть у модифицированных движков.

 

Файл с результатами (free_sids.txt) будет  в папке gamedata.

Строка вида: Free > [Story_Id] - свободный Сид - под сидом нет объекта на момент сканирования,

строка вида: In_list as: [СекцияИзStory_ids.ltx] > [Story_Id] - свободный Сид, но отмечены секцией в файле story_ids.ltx,

строка вида: [СекцияИзStory_ids.ltx] > [Story_Id] - Занятый Сид (под сидом есть объект на момент сканирования).

Изменено пользователем Graff46
  • Нравится 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Не давно, с момента написания данного поста, я спорил на форуме, о том что код распарсивания строк условий переключения схем логики, достаточно громоздкий и и ресурсозатратный.

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

Внимание! Старые схемы логики работать не будут! Вам нужно создать только своих НПС с логикой по новому стандарту.

Скрытый текст

Изменения касаются только полей переключателей(on_info, on_timer, on_actor_dist_le и тд...)

Значением поля переключателя должна быть LUA таблица, в которой 1-е поле - это данные для переключателя (для on_timer это чило микросекунд, для on_actor_dist_le - это расстояние... Для on_info это поле пропускаем! )

2-е поле (Для on_info 1-е) - это условия переключения, любые LUA типы (ф-ции, булёвы и тд соединенные логическими операторами, но будьте осторожны: если в этом поле 1 ф-ция и она возвращает таблицу - парсер может принять эту таблицу за вложенную! Что-бы этого избежать достаточно ф-цию логически умножить с true ( fname(param) and true )), в окружении доступна переменная npc, содержащая клиентский объект "обрабатываемого" НПС. Тут же можем указать условия присутвия или отсутствия инфопорней: Для обозначения "нужного" инфопоршня его нужно написать как строку(в кавычках) и прибавить к чему либо, к чему хотите (к предыдущему объекту или числу) (0+"infoporshn" +"infoporshn2", func() +"infoporshn3").

Отсутствие инфопоршня - пишем инфо-нь как строку с минусом перед строкой (не отнимаем строку, а с минусом, как у отрицательных чисел)!

Это поле обязательное! Если хотите переход без условия, то напишите в поле true.

3-е поле (Для on_info 2-е) - это имя секции, это строка - пишем в "кавычках", 'в любых' [[любых]]. Вы можете пропустить это поле и вам за это ничего не будет.

Далее можем делать сколько угодно полей (*хвост), где каждое поле это ф-ция или инфопоршни которая(ый) вызовется при выполнении всех условий. Выдача и удаление инфопоршней делается прибавлением строки и унарным минусом (описано выше, только теперь выдаём и удаляем инфопрошни)

А если мы хотим несколько условий со своими секциями и эффектами?

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

Эффекты:

 - Это ф-ции вызываемые при выполнении условия (и) или инфопоршни выдаваемые или удаляемые. Инфопоршни Добавляются актору и удаляются от него-же.

Ф-ции пишутся относительно глобального окружения _G ( нужно писать полный "путь" - стек (xr_effects.myfunc() )! Перед стеком нужно написать " e. "! Указание ф-ции по имени myreward из скрипта escape_task будет выглядеть так: e.myreward.escape_task()

В ф-ции эффектов неявно 1-ым параметром передается клиентский объект НПС, (в ф-ции условий само ничего не передаётся!)

Количество элементов в стеке не ограничено, элементы стека связаны точкой, если вы вызываете метод с неявной передачей 1-го параметра (когда пишем двоеточие, например: mystring:match('%w+')), то нужно 1-й параметр явно передать, причем параметр должен быть указан относительно _G, в реализации этот параметр будет доступен из второго аргумента (будет таблицей) в качесве первого поля таблицы.

Параметров у ф-ции эффекта может быть указано сколько угодно, эти параметры скомпануются в таблицу и эта таблица будет доступна 2-м параметром в реализации (1-й параметр это НПС). 

Пример:


[logic]
active = remark@1

[remark@1]
on_timer = {5000,{0+'infop1', "remark@2", e.xr_ffects.main(npc)}, {xr_condition.cond(npc), -'infop2', e.myscript.myclass.method(myscript.myclass, npc)}, fname(npc)+'infop3', "remark@3"}

[remark@2]

[remark@3]

 

Версия очень сырая, выкладываю для тестов, в скриптах есть 2 вида перебора переключателей, по таблице и по условиям. Возможно есть решения улучшить код. Хотелось бы узнать падение\прирост производительности...

Есть возможность заменить унарный минус строк для инфопоршней на разность, для аналогии со сложением.

Версия под ТЧ


Гибкая версия. Сама распознает старые переключатели и новые. Ссылка

Изменено пользователем Graff46
  • Сомнительно 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

×
×
  • Создать...