El proyecto a realizar será crear una versión simplificada de Final Fantasy Tactics. A grandes rasgos, el juego consta de dos grupos de unidades, controlables por un usuario (Player), que interactúan entre ellos de diversas maneras en un mapa donde estas unidades pueden desplazarse.
-
Separación clara de responsabilidades: Se optó por una arquitectura modular que organiza el código en múltiples paquetes, como
model.actions
,model.characters
,model.items
, ymodel.combatsystem
. Esto facilita la extensibilidad del proyecto, permitiendo agregar nuevos personajes, acciones, y elementos sin afectar otras partes del código. -
Uso de clases y traits: El diseño se basó en un enfoque orientado a objetos, usando clases abstractas y traits para definir el comportamiento y las propiedades comunes entre los diferentes tipos de personajes, armas, acciones y pociones. Esto permite que los objetos del juego compartan funcionalidades, al mismo tiempo que pueden ser especializados según el tipo de entidad (por ejemplo, personajes mágicos o no mágicos, armas mágicas o convencionales).
-
Flexibilidad en la creación de nuevas acciones y personajes: Se utilizó la herencia y el polimorfismo para facilitar la creación de nuevos personajes y acciones. Por ejemplo, las clases como
AbsAction
yAbsMagicAction
proporcionan una estructura común para las acciones, mientras que clases específicas comoHeal
oMeteor
extienden estas funcionalidades.
-
Paquete
model.actions
: Contiene las diferentes acciones que pueden realizar los personajes, como ataques, movimiento, y acciones mágicas. Incluye una clase abstractaAbsAction
como base para las acciones, junto con implementaciones específicas comoHeal
,Attack
,Meteor
, etc. Hay un traitAction
que define el comportamiento común de las acciones y su respectiva clase abstractaAbsAction
que implementa este trait. Las acciones específicas comoHeal
,Attack
,Meteor
, etc. extienden deAbsAction
. Luego se divide en tres packagesmodel.actions.magic
,model.actions.Unique
ymodel.actions.UsableAction
, se divide por categoria, los Unique utilizarán de forma distinta el método toJson. En los demás funcionan prácticamente igual entre ellos, sólo cambia su categoría. -
Paquete
model.characters
: Maneja la representación de los personajes en el juego. Las clases comoAbsCharacter
definen personajes genéricos, mientras queKnight
,Thief
, yArcher
son personajes específicos. Aquí se tiene un diseño parecido, un trait que incluye a Enemy y a Characters, otro trait solo para Character con su respectiva clase abstracta. Dentro de los 3 packages se encuentra la implementación de clases concretas con sus traits correspondientes. -
Paquete
model.items
: Contiene la estructura de los objetos del juego, como armas y pociones. Por ejemplo, las clasesSword
,HealthPotion
, yMagicPowerPotion
permiten a los personajes equipar armas o usar pociones. -
Paquete
model.combatsystem
: Implementa el sistema de combate, controlando el flujo de turnos y las barras de acción de los personajes. El objetoTurnScheduler
gestiona el avance de los turnos y la organización de las acciones. -
Paquete
model.gamemap
: Define el mapa del juego y cómo los personajes interactúan con los paneles (espacios en el mapa), a través de clases comoPanels
yPanelsGrid
.
-
Factory Method: El proyecto sigue el patrón de fábrica en la creación de personajes y acciones, donde clases abstractas como
AbsAction
yAbsCharacter
definen una interfaz común, pero las clases concretas (Knight
,Heal
,Sword
, etc.) proporcionan implementaciones específicas. -
Polimorfismo y Herencia: Utilizado en varios lugares, como en la creación de personajes (
AbsCharacter
->Knight
,Thief
,BlackMage
) y en las acciones (AbsAction
->Attack
,Move
,Heal
). Esto permite definir un comportamiento común, pero con la flexibilidad de modificar las acciones o atributos de manera específica según el tipo de personaje o acción.