Как сделать?
…
Aleks Versus,
Спасибо, сработало.
Всем привет, нужна помощь!
Например у меня в игре есть локации Комната1 (в этой комнате герой по сюжету находит ключ) и Комната2 (двери этой комнаты заперты на ключ).
Какой код нужно написать чтобы только после посещения Комнаты1, в Комнате2 появилось действие ‘Открыть ключем’ ?
Я читал FAQ но ничего не понял. Буду очень благодарен.
Larson,
в грубом приближении так:
комната1
if ключ_взят=0:
act 'Поднять ключ':
ключ_взят=1
addobj 'Ключ'
delact $selact & ! или по желанию goto $curloc
end
end
комната2
if ключ_взят=1:
act 'Открыть дверь ключом':
goto 'Комната3'
end
end
Огромное спасибо за ответ! все работает)
Aleks Versus,
У меня снова вопросы:
1)Например у меня есть локации Комната1 и Комната2. В Комнате1 я взял Ключ и иду в Комнату2. В ней стоят два сундука, но ключ у меня один, какой код нужно прописать чтобы Ключ можно было использовать только один раз а после чтобы он пропадал из окна Objects?
2)И еще: допустим в игре я взял меч, но потом умер. Когда начинаю игру заново (переход на начальную локацию) то меч так и остается в окне Objects. Что написать чтобы при возвращение на начальную локацию все предметы пропадали.?
Larson,
1) @@@@CODEBLOCK0@@@@
2) @@@@CODEBLOCK1@@@@
Спасибо! все оказалось насколько просто! а то я уже такого понаписывал что QSP прекращал работу при открытии квеста))
Larson,
Сейчас пытаюсь сделать более функциональный пример, но кусп не хочет исправлять баг.
24032017-2216_test.qsp
Здравствуйте.
Прошу совета по модификаторам регулярных выражений. Есть вот такой код:
$text='Текст
с
разрывами
строки'
strfind($text, '.*')
Этот код выводит на экран только слово “Текст”, потому что символ перевода строки по умолчанию точкой не охватывается. Мне же нужно вывести всё, что лежит в переменной, а не только первую строку. Для этого нужно использовать модификатор s, но примера использования модификаторов в справке нет, а методом тыка у меня что-то ничего не вышло. Подскажите, как его использовать.
Hinkmar,
я чтобы выбирать весь текст использую конструкцию
[\s\S]*
не подойдёт?
Нашёл из старых опытов. Попробуй тоже в скобки заключить:
$strfind("суббОта",'(?i:суббота)')
без скобок не работает.
и так работает
$strfind("суббОта",'(?i)суббота(?-i)')
Aleks Versus,
О, спасибо большое, теперь всё понял. [\s\S]* тоже работает, конечно, но мне хотелось с модификаторами разобраться.
И снова здравствуйте.
У меня ещё один вопрос. Довольно объёмный, поэтому под спойлером.
Spoiler
Допустим, у нас есть несколько различающихся префиксами массивов, в каждом из которых хранятся названия других массивов. Вот так:
$Синий_массив_первого_порядка[0]='Такой_массив_второго_порядка'
$Синий_массив_первого_порядка[1]='Сякой_массив_второго_порядка'
$Синий_массив_первого_порядка[2]='Растакой_массив_второго_порядка'
! и так далее
$Красный_массив_первого_порядка[0]='Этакий_массив_второго_порядка'
$Красный_массив_первого_порядка[1]='Разэтакий_массив_второго_порядка'
$Красный_массив_первого_порядка[2]='Такой_массив_второго_порядка'
! и так далее
$Зелёный_массив_первого_порядка[0]='Сякой_массив_второго_порядка'
$Зелёный_массив_первого_порядка[1]='Разэтакий_массив_второго_порядка'
$Зелёный_массив_первого_порядка[2]='Растакой_массив_второго_порядка'
! и так далее
При этом, каждому элементу каждого массива второго порядка присвоено какое-то значение:
$Такой_массив_второго_порядка[0]='какой-то текст'
$Такой_массив_второго_порядка[1]='другой текст'
$Такой_массив_второго_порядка[2]='ещё какой-то текст'
! и так далее
Есть ли возможность вытащить значение нужного мне элемента нужного массива, сославшись на него каким-нибудь образом вроде этого?
$<<$<<$Префикс_названия_массива>>_массив_первого_порядка[0]>>[2]
Именно такая запись не работает, я знаю. Но может быть, если вставить куда-нибудь кавычки или что-то ещё, то всё получится? Пока приходится делать так:
dynamic "$Временная_переменная[0]=$<<$Префикс_названия_массива>>_массив_первого_порядка[0]"
dynamic "$Временная_переменная[1]=$<<$Временная_переменная[0]>>[2]"
$Временная_переменная[1]
killvar '$Временная_переменная'
Но, по-моему, это не очень красиво. Может всё-таки есть способ лучше и проще?
И у меня вопрос. Выше головы не прыгнешь, но все-таки я пытаюсь разбираться в коде чуть лучше, чем разбираюсь сейчас.
Вот, в чем дело. В моей прошлой игре игрок может заразиться какой-нибудь болезнью, пока сражается с какими-то определенными врагами. Ну, допустим, с крысой.
Допустим, как только крыса “попадает по игроку”, шанс что он заразится, равен двум процентам - if rand(1,100) > 95…
Когда он заражается, я присваиваю переменной “рискзаболеть”, например = 5 и включаю gs ‘болезнь’ - в которой вот такая мутнота происходит:
Так как разных болезней много, то идет списком…
:ещераз
if rand(1,100) > 95 and чесотка=0 and рискзаболеть > 0:
чесотка=1
рискзаболеть-=1
end
if rand(1,100) > 95 and чахотка=0 and рискзаболеть > 0:
чахотка=1
рискзаболеть-=1
end
if rand(1,100) > 95 and простоплохо=0 and рискзаболеть > 0:
простоплохо=1
рискзаболеть-=1
end
рискзаболеть-=1
if рискзаболеть > 0:
jump 'ещераз'
end
И можно таким образом очень много разнообразных болезней сюда вставить и за один раз есть риск заболеть не одной, а даже пятью, например, если не повезет. А можно и вообще не заболеть.
Код был бы удобнее, если б просто назначать номер болезни в начале, а затем if номерболезни = 1: чахотка = 1, if номерболезни = 1: чуманамоюголову = 1 и оставить несколько номеров на то, что игрок ничем не заболел, но уже не помню почему, тогда мне показался более универсальным первый, громоздкий вариант.
Так вот в чем вопрос. Сейчас пишу новую игру. Хотелось бы тоже туда ввернуть “систему болезней”, но сделать ее удобнее и понятнее в коде.
Как это возможно? Чисто теоретически: как сделать, например, некий “пакет с болезнями”, чтобы по одной команде программа доставала оттуда одну-другую, либо, передумав, не доставала? возможно ли подобное сделать на “раз-два” или все-таки тоже получатся вот такие махины кода?
Я все со своими глупыми вопросами…
Какой код нужно прописать чтобы в игре в окне Additional desc отображалась картинка?
Насчет картинки как вставлять знаю, не знаю как окно указать в коде, не нашел что-то информацию…
Hinkmar,
Есть функция $dyneval. Я бы сделал так:
Spoiler
оформил бы отдельную локацию вида
!#get.Cell
$args[0] = $args[0] & ! название массива первого порядка
args[1] = args[1] & ! номер элемента массива первого порядка
args[2] = args[2] & ! номер элемента массива второго порядка
$args['arr']=$dyneval("$result=$<<$args[1]>>[<<args[1]>>]")
$args['result']=$dyneval("$result=$<<$args['arr']>>[<<args[2]>>]")
$result=$args['result']
Далее, когда требуется:
! выводим на экран первый элемент массива, прописанного в третьем элементе массива 1-го порядка
*pl $func('get.Cell','Красный_массив_первого_порядка',3,1)
За переменными $args[] следить не нужно. Они локальные.
mkir,
массивы, циклы и gosub.
Spoiler
Оформляешь на отдельной локации:
!#подхватить_заразу
! инициализируем список болезней
! (можно здесь, но лучше заранее, например на стартовой локации).
болезнь['чесотка']=болезнь['чесотка'] & ! болезнь[0]
болезнь['чахотка']=болезнь['чахотка'] & ! болезнь[1]
болезнь['простоплохо']=болезнь['простоплохо'] & ! болезнь[2]
! список можно пополнять хоть до посинения.
! собственно весь код заражения:
! выставляем счётчик
args['i']=0
:ещераз
if args['i']<arrsize('болезнь') and рискзаболеть>0:
! если значение счётчика не достигло размера массива, выполняем
if rand(1,100) > 95 and болезнь[args['i']]=0:
! если нам "посчасливилось" подхватить ету заразу
! выставляем болезнь
! если args['i'] на проходе равен 1, это соответствует чахотке
! т.е. болезнь[1]=1
болезнь[args['i']]=1
рискзаболеть-=1
end
args['i']+=1
jump 'ещераз'
end
Потом просто, когда нужно попробовать заболеть:
gosub 'подхватить_заразу'
Larson,
Те же команды, что и для окна основного описания, только без звёздочки – окно Дополнительного описания