Nova atividade em app/src/atividades/programacao/padroes/, seguindo o padrão arquitetural das demais (BaseGameScene + Blockly + interpretador): - Cena Phaser (PadroesScene), blocos customizados, API do interpretador, validador e UI com painéis ENTRADA/SAÍDA. - Fase 1 (teste): loop "enquanto" que verifica se a ENTRADA contém apenas letras de A-Z (caso "ABC123" -> "INVÁLIDO"). - Registro em gameRegistry.js, rota em App.jsx e ajuste do teste do registry (EXPECTED_IDS -> 10 jogos).
169 lines
5.6 KiB
JavaScript
169 lines
5.6 KiB
JavaScript
/**
|
|
* @fileoverview Registro centralizado de todos os jogos da plataforma.
|
|
*
|
|
* Carrega configurações de todos os 5 jogos educacionais (Autômato, Criptografia, Toupeira,
|
|
* Semáforo, Tartaruga) e fornece utilities para buscá-los, filtrá-los e gerenciá-los.
|
|
* Este é o ponto único de verdade para descoberta e acesso a jogos.
|
|
*
|
|
* @module config/gameRegistry
|
|
* @requires ../atividades/programacao/_/config/config.js
|
|
*/
|
|
|
|
import { gameConfig as ASPIRADOR_GAME_CONFIG } from "../atividades/programacao/aspirador/config/config.js";
|
|
import { gameConfig as AUTOMATO_GAME_CONFIG } from "../atividades/programacao/automato/config/config.js";
|
|
import { gameConfig as CRIPTO_GAME_CONFIG } from "../atividades/programacao/cripto/config/config.js";
|
|
import { gameConfig as EXEMPLO_GAME_CONFIG } from "../atividades/programacao/exemplo/config/config.js";
|
|
import { gameConfig as MOLE_MASH_GAME_CONFIG } from "../atividades/programacao/mole-mash/config/config.js";
|
|
import { gameConfig as ORDERNACAO_GAME_CONFIG } from "../atividades/programacao/ordenacao/config/config.js";
|
|
import { gameConfig as PADROES_GAME_CONFIG } from "../atividades/programacao/padroes/config/config.js";
|
|
import { gameConfig as PUZZLE_GAME_CONFIG } from "../atividades/programacao/puzzle/config/config.js";
|
|
import { gameConfig as SEMAFORO_GAME_CONFIG } from "../atividades/programacao/semaforo/config/config.js";
|
|
import { gameConfig as TURTLE_GAME_CONFIG } from "../atividades/programacao/turtle/config/config.js";
|
|
|
|
import { gameCategory as GAME_CATEGORIES } from "./categories.js";
|
|
|
|
/**
|
|
* Registro centralizado de todos os 5 jogos da plataforma.
|
|
* Chave é o ID do jogo (usado em URLs e rotas).
|
|
*
|
|
* @type {Object<string, GameConfig>}
|
|
* @constant GAMES_REGISTRY
|
|
*
|
|
* @property {GameConfig} aspirador - Jogo Aspirador (movimentação em grid)
|
|
* @property {GameConfig} automato - Jogo Autômato (movimentação em grid)
|
|
* @property {GameConfig} cripto - Jogo Criptografia (cifras)
|
|
* @property {GameConfig} molemash - Jogo Toupeira (reatividade)
|
|
* @property {GameConfig} ordenacao - Jogo Ordenação (algoritmos de ordenação)
|
|
* @property {GameConfig} puzzle - Jogo Quebra Cabeças (propriedades com combos)
|
|
* @property {GameConfig} semaforo - Jogo Semáforo (lógica condicional)
|
|
* @property {GameConfig} turtle - Jogo Tartaruga (desenho em canvas)
|
|
*/
|
|
export const GAMES_REGISTRY = {
|
|
aspirador: ASPIRADOR_GAME_CONFIG,
|
|
automato: AUTOMATO_GAME_CONFIG,
|
|
cripto: CRIPTO_GAME_CONFIG,
|
|
exemplo: EXEMPLO_GAME_CONFIG,
|
|
molemash: MOLE_MASH_GAME_CONFIG,
|
|
ordenacao: ORDERNACAO_GAME_CONFIG,
|
|
padroes: PADROES_GAME_CONFIG,
|
|
puzzle: PUZZLE_GAME_CONFIG,
|
|
semaforo: SEMAFORO_GAME_CONFIG,
|
|
turtle: TURTLE_GAME_CONFIG,
|
|
};
|
|
|
|
/**
|
|
* Utilitários para buscar, filtrar e gerenciar jogos do registry.
|
|
* Fornece interface única para acesso aos jogos com múltiplas estratégias de busca.
|
|
*
|
|
* @namespace gameRegistryUtils
|
|
* @type {Object}
|
|
*/
|
|
export const gameRegistryUtils = {
|
|
getActiveGames() {
|
|
return Object.values(GAMES_REGISTRY);
|
|
},
|
|
|
|
getFeaturedGames() {
|
|
return Object.values(GAMES_REGISTRY);
|
|
},
|
|
|
|
getGamesByCategory(categoria) {
|
|
return Object.values(GAMES_REGISTRY).filter(
|
|
(game) => game.categoria === categoria,
|
|
);
|
|
},
|
|
|
|
getGamesByDifficulty(dificuldade) {
|
|
return Object.values(GAMES_REGISTRY).filter(
|
|
(game) => game.dificuldade === dificuldade,
|
|
);
|
|
},
|
|
|
|
getGameById(id) {
|
|
return GAMES_REGISTRY[id];
|
|
},
|
|
|
|
searchGames(query) {
|
|
const searchTerm = query.toLowerCase();
|
|
return Object.values(GAMES_REGISTRY).filter(
|
|
(game) =>
|
|
game.gameName.toLowerCase().includes(searchTerm) ||
|
|
game.descricao.toLowerCase().includes(searchTerm) ||
|
|
game.conceitos.some((concept) =>
|
|
concept.toLowerCase().includes(searchTerm),
|
|
),
|
|
);
|
|
},
|
|
|
|
getCategoriesWithCounts() {
|
|
const categories = {};
|
|
Object.values(GAMES_REGISTRY).forEach((game) => {
|
|
if (!categories[game.categoria]) {
|
|
categories[game.categoria] = {
|
|
...GAME_CATEGORIES[game.categoria],
|
|
games: [],
|
|
};
|
|
}
|
|
categories[game.categoria].games.push(game);
|
|
});
|
|
return categories;
|
|
},
|
|
|
|
registerGame(gameConfig) {
|
|
if (!gameConfig.id && !gameConfig.gameId) {
|
|
throw new Error("Game must have an ID or gameId");
|
|
}
|
|
const id = gameConfig.gameId || gameConfig.id;
|
|
GAMES_REGISTRY[id] = gameConfig;
|
|
},
|
|
|
|
unregisterGame(gameId) {
|
|
delete GAMES_REGISTRY[gameId];
|
|
},
|
|
|
|
updateGame(gameId, updates) {
|
|
if (GAMES_REGISTRY[gameId]) {
|
|
GAMES_REGISTRY[gameId] = { ...GAMES_REGISTRY[gameId], ...updates };
|
|
}
|
|
},
|
|
};
|
|
|
|
export const getGameConfig = (gameId) => {
|
|
const config = GAMES_REGISTRY[gameId];
|
|
if (!config) {
|
|
throw new Error(`Jogo '${gameId}' não encontrado no registry`);
|
|
}
|
|
return config;
|
|
};
|
|
|
|
|
|
/**
|
|
* Retorna a lista de todas as configurações de jogos registradas.
|
|
* @returns {Array<GameConfig>} Array com todas as configurações de jogos
|
|
*/
|
|
export const getAllGames = () => {
|
|
return Object.values(GAMES_REGISTRY);
|
|
};
|
|
|
|
|
|
/**
|
|
* Registra um novo jogo no registry global.
|
|
* Se `gameConfig.gameId` ou `gameConfig.id` não existir, lança erro.
|
|
* @param {GameConfig} gameConfig - Configuração do jogo a ser registrada
|
|
* @returns {GameConfig} A configuração registrada
|
|
* @throws {Error} Se `gameId` não for provido
|
|
*/
|
|
export const registerGame = (gameConfig) => {
|
|
if (!gameConfig.gameId) {
|
|
throw new Error("gameId é obrigatório para registrar um jogo");
|
|
}
|
|
|
|
const id = gameConfig.gameId || gameConfig.id;
|
|
GAMES_REGISTRY[id] = gameConfig;
|
|
return gameConfig;
|
|
};
|
|
|
|
export const GAME_REGISTRY = GAMES_REGISTRY;
|
|
|
|
export default GAMES_REGISTRY;
|