Batalla RPG - Guía de la práctica

La guía de la práctica te sugiere un orden para completar con éxito la implementación de la funcionalidad de la práctica. Prepárate, eso sí, para leer mucho JavaScript y ten a mano Google, la MDN y StackOverflow.

1. El modelo de datos

En el juego existen muchos tipos de entidades, algunos relacionados y otros no.

La especificación de tales entidades puede encontrarse en spec/entities.js y la implementación en src/entities.js, src/Character.js y src/items.js.

Efectos

Quizá el tipo más sencillo sea el tipo Effect en src/items.js y especificado en spec/entities.js. Comienza por aquí.

Personajes

Continúa activando los tests relacionados con el tipo Character y desactiva los demás.

A continuación abre src/Character.js e implementa las partes que faltan.

Elementos

Continúa con el módulo src/items.js activando paulatinamente las suites para los tipos Item, Weapon y Scroll que encontrarás en spec/entities.js.

Entidades por defecto

Tienes que crear algunos personajes, armas y pergaminos por defecto para que otras prácticas puedan usarlos. La suite built-in entities en spec/entities.js incluye incluye todas las espectativas de estas entidades.

Ve al archivo src/entities.js y completa las que falten. Fíjate que las propiedades son getters para que cada acceso a las propiedades te devuelvan un nuevo personaje.

2. La lista de turnos

Esta es fácil. La especificación se encuentra en spec/TurnList.js y la implementación en src/TurnList.js. Tan sólo rellena los huecos. Es pura algoritmia. Quizá tengas que mirarte cómo funciona la función Array.sort() para no implementarte tu propia función de ordenamiento.

3. La vista del personaje

La vista del personaje es una representación de sólo lectura de las estadísticas del mismo. Su especificación está en spec/CharactersView.js y su implementación en src/CharactersView.js. Puedes continuar por ahí.

4. El grupo de opciones

El grupo de opciones representa las opciones que se pueden elegir en un momento dado. La especificación está en spec/CharactersView.js y la implementación, casi completa, en src/CharactersView.js. Fíjate cómo el tipo Options extiende EventEmitter. Tu misión será implementar el método .select() para que al llamarlo se emita un evento acorde con la especificación.

5. La pila de opciones

Un RPG se compone normalmente de varios menús apilados. Por ejemplo, el menú de acciones da paso al menú de hechizos que da paso al menú de objetivos. En cualquier momento podemos regresar al menú anterior. La pila de opciones en src/OptionsStack.js y especificada en spec/OptionsStack.js refleja este comportamiento.

La API es la misma que el grupo de opciones pero los métodos realmente sólo se deben redirigir al último menú apilado. Fíjate en cómo se apilan y desapilan menús nuevos.

6. Utilidades

Tranqui. No tienes que hacer nada aquí, tan sólo ten en cuenta que tienes el módulo src/utils.js donde puedes colocar más utilidades si encuentras que andas repitiendo el mismo código en muchas partes. Te aconsejo que escribas algún test. Puedes inspirarte en los que ya hay en spec/utils.js.

7. La batalla

Has llegado al plato fuerte de la práctica. Hasta aquí era todo preparar los tipos en los que se apoya el tipo Battle. Ahora tendrás que implementar la máquina de estados que controla las acciones de batalla: defender, atacar y lanzar un hechizo.

Fíjate que los combatientes, sus armas y los hechizos no son los que vienen por defecto en src/entities.js sino los que se encuentran en spec/samplelib.js.

La especificación de la batalla está en spec/Battle.js y la implementación en src/Battle.js. Para abordar esta implementación con éxito es necesario que todos los tests hasta ahora pasen.

En esta parte de la práctica no hay recomendaciones sobre qué tests activar primero. Tendrás que experimentar.

Repasa bien el código, muchos de los ejercicios consisten en dar las implementaciones de funciones auxiliares. Es el caso de:

  • assignParty
  • useUniqueNames
  • isAlive
  • getCommonParty

Fíjate entonces en la función _showAction que hará que las acciones de batalla estén disponibles en el atributo options.

Ahora concéntrate en las acciones. La implementación de _defend está casi hecha. Sólo tendrás que completar las funciones _improveDefense y _restoreDefense para el cálculo de la defensa mejorada.

La acción defend rellena la estructura this._action con el nombre de la acción, los identificadores del personaje activo y del objetivo, el efecto y la nueva defensa. Todos menos la defensa son necesarios para poder llamar a la función _executeAction que ejecutará la acción e informará del resultado.

Durante el proceso de implementación de las acciones, tendrás que implementar también _showTargets y _showScrolls de manera similar, de acuerdo a la especificación y al enunciado.

8. Calidad del código

Cuando termines y todos tus tests estén en verde habrás terminado la práctica.

Rotula la rama con un tag o cambia de rama antes de mejorar la calidad del código.

Lee ahora los errores de estilo que el comando de tests pueda proporcionar y pasa los tests cada vez que realices una modificación para asegurarte que no has roto nada.

Fin

¡Enhorabuena! Has completado la práctica.

results matching ""

    No results matching ""