Nordan
16 October 2012 | 23:30
У меня созрел один большой вопрос при разборе исходника скрипта Mr. Fixit. Я добрался до вывода строчек диалога, которые в данном случае являются списком рецептов в главном меню этого мода, но я немного завис на вот этом вот фрагменте...
CODE |
...
if (cur_pos + ITEMS_PER_SCREEN < items_avail - 1) then SayOption(bstr(105), list_next);
...
procedure list_next begin
cur_pos += ITEMS_PER_SCREEN; end
|
Т.е. иными словами если выполняется условие "(cur_pos + ITEMS_PER_SCREEN < items_avail 1)" должна появиться кнопка "Следующая страница" , при нажатии которой будет вызываться процедура "list_next". Но в этой процедуре происходит только увелицение переменной, отвечающей за пропуск "предыдущих рецептов" (которые "как-бы" были на прошлых страницах) и все, тупик. На практике же видно, что после нажатия этой кнопки появляется следующая страница рецептов.
Я так понял, что когда диалог заходит в такой "тупик", то он начинается сначала, т.е. со сточки "SayStart", только с обновленными параметрами. Так ли это?
Wasteland Ghost
17 October 2012 | 08:28
Нет, не так. cur_pos это текущая стартовая позиция в списке рецептов, начиная с которой эти самые рецепты выводятся на экран. На этом, собственно, всё. :)
Nordan
17 October 2012 | 09:03
Ну это я понял, просто немножко коряво это описал :). Там перед выводом вариантов диалога идет просчет сколько рецептов должно пропуститься, чтобы не было повторов на следующей странице .
Я просто не пойму куда идет скрипт после процедуры "list_next" :).
Wasteland Ghost
17 October 2012 | 20:02
На следующую строчку процедуры, которая его вызвала, вестимо. Я чё-т не пойму, в чём проблема? Функция display_items_avail отображает ITEMS_PER_SCREEN рецептов, начиная с cur_pos. Что именно там не понятно? Конкретизируй, что ты пытаешься найти/сделать.
Nordan
18 October 2012 | 09:18
Ага, вот оно как...
Т.е. после выполнения процедуры "list_next" скрипт возвращается обратно и просчитывает вывод рецептов с объявленной переменной "cur_pos".
Ну тогда все понятно, сорри за тупизну :) , просто я думал, что после перехода к процедуре "list_next" скрипт окончательно и бесповоротно переходит на нее, и обрабатывается дальше по совсем другой ветке, а там только увеличение переменной и больше нема :).
Wasteland Ghost
18 October 2012 | 11:59
Нет, рецепты выводятся до вызова list_next.
Nordan, ты знаком с основами программирования? Есть некие общие принципы, которые следует изучить перед тем, как начинать ковырять скрипты.
И всё-таки, что конкретно ты хочешь сделать/найти? Поясни, так проще будет.
Nordan
18 October 2012 | 13:33
Да, я знаю что рецепты выводятся до вызова функции "list_next", я создал эту тему лишь потому что я насовсем понимаю по какому закону работает say-режим.
А конкретно, почему уже после вывода рецептов и нажатия заветной кнопки "следующая страница" и увеличения переменной, непосредственно влияющей на отображения определенных рецептов, вдруг пропадают предыдущие рецепты и появляются новые, хотя никакого обновления там не последовало.
Т.е. я не пойму, как после функции "list_next" вдруг начинает работать код, который был ДО вызова этой функции.
П.С. Совершенно верно замечено, что кроме того что было написано в "script how to" и каких-то основ Паскаля, которые мне дали еще в старших классах школы я больше не знаю ни-че-го :). А все потому что я не программист, а инженер. Работая со скриптами я придерживался только главного правила "ничего просто так не происходит" и до этого момента этот принцип работал совершенно, помогая в разборе/создании скриптов разной степени извращенности, но вот почему происходит ситуация , которая описана выше я так и не понял...
Wasteland Ghost
18 October 2012 | 15:48
Ну, раз не программист, то понятно. :) Нагугли чего-нить по подпрограммам/процедурам/функциям и изучи на досуге, будет проще разбирать код. Кратко могу сказать, что после вызова процедуры и её исполнения, управление возвращается в точку вызова. Т.е. последовательный вызов процедур изнутри некой first_procedure в конечном итоге вернёт программу снова в first_procedure.
Фиксит работает так: из процедуры description_p_proc (см. obj_dude.ssl) вызывается процедура batch_init. Там происходит некое предварительное шаманство, а потом вызов loop_mode. Если спикаешь по инглишу, название этой процедуры скажет тебе всё само. :) В loop_mode воткнут цикл, который выполняется до тех пор, пока игрок не ткнёт опцию выхода, которая установит mode = -1. Во всех остальных режимах (mode = 0...4) будут выводиться соответствующие меню. Соответственно, когда юзер жамкает next, вызывается list_next, на которой всё "заканчивается", т.е. управление последовательно возвращается в loop_mode, где снова благополучно зацикливается, ибо mode == 1 и снова вызывает display_items_list, который отображает рецепты с нового значения cur_pos. И так далее.
Nordan
18 October 2012 | 16:37
Ага-а, вот в чем прикол, теперь все понятно.
Причем мысль о том, что управление после функции "list_next" будет просто уходить постепенно назад была у меня одной из первых, вот только я не обратил внимание на цикл в "loop_mode" и решил, что управление сразу перейдет в самую первую процедуру, где следующая строка просто удаляет все окно, поэтому я сразу отверг эту идею и стал искать более "неземные" варианты. :)
Но теперь все встало на свои места, окно будет удаляться только тогда, когда mode = -1, и просто не пройдет проверку в "loop_mode" , перейдет в самую первую функцию, где и удалиться на следующей строчке . :)
Спасибо что разжевали :).