Как сделать?
…
Aleks Versus, спасибо за пример.
Просидел несколько часов пытаясь адаптировать твой код под свои нужны, но ничего не выходит.
Отправил тебе личкой свой файл.
Все здравствуйте. Вопрос про меню. В faq про это очень плохо написано.
Есть обычное меню вида: $stone[0]=‘Взять камень:takestone’. Где-то прочитал, что локация “takestone” будет обрабатываться так же как и при переходе по GoSub. Собственно вопрос - как мне из меню напрямую передать нужные аргументы?
$menu[0] = 'Осмотреть : Камень'
$menu[1] = 'Взять камень : Камень'
Первая строка меню запустит 1 аргумент - осмотреть, вторая - добавит предмет в инвентарь.
Локация ‘Камень’
Args = 1 :
*pl 'Обычный камень'
End
Args = 2 :
addobj 'Камень'
*pl 'Вы подобрали камень.'
End
$menu[0] = 'Осмотреть : Камень'
$menu[1] = 'Взять камень : Камень'
$menu2[0] = 'Понюхать : Камень'
$menu2[1] = 'Сесть на камень : Камень'
Ну а если такой код к примеру?
Может if args[0]=1: или if args[0]=2:? А если в локации “камень” тоже используется args[0]?
St-john,
номер пункта меню передаётся в нулевом аргументе на локацию, которая осуществляет обработку пункта меню. В твоём случае это локаци takestone. args и args[0] - это одно и то же, т.е args - это “краткая форма записи” нулевого элемента массива args. Переменные args для каждой локации свои. Если использовать args[0] на одной локации, то на другой будет другое args[0] c другим значением, и они никак не повлияют друг на друга.
Всем спасибо. В-общем-то понятно, но не всегда удобно. В моем случае совсем неудобно. Почему бы сразу в пункте меню не передавать произвольный аргумент, а не номер пункта меню? Что-нибудь типа $menu[0] = ‘Осмотреть : Камень’,11,’осмотр’, то есть тот же принцип что и при переходах в локациях. Было б удобнее во многих случаях.
Что я делаю не так?
temp[0]=1
temp[1]=2
temp[2]=3
temp[3]=4
temp[4]=5
temp[5]=6
temp[6]=7
temp[7]=8
temp[8]=9
temp[9]=10
i=1
:markiniteff
ats=arrsize('temp')
variant=rand(0,ats)
k=temp[variant]
KILLVAR 'temp', variant
eff[i]=temp[k]
i+=1
if i<10:jump'markiniteff'
Делал по аналогии с выбором случайных карт. Мне нужно массиву eff[] присвоить числа от 1 до 10 так что бы они не повторялись, но код не правильно работает и просто присваивает случайные значения.
Все. Вопрос снят. Вот рабочий код.
temp[1]=1
temp[2]=2
temp[3]=3
temp[4]=4
temp[5]=5
temp[6]=6
temp[7]=7
temp[8]=8
temp[9]=9
temp[10]=10
i=1
:markiniteff
ats=arrsize('temp')
variant=rand(1,ats-1)
k=temp[variant]
eff[i]=k
KILLVAR 'temp', variant
i+=1
if i<=10:jump'markiniteff'
k не нужна, да и код жестко привязан к размеру изначального массива. Так лучше, по-моему:
i = 0
:loop
i += 1
if i <= 10:
temp[] = i
*nl 'temp[<<i-1>>] = <<temp[i-1]>>'
jump 'loop'
end
*nl '======================='
:markiniteff
ats = arrsize('temp')
*nl 'ats = arrsize(''temp'') = <<ats>>'
if ats:
variant = rand(0,ats - 1)
eff[] = temp[variant]
KILLVAR 'temp', variant
jump'markiniteff'
end
*nl '======================='
i = 0
:print
*nl eff[i]
i += 1
if i <= arrsize('eff')-1: jump 'print'
Операторы *nl только для иллюстрации того, что происходит. В рабочем коде их следует убрать.
Строго говоря, ats тоже не нужна. Блок :markiniteff может выглядеть короче:
:markiniteff
if arrsize('temp'):
variant = rand(0,arrsize('temp') - 1)
eff[] = temp[variant]
KILLVAR 'temp', variant
jump'markiniteff'
end
Но тут ситуация двоякая. В первоначальном варианте мы один раз вызываем функцию arrsize в каждом проходе цикла, тогда как во втором варианте - дважды. При больших размерах массива temp (очень больших - >> 1000) и слабом процессоре это может вызвать ненужную задержку.
Спасибо за код. Я не додумался создать временный массив через цикл.
evp:
eff[] = temp[variant]
Я подобным образом не стал заполнять массив eff потому что у меня массивы с индексом 0 не участвуют. Везде с индекса 1 начинается, а подобное заполнение массива идет с нуля. Особо нет никакого логического обоснования моей не любви к нулевому индексу, так, с одной стороны резерв, с другой стороны мне как то наглядней с единицы считать.
OK :)
eff[arrsize('temp')] = temp[variant]
Нулевого индекса не будет.
Нужно сделать так чтобы без перехода на новый экран добавлять или убирать персонажей. А после набора определеного числа можно было или убирать уже имеющихся или закончить с выбором.
*clr
cla
'Текст'
act 'Подбор группы': gt 'Вихрь', '0'
end
if $args[0] = '0':
*clr
cla
'Число участников <<grup>>'
if grup = 3:
'Вы не можете взять больше персонажей.'
act 'Закончить сбор группы': gt 'Вихрь', '1'
end
if grup = 0:
if act 'Иванов': gt 'Вихрь', '0'
set grup += 1
set iv += 1
end
if act 'Коля': gt 'Вихрь', '0'
set grup += 1
set kol += 1
end
if act 'Ира': gt 'Вихрь', '0'
set grup += 1
set ir += 1
end
if act 'Оля': gt 'Вихрь', '0'
set grup += 1
set ol += 1
end
end
что значит
Genryzz:
без перехода на новый экран
? Не используя goto?
Aleks Versus:
что значит
Genryzz:
без перехода на новый экран
? Не используя goto?
По нажатию мы возращаемся к выбору персонажей при этом grup(число участников) становиться больше на 1(grup += 1), и мы снова вновь выбираем участников.
Spoiler
true = -1
false = 0
if grup = 0:
iv = false
kol = false
ir = false
ol = false
'Текст'
act 'Подбор группы': gt $CURLOC, 1
end
if grup > 0 or args[0] = 1:
*clr
cla
'Число участников: <<grup>>'
if grup = 3:
'Вы не можете взять больше персонажей.'
act 'Закончить сбор группы':
!др. операторы, если нужно
!и, например, gt куда надо...
end
end
if grup < 3:
if no iv:
act 'Иванов':
grup += 1
iv = true
gt $CURLOC
end
end
if no kol:
act 'Коля':
grup += 1
kol = true
gt $CURLOC
end
end
if no ir:
act 'Ира':
grup += 1
ir = true
gt $CURLOC
end
end
if no ol:
act 'Оля':
grup += 1
ol = true
gt $CURLOC
end
end
end
end