RU 📌 Pinned

Как сделать?

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

Здравствуйте, извиняюсь, если вопрос уже был, но просмотреть всю ветку не реально =(
Подскажите, плиз, как сделать отсчет времени, чтобы определенное действие можно было совершить только раз в неделю, скажем. То есть нам надо как то запомнить день, когда оно было совершено и плюсовать к нему 7, а если перевалит за 30 обнулять? Только не пойму, как это в коде выразить =( Или как то хитрее можно сделать?

Пожалуйста, проконсультируйте по таким вопросам.

1. Локальные переменные. В локации у меня есть промежуточная переменная $s. Вызываю функцию, в которой используется промежуточная переменная с тем же именем. После выполнения функции в локации обращаюсь к $s, получаю значение, которое было в функции. Есть ли в qsp такая штука, как локальные переменные, которые существуют только на время выполнения функции? Если да, то где можно найти по ним информацию?

2. Многомерные массивы. Есть несколько персонажей с определенным набором параметров, привязанных к действию. Хотелось бы определить двумерный массив (персонаж-действие), чтобы по индексу (как вариант, по значению в одном из полей - первичному ключу) получать значения во всех остальных полях. Я где-то случайно натыкался на обсуждение этого вопроса, кажется здесь, на форуме, но тогда было не нужно, а теперь никак не могу найти…
Пожалуйста, подскажите.

Nex,
не, это я знаю, у меня есть счетчик времени, где то его нашла:

Spoiler
if minut >= 60:
:loopmin
set hour = hour + 1
set minut = minut - 60
     if minut >= 60:
     jump 'loopmin'
     end 
end

if hour >= 24:
:loop
set day = day + 1
set daystart = daystart + 1
set week = week + 1
set hour = hour - 24
     if hour >= 24:
     jump 'loop'
     end
end

if day > 30:
set day = day - 30
set month = month + 1
end

if day = 0:set day = 1

if week > 7:
:loopweek
set week = week - 7
     if week > 7:
     jump 'loopweek'
     end

end

if week = 1:Set $week = 'понедельник'
if week = 2:Set $week = 'вторник'
if week = 3:Set $week = 'среда'
if week = 4:Set $week = 'четверг'
if week = 5:Set $week = 'пятница'
if week = 6:Set $week = 'суббота'
if week = 7:Set $week = 'воскресенье'

if month = 0:Set month = 1
if month = 13:Set month = 1
If month = 1:set $month = 'Январь'
If month = 2:set $month = 'Февраль'
If month = 3:set $month = 'Март'
If month = 4:set $month = 'Апрель'
If month = 5:set $month = 'Май'
If month = 6:set $month = 'Июнь'
If month = 7:set $month = 'Июль'
If month = 8:set $month = 'Август'
If month = 9:set $month = 'Сентябрь'
If month = 10:set $month = 'Октябрь'
If month = 11:set $month = 'Ноябрь'
If month = 12:set $month = 'Декабрь'

if minut < 10:set $nilmin = '0'
if minut >= 10:set $nilmin = ''

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

Morning Star,
Я бы попробовал сделать так:
Завести массив:
Первая колонка Товар, вторая Интервал (часы, можно дни), третья - время покупки (например, в часах с начала игры).
Зелье 100 -100
Ступка 200 -200
Одежда 10 -10
Когда товар покупается обновляется время покупки. Когда игрок заходит во второй раз, проверяется прошло ли достаточно времени со времени покупки, если нет, товар не появляется в списке.

Надеюсь, поможет. :)

GrayWolf,
аа.. я поняла ваш ход мысли. Да, это действительно хитрее и проще, чем моя первоначальная мысль, спасибо большое =)
Только с массивами я никак не привыкну работать, поэтому предпочитаю просто отдельные переменные задавать…но тут в общем без разницы ;)

GrayWolf:

  1. Локальные переменные.

На данный момент полностью локальной переменной является только args. Хотя в плане разработки возможность создавать другие локальные переменные вроде бы есть.
Сейчас могу только предложить использовать какой-нибудь временный массив (есть несколько способов). Или пользоваться “локальными” исключительно локально.

GrayWolf:

  1. Многомерные массивы.

Многомерные массивы организуются, как массив[’<<x>>,<<y>>’]. Я так понимаю задача стоит, чтобы придумать функцию массив[’<<x>>’], возвращающую массив_x[’<<y>>’].
Если индексы числовые, то можно хранить в y=0 количество элементов при заданном х, а потом делать выборку циклом.

newsash,
огромное спасибо за ответ. Сейчас попробую с массивами. Имитацию локальных я сделал, но смотрится, конечно, не слишком красиво. Будет здорово, если в следующей версии появится возможность создавать локальные переменные.

GrayWolf:

Будет здорово, если в следующей версии появится возможность создавать локальные переменные.

Насколько я знаю, Байт уже добавил код для локальных переменных в библиотеку. В Quest Navigator’e они уже могут даже работать. Остаётся только надеяться, что следующая версия и описание синтаксиса от Байта будут довольно скоро.

Будем ждать :)

Morning Star:

Nex,
не, это я знаю, у меня есть счетчик времени, где то его нашла:

Spoiler
if minut >= 60:
:loopmin
set hour = hour + 1
set minut = minut - 60
     if minut >= 60:
     jump 'loopmin'
     end 
end

if hour >= 24:
:loop
set day = day + 1
set daystart = daystart + 1
set week = week + 1
set hour = hour - 24
     if hour >= 24:
     jump 'loop'
     end
end

if day > 30:
set day = day - 30
set month = month + 1
end

if day = 0:set day = 1

if week > 7:
:loopweek
set week = week - 7
     if week > 7:
     jump 'loopweek'
     end

end

if week = 1:Set $week = 'понедельник'
if week = 2:Set $week = 'вторник'
if week = 3:Set $week = 'среда'
if week = 4:Set $week = 'четверг'
if week = 5:Set $week = 'пятница'
if week = 6:Set $week = 'суббота'
if week = 7:Set $week = 'воскресенье'

if month = 0:Set month = 1
if month = 13:Set month = 1
If month = 1:set $month = 'Январь'
If month = 2:set $month = 'Февраль'
If month = 3:set $month = 'Март'
If month = 4:set $month = 'Апрель'
If month = 5:set $month = 'Май'
If month = 6:set $month = 'Июнь'
If month = 7:set $month = 'Июль'
If month = 8:set $month = 'Август'
If month = 9:set $month = 'Сентябрь'
If month = 10:set $month = 'Октябрь'
If month = 11:set $month = 'Ноябрь'
If month = 12:set $month = 'Декабрь'

if minut < 10:set $nilmin = '0'
if minut >= 10:set $nilmin = ''

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

daystart это переменная отслеживающая сколько прошло дней с момента начала игры. Что бы отсчитать неделю достаточно при покупке написать следующий код

ДеньПокупкиЗелья=daystart+7

И при покупке всегда проверять условие

if ДеньПокупкиЗелья<=daystart:

взяла для своей игры из чужой код времени

Spoiler
VIEW
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if minut >= 60:
:loopmin
set hour = hour + 1
set minut = minut - 60
set golod = golod - 1
set son = son - 1
     if minut >= 60:
     jump 'loopmin'
     end 
end

if hour >= 24:
:loop
set day = day + 1
set daystart = daystart + 1
set week = week + 1
set hour = hour - 24
     if hour >= 24:
     jump 'loop'
     end
end


if day > 30:
set day = day - 30
set month = month + 1
!ПЛАТЕЖИ
end

if day = 0:set day = 1

if week > 7:
:loopweek
set week = week - 7
     if week > 7:
     jump 'loopweek'
     end

end

if week = 1:Set $week = 'Понедельник'
if week = 2:Set $week = 'Вторник'
if week = 3:Set $week = 'Среда'
if week = 4:Set $week = 'Четверг'
if week = 5:Set $week = 'Пятница'
if week = 6:Set $week = 'Суббота'
if week = 7:Set $week = 'Воскресенье'

if month = 0:Set month = 1
if month = 13:Set month = 1&set year = year + 1
If month = 1:set $month = 'Январь'
If month = 2:set $month = 'Февраль'
If month = 3:set $month = 'Март'
If month = 4:set $month = 'Апрель'
If month = 5:set $month = 'Май'
If month = 6:set $month = 'Июнь'
If month = 7:set $month = 'Июль'
If month = 8:set $month = 'Август'
If month = 9:set $month = 'Сентябрь'
If month = 10:set $month = 'Октябрь'
If month = 11:set $month = 'Ноябрь'
If month = 12:set $month = 'Декабрь'

if minut < 10:set $nilmin = '0'
if minut >= 10:set $nilmin = ''
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!КОНЕЦ РАЧЕТА ВРЕМЕНИ
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!НАЧАЛО ОПИСАНИЯ
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if opisanie=0:'<center>Время <B><<hour>></B> часов <B><<$nilmin>><<minut>></B> минут. Сейчас <<day>> <<$month>> <<year>>года, <<$week>></center>'

В игре у меня есть счетчик жажды и голода, подскажите как присобачит к времени жажду и голод. Сама блондинка, мозгов не хватает:(

Aleks Versus Moderator 16.12.2013 06:57 (12 years ago)

vais,
Не совсем понятно, как работает счётчик времени, похоже он оторван от реальности. Однако голод в нём уже есть, насколько я вижу. Должен падать на один пункт каждый час. Не вижу, как отсчитывается время. Может кинешь сюда свою игру в том виде, в каком она есть? Так будет легче разобраться. И ещё ссылку желательно на игру, из которой ты этот код взяла.

Aleks Versus:

Не совсем понятно, как работает счётчик времени, похоже он оторван от реальности.

Я видел где-то этот код. Там по act время прибавляется (minut+= …).

vais,
там уже есть голод и усталость (уменьшается на 1 каждый час):

set golod = golod - 1 
set son = son - 1

Осталось только этим воспользоваться. Жажда делается аналогично.
И время в act нужно прибавлять только минутам, чтобы механизм срабатывал.

Aleks Versus Moderator 16.12.2013 08:01 (12 years ago)

newsash:

Я видел где-то этот код. Там по act время прибавляется (minut+= …).

не удобно, конечно, но ладно.
vais,
можно и нужно убрать лишние циклы:

Spoiler
VIEW 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
if minut >  59: 
	hour_plus = minut/60	&	!	сколько полных часов прошло
else
	hour_plus = 0	&	!	если ни одного полного часа не прошло, значит hour_plus = 0
end
hour = hour + hour_plus 	&	!	прибавляем к текущему времени, сколько полных часов прошло
minut = minut - hour_plus*60 	&	!	вычисляем текущее значение в минутах
! подсчитываем голод и усталость:
golod = golod - hour_plus
son = son - hour_plus 

if hour > 23: 
	day_plus = hour/24	&	!	сколько полных дней прошло

	hour = hour - day_plus*24	&	!	вычисляем количество текущих часов
else
	day_plus=0
end 
day = day + day_plus 	&	!	увеличиваем количество текущих дней
daystart = daystart + day_plus 	&	! не знаю, что это
week = week + day_plus	&	!	выставляем день недели

if day > 29:
	month_plus = day/30
else
	month_plus = 0
end
month = month + month_plus

if day = 0: day = 1 

if week > 6:
	week = week mod 7
else
	week = week
end
if week=0: week = 1

if week = 1:Set $week = 'Понедельник' 
if week = 2:Set $week = 'Вторник' 
if week = 3:Set $week = 'Среда' 
if week = 4:Set $week = 'Четверг' 
if week = 5:Set $week = 'Пятница' 
if week = 6:Set $week = 'Суббота' 
if week = 7:Set $week = 'Воскресенье' 

if month = 0:Set month = 1 
if month = 13:Set month = 1&set year = year + 1 
If month = 1:set $month = 'Январь' 
If month = 2:set $month = 'Февраль' 
If month = 3:set $month = 'Март' 
If month = 4:set $month = 'Апрель' 
If month = 5:set $month = 'Май' 
If month = 6:set $month = 'Июнь' 
If month = 7:set $month = 'Июль' 
If month = 8:set $month = 'Август' 
If month = 9:set $month = 'Сентябрь' 
If month = 10:set $month = 'Октябрь' 
If month = 11:set $month = 'Ноябрь' 
If month = 12:set $month = 'Декабрь' 

if minut < 10:set $nilmin = '0' 
if minut >= 10:set $nilmin = '' 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!КОНЕЦ РАЧЕТА ВРЕМЕНИ 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!НАЧАЛО ОПИСАНИЯ 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
if opisanie=0:'<center>Время <B><<hour>></B> часов <B><<$nilmin>><<minut>></B> минут. Сейчас <<day>> <<$month>> <<year>>года, <<$week>></center>'

Log in or Register to post comments.