La respuesta de Philipp ya muestra la dirección correcta. Simplemente creo que la estructura de datos es innecesariamente detallada. Los textos más cortos serían más fáciles de escribir y leer.
Incluso si los textos más cortos harían que el algoritmo sea un poco más complejo, vale la pena hacerlo, porque solo escribe el algoritmo una vez, pero la mayor parte de su tiempo se dedicará a escribir y mantener la historia. Por lo tanto, optimice para facilitar la parte que pasará más tiempo haciendo.
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" }
];
Algunas explicaciones para este diseño:
Toda la historia está escrita en una matriz. No tiene que proporcionar números, la sintaxis de la matriz los proporciona automáticamente: el primer elemento tiene el índice 0, el siguiente tiene el índice 1, etc.
En la mayoría de los casos, no es necesario escribir el número del siguiente paso. Supongo que la mayoría de las líneas de texto no son ramas. Hagamos que "el siguiente paso sea el siguiente elemento" sea una suposición predeterminada, y solo tomemos notas cuando no sea así.
Para saltos, use etiquetas , no números. Luego, si luego agrega o elimina algunas líneas, se conservará la lógica de la historia y no tendrá que ajustar los números.
Encuentre un compromiso razonable entre claridad y brevedad. Por ejemplo, sugiero escribir "m" en lugar de "mensaje", ya que ese será el comando utilizado con más frecuencia, por lo que acortarlo hará que el texto sea más legible. Pero no hay necesidad de acortar las palabras clave restantes. (Sin embargo, haga lo que desee. Lo importante es que sea más legible para usted . Alternativamente, puede admitir "m" y "mensaje" como palabras clave válidas).
El algoritmo para el juego debería ser algo como esto:
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
}
}
}
Por cierto, estas ideas fueron inspiradas por Ren'Py , que no es exactamente lo que quieres (ni JavaScript, ni web), pero de todos modos podría darte algunas ideas geniales.