RU 📌 Pinned

Как сделать?

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

Aleks Versus,
Спасибо, сработало.

Всем привет, нужна помощь!
Например у меня в игре есть локации Комната1 (в этой комнате герой по сюжету находит ключ) и Комната2 (двери этой комнаты заперты на ключ).
Какой код нужно написать чтобы только после посещения Комнаты1, в Комнате2 появилось действие ‘Открыть ключем’ ?
Я читал FAQ но ничего не понял. Буду очень благодарен.

Aleks Versus Moderator 23.03.2017 11:34 (8 years ago)

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, но примера использования модификаторов в справке нет, а методом тыка у меня что-то ничего не вышло. Подскажите, как его использовать.

Aleks Versus Moderator 25.03.2017 16:49 (8 years ago)

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 отображалась картинка?
Насчет картинки как вставлять знаю, не знаю как окно указать в коде, не нашел что-то информацию…

Aleks Versus Moderator 28.03.2017 07:05 (8 years ago)

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,
Те же команды, что и для окна основного описания, только без звёздочки – окно Дополнительного описания

Log in or Register to post comments.