RU 📌 Pinned

Как сделать?

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

dmvikar
Во-первых, спасибо, что пытаешься помочь.
Во-вторых gt $curloc теперь пересчитывает время после act. Но теперь первый act на локации зацикливается на повтор.

act ‘Войти в комнату’:
*clr & cla
time+=10 & Усталость+=5
gs ‘stat’
!Текст
gt curloc

act ‘Открыть шкаф’:
*clr & cla
!Текст
Усталость+=5 & time+=10
gs ‘вывод_статов’
gt curloc

cla
act ‘Выйти’: gt ‘Коридор’
end
end
end

Может все-таки в коде на onenewloc поправить?

clr
pl $weekday[weekday] + ’, ’ + day + ’ ’ + $month[month] + ’ ’ + year + ‘года’ + ’. ’ + $hour + ‘:’ + $minut
pl “Усталость: <<усталость>>|<<Максимум_усталость>>”

AndreWho,при таком построении актов оно так и должно быть.
То, что ты скопировал из onenewloc - это вывод времени, а не расчет. Попробуй, вставь его. Возможно и сработает. Я же не знаю твоего кода и что конкретно где считается. И не бойся экспериментировать).

Мыши кололись, но продолжали есть кактус.
Итак:
1. При смене локации, то есть при обращении к onnewloc время пересчитывается. Значит код времени там правильный

pl "Время: <<$weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '.  ' + $hour + ':' + $minut>>"

2. При смене действия, то есть при обращении к локации stat все показатели (в примере ниже - усталость), кроме времени пересчитываются (Усталость+=5 & time+=10). Значит код времени здесь неправильный.
При этом на локации stat тот же код времени, что и на локации onnewloc.

clr
Усталость+= args[1]
pl "Усталость: <<Усталость>>|<<максимум_Усталость>>"
if Усталость > 100: Усталость = 100
if Усталость <0: Усталость=0

Время+= args[2]
pl "Время: <<$weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '.  ' + $hour + ':' + $minut>>"

Соответственно, что поменять в коде времени на локации stat?

AndreWho,То что ты нашел, это не расчет времени, это вывод результата.
Ты мог не видеть результатов расчета времени по двум причинам:
Нет расчета.
Нет обновления результата.
Или все вместе сразу.
Этот код отвечает за подсчет времени.

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>>')

Этот - за вывод информации о нем

pl $weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '.  ' + $hour + ':' + $minut

Чота я совсем разъехался мыслями.
Все коды, что ты написал находятся на onnewloc. И обращение к нему происходит только при смене локаций. И здесь проблем нет.
Но при смене действий разве тоже идет обращение к onnewloc? Ну тогда бы должно было бы работать все также. А время не работает(((

ПС
Так, вроде отбой.
Я продублировал код расчета времени из onnewloc в stat и вроде поехало.

AndreWho,При выполнении твоих действий не происходит смена локации, то gt curloc, которое мы прописали не подходит тебе по структуре кода.

Спасибо. Смену времени при выполнении действия вроде удалось победить.

Но оно (время) по-прежнему не отпускает.
На первой локации действие с условием

if ((hour = 9 and minut >= 30) or (hour = 10 and minut < 00)) and weekday<6

На второй локации

if ((hour = 10 and minut >= 00) or (hour = 10 and minut < 30)) and weekday<6

На первой локации действие заканчивается в 10:10 и все нормально - повтора нет
На второй локации действие заканчивается в 10:50 и почему-то запускается повтор действия, хотя временные условия уже не соответствуют.
Я ради интереса поменял между собой эти условия на локациях и теперь на первой локации так же действие стало повторяться.
А на второй все нормально.
То есть не выполняется именно вот этот код. Точнее, действие еще раз повторяется.

if ((hour = 10 and minut >= 00) or (hour = 10 and minut < 30)) and weekday<6

AndreWho,Действие будет выполняться при условии hour = 10 и weekday<6.

Добрый день. У меня такой вопрос: я сделал в своей игре предмет радио. Оно работает через локацию счётчик - когда трек заканчивается, то должен начинаться следующий автоматически. Между песнями встречаются короткие вставки с ведущим. Часть кода, чтобы показать как это сделано:

if radio=1:
if isplay(”Sound\Radio\Music_beat_Darkdreams.mp3”)=0:
radio=2
play “Sound\Radio\Radio_1.mp3”
end
elseif radio=2:
if isplay(”Sound\Radio\Radio_1.mp3”)=0:
radio=3
play “Sound\Radio\Music_trans_Resonate.mp3”
end

elseif radio=42:
if isplay(”Sound\Radio\Nialm_Burn.mp3”)=0:
radio=1
play “Sound\Radio\Music_beat_Darkdreams.mp3”
end
end

И оно в целом работает. Вставки с ведущим короткие и после них сразу начинают играть треки с музыкой (как и задумано). Но после музыки долгая пауза, прежде чем начинается следующая аудиозапись (музыка, или ведущий) (в конце музыкальных треков нет молчания, музыка в них играет до самой последней секунды). Обращение к счётчику я указал и settimer 5, и 1, и 500, и просто убирал. Возможно я не знаю какого-то нюанса в QSP, или подобную задумку нужно реализовывать по другому, пожалуйста подскажите.

А в начале радио треков нет пауз?

Byte:

А в начале радио треков нет пауз?

Ни в начале, ни в конце нет. Тут точно проблема не в треках. У меня есть опция в выпадающем меню радио “Переключить”. Всё что она делает это “CLOSE ALL”. Стоит её нажать, как следующий трек сразу же начинает играть. Сложилось впечатление, что QSP просто считает что трек продолжает играть, даже когда тот остановился.

Я проверю, возможно это какая-то ошибка в звуковой подсистеме.

Воспроизвести не получилось (пробовал несколько раз с OGG/Vorbis, MP3 и MIDI) - у меня isplay быстро возвращает правильный результат. А можно прислать какой-то простой пример с ошибкой (с файлами + тестовым файлом игры)? Можно в дискорде, можно в телеграме, можно здесь.

Aleks Versus Moderator 29.07.2025 15:52 (6 months ago)

GrimLight,
но ведь легко проверить. Заметь трек, с которым воспроизводится такое молчание, возьми пару треков до него, пару после, и проверяй какие воспроизводятся, используя окно доп.описания:

count += 1
if count = 1000: count = 0
clr
pl 'Контроль: <<count>>'
pl 'darkdreams: '+ $str(isplay("Sound\Radio\Music_beat_Darkdreams.mp3"))
pl 'radio 1: '+ $str(isplay("Sound\Radio\Radio_1.mp3"))
pl 'resonate: '+ $str(isplay("Sound\Radio\Music_trans_Resonate.mp3"))

Ну и, надо всегда помнить, что counter не всегда срабатывает чётко в означенное время. Это может вызывать некоторые глюки в воспроизведении аудио.

https://wiki.qsp.org/help:realtime <– тут не совсем корректно описано, как это работает, позже поправлю. Но в целом смысл думаю ясен. Локация-счётчик может не попасть в заданные интервалы, и таким образом при воспроизведении музыки будут паузы.

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

Log in or Register to post comments.