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

Скриптование


Svoboда

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

(изменено)

если self.Utils_Operator = inv_system.Utils_Operator() у тебя выполняется всего один раз - манипуляции с _G - лишние.

 

По поводу конструкций вида self.obj:f() - ну, тебе решать.

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

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


Ссылка на сообщение
(изменено)

Монстровидны.

По поводу "другого места" - тут все определяется, опять же, нужен ли тебе тот же самый объект, или более другой. Ну, собственно, как и с self.

 

Да, еще: мне категорически не нравится вот такое вот:

 

function actor_binder:__init (obj) super(obj)
  self.weather_manager = level_weathers.WeatherManager()

...

function actor_binder:net_spawn(data)
  self.weather_manager:reset()

...

function actor_binder:update(delta)

self.weather_manager:update()

...

function actor_binder:save_old(packet)

    self.weather_manager:save(packet)

...

function actor_binder:load(reader)

    self.weather_manager:load(reader)

-- да еще и с очевидной ошибкой, там, где было бы достаточно просто

function actor_binder:update(delta)

weather_update()

 

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

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

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


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

Пример ООП ради ООП, который не дает ничего, кроме много строк. К вопросу о "вижу предрассудок".

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


Ссылка на сообщение
(изменено)

Предмет обсуждения пока что вполне сферичен и в вакууме. Будет что пощупать руками - будем посмотреть.

 

self.base.statics[self.downbtn]:LMouse(function()
        local wnd = mag_ref_support.GetWND()
        wnd:DescrWndUp()
    end) -- я ж понятия не имею, что оно делает, и зачем.

Изменено пользователем Dennis_Chikin
  • Согласен 1

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


Ссылка на сообщение
(изменено)

В этом конкретном примере функция нужна ровно одна. Чтобы там внутри что-нибудь сделалось. "Когда-нибудь в свободное время". И, соответственно, строка нужна тоже одна. То есть, не нужны ни __init(), ни reset(), ни загрузки/сохранения. Ни, соответственно, "получать" и хранить сам "менеджер".

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

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


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

Не надо ничего создавать.

bind_stalker: function actor_binder:on_item_take() - добавить свою проверку и добавить db.actor:give_info_portion(), тоже с проверкой на то, что уже выдано. И, да, целая отдельная тема есть, где все расписано.

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


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

"У него своя секция? Или sid?"

 

Да как-бы и obj:name() в таком случае должно быть вполне достаточно.

А скрит, кстати, откомментирован вполне подробно. Если уж ЭТОГО недостаточно, то вопрос называется "а вот сделайте мне сам не знаю что, но чтобы было".

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


Ссылка на сообщение
(изменено)

Э-эээ... Может, сначала попробовать расшифровать ?

Что за "лист" такой, зачем делать mu_call="Имя_скрипта"..".".."имя_функции".."()", и т.д.

 

Ибо, во-первых, есть классическое

local func
local module, fname = string_match( infop.func, "(.+)[.](.+)" )
if not fname then func = xr_effects[infop.func]
elseif _G[module] and _G[module][fname] then func=_G[module][fname]
end
из xr_logic.script, во-вторых:

t = { ["fn"] = module.fn }
...
t["fn"]()
Или надо что-то еще ? Изменено пользователем Dennis_Chikin

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


Ссылка на сообщение
(изменено)

xr_logic - это не работа с info как таковыми, а разбор условий и какие-то действия по этим условиям.

Здесь нам интересно конкретно реализация действия %=miscript.myfunc%

 

Если оно находит точку, то func=_G["miscript"]["myfunc"]

если точки нет - то есть, в логике написано  %=myfunc% - то пытается найти функцию "myfunc" в xr_effects.script.

Ну а дальше там идет банально func() - то есть, вызов найденного.

 

 

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

if another_script.myfunc then another_script.myfunc() -- функция есть, вызываем

else ... -- оппаньки !

end

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

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


Ссылка на сообщение
(изменено)

Кстати, о птичках, точнее - об этих самых кнопках из соседней темы:

w = CUIButton()

w:SetWindowName( "btn_next" )

w:SetAutoDelete( true )

w:Init( 250, 60, 50, 30 )

self:AttachChild( w )

self:AddCallback( "btn_next", ui_events.BUTTON_CLICKED, self.next, self )

w:Show( true )

 

Что здесь не так, что первое нажатие оно отрабатывает нормально, второе - 2 раза, а дальше - 4 и т.д.

Кнопку мы после каждого нажатия перерисовываем, но как бы вроде разве недостаточно w = CUIButton(), чтобы старая удалилась ?

Это надо еще какое-то волшебное слово сказать ?

 

 

2 abramcumner: в общем, да, DetachChild() помогает, но дешевле оказалось избавиться от перерисовки. Выяснилось, что нужные статики ложатся в нужном порядке, а оригинал был странен, но просто до подобной ситуации обычно не доживал.

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

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


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

"при взятии денег из схрона прибавлять их к общим деньгам ГГ"

 

Если деньги - это предмет, то вешаем вызов на on_take_item_from_box().

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


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

function take_money(pid)

db.actor:iterate_inventory(is_item, db.actor)

end

 

Жуть какая...

Собственно, то, что получаем - это и есть искомый предмет. Все. Получаем id, получаем объект, удаляем.

Больше ничего не надо. Ни каких итераций.

 

Единственный момент - после того, как удалили, ни каких действий в :on_что-попало() быть не должно. Собственно, я в статье про использование именно по-этому и сделал выбор нужной функции по таблице. Ну и продолжение трэда можно в курилке посмотреть.

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


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

2 7.9: однозначно, нет.

 

2 Shadows: а проверки с логом добавить ?

s = get_hud():AddCustomStatic("static") - вот здесь статик точно возвращается ?

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


Ссылка на сообщение
(изменено)

local t_info, t_info_any, t_info_n = {}, {}, 0

function add_on_info( f, nfo )	-- ( функция, инфо ), либо f для любых инфо
	if nfo then
		local t = t_info[nfo]
		if t then table_insert( t, f )
		else t_info[nfo] = { f }
		end
	else t_info_n = t_info_n + 1; t_info_any[t_info_n] = f
	end
end

function actor_binder:info_callback( npc, nfo )
	for i = 1, t_info_n do t_info_any[i]( nfo, npc ) end
	local t = t_info[nfo]
	if t then
		for i = 1, #t do t[i]( nfo, npc ) end
	end

	ltasks_proceed()		-- Сюжет
	ltasks_process_info( nfo )	-- Отметки на карте
end

 

local sms_t = {	-- info, текст; todo	-- сделать проверку живости авторов
	["sms_pulya"]		= "sms_pulya_text",
	["sms_lukash"]		= "sms_lukash_text",
	["sms_serega"]		= "sms_serega_text",
	["sms_borov"]		= "sms_borov_text",
	["sms_volk"]		= "sms_volk_text",
	["sms_shurup"]		= "sms_shurup_text",
	["sms_dan"]		= "sms_dan_text",
	["sms_new_dan1"]	= "sms_new_dan1_text",
	["sms_new_dan2"]	= "sms_new_dan2_text",
	["mitya_dead_sms_sidor"] = "Здорово Меченый, это Сидор,зайди есть посылка любопытная" }

function send_sms( sms )
	if sms_t[sms] then
		actor:give_info_portion( sms )
		amk_tip( game.translate_string( sms_t[sms] ), nil, nil, 30 )
	end
end


-- was: wawka

function add_krysyk_pomer_treasure()
	treasure_manager.get_treasure_manager():give_treasure( "esc_secret_village_rucksack" )
end


function check_bes_dead()
	if actor:has_info( "val_pula_ammo_start" ) and actor:dont_has_info( "val_pula_ammo_done" ) then
		timer_start( "send_sms", math_random( 20, 30 ), "sms_pulya" )
		timer_start( "send_sms", math_random( 50, 60 ), "sms_lukash" )
		timer_start( "send_sms", math_random( 70, 80 ), "sms_serega" )
	end
end

...

info_f = {
	["gar_hellcar_umer"]		= check_bes_dead,	-- по-моему, это info ни кто не генерит
	["bandit_krisyk_umer"]		= check_krysyk_dead,
	["esc_vagon_wounded_umer"]	= check_tolik_dead,
	["mil_freedom_member0018_umer"]	= check_maks_dead,
	["gar_dm_novice_umer"]		= check_yurik_dead,
	["marsh_dan_umer"]		= marsh_dan_umer,
	["ucen_talk_est"]		= marsh_dan_umer2,
	["mil_dolg_phase1"]		= mil_dolg_attack1,
	["mil_dolg_after_explode"]	= mil_dolg_attack2,
	["mitya_dead"]			= check_mitya_dead,
	["shadowman_zver_have"]		= check_shadowman_zver,
	["shadowman_zver_fail"]		= check_shadowman_zver,
	["grab_stal1_dead"]		= on_death_info,
	["grab_stal2_dead"]		= on_death_info,
	["grab_stal3_dead"]		= on_death_info,
	["grab_stal4_dead"]		= on_death_info,
	["grab_stal5_dead"]		= on_death_info,
	["tutorial_wounded_give_info"]	= esc_shustryi,
	["tutorial_wounded_start"] 	= esc_shustryi,
	["esc_blocpost_pust"]		= esc_desant_heli_1,
	["esc_btr_killed"]		= esc_desant_heli_2
} -- /info_f

info_f_invcl = {}


function on_inv_close()
	for k, f in pairs( info_f_invcl ) do
		if f and actor:has_info( k ) then f() end
	end
end


function on_info( nfo, something )
	log( "info", "on_info: %s, %s", nfo, to_str( something ) )
	if something and something.name then
		log( "info", "on_info, name: %s", something:name() )
	end
	local f = info_f[nfo]
	if f then f( nfo, something ) end
end

...
bind_stalker.add_on_info( on_info )

 

https://dl.dropboxusercontent.com/u/27871782/storyline.script

 

P.S. Таймеры - не нужны !

На самом деле тот же actor:give_game_news() задержку сам умеет, без всяких таймеров. Так что здесь осталось только по тому, что переносилось когда-то незадумываясь над смыслом переносимого.

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

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


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

2 abramcumner: ну, во-первых, при s/l и с таймером "доходить" не будет, по вполне очевидной причине.

Во-вторых, надо проверить, конечно. Ибо голые подозрения к делу не пришьешь.

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


Ссылка на сообщение
(изменено)

Сначала начинает идти игровое время, затем отрабатывают таймеры, потом идет загрузка торговли/озвучки для неписей. А на экране - все еще заставка.

 

 

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

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

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


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

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

AMK-Team.ru

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