Відповідь Філіпа вже показує правильний напрямок. Я просто думаю, що структура даних непотрібна багатослівна. Коротші тексти було б простіше писати та читати.
Навіть якщо більш короткі тексти роблять алгоритм трохи складнішим, це варто зробити, тому що алгоритм ви пишете лише один раз, але більшість вашого часу буде витрачено на написання та підтримку історії. Тому оптимізуйте для того, щоб полегшити ту частину, на яку будете витрачати більшу частину часу.
var story = [
{ m: "Hi!" },
{ m: "This is my new game." },
{ question: "Do you like it?", answers: [
{ m: "yes", next: "like_yes" },
{ m: "no", next: "like_no" },
] },
{ label: "like_yes", m: "I am happy you like my game!", next: "like_end" },
{ label: "like_no", m: "You made me sad!", next: "like_end" },
{ label: "like_end" },
{ m: "OK, let's change the topic" }
];
Деякі пояснення цього дизайну:
Вся історія написана одним масивом. Вам не потрібно вводити номери, вони надаються автоматично синтаксисом масиву: перший елемент має індекс 0, наступний - індекс 1 тощо.
У більшості випадків не потрібно писати номер наступного кроку. Я припускаю, що більшість рядків тексту не є гілками. Давайте зробимо «наступним кроком наступний пункт» припущення за замовчуванням, і робимо примітки лише тоді, коли це інакше.
Для стрибків використовуйте мітки , а не цифри. Тоді, якщо згодом ви додасте чи вилучите кілька рядків, логіка історії буде збережена, і вам не доведеться коригувати числа.
Знайдіть розумний компроміс між чіткістю та короткістю. Наприклад, я пропоную написати "m" замість "message", тому що це буде найчастіше використовувана команда коли-небудь, тому, якщо скоротити її, зробить текст більш розбірливим. Але не потрібно скорочувати решту ключових слів. (Однак робіть так, як хочете. Важливим є зробити це найбільш розбірливим для вас . Як варіант, ви можете підтримувати і "m", і "message" як дійсні ключові слова.)
Алгоритм гри повинен бути приблизно таким:
function execute_game() {
var current_line = 0;
while (current_line < story.length) {
var current_step = story[current_line];
if (undefined !== current_step.m) {
display_message(current_step.m);
if (undefined !== current_step.next) {
current_line = find_label(current_step.next);
} else {
current_line = current_line + 1;
}
} else if (undefined !== current_step.question) {
// display the question: current_step.question
// display the answers: current_step.answers
// choose an answer
// and change current_line accordingly
}
}
}
До речі, ці ідеї були натхнені компанією Ren'Py , яка не є саме такою, яку ви хочете (не JavaScript, не веб), але все одно може дати вам круті ідеї.