RU 📌 Pinned

Как сделать?

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

Oliver,
Спасибо разобрался

Lv2013,
Можете описать как игрок это должен видеть? Я просто не пойму вопроса.

не заметил что создалась еще страница на форуме)

в данный момент я делаю случайные события которые происходят с персонажем от простых типа подобрать монетку до квестов.

ACT 'к выбору': GOTO 'start' 
SET чтото = RAND(1)

if чтото = 0 : 
*Pl 'Ны заметили что возле вас что то блестит на полу'
ACT 'Посмотреть что на полу?': 
IF RAND(0,1) = 1 : money + RAND(1,25) *PL 'Вы нашли пару монет'
ELSE *PL 'Просто мусор'
END
END
END

if чтото = 1 : *Pl 'У вас стащили пару монет'

вот что у меня есть.
хочу построить все на закономерностях и рандомах

Опять-таки может я чего-то не понимаю (скорее всего), но здесь можно все сделать куда проще (и я не знаю, что делает SET, но здесь он точно лишний) Также для приведенного примера не не принципиально gt к другим локациям, поэтому обойдусь без этого.

act 'Запустить случайное событие':
чтото = rand(1,2)
   if чтото = 1:
   pl 'То одно случается, то другое'
   end
   if чтото = 1:
   pl 'А вот и монетки'
   монетки+=rand(1,25)
   end
   gt $curloc
end

Обратите внимание, что нельзя записывать RAND - вот с одним числом, как вы это сделали. Кроме того, если вы пишите код после “:” в строчку, а не в столбик - end ставить не надо, прочтется весь код справа и только он. Если меняются переменные, такие, как монеты, часто имеет смысл ставить curloc - изменения вступят в силу сразу же.

Странный вопрос, но можно ли сделать так, чтобы была возможность загрузки состояния игры во время срабатывания WAIT

Объясню: в одном из развилок сюжета в моем проекте с герой происходит фальш-смерть. Он переносится на локацию, идентичную обычной локации проигрыша (полагаю, что дойдя до этого момента, игрок будет знаком с этой локацией более чем). Суть в том, что он должен просто подождать, не перезагружаясь - и через какое-то время игра продолжится. Для ожидания я использую WAIT, также я убираю все допменюшки (как и при реальной смерти)… но этот WAIT замораживает любые кнопки, в том числе загрузку. И опытный игрок может заметить этот подвох.

Уже пока писал этот пост, меня осенило, что наверняка есть другие команды по времени, кроме WAIT, мол, запускаем таймер, а когда его значение достигло вот такой величины, срабатывает такое-то событие. Но я забыл их.

Aleks Versus Moderator 29.04.2017 16:01 (8 years ago)

mkir,
есть локация-счётчик counter. C её помощью можно делать любые реалтаймовые события. При этом, в отличие от wait, не блокируются ни действия, ни гиперссылки, ни прочие активные элементы.

Задать время, через которое обрабатывается код на локации counter можно с помощью оператора settimer

settimer 20 & ! устанавливаем период обработки counter в 20 миллисекунд.

Время, прошедшее с начала игры можно получить через функцию msecscount.
Для твоего случая, я бы предложил такой способ:
В самой первой локации игры пишем:

$counter='counter'

Создаём локацию с именем counter, где размещаем вот такой код:

if $curloc='название_локации_псевдосмерти' and возрождение<>1:
! если игрок находится на локации псевдосмерти, и "возрождение" ещё не произошло
   if timer_resurrection=0:
   ! если таймер ещё не выставлен, выставляем. Для этого
       ! записываем в таймер текущее значение времени прошедшего с начала игры, плюс
       ! время (в миллисекундах), в течение которого игрок должен оставаться на локации,
       ! чтобы игра продолжилась (30 секунд, для примера)
       timer_resurrection=msecscount+30000
   end
   ! теперь проверяем, не достигло ли время, прошедшее с начала игры, времени, записанного
   ! в таймер, а если достигло, выставляем возрождение=1 и переходим на нужную локацию
   if msecscount>=timer_resurrection:
      возрождение=1
      goto 'локация_возрождения'
   end
end

Спасибо! (но уж про counter-то я знаю))

есть такой код:

:Еще
ROL1 = rand(1,6)
ROL2 = rand(1,6)
ROL3 = rand(1,6)
ROL4 = rand(1,6)
ROL5 = rand(1,6)

*pl '<<ROL1>> <<ROL2>> <<ROL3>> <<ROL4>> <<ROL5>> '

!покер
if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'Покер!!!'
End
!Покер конец
!каре
if ROL1 ! ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 ! ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 ! ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 ! ROL5 :
set $ROLREZ = 'каре!!!'
End
!каре конец

pl '<<ROLREZ>>'

ACT 'Еще раз?': 
jump 'Еще'
END
ACT 'уйти': GOTO 'start'

я все правильно сделал или есть способ это упростить?

Aleks Versus Moderator 03.05.2017 15:20 (8 years ago)

Lv2013,
вот это не сработает:

ACT 'Еще раз?': 
jump 'Еще' 
END

если jump стоит внутри действия, то прыгать он может только на метку внутри действия.
Надо ставить:

ACT 'Еще раз?': 
xgoto $curloc 
END

xgoto — чтобы надписи не удалялись с экрана.

Хм, странно, зуб даю - у меня jump вполне выбирается и за пределы действия.

у меня тут под спойлером забавная штука, в доп описании переменная свежая а в основном она обнулена.
если я правильно понял мне нужно вывести текст через «выполнить при посещении»

???

Spoiler

к стати не пробовали позиционировать qsp как программирование для начинающих или школы? В этой штуке даже такая ракушка как я могу что то написать )

Aleks Versus Moderator 04.05.2017 07:19 (8 years ago)

Lv2013,
а можешь привести полный код, или прикрепить файл игры? Сложно сказать так по скриншоту, почему такая разница. Вижу, что в основное описание значения сначала выводятся, а потом происходит “раздача”. А в доп описании всё нормально. Где-то не там поставил вывод, или немного нарушена логика.

Lv2013:

к стати не пробовали позиционировать qsp как программирование для начинающих или школы? В этой штуке даже такая ракушка как я могу что то написать )

А вот был на форуме человек, который в школе детей на QSP программированию обучал. Но его давно не видно.

Aleks Versus,
проблему с с текстом и переменными решил но все равно у меня ступор с реализацией покера на костях.
вроде все верно но нет ли более оптимального способа написания?

:Еще
ROL1 = rand(1,6)
ROL2 = rand(1,6)
ROL3 = rand(1,6)
ROL4 = rand(1,6)
ROL5 = rand(1,6)

pl '<<ROL1>> <<ROL2>> <<ROL3>> <<ROL4>> <<ROL5>> '

!покер
if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'выпал ПОКЕР!!!'
End
!Покер конец
!каре
if ROL1 ! ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 ! ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 ! ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'каре!!!'
End

if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 ! ROL5 :
set $ROLREZ = 'каре!!!'
End
!каре конец

if ROL1 = ROL2 and ROL2 = ROL3 and ROL3 = ROL4 and ROL4 = ROL5 :
set $ROLREZ = 'Покер!!!'
End

if ROLREZ = 0:
set $ROLREZ = 'ничего хорошего не выпало.'
end

pl '<<$ROLREZ>>'

*pl 'Бросив кубики выпала такая комбинация:
<<ROL1>> <<ROL2>> <<ROL3>> <<ROL4>> <<ROL5>>
а это значит что<<$ROLREZ>>'

ACT 'Еще раз?': 
!jump 'Еще'
XGOTO '02'
END
ACT 'уйти': GOTO 'start'

Lv2013,
Вета в своей игре писала уже этот покер, можно посмотреть код, и что-то понять :)
podzemelya.rar

Aleks Versus Moderator 04.05.2017 19:42 (8 years ago)

Oliver,
там сделано сложновато для новичка.
Lv2013,
не проще, но изящнее можно решить через массивы. А так — это самый оптимальный вариант.

Log in or Register to post comments.