Skip to main content

GenericMissionSceneStructure.ts

Este archivo define la estructura genérica para manejar misiones. Esta estructura es adaptable a diferentes tipos de misiones, fases, y escenas, permitiendo una gran flexibilidad en la implementación.

Tipos y Estructuras

GenericSceneStructure<Exercise>

Esta estructura representa los detalles persistentes de una escena dentro de una misión.

  • phase: Exercise: La fase actual de la misión.
  • level: Difficulty: El nivel de dificultad de la misión (puede ser easy, medium, hard).
  • correctQuestions: number: El número de preguntas correctas contestadas en la escena.
  • status: "inprogress" | "success" | "failed": El estado de la escena actual.
  • incorrectInRow: number: Cantidad de respuestas incorrectas consecutivas.
  • totalQuestions: number: El número total de preguntas en la escena.
  • failedScene: boolean: Indica si la escena ha fallado.
  • returnToUnderstanding: boolean: Indica si el jugador debe regresar a una fase anterior.
  • coins: number: Monedas acumuladas en la escena.
  • extraCoins: number: Monedas adicionales obtenidas.
  • time: number: Tiempo transcurrido en la escena.
  • correctInRow: number: Respuestas correctas consecutivas.
  • timesCorrectInRow: number: Número de veces que el jugador ha alcanzado respuestas correctas consecutivas.
  • showCorrectInRowAnimation: boolean: Indica si se debe mostrar la animación de respuestas correctas consecutivas.

ScenePhaseStructure

Esta estructura contiene los detalles de una fase de la misión, incluyendo las escenas y las instrucciones.

  • getGeneralInstruction?: (toggleInstructions: () => void) => React.ReactNode: Función opcional para obtener instrucciones generales.
  • scenes: React.FC[]: Un array de componentes de escena.
  • forcedIndex?: number: Un índice forzado para mostrar una escena específica.

GenericMissionSceneStructure

Define la estructura de la misión completa, agrupando las diferentes fases que la pueden componener.

  • Fases disponibles (Exercise):
    • DIAGNOSTIC
    • PREVIOUS_KNOWLEDGE
    • OBSERVATION
    • UNDERSTANDING
    • ATTACHMENT
    • EXPERIMENT
    • APPLICATION

MissionState<Exercise, MissionStructure>

El estado general de la misión.

  • isLoadingMissionData: boolean: Indica si los datos de la misión están cargando.
  • missionId?: string: El ID de la misión.
  • missionNameKey?: string: El nombre clave de la misión.
  • planetNameKey?: string: El nombre clave del planeta.
  • worldNameKey?: string: El nombre clave del mundo.
  • missionName?: string: Nombre de la misión.
  • currentPhase: Exercise: Fase actual de la misión.
  • currentSceneIndex: number: Índice de la escena actual.
  • showGeneralInstruction: boolean: Indica si se muestran las instrucciones generales.
  • showSummary: boolean: Indica si se muestra el resumen de la misión.
  • showSummaryResults: boolean: Indica si se muestran los resultados del resumen.
  • showRouteCalculation: boolean: Indica si se está calculando la ruta de la misión.
  • missionFinished: boolean: Indica si la misión ha terminado.
  • visitedScenesIndexes: number[]: Índices de las escenas visitadas.
  • sceneHistorical: GenericSceneStructure<Exercise>[]: Historial de escenas.
  • scene: GenericSceneStructure<Exercise>: Detalles de la escena actual.
  • missionConfig: MissionStructure: Configuración de la misión.
  • levelConfig?: { easy: number; medium: number; hard: number }: Configuración de los niveles de dificultad.
  • simulatedLevelSummary?: { wrong: number; correct: number; total: number; totalCoins: number }: Resumen simulado de los niveles.

Funciones Auxiliares

getSceneInitialState(phase: Exercise = Exercise.DIAGNOSTIC)

Inicializa el estado de una escena basada en una fase particular de la misión.

const getSceneInitialState = (phase: Exercise = Exercise.DIAGNOSTIC): GenericSceneStructure<Exercise> => ({
// Valores iniciales
phase: phase,
level: Difficulty.EASY,
coins: 0,
time: 0,
correctInRow: 0,
correctQuestions: 0,
incorrectInRow: 0,
totalQuestions: 0,
failedScene: false,
returnToUnderstanding: false,
status: "inprogress",
extraCoins: 0,
timesCorrectInRow: 0,
showCorrectInRowAnimation: false,
});