RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2436334 views

планируется что в игре в коде каждого действия будет прописано (время=время +хх) и за счет этого будет идти таймер.
хмм тогда возникает ситуация что если игрок сорвал яблоко вечером, то придя через 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 рассчитывать составляющие, менять переменную “время” не на переходе, и в локациях использовать составляющие в условиях, баги будут неизбежно. Это не вопрос вкуса, это вопрос здравого смысла и грамотной организации кода.

Log in or Register to post comments.