A resposta de Philipp já mostra a direção certa. Eu apenas acho que a estrutura de dados é desnecessariamente detalhada. Textos mais curtos seriam mais fáceis de escrever e ler.
Mesmo que textos mais curtos tornem o algoritmo um pouco mais complexo, vale a pena fazê-lo, porque você escreve o algoritmo apenas uma vez, mas a maior parte do seu tempo será gasta escrevendo e mantendo a história. Portanto, otimize para facilitar a parte que você passará mais tempo realizando.
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" }
];
Algumas explicações para este design:
A história toda é escrita em uma matriz. Você não precisa fornecer números, eles são fornecidos automaticamente pela sintaxe da matriz: o primeiro item tem o índice 0, o próximo tem o índice 1, etc.
Na maioria dos casos, não é necessário escrever o número da etapa a seguir. Suponho que a maioria das linhas de texto não sejam ramificações. Vamos fazer "o próximo passo é o item a seguir" uma suposição padrão e só fazer anotações quando for o contrário.
Para saltos, use etiquetas , não números. Então, se você adicionar ou remover algumas linhas posteriormente, a lógica da história será preservada e você não precisará ajustar os números.
Encontre um compromisso razoável entre clareza e falta. Por exemplo, sugiro escrever "m" em vez de "mensagem", porque esse será o comando usado com mais frequência de todos os tempos, portanto, encurtá-lo tornará o texto mais legível. Mas não há necessidade de reduzir as palavras-chave restantes. (No entanto, faça o que desejar. O importante é torná-lo mais legível para você . Como alternativa, você pode oferecer suporte a "m" e "message" como palavras-chave válidas.)
O algoritmo para o jogo deve ser algo como isto:
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
}
}
}
A propósito, essas idéias foram inspiradas no Ren'Py , que não é exatamente o que você deseja (nem JavaScript, nem web), mas pode lhe dar algumas idéias legais de qualquer maneira.