2012-03-22 24 views
5

Estoy comenzando un robot de IA para el juego nethack, y no puedo pasar por alto el 'cheque humano' que está en la fuente. La sección de código que estoy hablando es nethack/sys/unix/unixunix.c:¿Cómo conectarse a nethack desde Node.js?

#ifdef TTY_GRAPHICS 
    /* idea from rpick%[email protected] 
    * prevent automated rerolling of characters 
    * test input (fd0) so that tee'ing output to get a screen dump still 
    * works 
    * also incidentally prevents development of any hack-o-matic programs 
    */ 
    /* added check for window-system type -dlc */ 
    if (!strcmp(windowprocs.name, "tty")) 
     if (!isatty(0)) 
     error("You must play from a terminal."); 
#endif 

estoy trabajando en JavaScript, (más específicamente Node.js), y debido a lo anterior, no me deja jugar desde el programa , a pesar de que estoy generando un proceso hijo bash shell y diciéndole que comience nethack. Necesito encontrar una manera de eludir lo anterior sin volver a compilar la fuente.

El código actual que estoy usando es:

"use strict"; 

var env = { TERM: 'tty' }; 
for (var k in process.env) { 
    env[k] = process.env[k]; 
} 

var terminal = require('child_process').spawn('bash', [], { 
    env: env, 
}); 

terminal.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

terminal.on('exit', function (code) { 
     console.log('child process exited with code ' + code); 
}); 

setTimeout(function() { 
    terminal.stdin.write('nethack'); 
    terminal.stdin.end(); 
}, 1000); 

La salida del programa es:

stdout: You must play from a terminal. 

child process exited with code 1 

Lo Node.js/JavaScript (y no cualquier otro idioma o marco, si posible) magia negra ¿podría usar para resolver este problema?

+1

No estoy seguro de esto, es posible que desee examinar el [módulo TTY] del nodo (http://nodejs.org/api/tty.html). Además, [este tema] (http://groups.google.com/group/nodejs/browse_thread/thread/6fd25d16b250aa7d) podría ser de su interés. –

+0

Sí, he comprobado el módulo TTY: parece que v0.6 + desaprueba el método 'tty.open()', que puede ser algo que pueda querer, pero ese método usa un 'process.binding desaprobado ('stdio') 'llamada, que no puedo encontrar ninguna documentación. Aunque voy a ver el hilo. Gracias. – chrisdotcode

Respuesta

3

Eso es una especie de cheque cojo porque ptys volverá verdadero en isatty(). Pty significa Pseudo terminal que permite que un programa finge ser un terminal. Así es como funcionan Xterm y Screen. Si ese control no permitía esos programas a través de usted, no podría reproducir NetHack en ellos.

Nunca lo he usado, pero pty.js se une exactamente a lo que usaría en el código C y la interfaz tiene sentido.

+0

Esto se ve perfecto, gracias :-) – chrisdotcode

Cuestiones relacionadas