Как подключиться к nethack из Node.js? - PullRequest
5 голосов
/ 22 марта 2012

Я только начинаю бота ИИ для игры nethack, и я не могу обойти "проверку человеком", которая есть в источнике.Раздел кода, о котором я говорю, - nethack/sys/unix/unixunix.c:

#ifdef TTY_GRAPHICS
    /* idea from rpick%ucqais@uccba.uc.edu
     * 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

Я работаю в JavaScript (точнее, на Node.js), и из-за вышеизложенного он не позволитиграть из программы, даже несмотря на то, что я порождаю дочерний процесс оболочки bash и приказываю ему запустить nethack.Мне нужно найти способ обойти вышесказанное без перекомпиляции исходного кода.

Используемый код:

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

Вывод программы:

stdout: You must play from a terminal.

child process exited with code 1

Какую черную магию Node.js / JavaScript (а не какой-либо другой язык или фреймворк, если возможно) я мог бы использовать для решения этой проблемы?

1 Ответ

3 голосов
/ 17 мая 2013

Это неэффективная проверка, потому что ptys вернет true в isatty () .Pty означает Псевдотерминал , который позволяет программе претендовать на статус терминала.Так работают Xterm и Screen.Если эта проверка не пропустит эти программы, вы не сможете играть в них в NetHack.

Я никогда не использовал его, но pty.js связывает именно то, что вы хотитеиспользовать в коде C и интерфейс имеет смысл.

...