Несколько динамичных вариантов в диалоге
Цитата: Chris Nerson от 02.02.22, 14:20Дратути!
Хочу поделиться таким вариантом отыгрыша, когда, например, нам нужно спросить персонажа несколько вопросов, и так, чтобы реплики удалялись, после того как были нажаты.Напоминаю, что я пользуюсь Свитчером //switch() {} чтобы минимизировать количество параграфов.
Допустим, у нас есть абзац диалога:
\ - Спрашивай о чем угодно!
\ [[Вопрос 1|параграф{выбор= 1;}]]
\ [[Вопрос 2|параграф{выбор= 2;}]]
\ [[Вопрос 3|параграф{выбор= 3;}]]Ссылки ведут на тот же параграф, в котором с помощью switch(выбор) {} отображаются варианты. (Покопайтесь в руководстве, это удобнее чем If/else if)
И вот как нам сделать так, чтобы после перехода отображались только те вопросы, которых игрок еще не задавал.
Перед ссылками задаем глобальный массив:
реплики = [1,2,3];
реплик может быть и больше, сколько угодно. Не забывайте их правильно потом обрабатыватьДалее выводим ссылки:
реплики.forEach(function(item) { //более простая форма цикла for для выполнения функции для каждого члена массива.
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 1;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 2;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 3;}]]
break;
default:
// код, если иное значение
}
})Они ведут на реплику, допустим:
\Вопрос номер 1, как дела?далее какой-то ответ:
Тут было бы хорошо вставить и оставшиеся реплики. Но что если игрок пришел к этому вопросу, спросив уже о другом. Некоторые вопросы будут лишними. А если этот вопрос был последним? Значит, нам надо удалить нажатую реплику, вывести оставшиеся либо перевести на конец разговора.
Удаляем реплику:
for(var i=0; i<реплики.length; i++) { //проверяем по количеству активных реплик еще активные
if(реплики[i]==1) { //теперь, если это была реплика 1, следует код
var удалённые = реплики.splice(i,1); //удаляем реплику из массива под ее номером, в количестве 1.
}
}Далее выводим оставшиеся:
if(реплики.length>0) { //мы проверяем, если игрок еще не нажал какую-то реплику, то выводим оставшиеся
реплики.forEach(function(item) {
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 1;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 2;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 3;}]]
break;
default:
// код, если иное значение
}
})
} else { // код, если все реплики были нажаты
\ [[Продолжить|параграф{выбор=4;}]]
}По итогу, у нас такая логика. Есть массив из нескольких цифр - номеров реплик. Мы выводим их, если номер присутствует в массиве, удаляем после перехода, а если вообще ничего не осталось - переводим в другой параграф/диалог.
[spoiler title="Примерный код, как все получилось:"]
switch(выбор) {
case 1:
\ - Спрашивай о чем угодно!реплики = [1,2,3];
реплики.forEach(function(item) { //более простая форма цикла for для выполнения функции для каждого члена массива.
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 2;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 3;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 4;}]]
break;
default:
// код, если иное значение
}
})break;
case 2:
\Как у тебя делаfor(var i=0; i<реплики.length; i++) { //проверяем по количеству активных реплик еще активные
if(реплики[i]==1) { //теперь, если это была реплика 1, следует код
var удалённые = реплики.splice(i,1); //удаляем реплику из массива под ее номером, в количестве 1.
}
}\ [[Ответ на вопрос|параграф{выбор= 5;}]]
break;
case 3:
\Какая сегодня погода?for(var i=0; i<реплики.length; i++) { //проверяем по количеству активных реплик еще активные
if(реплики[i]==2) { //теперь, если это была реплика 2, следует код
var удалённые = реплики.splice(i,1); //удаляем реплику из массива под ее номером, в количестве 1.
}
}\ [[Ответ на вопрос|параграф{выбор= 6;}]]
break;
case 4:
\Сколько тебе лет?for(var i=0; i<реплики.length; i++) { //проверяем по количеству активных реплик еще активные
if(реплики[i]==3) { //теперь, если это была реплика 3, следует код
var удалённые = реплики.splice(i,1); //удаляем реплику из массива под ее номером, в количестве 1.
}
}\ [[Ответ на вопрос|параграф{выбор= 7;}]]
break;
case 5:
\все хорошо! Не жалуюсь.
if(реплики.length>0) { //мы проверяем, если игрок еще не нажал какую-то реплику, то выводим оставшиеся
реплики.forEach(function(item) {
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 2;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 3;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 4;}]]
break;
default:
// код, если иное значение
}
})
} else { // код, если все реплики были нажаты
\ [[Продолжить|параграф{выбор=8;}]]
}break;
case 6:
\Хорошая погода
if(реплики.length>0) { //мы проверяем, если игрок еще не нажал какую-то реплику, то выводим оставшиеся
реплики.forEach(function(item) {
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 2;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 3;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 4;}]]
break;
default:
// код, если иное значение
}
})
} else { // код, если все реплики были нажаты
\ [[Продолжить|параграф{выбор=8;}]]
}break;
case 7:
\мне уде есть 18))
if(реплики.length>0) { //мы проверяем, если игрок еще не нажал какую-то реплику, то выводим оставшиеся
реплики.forEach(function(item) {
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 2;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 3;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 4;}]]
break;
default:
// код, если иное значение
}
})
} else { // код, если все реплики были нажаты
\ [[Продолжить|параграф{выбор=8;}]]
}break;
case 8:
\Вопросы кончились!break;
default:
};[/spoiler]
Дратути!
Хочу поделиться таким вариантом отыгрыша, когда, например, нам нужно спросить персонажа несколько вопросов, и так, чтобы реплики удалялись, после того как были нажаты.
Напоминаю, что я пользуюсь Свитчером //switch() {} чтобы минимизировать количество параграфов.
Допустим, у нас есть абзац диалога:
\ - Спрашивай о чем угодно!
\ [[Вопрос 1|параграф{выбор= 1;}]]
\ [[Вопрос 2|параграф{выбор= 2;}]]
\ [[Вопрос 3|параграф{выбор= 3;}]]
Ссылки ведут на тот же параграф, в котором с помощью switch(выбор) {} отображаются варианты. (Покопайтесь в руководстве, это удобнее чем If/else if)
И вот как нам сделать так, чтобы после перехода отображались только те вопросы, которых игрок еще не задавал.
Перед ссылками задаем глобальный массив:
реплики = [1,2,3];
реплик может быть и больше, сколько угодно. Не забывайте их правильно потом обрабатывать
Далее выводим ссылки:
реплики.forEach(function(item) { //более простая форма цикла for для выполнения функции для каждого члена массива.
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 1;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 2;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 3;}]]
break;
default:
// код, если иное значение
}
})
Они ведут на реплику, допустим:
\Вопрос номер 1, как дела?
далее какой-то ответ:
Тут было бы хорошо вставить и оставшиеся реплики. Но что если игрок пришел к этому вопросу, спросив уже о другом. Некоторые вопросы будут лишними. А если этот вопрос был последним? Значит, нам надо удалить нажатую реплику, вывести оставшиеся либо перевести на конец разговора.
Удаляем реплику:
for(var i=0; i<реплики.length; i++) { //проверяем по количеству активных реплик еще активные
if(реплики[i]==1) { //теперь, если это была реплика 1, следует код
var удалённые = реплики.splice(i,1); //удаляем реплику из массива под ее номером, в количестве 1.
}
}
Далее выводим оставшиеся:
if(реплики.length>0) { //мы проверяем, если игрок еще не нажал какую-то реплику, то выводим оставшиеся
реплики.forEach(function(item) {
switch(item) {
case 1:
\ [[Вопрос 1|параграф{выбор= 1;}]]
break;
case 2:
\ [[Вопрос 2|параграф{выбор= 2;}]]
break;
case 3:
\ [[Вопрос 3|параграф{выбор= 3;}]]
break;
default:
// код, если иное значение
}
})
} else { // код, если все реплики были нажаты
\ [[Продолжить|параграф{выбор=4;}]]
}
По итогу, у нас такая логика. Есть массив из нескольких цифр - номеров реплик. Мы выводим их, если номер присутствует в массиве, удаляем после перехода, а если вообще ничего не осталось - переводим в другой параграф/диалог.
Цитата: Makar Avdeev от 04.06.23, 00:18Спасибо большое, вы святой человек!!! Очень помогли!!! )))
Спасибо большое, вы святой человек!!! Очень помогли!!! )))