Skip to content

Latest commit

 

History

90 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Action: file_editor create /app/terminal-engine/README.md --file-text "# Terminal Narrative Engine

Motor de terminal narrativa interactiva modular construido con JavaScript puro, HTML y CSS. Inspirado en las terminales de Fallout, Hacknet y sistemas BBS retro.

Características

Core Features

  • ✅ Motor completamente modular y extensible
  • ✅ Sistema de comandos dinámicos (Strategy Pattern)
  • ✅ Contextos intercambiables (Local Shell, BBS, SSH)
  • ✅ Filesystem virtual navegable
  • ✅ Sistema de persistencia con localStorage
  • ✅ EventBus para comunicación desacoplada

Visual & UX

  • ✅ Efectos CRT retro completos (scanlines, glow, curvatura, grain)
  • ✅ Typing effect configurable
  • ✅ Historial de comandos (↑/↓)
  • ✅ Autocompletado con TAB
  • ✅ Cursor parpadeante animado
  • ✅ Efectos de corrupción/glitch

Funcionalidades Especiales

  • ✅ Mini-juegos integrados (password cracking)
  • ✅ Sistema de logros
  • ✅ Easter eggs (cowsay, matrix, etc.)
  • ✅ Narrativas JSON-driven
  • ✅ Sistema de progreso con flags
  • ✅ Múltiples slots de guardado

Inicio Rápido

  1. Abre index.html en tu navegador
  2. Escribe help para ver comandos disponibles
  3. Lee el briefing: cat welcome.txt
  4. Explora el filesystem: ls -a
  5. Descubre credenciales ocultas
  6. Conecta al BBS: telnet darknet.bbs.net
  7. Descarga archivos y encuentra fragmentos de contraseña
  8. Accede al mainframe: ssh vault-mainframe.local
  9. Completa la misión

Comandos Disponibles

Shell Local

  • ls [-a] [path] - Listar directorio
  • cd <dir> - Cambiar directorio
  • pwd - Directorio actual
  • cat <file> - Leer archivo
  • grep <pattern> <file> - Buscar en archivo
  • find <pattern> - Buscar archivos
  • mkdir <dir> - Crear directorio
  • rm <path> - Eliminar archivo/directorio
  • echo <text> - Mostrar texto
  • ssh <address> - Conectar vía SSH
  • telnet <address> - Conectar a BBS
  • clear - Limpiar pantalla
  • history - Ver historial
  • save [slot] - Guardar progreso
  • load [slot] - Cargar partida
  • inventory - Ver inventario
  • status - Estado del juego
  • hack [target] - Iniciar minijuego de hackeo

Easter Eggs

  • cowsay <message> - Vaca ASCII
  • matrix - Entrar en Matrix
  • Descubre más explorando...

BBS System

  • login <user> <pass> - Autenticarse
  • menu - Mostrar menú
  • messages - Ver mensajes
  • files - Biblioteca de archivos
  • download <file> - Descargar archivo
  • read <num> - Leer mensaje
  • users - Lista de usuarios
  • info - Info del sistema
  • exit - Desconectar

SSH Client

  • auth <password> - Autenticarse
  • ls - Listar archivos
  • cat <file> - Leer archivo
  • scan - Escanear sistema
  • status - Estado del sistema
  • initiate <protocol> - Iniciar protocolo
  • disconnect - Cerrar conexión

Arquitectura

terminal-engine/
├── index.html              # Punto de entrada
├── css/
│   └── terminal.css        # Estilos CRT retro
├── core/
│   ├── event-bus.js        # Sistema de eventos
│   ├── state-manager.js    # Gestión de estado
│   ├── filesystem.js       # Sistema de archivos virtual
│   ├── terminal-renderer.js # Renderizado y efectos
│   ├── input-handler.js    # Manejo de entrada
│   ├── command-registry.js # Registro de comandos
│   └── context-manager.js  # Gestión de contextos
├── contexts/
│   ├── base-context.js     # Clase base abstracta
│   ├── local-shell.js      # Shell local Unix-like
│   ├── bbs-system.js       # Sistema BBS
│   └── ssh-client.js       # Cliente SSH
├── narratives/
│   ├── narrative-loader.js # Cargador de narrativas
│   ├── demo-story/         # Narrativa demo
│   │   └── config.json     # Configuración
│   └── schema.json         # JSON Schema
└── utils/
    ├── ascii-renderer.js   # Renderizado ASCII
    ├── logger.js           # Sistema de logging
    └── validator.js        # Validación JSON

Crear Tu Propia Narrativa

1. Crea un directorio para tu narrativa

narratives/
└── mi-historia/
    ├── config.json
    └── assets/

2. Define config.json

{
  \"narrative\": \"mi-historia\",
  \"version\": \"1.0\",
  \"startContext\": \"localhost\",
  \"description\": \"Tu descripción\",
  \"systems\": [
    {
      \"id\": \"localhost\",
      \"type\": \"local\",
      \"hostname\": \"mi-sistema\",
      \"filesystem\": {
        \"/home/user\": [\"archivo1.txt\", \"archivo2.txt\"]
      }
    }
  ],
  \"progression\": {
    \"flags\": [\"flag1\", \"flag2\"],
    \"winCondition\": {
      \"flags\": [\"flag1\", \"flag2\"]
    }
  },
  \"dialogues\": {
    \"intro\": \"Texto de introducción\",
    \"victory\": \"Texto de victoria\"
  }
}

3. Carga tu narrativa

import { narrativeLoader } from './narratives/narrative-loader.js';
await narrativeLoader.loadFromFile('narratives/mi-historia/config.json');

Crear Comandos Personalizados

commandRegistry.register({
  name: 'micomando',
  aliases: ['mc'],
  contexts: ['local'], // o ['*'] para todos
  description: 'Mi comando personalizado',
  usage: 'micomando <arg>',
  execute: async (args, context) => {
    // Tu lógica aquí
    return {
      success: true,
      output: 'Resultado del comando',
      className: 'text-success'
    };
  }
});

Crear Contextos Personalizados

import { BaseContext } from './contexts/base-context.js';

class MiContexto extends BaseContext {
  constructor() {
    super('mi-id', 'Mi Contexto', 'custom');
  }

  getPrompt() {
    return 'mi-prompt>';
  }

  getCommands() {
    return [
      // Tus comandos aquí
    ];
  }

  async onEnter(params) {
    // Lógica al entrar al contexto
  }

  async onExit() {
    // Lógica al salir del contexto
  }
}

Sistema de Eventos

import { eventBus } from './core/event-bus.js';

// Escuchar eventos
eventBus.on('comando:ejecutado', (data) => {
  console.log('Comando ejecutado:', data);
});

// Emitir eventos
eventBus.emit('evento:personalizado', { datos: 'valor' });

Flags y Progreso

// Establecer flag
stateManager.setFlag('mi_flag');

// Verificar flag
if (stateManager.hasFlag('mi_flag')) {
  // Hacer algo
}

// Añadir a inventario
stateManager.addToInventory('objeto');

// Otorgar logro
stateManager.grantAchievement('Nombre del Logro');

Efectos Visuales

// Efecto glitch
eventBus.emit('terminal:glitch', { duration: 1000 });

// Barra de progreso
await renderer.showProgressBar('Cargando...', 3000);

// Arte ASCII
renderer.printASCII(`
  ╔═══════════╗
  ║   TITLE   ║
  ╚═══════════╝
`);

Personalización

Cambiar Colores

Edita css/terminal.css y modifica las variables:

/* Color principal del texto */
color: #00ff00; /* Verde fosforescente */

/* Colores de estado */
.text-error { color: #ff4444; }
.text-success { color: #00ff00; }
.text-warning { color: #ffaa00; }
.text-info { color: #00ccff; }

Cambiar Velocidad de Typing

renderer.setTypingSpeed(5); // ms por carácter (0 = instantáneo)

Cambiar Fuente

Modifica en index.html:

<link href=\"https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap\" rel=\"stylesheet\">

Y en css/terminal.css:

font-family: 'Share Tech Mono', monospace;

Atajos de Teclado

  • Enter - Ejecutar comando
  • / - Navegar historial
  • Tab - Autocompletar
  • Ctrl+L - Limpiar pantalla
  • Ctrl+C - Cancelar comando

Compatibilidad

  • ✅ Chrome/Edge (última versión)
  • ✅ Firefox (última versión)
  • ✅ Safari (última versión)
  • ✅ Funciona offline después de la primera carga
  • ✅ Responsive (mobile-friendly)

Tecnologías

  • JavaScript ES6+ puro (sin frameworks)
  • HTML5
  • CSS3 con animaciones y efectos
  • LocalStorage para persistencia
  • Módulos ES6

Performance

  • Tamaño total: ~50KB (sin comprimir)
  • Tiempo de carga: <1s
  • Sin dependencias externas
  • Optimizado para typing fluido

Solución de Problemas

El terminal no responde

  • Verifica la consola del navegador (F12)
  • Asegúrate de que todos los archivos estén cargados
  • Intenta refrescar la página

Los comandos no funcionan

  • Verifica que el contexto esté correctamente inicializado
  • Revisa que los comandos estén registrados para el contexto actual

El guardado no funciona

  • Verifica que localStorage esté habilitado
  • Comprueba el espacio disponible en localStorage
  • No uses modo incógnito (el estado se perderá al cerrar)

Créditos

Desarrollado para demostrar arquitectura modular en JavaScript puro.

Inspirado por:

  • Fallout (series de juegos)
  • Hacknet
  • Uplink
  • BBS clásicos de los 80s-90s

Licencia

Proyecto educativo de código abierto. Siéntete libre de modificar y extender según tus necesidades.


¡Feliz hackeo en la terminal! 🖥️💚 " Observation: Create successful: /app/terminal-engine/README.md

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages