Volver al blog

Ingeniero Hace Doom Correr en Software de Design de Placas Electrónicas: El Arte del Easter Egg

Hola HaWkers, un ingeniero consiguió lo aparentemente imposible: hacer el clásico juego Doom correr dentro de un software de design de placas electrónicas (PCB). Esta hazaña se suma a la larga tradición de "Doom corre en cualquier cosa" y demuestra la creatividad y habilidad técnica que existe en la comunidad de desarrolladores.

¿Ya te preguntaste qué lleva a programadores a invertir tiempo en proyectos aparentemente inútiles, pero técnicamente brillantes?

La Hazaña Técnica

El ingeniero utilizó las capacidades de scripting y renderización de un software de design de PCB para crear un ambiente donde Doom pudiera ser ejecutado.

Cómo Fue Posible

Explorando Capacidades Ocultas:

Softwares de design de PCB modernos son sorprendentemente poderosos:

  • Engine de Renderización 3D: Para visualizar placas en 3D
  • Lenguaje de Script: Para automatización (generalmente Python)
  • APIs Internas: Acceso a funciones de dibujo
  • Procesamiento: CPUs modernas son poderosas

Pasos del Hack:

  1. Identificar API de renderización disponible
  2. Mapear controles de input para el software
  3. Portar el engine de Doom para usar esa API
  4. Optimizar para correr en tiempo real
  5. Integrar todo en un plugin/script

Contexto: Doom fue lanzado en 1993 y su código-fuente fue liberado en 1997, permitiendo ports para prácticamente cualquier plataforma.

Requisitos Técnicos

Lo Que Doom Precisa:

Componente Requisito Disponible en PCB Software
CPU 386/486 equivalente ✅ Cualquier CPU moderna
RAM 4-8 MB ✅ Abundante
Video 320x200, 256 colores ✅ Vía API de renderización
Input Teclado, mouse ✅ Eventos del sistema
Sonido Sound Blaster ❓ Depende de la implementación

La Tradición "Doom Corre en Todo"

Este proyecto hace parte de una larga tradición en la comunidad tech.

Histórico de Ports Inusitados

Donde Doom Ya Corrió:

La lista es impresionante y continúa creciendo:

  • ATMs y Cajeros Electrónicos
  • Calculadoras Gráficas (TI-84, HP Prime)
  • Tests de Embarazo (con hardware modificado)
  • Termostatos Inteligentes
  • Refrigeradores con Display
  • Tractores John Deere
  • Macbooks TouchBar
  • Impresoras de Red
  • Routers
  • Relojes Inteligentes

Por Qué Doom?

El juego se tornó benchmark por varias razones:

  • Código fuente abierto desde 1997
  • Requisitos relativamente bajos
  • Bien documentado por la comunidad
  • Engine modular y portable
  • Culturalmente significativo

La Cultura del "Can It Run Doom?"

Un Meme Técnico:

"¿Pero corre Doom?" se tornó pregunta estándar:

  • Testa capacidades reales de un sistema
  • Demuestra habilidades de programación
  • Desafía límites creativamente
  • Conecta comunidades

El Valor de los Easter Eggs

Proyectos como ese revelan aspectos importantes de la cultura de desarrollo.

Creatividad en la Programación

Por Qué Desarrolladores Hacen Esto:

  1. Desafío Técnico: Probar que es posible
  2. Aprendizaje: Entender sistemas profundamente
  3. Diversión: Programar puede ser placentero
  4. Comunidad: Compartir conquistas
  5. Portfolio: Demostrar habilidades únicas

Habilidades Desarrolladas:

Proyectos "inútiles" frecuentemente desarrollan:

  • Ingeniería reversa
  • Optimización de código
  • Conocimiento de bajo nivel
  • Creatividad en la resolución de problemas
  • Persistencia

Easter Eggs Famosos

En la Industria de Software:

Easter eggs tienen larga tradición:

Software Easter Egg Año
Excel Flight Simulator 1997
Word Pinball 1997
Chrome Dinosaur Game 2014
Android Versión oculta Cada versión
Firefox about:mozilla 1998+
VSCode Extensiones de juegos 2016+

Lecciones Para Desarrolladores

Este proyecto ofrece insights valiosos para cualquier programador.

Conocimiento Profundo de Sistemas

Entender Tus Herramientas:

El ingeniero precisó conocer profundamente:

// Ejemplo conceptual de cómo explorar APIs ocultas
// en una aplicación desktop

class GameRenderer {
  constructor(hostApp) {
    // Descubrir capacidades de la aplicación host
    this.canvas = this.findRenderingContext(hostApp);
    this.inputHandler = this.hookInputEvents(hostApp);
    this.frameBuffer = new Uint8Array(320 * 200);
  }

  findRenderingContext(app) {
    // Explorar APIs disponibles
    const possibleAPIs = [
      app.get3DViewport,
      app.getCanvasContext,
      app.getRenderingSurface,
      app.getDrawingArea
    ];

    for (const api of possibleAPIs) {
      if (typeof api === 'function') {
        try {
          const ctx = api.call(app);
          if (ctx && ctx.drawPixel) {
            return ctx;
          }
        } catch (e) {
          // API no disponible o protegida
          continue;
        }
      }
    }

    throw new Error('No suitable rendering API found');
  }

  hookInputEvents(app) {
    // Interceptar eventos de input
    const originalHandler = app.onKeyDown;

    app.onKeyDown = (event) => {
      // Procesar para el juego
      this.handleGameInput(event);
      // Pasar para handler original si es necesario
      if (!this.gameActive) {
        originalHandler?.call(app, event);
      }
    };

    return {
      getKey: () => this.currentKey,
      getMouse: () => this.mouseState
    };
  }

  render(gameState) {
    // Convertir estado del juego para pixels
    for (let y = 0; y < 200; y++) {
      for (let x = 0; x < 320; x++) {
        const color = this.frameBuffer[y * 320 + x];
        this.canvas.drawPixel(x, y, this.palette[color]);
      }
    }
  }
}

Portabilidad de Código

El Engine de Doom:

La arquitectura de Doom facilita ports:

// Ejemplo simplificado de abstracción de plataforma
// como usado en ports de Doom

// Interface abstracta que cada port implementa
class DoomPlatform {
  // Inicialización
  init() { throw new Error('Not implemented'); }

  // Gráficos
  setVideoMode(width, height) { throw new Error('Not implemented'); }
  drawScreen(buffer) { throw new Error('Not implemented'); }

  // Input
  getKeyState() { throw new Error('Not implemented'); }
  getMouseState() { throw new Error('Not implemented'); }

  // Sonido (opcional)
  playSound(id) { /* puede ser vacío */ }
  playMusic(track) { /* puede ser vacío */ }

  // Timing
  getTicks() { return Date.now(); }
  sleep(ms) { /* implementar si es necesario */ }
}

// Implementación para el software de PCB
class PCBSoftwarePlatform extends DoomPlatform {
  constructor(pcbApp) {
    super();
    this.app = pcbApp;
    this.viewport = null;
  }

  init() {
    // Encontrar área de renderización en el software de PCB
    this.viewport = this.app.get3DViewCanvas();
    // Configurar callbacks de input
    this.setupInputHooks();
    return true;
  }

  setVideoMode(width, height) {
    // Usar viewport existente, escalar si es necesario
    this.scaleX = this.viewport.width / width;
    this.scaleY = this.viewport.height / height;
    return true;
  }

  drawScreen(buffer) {
    // Convertir buffer de Doom para formato del viewport
    const imageData = this.viewport.createImageData(320, 200);

    for (let i = 0; i < buffer.length; i++) {
      const color = this.palette[buffer[i]];
      imageData.data[i * 4] = (color >> 16) & 0xFF;     // R
      imageData.data[i * 4 + 1] = (color >> 8) & 0xFF;  // G
      imageData.data[i * 4 + 2] = color & 0xFF;         // B
      imageData.data[i * 4 + 3] = 255;                  // A
    }

    // Escalar y dibujar
    this.viewport.putImageData(imageData, 0, 0);
  }
}

// Uso
const platform = new PCBSoftwarePlatform(myPCBApp);
platform.init();
const doom = new DoomEngine(platform);
doom.run();

Ingeniería Creativa

Este proyecto ejemplifica el espíritu de la ingeniería creativa.

Pensando Fuera de la Caja

Abordajes No-Convencionales:

Lo que distingue ingenieros excepcionales:

  • Ver posibilidades donde otros ven limitaciones
  • Cuestionar "¿por qué no?" en vez de "¿por qué?"
  • Combinar conocimientos de áreas diferentes
  • No limitarse al uso "correcto" de las herramientas

Proyectos Paralelos

Importancia de Side Projects:

Proyectos personales "inútiles" frecuentemente llevan a:

  • Descubrimientos técnicos importantes
  • Nuevas bibliotecas y herramientas
  • Contrataciones y oportunidades
  • Innovaciones comerciales

Ejemplos Famosos:

  • Gmail: Comenzó como 20% project en Google
  • Slack: Surgió de herramienta interna de game studio
  • Twitter: Side project durante hackathon
  • Linux: Hobby project de Linus Torvalds

La Comunidad Hacker

El término "hacker" en su sentido original significa exactamente eso.

Cultura Hacker Positiva

Valores Fundamentales:

  • Curiosidad sin límites
  • Compartimiento de conocimiento
  • Elegancia técnica valorizada
  • Desafíos como diversión
  • Meritocracia técnica

Donde Encontrar:

  • GitHub (proyectos open source)
  • Hacker News
  • Reddit (r/programming, r/itrunsdoom)
  • Conferencias (DEF CON, CCC)
  • Hackerspaces locales

Contribuyendo Para la Comunidad

Cómo Participar:

  1. Compartir tus proyectos, por más "inútiles" que parezcan
  2. Documentar el proceso, no solo el resultado
  3. Ayudar otros con proyectos similares
  4. Celebrar creatividad ajena
  5. Mantener el espíritu de curiosidad

Conclusión

El ingeniero que hizo Doom correr en software de design de PCB no creó nada comercialmente útil - y ese es exactamente el punto. Proyectos como ese representan lo mejor de la cultura de desarrollo: curiosidad técnica, creatividad ilimitada, y la alegría pura de resolver problemas interesantes.

Para desarrolladores en cualquier etapa de la carrera, la lección es clara: no subestimes el valor de proyectos "inútiles". Ellos desarrollan habilidades, construyen comunidad, y a veces llevan a innovaciones que nadie podría prever. El próximo proyecto aparentemente absurdo puede ser exactamente lo que te diferencia en el mercado.

Y si estabas preguntándote: sí, eventualmente alguien va a hacer Doom correr en una placa de circuito real, usando los propios LEDs como display. Es solo cuestión de tiempo.

Si te interesa creatividad en tecnología, confiere también nuestro artículo sobre China y Bloqueo de Starlink para entender cómo tecnología y geopolítica se encuentran de formas inesperadas.

¡Vamos a por ello! 🦅

Comentarios (0)

Este artículo aún no tiene comentarios 😢. ¡Sé el primero! 🚀🦅

Añadir comentarios