Появился один вопрос относительно URQL.
Сцены\комнаты\локации могут иметь свои локальные переменные, которые не будут сбрасываться с каждым новых входом?
Конкретный пример того, что хотел реализовать:
Есть комната, там есть монстр, а у него есть "очки здоровья" и именно эти ОЗ должны сохраняться т.е. зашёл - пострелял немного, а затем сбежал, потом вернулся и добил монстра.
Такое можно реализовать? Конечно можно глобальную переменную объявить что-то вроде loc_room_gateA_monter_hp, но это как-то ... вроде должно быть что-то такое встроенное?
Неактивен
В URQ нет локальных переменных, и это не объектно-ориентированный язык. Посещение/покидание локации в общем случае не влияет на значения переменных, если только не присваивать этим переменным значения в явном виде (из этого правила есть исключения, но пока ими можно пренебречь).
Посмотрите описание языка здесь: http://urq.plut.info/texts
(Там для старой версии под DOS, но сами принципы языка с тех пор не сильно поменялись).
Один из приемов, чтобы не запутаться в длинной череде похожих переменных - давать переменным, относящшимся к определенной локации, имя, начинающееся с имени этой локации.
Неактивен
uux написал:
Один из приемов, чтобы не запутаться в длинной череде похожих переменных - давать переменным, относящшимся к определенной локации, имя, начинающееся с имени этой локации.
Таки пришёл к этой мысли. Это будет немного запарно конечно. Жаль, что нет зачатков ООПа, хотя бы в виде локальных и глобальных переменных - придётся выходить из ситуации.
Функции в URQ - это по сути тоже комнаты? Можно как-то нацепить на кнопку (возможно, в сплывающем меню) посещение и возвращение обратно? Есть вроде такая штука как "proc", но есть ли подобие, но для кнопок?
В чём суть - хочу сделать что-то вроде "магазина", в который можно будет войти из различных локаций, при этом там можно (вот неожиданность!) купить что-нибудь, хотелось бы по кнопке сделать это (операция с инвентарём), а потом нажав на "назад" - вернуться в локацию из которой зашли в магазин.
Неактивен
DarkDes написал:
uux написал:
Один из приемов, чтобы не запутаться в длинной череде похожих переменных - давать переменным, относящшимся к определенной локации, имя, начинающееся с имени этой локации.
Таки пришёл к этой мысли. Это будет немного запарно конечно. Жаль, что нет зачатков ООПа, хотя бы в виде локальных и глобальных переменных - придётся выходить из ситуации.
Функции в URQ - это по сути тоже комнаты? Можно как-то нацепить на кнопку (возможно, в сплывающем меню) посещение и возвращение обратно? Есть вроде такая штука как "proc", но есть ли подобие, но для кнопок?
В чём суть - хочу сделать что-то вроде "магазина", в который можно будет войти из различных локаций, при этом там можно (вот неожиданность!) купить что-нибудь, хотелось бы по кнопке сделать это (операция с инвентарём), а потом нажав на "назад" - вернуться в локацию из которой зашли в магазин.
Если я правильно помню, то в урке есть переменная превлок, которая хранит имя предыдущей локации, как каррент лок хранит текущей, если вы перешли по кнопке или по ссылке. Надо смотреть. Но вообще можно поставить переменную на этих локациях, которой присваивать имя локации и использовать её для возвращения из магазина. Нужен код или смысл понятен?
Отредактировано Ajenta (10.08.2015 17:34)
Неактивен
Да, вроде смысле понятен. По сути это тогда получается собственные переменные рода "превлок" и "каррентлок". Но на самом деле понадобится только одна - превлок. Получается её каждый раз необходимо будет ставить для каждой локации или есть какой-то механизм для этого? Вроде имеется локация common - она вызывается при действии (переходе) или всегда (как обновление игры - каждый "кадр") ?
Неактивен
DarkDes написал:
Да, вроде смысле понятен. По сути это тогда получается собственные переменные рода "превлок" и "каррентлок". Но на самом деле понадобится только одна - превлок. Получается её каждый раз необходимо будет ставить для каждой локации или есть какой-то механизм для этого?
Из документации: current_loc и previous_loc (строковые системные переменные) хранят имена соответственно текущей и предыдущей посещенной локаций. previous_loc удобно использовать для сохранения игры из любой локации при помощи действия типа use_inv_Запись. Для первой локации previous_loc равна ее имени (чтобы сохранение работало и для нее). current_loc и previous_loc теперь меняются только при btn-переходах.
DarkDes написал:
Вроде имеется локация common - она вызывается при действии (переходе) или всегда (как обновление игры - каждый "кадр") ?
Локация common вызывается только при переходах по btn. Есть еще системная числовая переменная Common, позволяющая задать, к какой именно локации Common будет происходить обращение (например, при Common=5 вызываться будет локация Common_5).
Это, кстати, тоже из документации:).
Неактивен
Да я просто невнимательно похоже читал, раз не заметил этого )
Про сохранение чего-то не совсем понял, которое про use_inv_Запись. Это такая "функция" для сохранения игры? Или это что-то совсем другое. Видел в плеере есть загрузка, а сохранение я так понял на плечах автора? Т.е. только он сам решает где должно быть сохранение или же можно всё таки сделать пункт меню "сохранить игру" ?
Неактивен
DarkDes написал:
Да я просто невнимательно похоже читал, раз не заметил этого )
Про сохранение чего-то не совсем понял, которое про use_inv_Запись. Это такая "функция" для сохранения игры? Или это что-то совсем другое. Видел в плеере есть загрузка, а сохранение я так понял на плечах автора? Т.е. только он сам решает где должно быть сохранение или же можно всё таки сделать пункт меню "сохранить игру" ?
В меню этого действительно нет. Только автор ставит где он хочет, чтобы сохраняли игру. Можно повесить кнопку сохранения на экран или сделать меню для игры, или повесить её в инвентаре, как многие делают.
https://clck.ru/9ZQoE
Вот всё про сохранение в фурке.
Неактивен
О, получается можно сделать кнопку, которая всегда будет активна и не будет привязана к самому квесту, а будет где-то там висеть ? Тогда наверно так и стоит сделать мне ибо там скорее всего будет большая смертность персонажа, а может и нет - посмотрим как будет.
Всё больше я сомневаюсь в выборе URQ. Думаю больше с уклоном в объекты, а URQL не такой язык. Как можно сделать на нём сущность монстра и при этом с параметрами различными?
Ладно, если речь идёт о какой-то конкретном монстре, но что если я захочу в локацию А поместить монстра с типом1 ? Т.е. это ведь как-то надо будет всё вычислять, надеюсь меня спасут функции.
Неактивен
DarkDes написал:
О, получается можно сделать кнопку, которая всегда будет активна и не будет привязана к самому квесту, а будет где-то там висеть ? Тогда наверно так и стоит сделать мне ибо там скорее всего будет большая смертность персонажа, а может и нет - посмотрим как будет.
Всё больше я сомневаюсь в выборе URQ. Думаю больше с уклоном в объекты, а URQL не такой язык. Как можно сделать на нём сущность монстра и при этом с параметрами различными?
Ладно, если речь идёт о какой-то конкретном монстре, но что если я захочу в локацию А поместить монстра с типом1 ? Т.е. это ведь как-то надо будет всё вычислять, надеюсь меня спасут функции.
Если вы пирвыкли к ООП, берите instead и не мучайтесь. URQ позволяет как раз на ооп не заморачиваться тем, кто с ним не знаком и делать всё то же самое своими простыми методами.
Но если вам удобнее ооп, то зачем себя насиловать?
Неактивен
Подумаю по поводу instead, спасибо.
Пока всё же ставлю себе цель описать всё независимо от платформы и уже от этого идти дальше, однако, уже лучше со старта знать некоторые моменты платформы. Сколько ещё времени уйдёт на конкретную реализацию - не знаю.
Instead выглядит сложнее с первого взгляда, буду иметь ввиду тогда эти две платформы, да.
Неактивен
Появилось пару вопросов-проблем относительно URQ.
Можно ли составлять конструкции вот такого вида?
if <> then A1 else if <> then A2 else if <> then A3 else A4
Пробую написать такое, но условия срабатывают как-то неверно.
И ещё по поводу меню. Нужно каждый раз делать метки вроде такого:
:mark1 btn mark1_1, Abc btn mark1_2, Def end :mark1_1 ... end :mark1_2 ... end
Можно ли как-то сократить такую конструкцию? Т.е. чтобы логика нажатия кнопок оставалась в рамках одного mark1 ?
И похоже нет возможности вызвать proc в меню? Хотел вывод сообщений сделать при нажатии на кнопку, но мне дебаг говорит, что нельзя.
UPD:
И ещё такой вопрос. Все проверки в if then else происходят при помощи == ? Постоянно то там, то здесь условие не срабатывает - это меня огорчает.
И переменные. Они же все глобальные, так? т.е. они не только в области метки действуют? Это к предыдущему вопросу - условия не срабатывают.
Вот конкретный код:
:proc_EnterCode;( CODE, HACKLVL ) proc_EnterCode_BOOL_OUT = 0; proc_EnterCode_BOOL_HACK = 0; proc Sys_Msg( "Введите код" ); pln input InputCode; if (InputCode == #%proc_EnterCode_1$ ) then _proc Sys_Msg( "Ввод кода - Удачно!" ) & proc_EnterCode_BOOL_OUT = 1 else proc Sys_Msg( "Кодовый замок - Неуспех!" ) & proc_EnterCode_BOOL_OUT = 0 end; :EnterSecretCode proc proc_EnterCode( "11111", 0 ); if proc_EnterCode_BOOL_OUT = 1 then _ proc Sys_Msg("Код верный! Вы получили навыки: Хакерство+ и макс.здоровье до 40!") & _ Hero_Hacker = 3 & _ C_HealthPointsMax = 40 _ else _ proc Sys_Msg("Код неверный. Хотите попробовать ещё?") & _ btn EnterSecretCode, Да goto NowOnShip5; end;
Отредактировано DarkDes (14.09.2015 13:15)
Неактивен
DarkDes написал:
Появилось пару вопросов-проблем относительно URQ.
Можно ли составлять конструкции вот такого вида?Код:
if <> then A1 else if <> then A2 else if <> then A3 else A4Пробую написать такое, но условия срабатывают как-то неверно.
Можно. Просто пиши все подряд if A then B else if C then D и т.д. Можно использовать переносы строк для наглядности, но ты это умеешь. Подводный камень был в том, чтобы понять какой else относится к какому ifу, но это легко понять один раз сильно протестив подобную конструкцию в фурке.
DarkDes написал:
И ещё по поводу меню. Нужно каждый раз делать метки вроде такого:
Код:
:mark1 btn mark1_1, Abc btn mark1_2, Def end :mark1_1 ... end :mark1_2 ... endМожно ли как-то сократить такую конструкцию? Т.е. чтобы логика нажатия кнопок оставалась в рамках одного mark1 ?
Для такого нужно использовать кнопку с параметром (работает только в фурке).
Могу путаться в синтаксисе, глянь на вики как правильно их использовать, но идея такая:
:0 btn mark(1), Abc ; по нажатию кнопки передаем в первую переменную локации mark единичку btn mark(2), Abc ; по нажатию кнопки передаем туда же двойку end :mark if mark_1=1 then pln Нажата первая кнопка if mark_1=2 then pln Нажата вторая кнопка end
DarkDes написал:
И похоже нет возможности вызвать proc в меню? Хотел вывод сообщений сделать при нажатии на кнопку, но мне дебаг говорит, что нельзя.
По-моему ты говоришь про т.н. "локальные действия", тоже есть в документации на вики. Но вообще, первый раз слышу, что кто-то использует меню в реальной игре Удачи!
DarkDes написал:
Вот конкретный код:
Код:
if (InputCode == #%proc_EnterCode_1$ )
Ты здесь сравниваешь значение переменной InputCode со значением другой переменной, имя которой - значение переменной proc_EnterCode_1. Т.е., если proc_EnterCode_1="z" урка понимает твое выражение как if (InputCode == z), а чему там равно значение этого z никто не знает, скорее всего "".
Если нужно сравнить значение InputCode с текстовым значением proc_EnterCode_1, то лучше ставить кавычки.
if (InputCode == "#%proc_EnterCode_1$" )
Отредактировано Евг (14.09.2015 14:05)
Неактивен
Евг, спасибо за ответ!
Поковырялся в коде и ... понял, что опять что-то намудрил сам.
Конструкция из многих if-then-else действительно нормально работает - записал сначала в строку, а потом попытался разбить - вроде нормально.
Про передачу параметра в кнопку - хорошее решение, надо будет сделать так.
А вот с инпутом это я серьёзно проиграл даже в двух местах. В строку перевёл и параметр и сам инпут - всё стало окей.
Важный момент для Урки, который на мой взгляд нелогичен - разный запрос на "=" и "==". Собственно второй годится для строк (поэтому инпут с ним и сравнивается), а первый - для чисел. От того и не правильно условия были у меня
Неактивен
== появилось во времена досурки, когда Корянов решил сделать сравнение строк по маске
Если = просто сравнивало переменные по "совпадает одно с другим или нет", то == позволяло писать конструкции вида if str == "взять *" then ... или if date == "??.01.2015" then ... Таким образом не надо было бить строки на буквы и перебирать каждую в цикле. Но этим, кажется почти никто не пользуется
Отредактировано Евг (15.09.2015 13:06)
Неактивен
Евг написал:
== появилось во времена досурки, когда Корянов решил сделать сравнение строк по маске
Если = просто сравнивало переменные по "совпадает одно с другим или нет", то == позволяло писать конструкции вида if str == "взять *" then ... или if date == "??.01.2015" then ... Таким образом не надо было бить строки на буквы и перебирать каждую в цикле. Но этим, кажется почти никто не пользуется
Если бы об этом кто-то знал, то может быть и пользовались бы. Мне вот ты сейчас буквально Америку открыл.
И в фурке это работает, кстати?
Неактивен
Ну да, проверь:
:0 z = "взять лук" if z == "взять *" then p Я взяла & if z == "* лук" then p лук и заплакала. else p что-то непонятное и теперь не знаю, что с этим делать. else p Ничего я не взяла. end
Неактивен
Ajenta написал:
Если бы об этом кто-то знал, то может быть и пользовались бы.
Об этом вроде как в документации (описании URQL для URQ_DOS от Корвина) написано. Страница 21, "Строковые переменные и работа с ними".
Неактивен
uux написал:
Ajenta написал:
Если бы об этом кто-то знал, то может быть и пользовались бы.
Об этом вроде как в документации (описании URQL для URQ_DOS от Корвина) написано. Страница 21, "Строковые переменные и работа с ними".
Всё может быть, но для этого доку надо было найти и прочитать, а это ещё почти никому не удавалось
Спасибо за ссылку, ага. Ну и кстати кто в курсе, что в фурке это рабоотает, опять же.
Неактивен
Ajenta написал:
Ну и кстати кто в курсе, что в фурке это рабоотает, опять же.
Ну, вообще фурка изначально ориентирована была на то, чтобы по максимуму перенять стандарт досурки, поэтому по умолчанию можно считать, что если какой-то функционал есть в URQ_DOS, в FireURQ он тоже есть. (Тон, поправь меня, если что). Исключения, наверно, по пальцам одной руки пересчитать можно, причем бОльшая их часть описана в фурк-документации. Я навскидку из неподдерживаемых фич досурки могу вспомнить разве что чуть иную логику работы с инвентарем (вследствие чего иногда "размножаются" кнопки, а некоторые популярные авторы отказываются писАть на фурке). Да, еще DOS-кодировка не поддерживается, поэтому эпический квест про Евга, универ и спасательный круг на фурке без перекодировки не доступен.
Прости меня, Аджента, за длинный и занудный пост:).
Неактивен
Нужно будет запомнить эти хитрости : )
Наверно опять глупый вопрос, ответ на который где-то в документации, но опять не увидел его:
Имеется ли в Фурке\URQL символ перехода на следующую строку? Т.е. как обычно '\n' в Си.
Что-то вроде этого:
MyStringVar = "Это первая строка <символ перевода строки> А это вторая строка";
А выводилось бы это так:
Это первая строка А это вторая строка
Или такое не предусмотрено?
И ещё кое-что ... опять.
Можно делать подстановку в кнопку? Т.е. у меня есть "функция" с параметром, где этот параметр - локация, например, "Loc_Begin". Пишу что-то вроде вот такого:
btn #%Loc_Begin$, Назад
Но Фурка ругается. Какое значение в кнопке вообще должно быть? Можно так делать? Это мне необходимо для кнопки "назад". Есть конечно previous_loc, но это не то, что необходимо.
UPD:
Ох, стоило написать и чуть повозится - решения нашлись
Вдруг кому пригодится - для переноса строки есть такая штука - #/$. Вставляется в текст и строка переносится.
А по поводу подстановки - похоже в BTN она не работает, но нашёл "хак", делаю так:
:Loc_Shop ... btn func_exit( "#%Loc_Shop_1$" ), Назад ... end :func_exit goto #%func_exit_1$ end
Использование: Loc_Shop( "Loc_to_go" );
И при нажатии на кнопку "назад" будет переход на указанную локацию. Знаю, что костыль, но через кнопку как-то не получилось.
Отредактировано DarkDes (20.09.2015 16:12)
Неактивен
Привет всем!
Квест ещё разрабатывается, но очень уж медленно, что печалит меня. Всё боюсь, что на КРИЛ не успею, но буду стараться.
Тут появился такой вопрос: имеется ли в URQ команда для очистки инвентаря? Или может полный рестарт, но в виде команды, а не стандартного пункта меню?
Неактивен
invkill
Неактивен
Александр Морт написал:
invkill
Да, invkill удаляет весь инвентарь. Есть еще perkill - сбрасывает все переменные.
Полный рестарт делается так: вначале квеста ставится метка, сразу после которой прописываются invkill и perkill. Когда нужен рестарт, просто каким-то образом осуществляется переход на эту метку (через btn, goto...)
Неактивен