Форум » » Диалог » Ответить

Диалог

Molok: Здраствуйте. вот недавно (дня 4 назад) занялся изучением движка. Намного больше понравилось писать все действия через команды, выполняемые при посещении. Вот у меня диалог: [quote]*pl '- Чай, кофе?' act 'Благодарю': $selact DELACT $SELACT Delact 'Не - спасибо, я сегодня уже что-то не то съел... ' end act 'Не - спасибо, я сегодня уже что-то не то съел... ': $selact DELACT $SELACT delact 'Благодарю' end[/quote] Дальше у меня при любом варианте ответа будет одно и тоже продолжение. пока кроме как в вставки в каждый ответ действия не знаю как сделать иначе. Но у меня там ещё на 150 строк текста, а там ещё не единожды встречаются подобные действия. Вот вопрос, что тут можно сделать? Пока кроме как присвоить какой-то переменной выполнение программы (макрос по сути) либо сделать ссылку на часть программы мыслей других не приходит. Но из-за своего незнания не знаю как и это сделать =))

Ответов - 16 новых

WladySpb: Если у тебя один и тот же кусок кода повторяется много раз, можешь вынести его на отдельную локацию, а вызывать в нужных местах через gs'локация с кодом' Или ты имеешь в виду что у тебя большой диалог который при любом выборе в конце концов закончится одинаково?

WladySpb: можно, кстати, упростить код. *pl писать не обязательно, 'текст' по умолчанию выводится именно так. $selact - это по моему было в одном из примеров... Тоже необязательно, то действие которое ты выбрал по умолчанию хранится в переменной $selact '- Чай, кофе?' act 'Благодарю': DELACT $SELACT Delact 'Не - спасибо, я сегодня уже что-то не то съел... ' end act 'Не - спасибо, я сегодня уже что-то не то съел... ': DELACT $SELACT delact 'Благодарю' end Так же, если у тебя всего два варианта выбора, не обязательно использовать: DELACT $SELACT delact 'Благодарю' оператор cla убирает все действия. то есть, тот же код в ещё более сокращённом варианте: '- Чай, кофе?' act 'Благодарю': cla end act 'Не - спасибо, я сегодня уже что-то не то съел... ': cla end единственно, после совершения действия должен происходить хоть какой-то код, кроме очистки списка действий) Если тебе нужно встроить туда один и тот же ответ для обоих вариантов, можно либо скопировать его, либо, если таких мест много - попробовать через gs: '- Чай, кофе?' act 'Благодарю': cla gs 'локация с действием' end act 'Не - спасибо, я сегодня уже что-то не то съел... ': cla gs 'локация с действием' end

Molok: WladySpb пишет: Или ты имеешь в виду что у тебя большой диалог который при любом выборе в конце концов закончится одинаково? Да, именно так. Пробвал через JUMP, но наверно пишу что-то не так.... act 'прыжок': Jump 'LABEL' :LABEL что в этой записи может быть не правильно?


Molok: WladySpb пишет: $selact - это по моему было в одном из примеров... Тоже необязательно, то действие которое ты выбрал по умолчанию хранится в переменной $selact $selact выводит название этого действие в окно как текст как я понял

WladySpb: jump работает только в "текущем" куске кода.. это не указано в хелпе, но такая конструкция не прокатит. не совсем понимаю почему, это Байт лучше объяснит, но в данном случае, оператор jump ищет label в пределах кода выполняемого после выбора действия. jump подходит только для организации циклов. Создай новую локацию и помести в неё код вывода действия, это проще.

WladySpb: Molok Ну, если текст не отличается, то можно оставить.. Я обычно отдельно вывожу, плюс, обычно нужно ещё вывести ответ.

Molok: WladySpb пишет: Создай новую локацию и помести в неё код вывода действия, это проще таких развилок выходить довольно много. под каждую создавать локацию выйдет слишком грамоздко. А что можно использовать за место Jump? Вроде в бейсике работало goto "номер строки", но тут тоже не прокатило....

WladySpb: Molok если хочешь всё в одной локации замутить, попробуй через аргументы. Предположим, локация называется диалог. код у нас будет выглядеть так: if $ARGS[0]!'': jump $ARGS[0] *pl '- Чай, кофе?' act 'Благодарю': $selact DELACT $SELACT delact 'Не - спасибо, я сегодня уже что-то не то съел... ' gs 'диалог','LABEL' end act 'Не - спасибо, я сегодня уже что-то не то съел... ': $selact DELACT $SELACT delact 'Благодарю' gs 'диалог','LABEL' end exit :LABEL 'У нас в меню есть фирменное блюдо!' act'следующее действие': end В массиве $ARGS хранится передаваемая в локацию информация, то есть, строчкой gs 'диалог','LABEL' мы переходим на локацию диалог с аргументом LABEL а в начале локации проверяем аргументы, и если массив не пуст, переходим jump'ом (здесь он сработает) в место указанное аргументом. exit нужен, чтобы код после LABEL не начал выполнятся раньше чем нужно.

Molok: Я конечно понимаю что тебя уже достал этот нуб, хотя может ещё и не достал =) В общем вот кусок игры, собственно локация на которой расположен диалог: http://slil.ru/27756055 Понимаю что можно было всё сделать компактней но я на этом учусь =) Ближе к концу тот кусок, на котором мне надо сделать этот переход. Как его сделать я не пойму =( В примерах ничего дельного не нашёл. Может покажешь на примере? А то так я не догоняю....

Byte: Если речь всё ещё о act 'прыжок': Jump 'LABEL' :LABEL то вставляем в начало локации [pre2]if $ARGS!'':jump $ARGS[/pre2] и далее вместо всех подобных Jump 'LABEL' вставляем gt 'название_текущей_локации', 'LABEL' Конечно, можно вместо gt указать gs - программа будет вести себя соответственно оператору.

Molok: Код ошибки 120. Неверное количество числа функций/аргументов....

Byte: Molok, какая версия QSP?

Molok: Спасибо за подсказку) вот обновить я не догадался, вроде работает =)

Byte: Molok, текущая версия QSP - 5.5.7 -- http://qsp.su/files/comment.php?dlid=1 Для WinCE - 5.5.5 -- http://qsp.su/files/comment.php?dlid=66

Byte: OK.

WladySpb: И, кстати, по мотивам этой темы на сайте появился новый пример диалога) Так что, при наличии вопросов "как сделать" можно попробовать покопаться в коде, а если что будет непонятно - мучить меня вопросами "как сделано"



полная версия страницы