Как сделать?
…
планируется что в игре в коде каждого действия будет прописано (время=время +хх) и за счет этого будет идти таймер.
хмм тогда возникает ситуация что если игрок сорвал яблоко вечером, то придя через 4 дня утром он его сорвать не сможет и надо ждать тогоже времени когда было произведено действие или позже.
думал можно задать новую переменную и приравнивать ее к “дни” в конце успешного выполнения действия, проверку если дни>=новая переменная+4 и выполнение(соответственно новое присвоение значение переменной=дни) =(
если я правильно понял игра не воспринимает “дни” как числовое значение и работать с этой “переменной” нельзя?
saks,
если игрок сорвал яблоко вечером, то придя через 4 дня утром он его сорвать не сможет и надо ждать тогоже времени когда было произведено действие или позже.
Да, именно так. Ведь яблоко вырастает через четыре дня?
Если оно вырастать должно в полночь с третьего дня на четвёртый, то делается так:
! Узнаём, во сколько времени начался текущий день.
полночь_сегодня = время - (время MOD (24*60))
! Время, в которое вырастет яблоко: сегодняшняя полночь + четыре дня.
время_яблока = полночь_сегодня + 4*24*60
если я правильно понял игра не воспринимает “дни” как числовое значение и работать с этой “переменной” нельзя?
Нет, неправильно. “Дни” - это лишь одна из составляющих переменной “время”. Смотрим, сколько минут прошло с начала игры по переменной “время”, определяем, сколько дней в этих минутах, результат записываем в “дни”. Поэтому каждый раз, когда потребуется обратиться к ней, она должна быть пересчитана, так как “время” могло измениться. Если ты не забудешь рассчитывать “дни” каждый раз когда она тебе понадобится, то можешь и по своему варианту сделать.
Я не рекомендую пользоваться составляющими - “дни”, “часы”, “минуты” вне вывода, только из-за того, что их нужно всё время пересчитывать. Это захламляет код, и в конечном счёте автор где-нибудь забывает пересчитать или путается, а потом будет тратить кучу времени на отлов багов. Без этих переменных можно обойтись.
В принципе, можно написать набор процедур и функций для работы с игровым временем, тогда риск накосячить будет меньше, код будет нагляднее. Но это уже не вопрос “как сделать”, а вопрос “как лучше сделать”, на него ответ у каждого свой. Кому-то нравится работать с процедурами и функциями. Я предлагаю минимальный код, необходимый для того, чтобы всё работало.
Главное - это понять принцип, как работать с игровым временем. Это вопрос “как сделать”. Дальше уже каждый сможет хоть так использовать, хоть взять чужую библиотеку функций (модуль) для работы со временем, хоть написать свою собственную.
Nex:
Я не рекомендую пользоваться составляющими - “дни”, “часы”, “минуты” вне вывода, только из-за того, что их нужно всё время пересчитывать. Это захламляет код, и в конечном счёте автор где-нибудь забывает пересчитать или путается, а потом будет тратить кучу времени на отлов багов. Без этих переменных можно обойтись.
Обычно (по-крайней мере я только такой вариант встречаю) пересчёт времени происходит строго в onnewloc, а результаты пересчета всё равно используются при отображении игрового времени. И в таком случае такой код тоже должен работать:
! Новое волшебное яблоко вырастает за четыре дня.
ACT 'Сорвать волшебное яблоко':
! В переменной "день_яблока" храним время, когда появится следующее яблоко.
! Второе условие убрал, т.к. оно должно срабатывать автоматически.
! Если "дни" вдруг могут быть отрицательными, условие нужно вернуть.
IF (день_яблока <= дни):
'Вы сорвали яблоко.'
ADDOBJ 'яблоко'
! Устанавливаем время появления следующего яблока в будущем, через четыре дня.
день_яблока = день + 4
ELSE
'Новое яблоко ещё не выросло.'
END
END
newsash,
что ты подразумеваешь под “пересчётом времени”?
Уважаемые знатаки! Помогите! Ничего не получается, измучился совсем!
Мне нужно провести операцию “Разговор по телефону” в форме диалога. Диалог получился и я почти разобрался с этим, но столкнулся с проблемой - немогу выернуться к началу локации откуда начинал разговор! Именно вернуться! Ибо телефон в инвентаре, а позвонить с него возможно соответственно из любой локации.
Если запутал, то попроще: Как сделать разговор по телефону (из инвентаря) с кнопкой, “положить трубку”, чтоб она вела к той локации, откуда начался разговор?
Podkovally,
! Это пишем в ONOBJSEL
$локация_звонка = $CURLOC
! Это пишем где кладём трубку
ACT 'Положить трубку':
GOTO $локация_звонка
END
Nex:
newsash,
что ты подразумеваешь под “пересчётом времени”?
Вот этот код:
saks:
дни = время / (24*60)
часы = (время - дни*24*60) / 60
минуты = время - часы*60 - дни*24*60
О, так легко! Спасибо! Не получилается разобраться с этой onobjsel. Использую только для описания предметов. И никак не могу вникнуть в суть этой переменной.
Podkovally:
О, так легко! Спасибо! Не получилается разобраться с этой onobjsel. Использую только для описания предметов. И никак не могу вникнуть в суть этой переменной.
Грубо говоря (и опустив нюансы), движок игры выполняет GS $onobjsel каждый раз при выборе предмета.
Другими словами, ты в эту переменную записываешь название локации, которая должна выполняться при выборе предмета.
Аааа! Вот оно что! Спасибо, теперь все стало на свои места. Мне, как нубу, бывает сложновато пользоваться qsp-справкой, примеры не развернуты , да и вообще не всегда понимаю, что написано))
А обучения пару начальных уроков всего. Жаль больше нет.
Podkovally:
Аааа! Вот оно что! Спасибо, теперь все стало на свои места. Мне, как нубу, бывает сложновато пользоваться qsp-справкой, примеры не развернуты , да и вообще не всегда понимаю, что написано))
А обучения пару начальных уроков всего. Жаль больше нет.
Ты ведь не про вот эту справку? :) А если про эту, то там есть ссылка на тему, в которой ты можешь ткнуть меня в непонятные места справки, чтобы я сделал их понятнее.
newsash,
но перерасчёт составляющих в ONNEWLOC не имеет смысла. Ведь время может меняться и без перехода на другую локацию.
Если ты ищешь способ “как лучше сделать”, то вот подходящий вариант для любителей использовать составляющие:
1. Заводится процедура
! Увеличить время на 2 дня, 3 часа и 4 минуты.
GS 'прибавить_время', 2, 3, 4
! Увеличить время на 5 минут.
GS 'прибавить_время', 0, 0, 5
2. В процедуре увеличивается переменная “время”.
3. Переменная “время” изменяется только через процедуру “прибавить_время”.
4. В процедуре “прибавить_время” после каждого изменения сразу рассчитываются значения составляющих - “дни”, “часы”, “минуты”.
5. В процедуре “прибавить_время” стоит проверка, чтобы переменные “время”, “дни”, “часы”, “минуты”, не меняли извне - если меняются, то вывести предупреждение через MSG.
При такой организации, у автора всегда будут актуальные значения “дни”, “часы”, “минуты”, которые он сможет использовать и для вывода, и для условий.
Nex, в такие моменты мне начинает хотеться ООП в QSP. Хотя бы инкапсуляцию. :)
А по теме - да, согласен, такой вариант мне тоже больше нравится, но лично я чаще встречал изменение времени без перехода с использованием вариаций “gt $curloc, номер_этапа”. Так что это скорее вопрос вкуса.
newsash,
вкус тут ни при чём, если на ONNEWLOC рассчитывать составляющие, менять переменную “время” не на переходе, и в локациях использовать составляющие в условиях, баги будут неизбежно. Это не вопрос вкуса, это вопрос здравого смысла и грамотной организации кода.
:)