如何从Node.js连接到nethack?

6

我刚开始为游戏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 shell子进程并告诉它启动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
我不确定这个,你可能需要查看Node的TTY模块。此外,这个线程可能会引起你的兴趣。 - Linus Thiel
是的,我已经查看了TTY模块:似乎v0.6+已经弃用了tty.open()方法,这可能是我想要的东西,但该方法使用了弃用的process.binding('stdio')调用,我找不到任何文档。但我会去查阅相关线程的。谢谢。 - chrisdotcode
你对这个结果感到好奇吗?我也想开始尝试使用NetHack和JavaScript做些什么。 - Jay
@Jay 虽然这是几年前的事情了,但我在放弃这个概念之前没有取得任何进展。现在我会做的可能是从源代码编译nethack并删除那行代码,或者以某种方式从节点中伪造一个TTY。此时,节点可能具有这样的功能,也可能没有,但老实说,如果您只想在本地进行黑客攻击,从源代码编译nethack似乎是一个不错的解决方案。 - chrisdotcode
1个回答

3

这种检查有点无力,因为在 isatty() 中,ptys 会返回 true。Pty 代表 伪终端,它允许程序假装成终端。这就是 Xterm 和 Screen 的工作原理。如果该检查不允许这些程序通过,你将无法在其中玩 NetHack。

我从未使用过它,但 pty.js 绑定了你在 C 代码中使用的内容,界面很合理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接