Перейти к содержимому


Фотография

Немного о диалоговой последовательности


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 16 Октябрь 2012 - 22: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", только с обновленными параметрами. Так ли это?


#2 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 17 Октябрь 2012 - 07:28

Нет, не так. cur_pos — это текущая стартовая позиция в списке рецептов, начиная с которой эти самые рецепты выводятся на экран. На этом, собственно, всё. :)


#3 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 17 Октябрь 2012 - 08:03

Ну это я понял, просто немножко коряво это описал :). Там перед выводом вариантов диалога идет просчет — сколько рецептов должно пропуститься, чтобы не было повторов на следующей странице .

Я просто не пойму куда идет скрипт после процедуры "list_next" :).


#4 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 17 Октябрь 2012 - 19:02

На следующую строчку процедуры, которая его вызвала, вестимо. Я чё-т не пойму, в чём проблема? Функция display_items_avail отображает ITEMS_PER_SCREEN рецептов, начиная с cur_pos. Что именно там не понятно? Конкретизируй, что ты пытаешься найти/сделать.


#5 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 18 Октябрь 2012 - 08:18

Ага, вот оно как...
Т.е. после выполнения процедуры "list_next" скрипт возвращается обратно и просчитывает вывод рецептов с объявленной переменной "cur_pos".
Ну тогда все понятно, сорри за тупизну :) , просто я думал, что после перехода к процедуре "list_next" скрипт окончательно и бесповоротно переходит на нее, и обрабатывается дальше по совсем другой ветке, а там только увеличение переменной и больше нема :).


#6 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 18 Октябрь 2012 - 10:59

Нет, рецепты выводятся до вызова list_next.

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

И всё-таки, что конкретно ты хочешь сделать/найти? Поясни, так проще будет.


#7 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 18 Октябрь 2012 - 12:33

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

Т.е. я не пойму, как после функции "list_next" вдруг начинает работать код, который был ДО вызова этой функции.

П.С. Совершенно верно замечено, что кроме того что было написано в "script how to" и каких-то основ Паскаля, которые мне дали еще в старших классах школы — я больше не знаю ни-че-го :). А все потому что я не программист, а инженер. Работая со скриптами я придерживался только главного правила "ничего просто так не происходит" и до этого момента этот принцип работал совершенно, помогая в разборе/создании скриптов разной степени извращенности, но вот почему происходит ситуация , которая описана выше — я так и не понял...

Это сообщение отредактировано Nordan - 18 октября 2012 | 15:27


#8 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 18 Октябрь 2012 - 14: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. И так далее.


#9 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 18 Октябрь 2012 - 15:37

Ага-а, вот в чем прикол, теперь все понятно.

Причем мысль о том, что управление после функции "list_next" будет просто уходить постепенно назад — была у меня одной из первых, вот только я не обратил внимание на цикл в "loop_mode" и решил, что управление сразу перейдет в самую первую процедуру, где следующая строка просто удаляет все окно, поэтому я сразу отверг эту идею и стал искать более "неземные" варианты. :)
Но теперь все встало на свои места, окно будет удаляться только тогда, когда mode = -1, и просто не пройдет проверку в "loop_mode" , перейдет в самую первую функцию, где и удалиться на следующей строчке . :)

Спасибо что разжевали :).




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru