Skip to main content

generictemplatemissionSlice.ts

Este archivo define un slice genérico para manejar misiones en una aplicación. Utilizando Redux Toolkit, se configura un estado de misión que puede ser reutilizado en diferentes misiones y tipos de juegos.

TEMPLATE

import {
Difficulty,
Exercise,
} from "@components/LessonController/LessonControllerTypes";
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { DBMissionStateGeneric } from "database/database";

import {
GenericMissionSceneStructure,
getSceneInitialState,
initialState,
LevelConfig,
// MissionState,
} from "./GenericMissionSceneStructure";

// Configuración específica para esta misión
const levelConfig: LevelConfig = {
easy: 4,
medium: 3,
hard: 3,
};

// Definir el slice
const missionSlice = createSlice({
name: "mission", // Nombre del slice
initialState, // Estado inicial que has definido en el archivo de configuración
reducers: {
// Incrementa el tiempo en la escena actual. Si el tiempo no está definido, lo inicializa en 0.
addTime(state, action: PayloadAction<number>) {
if (state.scene.time === undefined) {
state.scene.time = 0;
}
state.scene.time += action.payload;
},
// Permite configurar opciones de desarrollo, como la fase actual y el índice de la escena, útil para pruebas o ajustes rápidos.
setDevOptions(
state,
action: PayloadAction<{
phase: Exercise;
sceneIndex: number;
}>
) {
// TO DO si es necesario se leagregan mas opciones
const { phase = Exercise.DIAGNOSTIC, sceneIndex = 0 } = action.payload;
state.currentPhase = phase;
state.currentSceneIndex = sceneIndex;
state.scene = getSceneInitialState(phase);
},
// Configura el estado inicial de la misión
onMissionStart(
state,
action: PayloadAction<{
missionId?: string;
missionNameKey?: string;
planetNameKey?: string;
worldNameKey?: string;
missionName?: string;
missionConfig: GenericMissionSceneStructure;
}>
) {
const {
missionId,
missionNameKey,
planetNameKey,
worldNameKey,
missionConfig,
missionName,
} = action.payload;

state.missionId = missionId;
state.missionNameKey = missionNameKey;
state.planetNameKey = planetNameKey;
state.worldNameKey = worldNameKey;
state.missionConfig = missionConfig;
state.missionName = missionName;
state.isLoadingMissionData = true;
},
// Establece la configuración de los niveles
setLevelConfig(
state,
action: PayloadAction<
| {
easy: number;
medium: number;
hard: number;
}
| undefined
>
) {
if (action.payload) {
const { easy, medium, hard } = action.payload;
state.levelConfig = {
easy,
medium,
hard,
};
} else {
// Si el payload es indefinido, dejamos `levelConfig` como undefined
state.levelConfig = levelConfig;
}
},
// Activa o desactiva la visualización de instrucciones generales para la misión
setShowGeneralInstruction(state, action) {
state.showGeneralInstruction = action.payload;
},
// Acción que se ejecuta cuando una escena termina
onSceneFinished(state) {
// TO DO dependiendo de la escena se ejecutan acciones
console.log("Scene finished", state);
},
// Actualiza si el resumen de la escena debe mostrarse o no.
setSummary(state, action: PayloadAction<boolean>) {
state.showSummary = action.payload;
},
// Marca una respuesta como correcta o incorrecta
checkAnswer(state, action) {
// TO DO
console.log("Check answer", state, action);
},
//Maneja el flujo de cuando una escena falla y muestra los recursos
setFailedScene(state) {
// TO DO IMPLEMENTAR SI ES NECESARIO
state.scene.failedScene = true;
state.scene.showResources = false;
},
// Maneja el flujo de cuando una escena falla, pero más orientado a la lógica de transición.
onFailedScene(state) {
// TO DO
console.log("Failed scene", state);
},
// estado de transiciion de una escena a otra unicamente se utiliza para Observacion y Expermientacion
onTrivialSceneFinished(
state,
action: PayloadAction<{
coins: number;
}>
) {
state.scene.coins += action.payload.coins || 0;
state.showSummary = true;
state.showSummaryResults = false;
},
// Gestiona la generación de la siguiente pregunta
handleNextQuestion(state, action) {
// TO DO
console.log("Next question", state, action);
},
// Actualiza la cantidad de monedas extra obtenidas en una escena
handleExtraCoins(state, action: PayloadAction<number>) {
state.scene.extraCoins = action.payload;
},
// Actualiza el nivel de la misión.
levelUp(state, action: PayloadAction<Difficulty>) {
// esto es provisional
console.log(action.payload);
state.scene.level = action.payload;
},
// restauras el estado completo de una misión a partir de un estado guardado (DBMissionStateGeneric). Esto es útil para cargar misiones en curso
// TO DO IMPLEMENTAR el guardado en database para que pueda ser generico ya que solo se penso para intergalactica
setMissionSettings(state, action: PayloadAction<DBMissionStateGeneric>) {
const missionState = action.payload;
state.currentPhase = missionState.currentPhase;
state.currentSceneIndex = missionState.currentSceneIndex;
state.showGeneralInstruction = missionState.showGeneralInstruction;
state.showSummary = missionState.showSummary;
state.showRouteCalculation = missionState.showRouteCalculation;
state.missionFinished = missionState.missionFinished;
state.visitedScenesIndexes = missionState.visitedScenesIndexes;
state.sceneHistorical = missionState.sceneHistorical;
state.scene = missionState.scene;
state.isLoadingMissionData = false;
},
closeCorrectInRowAnimation(state) {
// tiene como propósito cerrar o detener la animación que se muestra cuando el jugador responde varias preguntas correctamente de manera consecutiva.
state.scene.showCorrectInRowAnimation = false;
},
},
});

// Exportar las acciones y el reducer
export const missionActions = missionSlice.actions;
export default missionSlice.reducer;