level 12
搜 from birth(图一),与源码直接相关的文件就只有三个,其中 attrib.c 这个最可疑,有一个判断是 u.uroleplay.blind. 那就再搜这个(图二),八个文件相关。在 u_init.c 中发现依赖这个判断属性的赋值语句,这大概率就是核心了。这是个位运算,为 HBlinded 添加了一个标志位 FROMOUTSIDE. 更重要的是这个注释,它解释了这句话是在“设置 PermaBlind”。perma=permanently,那 PermaBlind 就是永久失明了,那就去找 PermaBlind(图三)。youprop.h 中发现,这是个判断宏,通过 HBlinded 和 FROMOUTSIDE 两个标志位做与位运算实现,那就大概明白这几个符号之间的关系了:OPTIONS=blind 配置后先会设置 u.uroleplay.blind 属性,后续判断为这个属性就会为 HBlinded 设置 FROMOUTSIDE 这个flag,HBlinded 是玩家的一个内在属性,改成 HHallucination 就能实现 设置天生失明->得到天生幻觉(这些信息都可以转到 HBlinded 的定义位置查看)。(图四)这一处改动最关键,但只改这个很可能是不够的,刚刚拿到的所有相关信息都要全局搜索检查一次,和 blind 相关的很多判断都是和 眼部/视觉 在一起的,一个个检查需不需要一起改。直接定义一个新的配置项 OPTIONS:hallu 没准要更简单,毕竟是全新的就可以自己全权掌握,当然那就是另外的操作路径了。
这种改动还算比较清晰,但 NetHack 是历史包袱很重的项目,里面的逻辑组织和很多写法以现在的眼光来看是有难绷之处的,不是所有需求都那么好改







