RU 📌 Pinned

Как сделать?

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

PsiH, читай выше я практически тот же вопрос задавал пару страниц назад
а восполнение например так
act “еда”:
golod += 100
end

Ajenta:

evp,

А мне больше интересно, а нафига в этой строчке динамик?

dynamic ‘Var = <<$ARGS[0]>>’

Вы хотите понять зачем? Или вы просто от нечего делать написали?

Вы сами не поняли, мне отдельно лекцию про динамик написать? Объясните свою позицию. Или я объясню свою.

XaHK:

Еще если я захочу добавить дополнительные параметры достаточно добавить строчку например gs ‘dstat’, ‘water’, -240? Или надо еще что то добавлять? И для того что бы параметр уменьшался скажем не за сутки а за половину достаточно 240 заменить на 120?

Именно так. Вы быстро учитесь :)

Специально для вас вкратце поясню суть.

Подпрограмма в локации ‘dstat’ в дополнении к вашей переменной генерирует еще одну под именем delta+Имя_вашей_переменной. Для чего это нужно? QSP работает только с целочисленными значениями, поэтому, если ваша переменная за 1 мин должна измениться на 1,(3), QSP изменит ее на 1, игнорируя остаток после деления. Моя подпрограмма исправит этот недостаток, сохраняя остаток от деления в переменной с именем delta+Имя_вашей_переменной. Таким образом, всегда при изменении основной переменной, будет добавляться (или отниматься) кусочек, оставшийся с предыдущего вычисления.

И, конечно, вы правы, что эту процедуру можно использовать для разных переменных, достаточно лишь подставить их имя в формулу, что я предоставил. Не буду углубляться в объяснения сакральных значений ARGS[0-8], ибо все описано в справке. В принципе, для общего понимания и правильного использования должно быть достаточно описания выше.

Ajenta:

evp,

А мне больше интересно, а нафига в этой строчке динамик?

dynamic ‘Var = <<$ARGS[0]>>’

А у вас не возникло вопроса, почему используется dynamic в следующей строке?

dynamic '<<$ARGS[0]>> = Var'

Думаю, после объяснений вы сами сможете объяснить почему.

Строчкой

dynamic 'Var = <<$ARGS[0]>>'

мы присваиваем переменной Var значение переменной, имя которой хранится в (передается через) ARGS[0].

Вот, скажем, ниже мы обсуждаем статистику персонажа на примере переменной son. Так вот, локации dstat мы передаем не значение переменной son, а ее имя. Т.е. в ARGS[0] у нас лежит ‘son’. И если “развернуть” dynamic, то получится следующий код:

Var = son

И попробуйте проделать то же самое без динамика.

Edited at 31.07.2015 07:53 (10 years ago)

Возвращаясь к календарю, у меня почему то после того как здоровье опускается до 20 и ниже переносит на конечную локацию. Подскажите пожалуйста что делать?

JDN = JDNStart + time/1440
hour = (time/60) MOD 24
minut = time MOD 60
weekday = (JDN MOD 7) + 1

JDa = JDN + 32044
JDb = (4*JDa + 3)/146097
JDc = JDa - (146097*JDb/4)
JDd = (4*JDc + 3)/1461
JDe = JDc - 1461*JDd/4
JDm = (5*JDe + 2)/153

day = JDe - (153*JDm+2)/5 + 1
month = JDm + 3 - 12*(JDm/10)
year = 100*JDb + JDd - 4800 + JDm/10
$hour = iif (hour < 10, ’0<<hour>>’, ‘<<hour>>’)
$minut = iif (minut < 10, ’0<<minut>>’, ‘<<minut>>’)
TimeInterval = time - LastTime
LastTime = time

if hour <> lasthour:
son -= 10
golod -= 10
lasthour = hour
end

!Уменьшение бодрости со скоростью 240ед/1440мин=24час=1сутки
gs ‘dstat’, ‘son’, -240
!Уменьшение golod со скоростью 240ед/1440мин
gs ‘dstat’, ‘golod’, -240

pl’Время <B><<day>></B> Дней <B><<week>></B> Недель <B><<hour>></B> часов <B><<$nilmin>><<minut>></B> минут’
pl’Сон<<son>>’
pl’Голод<<golod>>’
pl’Здоровье<<health>>’
pl’деньги<<money>>’

IF son <= 0:
health = health - 10
End

IF golod <= 0:
health = health - 10
End

If health <= 0:
gt ‘end’
End

PsiH, либо

if hour <> lasthour: 
    son -= 10 
    golod -= 10 
    lasthour = hour 
end

либо

!Уменьшение бодрости со скоростью 240ед/1440мин=24час=1сутки 
gs 'dstat', 'son', -240 
!Уменьшение golod со скоростью 240ед/1440мин 
gs 'dstat', 'golod', -240

Не так ли? Что вы делаете? В общем, получается, что вы плавно уменьшаете son и golod со скоростью 10 ед/час и, одновременно у вас код, который при смене часа дополнительно снимает son и golod еще на 10 ед.

А выбрасывает на конечную локацию не из-за этого. Уменьшение son и golod рано или поздно приведет их к нулю и дальше - к отрицательным значениям. Из приведенного участка кода не ясно решаете ли вы эту проблему. А поскольку они начинают удовлетворять условиям

IF son <= 0: 
health = health - 10 
End 

IF golod <= 0: 
health = health - 10 
End

то health уменьшается и вас перекидывает в локацию ‘end’.

If health <= 0: 
gt 'end' 
End

И календарь тут не причем. Какая-то каша у вас в голове. Календарь считает время и переводит его в даты, а к вашему сну, голоду и здоровью он не имеет никакого отношения.

можно ли как то сделать что бы во время сна некоторые параметры уменьшались медленнее чем обычно?
сон у меня выглядит так
health += 10
:loopson
set time = time + 1
set stime = stime + 1
if stime = 60:set stime = 0&set son = son + 25
clr
gs ‘календарь’
if son > 240:
if son >240: son = 240
‘Вы выспались’
act ‘Встать с кровати’:gt’спальня’
else
jump ‘loopson’
end

Вы тупо копируете код, написанный известным в узких кругах быдлокодером, автором порноподелок на QSP. Код очень низкого качества. Не стоит начинать изучение QSP на таком неадекватном примере.

Я сейчас поправлю вам и распишу с комментариями что и почему следует делать. Писать буду с редактированием этого поста, так что проверяйте его обновление время от времени.

Первое. У вас наверняка есть локация ‘stat’. Я прав? :) Так вот, удалите из нее закомментируйте в ней весь код.

!'
...
код локации stat
...
'

Вот таким образом сделайте: первая строка - восклицательный знак и апостроф, последняя строка - апостроф.
Календарь вынесите в отдельную локацию ‘calendar’, чтобы его код вас не путал.

Если локации stat уже нет - создайте ее и начните вот такими строками:

TimeInterval = time - LastTime 
LastTime = time
gs 'calendar'

Первая строчка вычисляет количество минут, прошедшее с момента последнего обращения к локации stat. Вторая строчка запоминает текущее время, чтобы использовать его в первой строчке при последующем выполнении локации stat. Третья строчка заставляет выполниться код календаря. Таким образом мы получаем актуальные значения даты и т.п. Если это вам понятно, то мы сможем продолжить.

Чтобы локация stat не требовала к себе излишнего внимания и работала в большинстве случаев без вашего участия, мы воспользуемся одной из возможностей языка QSP - локацией ONNEWLOC. Чтобы включить эту локацию надо в стартовой локации сделать запись

$ONNEWLOC  = 'OnNewLoc'

и создать локацию ‘OnNewLoc’. В чем фишка этой локации? Каждый раз, когда у вас будет срабатывать оператор GT (обычно когда вы будете переходить в другую локацию), будет исполняться код локации ‘OnNewLoc’ абсолютно автоматически. Так вот, в первой строке этой ‘OnNewLoc’ запишите следующее:

gs 'stat'

В локации ‘stat’ мы будем отслеживать характеристики вашего героя, поэтому очень удачно, что мы можем автоматизировать ее работу, не разбрасывая по локациям излишние gs ‘stat’

Продолжите stat следующими строками

!Уменьшение бодрости со скоростью 240ед/1440мин=24час=1сутки 
gs 'dstat', 'son', -240 
!Уменьшение golod со скоростью 240ед/1440мин 
gs 'dstat', 'golod', -240

Их значение вам уже известно, поэтому не будем на них останавливаться.

Перейдем к вашему сну, то есть сну вашего героя :) Как я понимаю, ваш код увеличивает значение son до определенного предела, по достижении которого персонаж просыпается. Мы сделаем то же самое, но немного по-другому.

:loopson
NowSleep = true
time += 1 
gs 'stat' 
if son < 100: 
	jump 'loopson'
else 
	NowSleep = false 
	'Вы выспались' 
	act 'Встать с кровати':gt'спальня' 
end

Как вы заметили, мы не изменяем никаких характеристик героя. Этим должна заниматься локация stat и только она. Иначе вы потеряетесь в собственном коде. Это очень просто и эффективно - статы менять только в stat. Повторю, пока вы не запомните: изменять все характеристики удобнее в одном месте потому, что, если вы захотите потом отредактировать шкалы статистики, скорость изменения характеристик, то вам не придется бегать по всем локациям в поисках, где же вы еще изменяете, скажем, son.

Кроме того, я ввел переменную NowSleep. Когда она равна true, это значит, что персонаж спит. (Чтобы это работало можно записать NowSleep = -1, когда персонаж спит и NowSleep = 0, когда он бодрствует. Но я предпочитаю более понятный текст и поэтому всегда в стартовой локации объявляю переменные true = -1 и false = 0. Если вы будете использовать мой код без изменений, то тоже должны это сделать).

Также я изменил шкалу son. Просто потому, что считаю логичным мерять что-либо в интервале от 0 до 100, а не до 240.

Когда мы отправляем персонажа спать, то переменная NowSleep принимает значение true, добавляется одна минута времени и вызывается локация stat. Происходит проверка на son, и если он не достиг 100, то все повторяется, иначе - выход из цикла с одновременным присваиванием переменной NowSleep значения false.

Теперь, что у нас происходит при этом в stat. Меняем

!Уменьшение бодрости со скоростью 240ед/1440мин=24час=1сутки 
gs 'dstat', 'son', -240

на

if NowSleep:
	!Увеличение бодрости со скоростью 300ед/1440мин = 100ед/8часов 
	gs 'dstat', 'son', 300
else
	!Уменьшение бодрости со скоростью 150ед/1440мин = 100ед/16часов 
	gs 'dstat', 'son', -150
end

Я думаю, что вы уже поняли. Когда персонаж спит (NowSleep = true), son увеличивается. Скорость изменения я подобрал так, чтобы son от 0 до 100 вырос за 8 часов. Все остальное время (NowSleep = false), son уменьшается с такой скоростью, чтобы от 100 до 0 он упал за 16 часов. Скорости изменения son вам придется еще изменять по ходу разработки, но на первых порах эти значения вполне подойдут.

Кроме того, я заметил, что вы увеличиваете health на 10 всякий раз, когда персонаж ложится спать. Я не думаю, что это нормально. Спит персонаж 10 минут или 8 часов, а health все равно увеличивается одинаково. Автор этого кода просто не сумел в нормальное программирование, но вы то уже знаете как :) Напишите, пожалуйста, что надо изменить, чтобы health во время сна увеличился на 10, скажем, за 8 часов.

Кажется все. Вопросы?

ну что на глаза попалось то и взял)) самостоятельно написать такой код мне еще сложновато.
Нет локации stat у меня уже нету. dstat только)
пока понятно, только вот скоро от компа уйду и сразу отвечать не смогу.
Напишите так же с пояснениями код а если останутся потом вопросы спрошу
сюда добавить
if NowSleep:
!Увеличение бодрости со скоростью 300ед/1440мин
gs ‘dstat’, ‘son’, 300
gs ‘dstat’, ‘health’,
цифру сразу так не получается)
я только не пойму nowsleep вроде присутствует и когда персонаж спит и когда бодрствует просто в одном случае значение -1, а в другом 0
А в коде идет if nowsleep. вроде как в любом случае должен сон прибавляться.
Аааа вот теперь все понятно стало. Спс

Белый Шарик #100 31.07.2015 05:00 (10 years ago)

Представляю, какими эпитетами по отношению ко мне, разразился бы Evp, увидев код-бурелом моей игрушки ))))

Белый Шарик, не сказал бы ничего плохого. В отличие от известной личности вы не считаете себя гением программирования. Не так ли? :) У него много гонора, а умений почти ноль. Поэтому и эпитеты :)

evp, Спасибо немного разобрался, что бы значения не уходили в минус я попробовал сделать так:
if son < 0:
son = 0
end

if golod < 0:
golod = 0
end

Но на удивление значения son, golod опускаются на отметку - 10 и удерживаются. Что касательно здоровья вы правильно подметили что health уменьшается и героя должно перекинуть на локацию end, но здоровье не опускаются до 0 и не уходят в отрицательное значение, значение health опускается до 10 или 20 и сразу перебрасывает на локацию end, то есть не удовлетворяет условию:

If health <= 0:
gt ‘end’
End

XaHK:

gs ‘dstat’, ‘health’,

30

XaHK:

А в коде идет if nowsleep. вроде как в любом случае должен сон прибавляться.

if nowsleep вас немного путает. Такая запись очень близка к естественному языку поэтому легко читается и я ее часто использую. Она есть аналог записи if NowSleep = true.

В QSP if - это проверка выражения на истинность. Если выражение истинно, то проверка удачна. А истина/ложь кодируется числами. Например, ложь - это ноль. А истина это любое другое значение. Лучше всего использовать -1.

Следующие выражения будут проходить проверку:

if 2=2
if 1
if -50

!Когда персонаж спит
if NowSleep = -1
if nowSleep

PsiH,

if son < 0: 
son = 0 
end 

if golod < 0: 
golod = 0 
end

В целом правильно, но можно записать короче

if son < 0: son = 0 
if golod < 0: golod = 0

или так

son = iif (son<0, 0, son)
golod = iif (golod<0, 0, golod)

PsiH:

но здоровье не опускаются до 0 и не уходят в отрицательное значение, значение health опускается до 10 или 20 и сразу перебрасывает на локацию end, то есть не удовлетворяет условию:

If health <= 0:
gt ‘end’
End

Чудес не бывает. Если перекидывает в end, значит health <= 0. Просто вы этого не видите. Скажем, health = 20. Исполняется код уменьшения здоровья в при golod=0, затем уменьшение при son=0, и вот вам health = 0, а поскольку оператора вывода значения health в окно я не увидел, то предполагаю, что и вы не видите истинного значения health.

Понимаете, на что я намекаю? Проверьте golod и son.

PsiH:

Но на удивление значения son, golod опускаются на отметку - 10 и удерживаются.

Приведите весь получившийся у вас код. Только тогда можно будет найти причину. И, пожалуйста, код выделяйте специальными тегами при вставке. Это просто. Вставьте код, потом выделите его и нажмите на кнопочку с двумя стрелками над окошком ответа. Если на нее навести курсор, то всплывет подсказка “Код”.

Log in or Register to post comments.