Как сделать?
…
jazzy77,
Тебе нужно что-то типа
$use_item=$item[1]
Таким образом, ты получишь имя используемого предмета, которое в последствии будешь использовать, как индекс в формуле.
itmqual[$use_item]
Можно было и как я выше писал, там не нужно никаких if. Но ты должен знать, какой итем используешь.
Приветствую. Необходимо прописать НПС на локации в определенное время, и соответственно их перемещение. Читал тему на форму на счет этого, но у меня есть собственный вариант:
Можно прописать НПС и возможность вступить с ними в диалог в виде простого условия через If hour и тд. Соответственно в определенные промежутки времени эта опция будет доступна, а в другие нет.
Вопрос собственно вот в чем: Не приведет ли это потом к различным ошибкам в накоплении переменных? Поскольку с НПС можно будет торговать, улучшать репутацию (что записывается в простейшие переменные РепутацияТорговца=РепутацияТорговца+1). Каким образом еще можно прописать НПС на локации, без обработки множества локаций через gs? В моем варианте существует отдельная локация с именем нпс, к которой осуществляется переход через действие, и собственно локация в которой этот НПС доступен в определенное время. Заранее спасибо
Доброго времени суток, Piksha.
Вопрос собственно вот в чем: Не приведет ли это потом к различным ошибкам в накоплении переменных?
Не приведет. Порог переменных более чем высокий. Даже при неграмотном алгоритме достигнуть его трудно.
Отдельно можете сделать условие вроде: если значение выше максимума - значение выравнивается к максимальному.
Каким образом еще можно прописать НПС на локации, без обработки множества локаций через gs?
Трудный вопрос. Есть большое количество способов, в том числе для генерируемых НПС.
Но в вашем случае, НПС имеет явную локацию-обработчик (локацию со своим именем) и локацию, откуда игрок будет взаимодействовать с ним. Вы можете поставить переменную-флаг и игра будет знать, что игрок сейчас взаимодействует с ним.
Пример:
If hour > 9 and hour < 18:
If Разговор_с_Мишель = 0:
Act 'Поговорить с Мишель':
Разговор_с_Мишель = 1
GOTO $Curloc
End
Else
Act 'Поговорить о погоде':
[код разговора]
End
Act 'Торговать':
[код торговли]
End
Act 'Попрощаться':
Разговор_с_Мишель = 0
GOTO $Curloc
End
End
End
В данном варианте всё еще более упрощено до одной локации. Нужно понимать, что и GOSUB - всего лишь метод вызова разделенного кода. Так, весь код можно держать на отдельной локации и вызывать через действие или гиперссылку. Правда, по-сути вы “сохраните” только переменную-флажок взаимодействия с персонажем.
Если я не смог ответить - уточняйте.
Спасибо за ваш ответ. Дополнительный вопрос по условиям If.
Есть код вида:
If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2)
If Переменная 1=>20 and Переменная 1<=40: Ивент = rand (1,4)
If Переменная 1=>40 and Переменная 1<=60: Ивент = rand (1,6)
If Переменная 1=>60 and Переменная 1<=80: Ивент= rand (1,8)
If Переменная 1=>80 and Переменная 1<=100: Ивент = rand (1,10)
Он устанавливает пределы, для рандомизации и последующего случайного события. К примеру в пределах 0-20, может случится только событие 1,2 а в пределах 80-100 от 1 до 10.
Но вот проблема, мне необходимо внести в этот код еще критерий времени. Как я понимаю более 3х параметров, даже через and внести в условие If невозможно (в одной строке кода), что приводит к тому, что критерий времени получится внести только НАД данным кодом, что то типа такого:
If Час=>6 and Час <=20:
If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2)
If Переменная 1=>20 and Переменная 1<=40: Ивент = rand (1,4)
If Переменная 1=>40 and Переменная 1<=60: Ивент = rand (1,6)
If Переменная 1=>60 and Переменная 1<=80: Ивент= rand (1,8)
If Переменная 1=>80 and Переменная 1<=100: Ивент = rand (1,10)
Вопрос собственно вот в чем: А нужно ли вообще при задавать два условия для создания предела?
К примеру в строчке
If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2)
Предел 0-20. Можно ли оставить If Переменная 1=>0 и так далее? Получится что при значании переменной 1 = 100, будут выполнятся все условия и рандомизация произойдет несколько раз, но для нас то какая разница? если последняя рандомизация все равно будет между 1-10?
Т.е упросить код и сделать следующее:
If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)
Небольшое пояснение: Этот код - механизм генерации случайного ивента. Он записан на локации самого ивента (ИвентКоридор)
Сам шанс на ивент, генерируется в процессе перехода. (так как он происходит как бы между локацией 1 и локацией 2) с помощью команды rand.
Дополнительно буду рад примерам кода, либо вашим идеям как задать увеличение количества возможных ивентов в зависимости от значения переменной.
Вопрос 2, сугубо теоретический: $ONNEWLOC=“Локация”, задает служебную локацию с именем “Локация”, обработка которой происходит КАЖДЫЙ РАЗ при смене локации, через gt? Именно поэтому на неё выносят различные параметры обновляемые между переходами? К примеру статистику, время и прочее?
Piksha:
Как я понимаю более 3х параметров, даже через and внести в условие If невозможно (в одной строке кода)
Можно.
Piksha:
что приводит к тому, что критерий времени получится внести только НАД данным кодом, что то типа такого:
Только - нет, можно третьим параметров добавлять, но не нужно. твой вариант - это оптимизация.
Piksha:
Вопрос собственно вот в чем: А нужно ли вообще при задавать два условия для создания предела?
Можно не задавать. тут вопрос чисто в технической области - объем кода, скорость выполнения - все это настолько незначительно, что можно не париться.
Piksha:
Дополнительно буду рад примерам кода, либо вашим идеям как задать увеличение количества возможных ивентов в зависимости от значения переменной.
Определи условия при которых должен срабатывать ивент и его вероятность. От этого будет зависеть код.
Piksha:
Вопрос 2, сугубо теоретический: $ONNEWLOC=“Локация”, задает служебную локацию с именем “Локация”, обработка которой происходит КАЖДЫЙ РАЗ при смене локации, через gt? Именно поэтому на неё выносят различные параметры обновляемые между переходами? К примеру статистику, время и прочее?
Да.
Piksha:
Т.е упросить код и сделать следующее:
If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)
Есть возможность сделать исключающее условие в твоём случае:
if переменная_1>=80:
ивент=rand(1,10)
elseif переменная_1>=60:
ивент=rand(1,8)
...и т.д.
это будет, во-первых, более читаемо, а во-вторых, более правильно и позволит избежать багов в дальнейшем.
Piksha:
If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)
ивент = rand(1,((min(переменная,99)/20)*2)+2)
Ребят, я жутко деревянный во всём этом, это капец, извините, но оч. хочется разобраться в следующей ситуации:
act’старт’:
gs’’
if [переменная]=1:’<картинка-1>’
‘текст’
act’Далее’:gt $curloc
gs’следующая локация’
end
… след. лок., короче рандомные ивенты, которые можно пропустить или принять:
if [переменная]=2:’<картинка-2>’
‘текст’
if [переменная]=x:’текст’
if [переменная]=xx:’текст’
…
Ну как бы понятно что всё выполняется из первой локации, но… Как в данной ситуации проще всего сделать так, чтобы первая картинка не отображалась, когда запускается условие с ‘<картинка-2>’, и отображалась во всех остальных случаях?
kanparonner,
if условие=2:
картинка=2
else
картинка=1
end
А вообще, не очень понятно какой у тебя код, gs внутри актов или снаружи, какие акты что делают…
Ну, вначале gs снаружи… во второй локе, в зависимости от ситуации… если дополнить что написано выше: act переходит к gs’stat’ - картинка-2… + act который возвращает в первую локацию…
В общем, только если дублировать картинки и чередовать их… Там просто могут быть и другие if, которым опять может вторая понадобиться, думал, может можно как-то сделать первую “картинкой по умолчанию”.
Ну в общем, ок, понятно.
act'старт':
gs '' &! пустой GOSUB? Шутишь? Допустим, он не пустой.
if [переменная]=1:'<картинка-1>'
'текст'
act'Далее':gt $curloc
gs'следующая локация'
end
... след. лок., короче рандомные ивенты, которые можно пропустить или принять:
if [переменная]=2:'<картинка-2>'
'текст'
картинка будет выводится только в случае переменная=2 а текст в любом случае.
Плохо. Очень плохо. Мог бы вынести за условие.
Либо использовать оператор отрицания NO, который будет выводить картинку во всех случаях, кроме когда переменная = 2.
if no [переменная]=2: *pl '<картинка-2>'
Добрый день!
у меня вопрос по работе с массивами. У меня есть текстовый массив $item, в нем есть $item[1], $item[2]… $item[n+1]. И есть соответствующий ему числовой массив itm[$item[1]], itm[$item[2]]…itm[$item[n+1]]
Когда игрок покупает оборудование, то соответствующей переменной маасива itm[$item] присваивается значение 1.
Теперь мне надо показать купленное пользователю. Не могу найти в документации, как сделать это одной командой, что-то типа
IF itm[$item]=1:
'<<$item>>'
END
То есть, возможно ли это в принципе, чтобы система проверяла массив itm[$item] на наличие значений 1 и по ним выводила связанные данные из текстового массива $item?
jazzy77, доброго времени суток.
Сперва хотелось бы напомнить, что вы всегда можете присоединится к дискорду (там просто быстрее отвечать на оперативные вопросы).
То есть, возможно ли это в принципе, чтобы система проверяла массив itm[$item] на наличие значений 1 и по ним выводила связанные данные из текстового массива $item?
Ну, начнем по порядку.
Во-первых: нужно провести проверку по массиву.
x = 0 &! задаем значение счетчика цикла
:mark
If no $item[x] = '':
*p $item[x] &! Тут мы используем переменную-счетчик [x] в качестве указателя на ячейку массива.
end
if x < arrsize('$item'): x = x + 1 & jump 'mark'
Теперь о проблемах:
itm[$item] - достаточно неправильная (хоть и валидная) конструкция, которая создаст проблемы на следующем этапе разработки.
Настоятельно советую сыграть пару игр в каталоге, поразмыслить и представить, как была создана та или иная механика и пересмотреть подход.
Надеюсь, смог ответить. Коллеги подправят, если что-то упустил)
Обновлено:
Если хотите наступать на грабли, то:
x = 0 &! задаем значение счетчика цикла
:mark
If itm[x] = 1:
*p itm[x] &! Тут мы используем переменную-счетчик [x] в качестве указателя на ячейку массива.
end
if x < arrsize('itm'): x = x + 1 & jump 'mark'
Не мне вас отговаривать ;)
jazzy77,
:for
if i<arrsize('$item'):
IF itm[$item[i]]=1:
'<<$item[i]>>'
END
i+=1
jump 'for'
end
Aleks Versus,*HronoStranger,* спасибо большое! Проблему понял, варианты понял, буду думать :)