2012-03-22 13 views
5

Sto appena iniziando un robot AI per il gioco nethack, e non posso ignorare il 'controllo umano' che è nella fonte. La sezione di codice di cui sto parlando è nethack/sys/unix/unixunix.c:Come connettersi a nethack da 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 

sto lavorando in JavaScript, (più precisamente Node.js), ed a causa di quanto sopra, non mi permette di giocare dal programma , anche se sto generando un processo figlio shell bash e dicendo di iniziare nethack. Ho bisogno di capire un modo per aggirare il precedente senza ricompilare la fonte.

Il codice corrente che sto utilizzando è:

"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); 

L'output del programma è:

stdout: You must play from a terminal. 

child process exited with code 1 

Che Node.js/JavaScript (e non qualsiasi altra lingua o di un quadro, se possibile) la magia nera posso usare per risolvere questo problema?

+1

Non sono sicuro, potresti voler esaminare il [modulo TTY] del nodo (http://nodejs.org/api/tty.html). Inoltre, [questo thread] (http://groups.google.com/group/nodejs/browse_thread/thread/6fd25d16b250aa7d) potrebbe essere di interesse. –

+0

Sì, ho controllato il modulo TTY: sembra che v0.6 + deprecano il metodo 'tty.open()', che potrebbe essere qualcosa che potrei volere, ma quel metodo usa un deprecato 'process.binding ('stdio') 'call, su cui non riesco a trovare alcuna documentazione. Controllerò comunque il thread. Grazie. – chrisdotcode

risposta

3

Questo è un tipo di controllo zoppo perché pty restituirà true in isatty(). Pty sta per Pseudo terminal che consente a un programma di fingere di essere un terminale. Ecco come funzionano Xterm e Screen. Se quel controllo non permettesse a quei programmi attraverso di te non sarebbe possibile giocare a NetHack.

Non l'ho mai usato, ma lo pty.js si lega esattamente a ciò che usereste nel codice C e l'interfaccia ha senso.

+0

Questo sembra perfetto, grazie :-) – chrisdotcode

Problemi correlati