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;