2009年8月30日星期日

关于zflap.com

Hello World!

http://zflap.com/
这是前些天买的域名&空间,还没什么内容啊。
先建了一个本博的入口
http://blog.zflap.com/
另提供如下订阅入口
http://feeds.feedburner.com/ZsYard

写在http://blog.zflap.com/的代码暂就不贴了,
给下面的参考链接:
http://phpjs.org/
http://php.chinaunix.net/manual/zh/

备用域名myblog.zflap.com
感觉不好看,不用了。

再强调一下ee.zsy就是我,Z's Yard[中文]的博主。
你可通过下列方式联络
Z's Yard[中文]
Z's Yard[中文] - zflap.com入口
恩,感觉还是缺少一些方便的互动的东西啊,
而且至少目前访问确实也不方便,
此外就是在自己的空间里加强一下自身的存在感。

博客这里的内容是些自己杂乱的东西了,
开来还是需要有特别的项目来开展。
这不是关于关注度的话题,而是我能够创造的价值。
好吧,私人空间就依旧如平静的夜晚吧。

2009年8月28日星期五

伪春菜 - 简述

[茶兔&茶鹿]


伪春菜的说明请转移维基百科
http://zh.wikipedia.org/wiki/%E5%81%BD%E6%98%A5%E8%8F%9C
简单的说就是一个拟人化的桌面玩物,除了所安装的特定的人格(Ghost)机能外,也提供报时收取订阅等系统功能。

目前通过搜索可以找到打包好的伪春菜,不过在这里要自己组装一回。

核心程式:SSP
下载地址:http://cers.cuc2.idv.tw/
解包后运行主程序

先在已经可以开见最基础的平台,之后下载的模块只需要拖动到程序运行的窗口上(或者解包到程序所在目录,对应好路径)。
下面去下载 "人格(Ghost)":这是中文偽春菜後援會Wiki,http://cuc2.idv.tw/wiki/index.php?FrontPage,选择其中的"资源"的"人格"项目。仔细找可以发现下载链接。
其中最知名的人格是"橘花",目前有两个版本。
"落鳥" 以及 "茶兔&茶鹿" 具有很高完成度,推荐使用。
采用拖放方式安装后,右键选择切换或呼叫人格即可。

同时请仔细寻找额外的 "外表(Shell)" "对话框(Balloon)"哦(汗,其实我自己就很不擅长找)。主要是找橘花的,因为另两个有配套的提供。

最新的(从我写贴时间) 小绿
http://220.170.79.48/html/art/20090826/44568.html
来自 acfun.cn

觉得开此贴是在无聊了(没写到什么特别的),下面说玩法:
系统功能,详见右键菜单。
推到抚摸等动作,会与好感度相关。
人格提供的功能,双击出菜单。
调教,自己给人格添加脚本实现功能(算重点吧),涉及辞书文件和伪AI(Shiori),相关资料参见"中文偽春菜後援會Wiki"。

[橘花]图转自官网

好就先这么些,其他更多的可以去Google或百度贴吧看看。

2009年8月23日星期日

关于神的一二[第二篇小说的构想]

Part.1
090823
暂不打算成文,这次目的是完成内容的基础设定。本文标题是原先引开整个构思的话题。

对于神是否存在,有看法认为有,有反对的认为是没有。也有觉得神或许存在,但是在对外界的认识不断构建的过程中,神是会被简化去的事物。这里仅在把话题划分为三种存在形态。
信仰的一种可以的对象,是神。宗教是这种信仰的形式,体现在日常的认知和行为上。
在生命体认识(包括对外界事物和对心理道德等两方面的)有限的时期下,有太多空白需要以神做填补。
原始状况下无知的故事,对于一个隔开的观者,可以表现出满满的悲伤,也同时能体会到些许纯真。
某神说,它是世间的解救者。这与一群人内心想法共鸣,比如不满,愿望,内疚。他们发现,神是可以被认为存在的,并也同时利用他人信仰获得了收益。
于是他们更广泛的传播神的福音,扮演者解救众人的使者。不断歌颂着神的伟大,并描绘着需要齐力对付的黑暗敌人。
面对其他信仰,他们告诫信者,这是恶魔的诱惑,源于对神的不诚。面对神的怀疑者,他们将展示给信者自身的功劳和这类人面临的极大不幸。
信者在成长,对神的认知已不再是原本的共鸣。也没有转向怀疑,因为知道了所保持的信仰代表了自己拥有的,和能够再获得的。
神的影响在壮大,不论是何种缘由,直到有一刻发展成为区域内的共同取向。从此,神由名义的存在,变为了对社会推进的指引。

由此得到一个故事设定,是一个有现代感的封闭村落,保留着有血缘遗传的神的绝对信仰。出于安全考虑(表明其实有反对者活动),神的继承者要送往远方完全隔绝的地方教育成长,并在成年时接回告知神的血统。此时只有接受神的名号才能保障自身(包括父辈)的安全,同时出于传统需要否认之前的一切经历。哪怕是最好的伙伴也只能视为陌生,忍受着孤独。其实在村落里,能成为神是被向往的事情,是希望自己的出身是荣耀的血统。
关于故事的年代设定,是架空的久远的感觉,会调动起人情绪的幻想,而不是无知落后。是面对了合适但又伤感的东西。

成文方式,再等形式确定按需要和预计来。这次风格是打算保持有完整的情节和人物线,也按习惯考虑再在形态上体现些非常态的要素。注重个人体会和神的视角。

人物。主角,男,神的继承者,情节的主线。其他待确认或添加。
这里的内容本身,就在于构想的积累。

Part.2
090824-5
续写和预想总担心会有难调和的地方啊,现在是开始一个新的部分了。

教堂是宗教仪式的场所,具有神圣之感。信者在此洗礼祈愿,希望获得神的庇护。
即使不见神的形体,也能体会到它对未来的影响。以预言的方式,让信者内心感受力量,来支持自身最认为的情况。
或许存在击穿了现实和其他次元的视感,掩饰了悲伤的自虐感。或者既可是源于生命的力量信念向往,亦可是无形沉重的束缚。
仰望教堂汇聚的屋顶,寻找灵魂引导者的光芒。那是被渺小身影寄予希望能存在的神,它的作用在仪式场所里,被实现。
以神的名义而被广知的意志,是众信者依靠的引导。结合在一起的力量,掩去了争端隔阂。不论是出于对此力量的满足或恐惧。
一代代的信者,化身为神躯壳的部件,于发展之路上开拓出新的脚印,光芒闪烁在无尽长河中。
教会的领导者,同时是与神的媒介。也共同意志的个人存在,引导职责的现实担当。他获得着信者对神的依赖,可能出于愿望的共鸣,或也可能是象征体的延续(扮演与希望担当引导者不同的理想)。
古老的预言曾讲述,神把众生从恶魔的拉扯中解救。在延续下的信者对神敬仰的幸福目光的暗影中,有囚禁着的恶魔和发生的对将新诞生的神的杀戮。
神的意志,是生命对不可知的境地的依赖。同时渐渐,个体也把神视作等同满足感的存在,以忍受个体的压抑作为代价,共同填充着神的躯体。
约定,神不会说,因为它没有亲自实现愿望的力量。

以上构造背景是想想的,估计不合实际。教堂是古典欧洲的味道,故事里也想有石墙外神社状神灵和大自然的感觉。设定时间组成,主体是主角成人仪式时段,发生来有隔绝感到村落。还有就是很分明的成长时段,是现代文化的空间,有校园伙伴和成长,是被认为最真实不可丢弃的(有点读者生活的空间的情感)。预言传说,是模糊的,和现实有重影的,被相信而不会摆脱的。好友的亲近和对族人的距离感是对于,也和血缘关系反差。神的存在感,以典故氛围,特别是迫使主角的力量的形式存在。行文对神的重点在存在感,不涉及评价的。完整的故事由线索和场景的发展构成。

人物:主角的父亲,考虑是会有爷爷辈,该角色是发生了双重的身份,这里以长辈的为首要体现。抗议团体,根据上次设定有一个暴力团体,作为力量迫使主角的家族出于安危不可放弃地位(这里可划分出不同立场的)。主角同学,女生,可爱,有相对特别的性格。被祭祀和祈愿的对象,在传说和历史上分别存在的神,自身是认为到幸福的,不过被主角体会到悲剧感(有母亲爱子女感),这个不做故事线索。村民路人,被需要的角色,会提拔其中的任故事要素的。人物间有立场和身份的关系。

直线型情节要交织感有困难啊,情节的波动仍按习惯转移到叙述上(情节本身平稳化)。故事这次打算基于场景和情绪来组织。部分人物有纯真和距离近的感觉。

简单设定点场景(感觉上的,不一定使用):坐在倒下的树干上,夜晚,有虫鸣,星空和月光,独自或和来自外界的人一起,唤起现代回忆下美好和真实的感受。主角的不同时段愿望(理想)的冲突(就仅设定过两个存在的时段吧)。不同身份的人,亲切和敬意的同时存在的对话。注,村落也是现代感的,只是味道不同而已。

Part.3
090830
又过了些天了,构想没多少推进。话说这种依靠累积的项目,是需要安排好集中而平缓的进度的。

在背景中设定的各立场:主体是神,一个抽象的存在。故事中其他视角对它是模糊的认识,神圣无上的感觉。神使和信者,他们共同受神的牵制(这是故事的切入,展现悲伤的情绪,方向是意识的发掘)。两者的自身利益和与相互关系推动出了神的存在形态(也看作人的组成部分,区别在转为了人的制衡)。信者有对神使的不满,但仍有此方向的利益取向(价值的认可和收益)。不同神使有巩固自身利益和立场的动机,这也会造成另一方的情绪。整体是被压制的感觉。

这是补充内容,本篇构想篇第一篇就此结束。这里设定(这贴里的)的要点是故事的主题,也会再补些。此外填充场景(发展中的片段)人物和故事线(展现形态方面的,或情绪关系发展)。

2009年8月20日星期四

开始加AdSense试试

如题,刚填了申请。
加Ad不是本人最初对本Blog建设的设想了,虽然曾有过觉得对不住服务商的想法。
不过为了写本贴,来尝试一下申请和投放喽。
话说其实都没人路过这里啊。
就先这么,样式也不调整了,等下一步怎么做。
Ok,在自家挖个试验田。其他文章属性不受影响。
====
回信说 不符合。
参考这篇
http://www.google.com/support/forum/p/adsense/thread?tid=7ddbed7081a813d0&hl=zh-CN
中文blogspot的站点目前不接受。
注册网站的要求和其他说明看这里
http://www.google.com/support/forum/p/adsense/thread?tid=5b6daaad0a89ba6d&hl=zh-CN
先放一会公益广告吧。
====
090824
准备买空间,有考虑HG的,现在看中HM。
====
090828
前天晚上买好,域名是zflap.com,已尝试Drupal并建立博客入口,SSH也以开通。

2009年8月19日星期三

pdftotext

pdftotext is an open source command-line utility for converting PDF files to plain text files.
http://www.foolabs.com/xpdf/download.html
If your machine is x86,Win32,
you can download the Precompiled binaries for Win32,and use pdftotext.exe following pdftotext.txt.
If the PDF you converted contains Simplified Chinese characters,extra Language Support Packages for Chinese/simplified is needed.The URL where you will get the fonts can be founded in file README,which also shows you how to use this pac.

EN写着不顺啊,而且内容还是提及中文问题的。

2009年8月16日星期日

cgi&c,jQuery&CMS与OO

CGI 通用网关接口

The Common Gateway Interface
http://hoohoo.ncsa.illinois.edu/cgi/
CGI Programming FAQ
http://www.htmlhelp.org/faq/cgifaq.html

文档,参照和参考

最简单的示例

#!/bin/sh
echo Content-type: text/plain
echo /bin/date

出自 - 学习CGI脚本
http://www.jdon.com/idea/cgi.htm
老文了,用实例介绍了cgi

cgi是一种标准协议,与可执行的文件是何种语言编写无关。
通过URI的调用,服务器建立cgi进程。
cgi程序的标准输出的内容被发回客户端浏览器,
输入通过表单的GET和POST是以环境变量和标准输入的方式,
比如"/cgi-bin/test.cgi?inputstr"。
被建立的cgi进程随后销毁
c语言的实验代码

#include
int main(int argc,char** argv,char** envp)
{
puts("content-type:text/html\r\n\r\n");
while (envp++,*envp!=NULL){
puts(*envp);
puts("
");
}
}

解析FROM提交的QUERY-STRING的c实现
参见 用c写CGI 程序
http://www.programfan.com/article/2858.html

QUERY-STRING的格式及代码 略
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
URL编码遵循下列规则:
每对name/value由&符分开.
每对来自表单的name/value由=符分开. 如果用户没有输入值给这个name,那么这个name还是出现,只是无值(象这样 "name=").
任何特殊的字符(就是那些不是简单的七位ASCII,如汉字) 将以百分符%用十六进制编码. 当然也包括象 =, &, 和 % 这些特殊的字符.
在输入区中的空格将以加号+显示.




用perl会比用c方便些,而php则更加专用了。
c/cpp库有 cgic Cgicc
封装了函数提供如表单检查或文件上传等功能
协议大体分别是BSD-Like和LGPL
能找到示例代码

使用FastCGI技术,可以建立长期的cgi进程。
http://www.fastcgi.com

#include

void main(void)
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("Hello world!
\r\n");
printf("Request number %d.", count++);
}
exit(0);
}


想简单实验cgi可以用
(Win32)EasyWebServer V1.9
(Linux)mini-httpd
Linux下注意权限和是否开启cgi功能

c语言下锁住文件用sys/file.h的flock()
例如编写计数器类似程序,会同时对同一个共享的文件读写的。

编写包含同时处理多用户的各自状态的程序,
通过session和cookie来实现
cookie的获取和设定功能,有cgi协议提供
session则对登录的用户分配ID,分别由服务器和浏览器的cookie匹配保存和传递状态。
如果用c编写,session需要自行实现。

CMS
内容管理系统 - Content Management System

比如 drupal,Joomla(个人乱猜前者侧重平台,后者是信息展示)
博客类wordpress也可以算,不过CMS管理个内容不限于博主及Post,且可结合更多样的形式。
对CMS我是刚去了解,之前仅有所耳闻。
我看了各自DEMO,感觉到的基础的组成有:前端后端(用于展示和管理),用户管理,模块管理(安装),文本(基本的)的发布及管理,站点栏目及页面的管理,展示的视图组件(首页的部件,也和使用theme相关),二次开发的API。

jQuery是用于客户端的JavaScript代码库,以实现
DOM操作 选择器及操作
AJAX 用于创建与服务器通信的交互式网页
动态效果
用户界面 jQuery UI
使用已有众多组件

见到有jQuery与drupal结合操作的教程。

如果想复杂,可以自己架一个eyeos试试?
一个基于php的WebOS,
提供GUI创建工具,和供服务端自行编写PHP使用的API。
感觉把一个Linux(界面很像)搬到了浏览器中。
记得它已经有好几年历史了,不过目前看来,过多把数据和处理逻辑全放在服务器,而客户端运行的部分不足,确实不方便。
其他WebOS也有形式如远程终端,FireFox的附加组件类似,FLASH类似先接受一个小心客户端再与服务端交互,AJAX与CGI的处理逻辑分别由和客户端服务端承担。

上面一段是借题想到,就写上去了。话说最近指南类文贴的较多,都仅泛泛说说,而求内容由不集中啊。呵呵。
我给本博想了一个主题,叫 IT技术(与 文艺)提升人的生产与生活。单篇贴仍保持之前“资源与引导”的思路来。恩,这里仅仅是这么想过而已。
有购域名和空间的打算,目前思路还不明了啊。

其实本来开本贴就只打算简单扯几句想法的,介绍部分一写就占内容了。
话说建立站点与信息发布,
较原始和简单的办法,就是手工编辑网页文件。
发布信息,只需要建立新网页或在网页中添加相应内容,修改也是同样的方式。
如果考虑主页的部分内容是可以自动生成的,也可编写简单的脚本来辅助。
评论部分用CGI的GuestBook即可。
单纯的信息发布,也可用已有的博客系统。但相比而言,一个博客系统会比前一种方式要庞大,且机制更为复杂。是否算违背“简单”的原则呢?
恩,这里会考虑分离和重用。就像DIV+CSS可以分离网页的内容和布局,运用博客系统则是分离了对内容的控制和对系统功能的控制。在对系统使用的功能中,使得用户能够更好的专注内容。同时也降低了技术上的要求。而同一份高质量的博客系统可以被不同的人使用,既节约了成本也保障了代码的质量。也有自定义主题和扩展模块的部件。

对于命令式语言,块结构是对GOTO的封装,而函数功能则提供了更高层次的封装。在C风格的API的设计中,可以划分出获取值,设置值,执行命令(初始化和释放是成对出现,有点特别)三类。而以对象形式封装的接口由包,属性,事件,方法组成。接口的信息可以通过文档或对象浏览器提供。GUI组件倾向于后者的形式封装,符合人的观点且可节约代码。(比如,不用调用一个长名称的函数,再加一个指向结构的指针为参数。也增强安全性。)
接口的形式仅是一个方面,这里更多是涉及设计方式的变化。从单一的变量,到包含不同数据的结构体,在演化为对象在包含数据的同时也可以能对自身处理的函数。这是在出于封装需求(安全,重用)的同时,也出于对模拟系统的开发与设计之中的探索(比如生命之类?)。参考Win32API在GUI部分的设计(我记不太清楚了,大体如此吧)是物件导向的思路加函数形式的接口。先填充包含属性和用于处理的消息的回调函数的结构体,由此从窗口类注册并创建窗口对象(也包含按钮文本框之类的,先是一个容器窗口了)。同时存在一个消息循环,就是一个while/loop循环了。接受到来自消息列队的消息并对消息代表的事件判断,就是switch或ifelseif(这两者有区别,因为前者可以优化为跳转表)的形式。事件比如按钮按下更,包括了两个基本的,是创建时和销毁时。如果不是通过资源文件里编写好的对话框样式,窗口就需要在创建是建立如按钮等控件,同时告诉子窗口发回不处理的消息(可能是)。对于窗口可以子类化(先自行处理消息在调用父类处理)和超类化(用来批量创建子类),实现方式体现在对消息的处理流程上。对比smalltalk和c++风格处理消息/方法的办法,前者是动态查找,后者是转化为函数并建立虚函数表处理子类的继承关系(可当接口用)。但至少不用自己进行消息判断的代码,在运用物件导向的同时,既节约了代码,也分离了实现消息处理的方法和设计中消息要处理的实际内容(即实际的处理逻辑)。
先承认一下,我一直认为物件导向给编码带来麻烦,同时又认同设计模式和重构中(才仅听说而已)分离出设计的步骤,且VB和GWBASIC都是方便的东西,所以想来上面一些内容。不过我目前看那些CMS都很痛苦的感觉,不过要用时又确实去会使用他们。

下面的话题是用代码创建一个虚拟的世界,其实就是游戏啦。通常的游戏脚本使用简单的GOTO语句就可以实现逻辑了。也或许有更快捷的方式。
参照是类RPG形式的冒险类游戏。
来伪代码:
while !quitgame
界面绘制()
处理按键()
触发及事件的游戏逻辑()
wend
func 子界面
或者有文本数据
或role npc1=new role("路人甲");sense1.add(npc1);
或...(?)
ok,不早了,先烂尾在这里吧。
4hours累计,闲话啊

======
找来RPGMARKER PC版的试玩,它把项目分为事件和数据(可单独划分出map)两类。其实它事件也是当作数据的,因为游戏本身的系统是固定的。后来的的版本由增加脚本模块,并预置了系统本身使用的脚本,按作用木桶分为:模块,游戏对象,精灵,窗口,场景,自定义插件,主程序。这些脚本可以看作是由原本固定的系统转化而成。在数据部分,系统是极有FF+DQ的风格。道具的效果或敌人的行为等设定并不直接提供脚本形式,而是选择预设的条件事件或加成效果等。事件编辑是条件加事件List(界面就是List加单独的属性框的设计)。RM的gba版和3d版也蛮有趣的样子啊。
看一些Galgame的引擎就是纯文本的脚本了,系统最基本的部分是提供了图像声音等一些功能调用。仅限定了游戏的形式,而对游戏的系统设计需自行完成(这样才被玩得有意思嘛)。不过这里通常就不用考虑OO了。状态以变量形式保存,用脚本展现游戏流程,再单独制作如存档等功能模块(包括场景)。
====
090819
关于WebApp的平台或框架,看了GAE和web.py的文档比较简明,虽然它们不是被通常使用。<-病句
AVG游戏的常见引擎有几个,这里略过。N,K,R.
有的CMS就可当框架用了,不过当然不是一回事情。
====
091029
只想着设计上的接口和抽象了,忘说cpp设计的一个初始目的是便于组织代码结构。<-当然前者仍是这贴里考虑的重点,貌似我当初是在这么写的。

2009年8月12日星期三

[回收贴]编写简单的语言解释器

说明:注意哦,是回收贴,把这段时间的一些实验的想法和代码贴过来。
都仍只是不成熟的内容,问题会比较多,而且缺少很多东西,如错误处理之类。
贴过来是觉得这些东西还是有点实用价值的。
因为代码中"<"和">"没有处理,所以#include部分在显示上有问题。
恩...我K&R风格的缩进也没显示出来。

Part1
编写简单的语言解释器
09-7-19

是想只记录构想要点的,不过仍是多了些无用的词句。不想在文字而非内容上耗时间。嗯,想到自己写文字为邮件是纯笔记的时候,是快快完成内容为先的啦。或者就把记事本里留的直接贴上,那个没有是专门去写的感觉。

语言用C,目地是纯实验,仅此很个人的。之前有试写了片段,不过若要完整的开始,还是先有份文档为好。
有三个方向,一个是GWBASIC兼容的,再适当扩展简单的代码风格。一个是基于lisp式表达式处理的,是处理type,value car,cdr式结构的,因为需要对list进行处理,不过如果从纯函数的角度说也不一定有必要。前面的那个就直接基于文本解析了,不按照编译原理先对完整的代码做词法和句法的分析,虽然有效率和编译时错误的缺陷,但我想会是仍能满足简单的运行要求。还有一个方向就是基于命令的如bat,sh,是语言本身就十分简单实用的实现。

BAS
由行构成,以换行或":"分割,行第一项为行号(纯数字只在换行后的行首,这次按Label处理,增加L语句)可省略,接着为语句名称,写为变量名的形式,对后续参数的处理由语句名称决定
变量简单地用链表储存,不hash或btree了。每项是字符串到值,值有类型和数据两部分。(之前第三类是全视为字符串,这里不是,有至少整数实数二进制字符串三类。)
先来流程控制部分。
LISP,先解析填充为树状结构,然后执行。两者之间可适当封装一下。
简单是原则哦。


lisp5.c

前缀表达式计算实验
ee.zsy按照BSD协议发布
缺陷
缺少错误处理
使用方法参见bat文件
lisp5.exe用TCC默认参数编译
09.07.12

BG
PLAN
简单的LISP解释器
//BAS解释器
TODO
逐步实现更多特性
从直接处理文本改为先转换为语法树
NEXT
改进getnum为getitem+isnum


#include
#include
#include
#include

char *exp;

int main(int argc, char** argv){
double eval();
//~ printf("argc %d\n",argc);
char ins[255];
gets(ins);
exp=ins;
printf("%s\n",exp);
//exp="(/ (+ 32 12) (* 1 4))";
printf("RST %g\n",eval());
return 0;
}

double getitem(){
double eval(),getnum();
if(*exp=='('){
printf("eval %s\n",exp);
return eval();
}else{
//printf("num %s\n",exp);
return getnum();
}
}

double getnum(){
int i=0;
char ts[10]={0,0,0,0,0,0,0,0,0,0};
printf("getnum %s\n",exp);
//~ for(i=0;isdigit(exp[i]);i++);
while(isdigit(exp[i]) || exp[i]=='.'){
i++;
}

printf("LEN %d\n",i);
strncpy(ts,exp,i);
printf("STR %s\n",ts);
printf("NUM %g\n",atof(ts));
exp+=i;
return atof(ts);
}

double eval(){
double p[5];
double result;
exp++;
switch(*exp){
case '+':
exp+=2;
p[0]=getitem();
exp+=1;
p[1]=getitem();
exp+=1;
printf("=%g+%g\n",p[0],p[1]);
result=p[0]+p[1];
break;
case '-':
exp+=2;
p[0]=getitem();
exp+=1;
p[1]=getitem();
exp+=1;
printf("=%g-%g\n",p[0],p[1]);
result=p[0]-p[1];
break;
case '*':
exp+=2;
p[0]=getitem();
exp+=1;
p[1]=getitem();
exp+=1;
printf("=%g*%g\n",p[0],p[1]);
result=p[0]*p[1];
break;
case '/':
exp+=2;
p[0]=getitem();
exp+=1;
p[1]=getitem();
exp+=1;
printf("=%g/%g\n",p[0],p[1]);
result=p[0]/p[1];
break;
default:
exit(1);
break;
}
return result;
}

getput.bat

getput.exe

后来随即尝试添加了cond语句(有嵌套的问题),并加入lisp中atom/list的处理,还没法编译。

3bas1.c

#include
#include
#include
#include
#define DebugPrint(SS) printf("%d:%s\n",__LINE__,SS);
int main(int argc, char** argv){
int LoadFile();
DebugPrint("main");
LoadFile();
return 0;
}

int LoadFile(){
DebugPrint("loadfile");
FILE *fp;
char *ss;
int fl;
fp = fopen("do2.c","r");
fseek(fp,0l,SEEK_END);
fl=ftell(fp);
fseek(fp,0l,SEEK_SET);
DebugPrint("as");
printf("LEN %2db\n",fl);
ss=(char*)malloc(fl+1);
int i;
for(i=0;i<=fl;i++) ss[i]='\0'; //~ ss[5]='\0'; //~ ss[0]='s'; //~ ss[1]='\0'; printf("%s\n",ss); //printf("%d",i); //~ int i; char ts[256]; for(i=0;i<=255;i++) ts[i]='\0'; //~ strcpy(ts,"bbbbbb"); //~ puts(fgets(ts,255,fp)); strcat(ss,ts); while(fgets(ts,256,fp) != NULL){ strcat(ss,ts); //~ puts("aa"); } //~ for(i=0;fgets(s,256,fp)!=NULL;i++){ //~ DebugPrint("cs"); //~ printf("%2d]",i+1); //~ puts(s); //~ strcat(ss,s); //~ puts(ss); //~ } fclose(fp); DebugPrint("bs"); printf("%s\n",ss); return 0; }

之后添加了

int main(int argc, char** argv)
int LoadSource(char* sn)
int NextStatement()//获取行并执行
int GetItemValue()
int GetItemLen(int start)
struct VarNode {
char *name;
char *value;
struct VarNode *next=NULL;
} VarNode0;//链表,可用代码在下面会有
char* GetVar(const char *name)
int SetVar(const char *name,const char *value)
char* NewStr(const char *Str)//malloc一个字符串的副本


Part2
BAS.txt

语句
[行号] 语句 参数
流程
label
goto
if then [else ]
//on goto

do
end
break,continue
for to stepnext
while:wend

命令
let =
表达式
运算符
数 +-*/
关系运算
字符串
]支持运算符和函数

变量储存
变量名,字符串
数组 支持数组语法 d(i,j)
转为字符串名处理 如 d_2_1
$运算符如 $abc
取字符串变量abc对应值为变量名的对应值
或单独建立类型名为引用
变量名是[a-zA-Z._0-9],凡是分隔符前不能被识别为数字的

def <>=<> 是扫描时定义,label


BAS表达式解析.txt

bas
目标 轻便

表达式计算 部分

记号
整数 digit
实数 digit|.|eE
//strtod能识别的部分,double
//能转换为整数就转换,运算都作实数
//或strtol
字符串 ""之间的
变量名 取得类型和值 alnum |$|%
之后有()则可能是
内置函数 运算
数组 查找
用户函数(或FN 开头) 查找并运算


操作符 长度>=1 可以前后有空格,或省略
优先级

针对double类型的
类型不符合则出错 类型错误
表达式(由高到低,优先处理):

括号表达式
数(leading 0 for octal, 0x for hex, else decimal),变量
一元 -
* /
+ -
= <>
> < <= >=
(* and + are also used for boolean AND and boolean OR)
Boolean expressions evaluate to 0 for false and 1 for true

对字符串类
& 合并
其他函数 返回值为数或字符串

解析函数为递归函数
被提供待解析的表达式
单独的片段
一个起始位
解析返回一个变量结构

流程
记号->变量->函数->常量
操作符

变量结构由链表储存
{
char *name
value
*}
*next
}

value emum type %{int
double
char

基本的常数运算

basexpr2.c
数值表达式

#include
#include
#include
#include
//~ #include
float expr();
float expr0();
float expr1();
float expr2();
float expr3();
float expr4();
float expr5();
float expr6();
char *e;
float expro=0;

double sin(double i){
return i+1;
}

float expr(){
char* o;
int i=expro,j;
expro=0;
do{
o=e;
expro=expr4();
}while(o!=e);
j=expro;
expro=i;
return j;
//~ return expr4();
}

float expr4(){
float o=expr3();
while(isspace(*e))e++;
if(!strncmp(e,"<=",2)){ e+=2; return o<=expr3(); }else if(!strncmp(e,">=",2)){
e+=2;
return o>=expr3();
}else
if(*e=='<'){ e++; return or,4:r->l
}else
if(*e=='>'){
e++;
return o>expr3();
}else{
return o;
}
}

float expr3(){
float o=expr2();
while(isspace(*e))e++;
if(*e=='='){
e++;
return o==expr2();
}else
if(!strncmp(e,"<>",2)){
e+=2;
return o!=expr2();
}else{
return o;
}
}

float expr2(){

float o=expr1();
while(isspace(*e))e++;
if(*e=='+'){
e++;
return o+expr1();//strtod(e,&endp);
}else
if(*e=='-'){
e++;
return o-expr1();//strtod(e,&endp);
}else{
return o;
}
}

float expr1(){
float o=expr0();
while(isspace(*e))e++;
if(*e=='*'){
e++;
return o*expr0();
}else
if(*e=='/'){
e++;
return o/expr0();
}else{
return o;
}
}

float expr0(void){
//~ char *endp;
//~ float o=strtod(e,&e);
while(isspace(*e))e++;
if(*e=='('){
e++;
float o=expr();
e++;
return o;
}else
if(isalpha(*e)){
if(!strncmp(e,"sin(",4)){
e+=4;
//~ return sin(expr());
//~ e++;
float o=expr();
e++;
return sin(o);
}
}else{
/* o=strtod(e,&e);//printf("%d\n",o);
* //~ e=endp;
* //~ else
*
* if(*e==')'){
* e++;printf("%d\n",o);
* return expr2(e);
* }else{
*
* return o;
* }
*/ if(expro!=0){float o=expro;expro=0;return o;}
else{return strtod(e,&e);}

//~ return strtod(e,&e);
}
}

int main(int argc, char** argv){
e="4+<5"; i="expr();">

basstrexpr.c
字符串表达式

#include
#include
#include
#include

char *e;
char* getstr();
char* strexpr1();

char* strexpr1(){
char* o=getstr();
while(isspace(*e))e++;
if(*e=='&'){
e++;
while(isspace(*e))e++;
char* p=strexpr1();
char* q=strcat(strcpy(malloc(strlen(o)+strlen(p)+1),o),p);
free(o);free(p);
return q;
}else{
return o;
}
}

char* getstr(){
while(isspace(*e))e++;
//not necessary
//~ if(*e=='('){
//~ e++;
//~ char* o=strexpr1();
//~ e++;
//~ return o;
//~ }else
if(*e=='\"'){
int i;
e++;
i=strchr(e,'\"')-e;
//~ printf("%d\n",i);
char* p;
p=strncpy(malloc(i+1),e,i);
p[i]='\0';
e+=i+1;
//~ if(p[i-2]!="\0"){
//~ p[i-2]="\0";
//~ }
//~ printf("%d\n%d\n%s\n",i,strlen(p),p);
return p;
}else
if(!strncmp(e,"left(",5)){
e+=5;
char* o=strexpr1();
e++; // ,
int i=strtod(e,&e);
e++; // )
char *p=strncpy(malloc(i+1),o,i);
p[i]='\0';
free(o);
return p;
}
}

int main(int argc, char** argv){
e="left(\"ABcdefg\"&\"CD\",9)&\"EF\"";
printf("e]%s\n",e);
char* i=strexpr1();
printf("]%s\n",i);
printf("]%s\n",e);
free(i);
return 0;
}


basvarnum.c
变量-数字部分

#include
#include
#include
#include
struct num* findnum(char*name);
float getnum(char *name);
int putnum(char *name,float value);

struct num{
char*n;
float v;
struct num *next;
} lne;//list num start
struct num* lns=⪇
//~ struct num ;
//~ lns.v=0.0;
//~ lns.next=NULL;
struct num* findnum(char*name){
struct num* i;
for(i=lns;(i->next)!=NULL;i=i->next){
if(strcmp(i->n,name)==0){
return i;
}
}
printf("not found %s\n",name);
return NULL;
}

float getnum(char *name){
struct num* o=findnum(name);
if(o!=NULL){
return o->v;
}
return 0;
}
int putnum(char *name,float value){
struct num* o;
o=findnum(name);
if(o!=NULL){//exist
o->v=value;
return 0;
}else{//new
o=malloc(sizeof(struct num));
o->n=name;
o->v=value;
o->next=lns;
lns=o;}
return 0;
}

int main(int argc, char** argv){
lne.n="test";
lne.v=123456;
lne.next=NULL;
putnum("a",1);
putnum("b",2);
putnum("c",3);
putnum("b",980);
//~ printf("%g\n",lns->v);
//~ lns=lns->next;
//~ printf("%g\n",lns->v);
//~ lns=lns->next;
//~ printf("%g\n",lns->v);
//~ lns=lns->next;
//~ printf("%g\n",lns->v);
//~ lns=lns->next;
//~ printf("%g\n",lns->v);
//~ findnum("b");
struct num* o=findnum("a");
if(o!=NULL){
printf("%g\n",o->v);
}

printf("%g\n",getnum("b"));
return 0;
}



Part3
变量存放.txt

以链表为基础name->value
局部变量用局部链
或加前缀
或允许同名并针对块语句处理

isitem(",")
=" "*," "*
e++

设计文档与草图
和编码过程

内置函数
数学函数num->num
字符串str->str
str->num
len
val
num->str
str/str$

合并为函数,也可match ,用
if(!strncmp(e,"while",5)){
e+=5;
}
while(isspace(*e))e++;

或建立单独的词法分析函数


对于模块先理,有规划和散开简单的尝试,再补充技术要点,使能初步运行,再补完和修改
有步骤和完成效率,补完类似代码时,目标相对非模糊

往专业化的痕迹

bas转c
添加如字符串库


块语句
设置execline标志判断块内是否执行(或passline)
某变量为记录块的嵌套层数
如果要层可嵌套,则块的首尾语句都要处理,不受标志影响
上层块设定不执行块内语句(不包含结构语句),内层则不做判断,直到上层的结束时恢复标志
块内可有局部变量

对解释while/wend块,若在执行状态则wend处跳回while之前,否则继续执行之后的语句

label table建立(常量)

basexpr3.c
上部分的代码合并并添加新特性

#include
#include
#include
#include
//~ #include

char* getstr();
char* strexpr1();


//================================================================================================
struct num* findnum(char*name);
float getnum(char *name);
int putnum(char *name,float value);

struct num{
char*n;
float v;
struct num *next;
} lne;//list num start
struct num* lns=⪇
//~ struct num ;
//~ lns.v=0.0;
//~ lns.next=NULL;
struct num* findnum(char*name){
struct num* i;
for(i=lns;(i->next)!=NULL;i=i->next){
if(strcmp(i->n,name)==0){
return i;
}
}
printf("not found %s\n",name);
return NULL;
}

float getnum(char *name){
struct num* o=findnum(name);
if(o!=NULL){
return o->v;
}
return 0;
}
int putnum(char *name,float value){
struct num* o;
o=findnum(name);
if(o!=NULL){//exist
o->v=value;
return 0;
}else{//new
o=malloc(sizeof(struct num));
o->n=name;
o->v=value;
o->next=lns;
lns=o;}
return 0;
}

//~ int main(int argc, char** argv){
//~ lne.n="test";
//~ lne.v=123456;
//~ lne.next=NULL;
//~ putnum("a",1);
//~ putnum("b",2);
//~ putnum("c",3);
//~ putnum("b",980);

//~ struct num* o=findnum("a");
//~ if(o!=NULL){
//~ printf("%g\n",o->v);
//~ }

//~ printf("%g\n",getnum("b"));
//~ return 0;
//~ }
//============================================================================

float expr();
float expr0();
float expr1();
float expr2();
float expr3();
float expr4();
float expr5();
float expr6();
char *e;
float expro=0;

double sin(double i){
return i+1;
}

float expr(){
char* o;
int i=expro,j;
expro=0;
do{
o=e;
expro=expr4();
}while(o!=e);
j=expro;
expro=i;
return j;
//~ return expr4();
}

float expr4(){
float o=expr3();
while(isspace(*e))e++;
if(!strncmp(e,"<=",2)){ e+=2; return o<=expr3(); }else if(!strncmp(e,">=",2)){
e+=2;
return o>=expr3();
}else
if(*e=='<'){ e++; return or,4:r->l
}else
if(*e=='>'){
e++;
return o>expr3();
}else{
return o;
}
}

float expr3(){
float o=expr2();
while(isspace(*e))e++;
if(*e=='='){
e++;
return o==expr2();
}else
if(!strncmp(e,"<>",2)){
e+=2;
return o!=expr2();
}else{
return o;
}
}

float expr2(){

float o=expr1();
while(isspace(*e))e++;
if(*e=='+'){
e++;
return o+expr1();//strtod(e,&endp);
}else
if(*e=='-'){
e++;
return o-expr1();//strtod(e,&endp);
}else{
return o;
}
}

float expr1(){
float o=expr0();
while(isspace(*e))e++;
if(*e=='*'){
e++;
return o*expr0();
}else
if(*e=='/'){
e++;
return o/expr0();
}else{
return o;
}
}

float expr0(void){
//~ char *endp;
//~ float o=strtod(e,&e);
while(isspace(*e))e++;
if(*e=='('){
e++;
float o=expr();
e++;
return o;
}else
if(isalpha(*e)){
if(!strncmp(e,"sin(",4)){
e+=4;
//~ return sin(expr());
//~ e++;
float o=expr();
e++;
return sin(o);
}else
if(!strncmp(e,"len(",4)){
e+=4;
//~ return sin(expr());
//~ e++;
char* o=strexpr1();
e++;
int i=strlen(o);
free(o);
return i;
}else{//getvar
char* p=e;
while(isalnum(*e)){
e++;
}
//~ puts(e);
//~ printf("%d\n",e-p);
int i=e-p;
p=strncpy(malloc(i+1),p,i);
p[i]='\0';
puts(p);
float l=getnum(p);
free(p);
return l;
}
}else{
/* o=strtod(e,&e);//printf("%d\n",o);
* //~ e=endp;
* //~ else
*
* if(*e==')'){
* e++;printf("%d\n",o);
* return expr2(e);
* }else{
*
* return o;
* }
*/ if(expro!=0){float o=expro;expro=0;return o;}
else{return strtod(e,&e);}

//~ return strtod(e,&e);
}
}

//=====================================================================================
//~ char *e;
//~ char* getstr();
//~ char* strexpr1();

char* strexpr1(){
char* o=getstr();
while(isspace(*e))e++;
if(*e=='&'){
e++;
while(isspace(*e))e++;
char* p=strexpr1();
char* q=strcat(strcpy(malloc(strlen(o)+strlen(p)+1),o),p);
free(o);free(p);
return q;
}else{
return o;
}
}

char* getstr(){
while(isspace(*e))e++;
//not necessary
//~ if(*e=='('){
//~ e++;
//~ char* o=strexpr1();
//~ e++;
//~ return o;
//~ }else
if(*e=='\"'){
int i;
e++;
i=strchr(e,'\"')-e;
//~ printf("%d\n",i);
char* p;
p=strncpy(malloc(i+1),e,i);
p[i]='\0';
e+=i+1;
//~ if(p[i-2]!="\0"){
//~ p[i-2]="\0";
//~ }
//~ printf("%d\n%d\n%s\n",i,strlen(p),p);
return p;
}else
if(!strncmp(e,"left(",5)){
e+=5;
char* o=strexpr1();
e++; // ,
int i=strtod(e,&e);
e++; // )
char *p=strncpy(malloc(i+1),o,i);
p[i]='\0';
free(o);
return p;
}
}

//~ int main(int argc, char** argv){
//~ e="left(\"ABcdefg\"&\"CD\",9)&\"EF\"";
//~ printf("e]%s\n",e);
//~ char* i=strexpr1();
//~ printf("]%s\n",i);
//~ printf("]%s\n",e);
//~ free(i);
//~ return 0;
//~ }
//========================================================================================

int main(int argc, char** argv){
putnum("a",1);
putnum("b",2);
putnum("cde",3);
e="len(\"asf\")+1";
float i=expr();
printf("%g",i);
return 0;
}


baslineexper.c
按行解析

#include
#include
#include
#include

char *e=
//"0 goto 30 \n"
//"5 print a\n"
"10 while 1\n"
"pause\n"
"while 1\n"
"print in\n"
"pause f\n"
"wend\n"
"wend\n"
//"20 goto 25\n"
"25 end\n"
"30 print 3\n";

char* pe;
char *s[256];//存放指针的数组,不用存行号了
char **ps;//指针 指向 指,数组(类型为指针)的元素

int main(int argc, char** argv){
pe=e;
ps=s;
int ln;
e--;
int passline=0;//跳过执行块内语句,非零为块的条件不成立时
do{
e++;
ln=strtol(e,&e,10);//pass line num
printf("e>\n===\n%s===\n",e);

while(isspace(*e))e++;
if(!strncmp(e,"while",5)){
//e+=5;
puts("[while]");
*ps++=e;
e+=5;
int i=strtod(e,&e);
if(passline==0){
passline=(i==0);
}else passline++;
printf("i='%d'\t%d\n",i,passline);
//~ push(ln);
if(ps==s+10)exit(5);
}else
if(!strncmp(e,"wend",4)){
e+=4;
puts("[wend]");
//~ int i=strtod(e,&e);
//~ printf("i='%d'\n",i);
printf("i\t%d\n",passline);
//~ pop(ln);
//~ //goto ln
if(passline==0){e=*--ps;}
else {--ps;passline--;}

printf("i\t%d\n",passline);
}else

if(passline)continue;
else

if(!strncmp(e,"print",5)){
e+=5;
puts("[print]");
while(isspace(*e))e++;
//

}else

if(!strncmp(e,"pause",5)){
e+=5;
puts("[pause]");


}else

if(!strncmp(e,"goto",4)){
e+=4;
puts("goto");
int i=strtod(e,&e);
printf("i='%d'\n",i);
e=pe-1;
do{
e++;
if(i==strtol(e,&e,10))break;
}while(e=strchr(e,'\n'));



//~ push(ln)
}else

if(!strncmp(e,"for",3)){
e+=3;
puts("[for]");
//~ int i=strtod(e,&e);
//~ printf("i='%d'\n",i);
//~ push(ln)
}else
if(!strncmp(e,"next",4)){
e+=4;
puts("[next]");
//~ int i=strtod(e,&e);
//~ printf("i='%d'\n",i);
//~ pop(ln);
//goto ln
}else
if(!strncmp(e,"end",3)){
e+=3;
puts("[end]");
exit(0);
}
//block,gosub,let,def,data,dim
//else
//if//to
//nextline
}while(e=strchr(e,'\n'));

puts("prog end");

return 0;
}


这个,我编辑器的框好小啊,纯写文字还好,一贴代码自己已经晕了。强调一下,我没考虑错误处理,贴的都是能编译的代码。自己这样一行行写的也是好耗时间的,自己还是不熟练啊。特别是把构想的细处实现的时候,还只有找个安静的地方一人想想才有些进展啊。

补充一下,目前的代码是把数,字符串,数组,变量分开处理的,包括解析和变量存放,比较简单的。另一种是变量是引用一个值,而值是有类型的,可以被处理函数获取。而不同于上面的觉得遇到的应该是什么类型。
表达式解析,除了用专用的词法与句法分析工具,可以递归解析。或从左到右,用两个stack存放元素和操作符。根据操作符的优先级,来进行运算。需要注意stack的长度,避免溢出或动态管理。目前觉得这样可能比递归会更好处理元素类型(?)。
现在是按照纯文本,没有编译加虚拟机,为跨平台考虑。可以解释器与虚拟机分离,使客户端轻便,但不要影响描述性脚本数据的易编辑。

Part4
上面实验代码就这样吧,不行再修改,以后重写时会用到。bas的解释器没写完,暂时停工了,在等打算好下一步的规划。
再贴一点上面已包含的小片段吧。还有一些参考资料。小片段的内容还思路很明了的感觉啊。

K&R
http://cis.csuohio.edu/~somos/ddsbasic.c
http://www.personal.leeds.ac.uk/~bgy1mm/Minibasic/MiniBasicHome.html
WxBasic PDF
FreeBasic chm
http://www.nicholson.com/rhn/basic/
编译原理
编程语言概念/原理

注意需要引用的库,K&R关于库的部分相当粗略。

int GetFileLen(){
FILE *fp;
int fl;
//FILE *fopen(char *name, char *mode);
fp = fopen("do2.c","r");
fseek(fp,0l,SEEK_END);
fl=ftell(fp);
//printf("%d",i);
fclose(fp);
return fl;
}


#include
#include
#include
#include

int main(int argc, char** argv){
char* e="assd+sdfdf";
char* p=e;
while(isalnum(*e)){
e++;
}
puts(e);
printf("%d\n",e-p);
int i=e-p;
p=strncpy(malloc(i+1),p,i);
p[i]='\0';
puts(p);
//free(p);
return 0;
}


...


回收贴了,东西杂乱了一点。
已经成了我不喜欢的形态了。
而且没语法高亮好不习惯,不如直接备份文件了,不过这里好自己附些评论。
对于耗时的事情,定计划长期行为,还是会有效过些。
当然也要预定好目的和结果。

补一下有关日期(会发现是纯粹在写着娱乐啊,日期是最后修改日期)

开贴 090812
today 090813
exp.exe 090709
lisp.c 090712
lisp7.c 0907113
3bas2.c 090720
复件 basexpr.c 090723
复件 basvarnum.c 090731
basexpr2.c 090729
basexpr3.c 090801
BAS.txt 090720
BAS表达式解析.txt 090723
basexpr.c 090727
basexpr2.c 090729
basstrexpr.c 090731
basvarnum.c 090731
basexpr3.c 090801
复件 baslineexper.c 090807
baslineexper.c 090811
变量存放.txt 090811

对这些日期,我承认,我只是想证明一下自己的存在感。
我这段期间里上cnbeta和acfun(我也是东方爱好者哦,还没狂热)也比较多,估计会有同好者看见啊。

====顺便写点,也回收了
说一下前面那贴翻译,目前没计划推动说要就翻译全文,仅凭喜好一点点做了。看来没翻译全部完成的可能,不过不至于是看自己无聊时间到什么地步才做的翻译。

我在自聊?

====
091029
The C++ Programming Language,Special Edition 里把简单的表达式计算作为示例,有很好的代码(相比我的那些就...),即使用C改写也是很容易的。

2009年8月11日星期二

NetHack - 免费游戏推荐篇3

http://www.nethack.org/

维基百科(中文简介)
http://zh.wikipedia.org/wiki/NetHack

我承认我目前还不会玩这个游戏,开此贴仅是为了有地方翻译游戏里附带的介绍和指南。
翻译目前只是在全文的局部缓慢进行,但仍希望能给同样关注此游戏的人一些帮助。
暂时格式设置有点问题,文档翻译仅供参考,内容仍以原文为准。
对于其中的名词用语,我没有与原文对照呈现,可能会有阅读的不便。
译者:ee.zsy,开始于#090811。文档来源为当前最新版本。
也有翻译意向的爱好者,希望能够获得联系。或仅提供相关建议。
感谢google translate&dictionary和认识的人。

引子:FAQ
README(部分)

你问:
好,游戏运行了。我从哪里学习怎么玩呢?

一个路过的陌生人回答:

它当然工作了。你认为我是什么,一个广播?
一旦你进入游戏,一些值得尝试(它们连移动都不算)的命令是 ? 和 / 。At risk of sounding
like a marketing blurb, 帮助键(在你的终端上会标有问号 - 并警告需要按下shift键来激活功能!)提供立即访问我们在线帮助的功能。 It's kind of a menu with lovely
options like "c" (where you get to see MY NAME in the history of
NetHack!), "i" (which gives you all the important legal blurb which
tells you about your rights and responsibilities as a NetHack
licensee), and the more boring items "a" and "b" which merely explain
all the commands and the display symbols and uninteresting stuff like
that. What the hell. It's there, you can use it.
The / key is pretty good, too. If there's something on the
screen that you don't know what it is, well, it's probably a letter or
a symbol or something. That's wisdom, see? But to get onto the
Eternal Verities, suppose you want to know what it MEANS? Aha! Hit
/, say "y", I want to specify it by cursor (cursors are blinking
underscores, and if you're British like me you can curse them with
your numeric bloody keypad, too -- Americans needn't understand this
joke), whatever it is, and then you can point out the object of your
confusion and have it explicated in frabjous detail. Helps you avoid
getting your face et, sometimes, that. Always nice, not having your
face et.
哦,对了,我差点忘。There's the Guidebook, too, for
the quiche-eaters in our midst.... 你可能已在你的游戏里得到一份,以叫Guidebook.txt的文件的形式。


NetHack(部分)

NETHACK

名称
nethack - Exploring The Mazes of Menace
描述
NetHack is a display oriented Dungeons & Dragons(tm) -
like game. The standard tty display and command structure
resemble rogue.

Other, more graphical display options exist if you are
using either a PC, or an X11 interface.

为了能够进行游戏,你仅仅需要知道两个命令。命令“?”会给你一个可用命令的列表(也有其他信息),而命令“/”会辨认你在屏幕上看到的东西。

为了赢得这场游戏(而不是仅仅为超过别人的最高分而玩),你必须找到20层地牢下的Amulet(护身符) of Yendor并把它带出。目前还没有人成功完成这点;任何做到的人将会最为英雄中的英雄流传史册。

当游戏结束的时候,无论你是因为死亡,退出,或是从洞穴中逃离,NetHack会给你(片段)高分的列表。得分是基于你行为的许多方面,但粗略的估计是由你在洞穴里发现的金币数量加上你(真实)经验的四倍获得。带出洞穴的宝石会值很多金币。如果你让自己被杀,会有10%的惩罚。



Guidebook











A Guide to the Mazes of Menace
(Guidebook for NetHack)


Eric S. Raymond
(Extensively edited and expanded for 3.4)



1. 导言

Recently, you have begun to find yourself unfulfilled and distant
in your daily occupation. Strange dreams of prospecting, steal-
ing, crusading, and combat have haunted you in your sleep for
many months, but you aren't sure of the reason. You wonder
whether you have in fact been having those dreams all your life,
and somehow managed to forget about them until now. Some nights
you awaken suddenly and cry out, terrified at the vivid recollec-
tion of the strange and powerful creatures that seem to be lurk-
ing behind every corner of the dungeon in your dream. Could
these details haunting your dreams be real? As each night pass-
es, you feel the desire to enter the mysterious caverns near the
ruins grow stronger. Each morning, however, you quickly put the
idea out of your head as you recall the tales of those who en-
tered the caverns before you and did not return. Eventually you
can resist the yearning to seek out the fantastic place in your
dreams no longer. After all, when other adventurers came back
this way after spending time in the caverns, they usually seemed
better off than when they passed through the first time. And who
was to say that all of those who did not return had not just kept
going?


Asking around, you hear about a bauble, called the Amulet of
Yendor by some, which, if you can find it, will bring you great
wealth. One legend you were told even mentioned that the one who
finds the amulet will be granted immortality by the gods. The
amulet is rumored to be somewhere beyond the Valley of Gehennom,
deep within the Mazes of Menace. Upon hearing the legends, you
immediately realize that there is some profound and undiscovered
reason that you are to descend into the caverns and seek out that
amulet of which they spoke. Even if the rumors of the amulet's
powers are untrue, you decide that you should at least be able to
sell the tales of your adventures to the local minstrels for a
tidy sum, especially if you encounter any of the terrifying and
magical creatures of your dreams along the way. You spend one
last night fortifying yourself at the local inn, becoming more
and more depressed as you watch the odds of your success being
posted on the inn's walls getting lower and lower.



NetHack Guidebook 1





NetHack Guidebook 2



In the morning you awake, collect your belongings, and set
off for the dungeon. After several days of uneventful travel,
you see the ancient ruins that mark the entrance to the Mazes of
Menace. It is late at night, so you make camp at the entrance
and spend the night sleeping under the open skies. In the morn-
ing, you gather your gear, eat what may be your last meal out-
side, and enter the dungeon...


2. 这是怎么回事?

You have just begun a game of NetHack. Your goal is to grab
as much treasure as you can, retrieve the Amulet of Yendor, and
escape the Mazes of Menace alive.

Your abilities and strengths for dealing with the hazards of
adventure will vary with your background and training:

Archeologists understand dungeons pretty well; this enables
them to move quickly and sneak up on the local nasties. They
start equipped with the tools for a proper scientific expedition.

Barbarians are warriors out of the hinterland, hardened to
battle. They begin their quests with naught but uncommon
strength, a trusty hauberk, and a great two-handed sword.

Cavemen and Cavewomen start with exceptional strength but,
unfortunately, with neolithic weapons.

Healers are wise in medicine and apothecary. They know the
herbs and simples that can restore vitality, ease pain, anes-
thetize, and neutralize poisons; and with their instruments, they
can divine a being's state of health or sickness. Their medical
practice earns them quite reasonable amounts of money, with which
they enter the dungeon.

Knights are distinguished from the common skirmisher by
their devotion to the ideals of chivalry and by the surpassing
excellence of their armor.

Monks are ascetics, who by rigorous practice of physical and
mental disciplines have become capable of fighting as effectively
without weapons as with. They wear no armor but make up for it
with increased mobility.

Priests and Priestesses are clerics militant, crusaders ad-
vancing the cause of righteousness with arms, armor, and arts
thaumaturgic. Their ability to commune with deities via prayer
occasionally extricates them from peril, but can also put them in
it.

Rangers are most at home in the woods, and some say slightly
out of place in a dungeon. They are, however, experts in archery
as well as tracking and stealthy movement.








NetHack Guidebook 3



Rogues are agile and stealthy thieves, with knowledge of
locks, traps, and poisons. Their advantage lies in surprise,
which they employ to great advantage.

Samurai are the elite warriors of feudal Nippon. They are
lightly armored and quick, and wear the dai-sho, two swords of
the deadliest keenness.

Tourists start out with lots of gold (suitable for shopping
with), a credit card, lots of food, some maps, and an expensive
camera. Most monsters don't like being photographed.

Valkyries are hardy warrior women. Their upbringing in the
harsh Northlands makes them strong, inures them to extremes of
cold, and instills in them stealth and cunning.

Wizards start out with a knowledge of magic, a selection of
magical items, and a particular affinity for dweomercraft. Al-
though seemingly weak and easy to overcome at first sight, an ex-
perienced Wizard is a deadly foe.

You may also choose the race of your character:

Dwarves are smaller than humans or elves, but are stocky and
solid individuals. Dwarves' most notable trait is their great
expertise in mining and metalwork. Dwarvish armor is said to be
second in quality not even to the mithril armor of the Elves.

Elves are agile, quick, and perceptive; very little of what
goes on will escape an Elf. The quality of Elven craftsmanship
often gives them an advantage in arms and armor.

Gnomes are smaller than but generally similar to dwarves.
Gnomes are known to be expert miners, and it is known that a se-
cret underground mine complex built by this race exists within
the Mazes of Menace, filled with both riches and danger.

Humans are by far the most common race of the surface world,
and are thus the norm by which other races are often compared.
Although they have no special abilities, they can succeed in any
role.

Orcs are a cruel and barbaric race that hate every living
thing (including other orcs). Above all others, Orcs hate Elves
with a passion unequalled, and will go out of their way to kill
one at any opportunity. The armor and weapons fashioned by the
Orcs are typically of inferior quality.

3. 屏幕上所有那些东西意思是什么?

On the screen is kept a map of where you have been and what
you have seen on the current dungeon level; as you explore more
of the level, it appears on the screen in front of you.









NetHack Guidebook 4



When NetHack's ancestor rogue first appeared, its screen
orientation was almost unique among computer fantasy games.
Since then, screen orientation has become the norm rather than
the exception; NetHack continues this fine tradition. Unlike
text adventure games that accept commands in pseudo-English sen-
tences and explain the results in words, NetHack commands are all
one or two keystrokes and the results are displayed graphically
on the screen. A minimum screen size of 24 lines by 80 columns
is recommended; if the screen is larger, only a 21x80 section
will be used for the map.

NetHack can even be played by blind players, with the assis-
tance of Braille readers or speech synthesisers. Instructions
for configuring NetHack for the blind are included later in this
document.

NetHack generates a new dungeon every time you play it; even
the authors still find it an entertaining and exciting game de-
spite having won several times.

NetHack offers a variety of display options. The options
available to you will vary from port to port, depending on the
capabilities of your hardware and software, and whether various
compile-time options were enabled when your executable was creat-
ed. The three possible display options are: a monochrome charac-
ter interface, a color character interface, and a graphical in-
terface using small pictures called tiles. The two character in-
terfaces allow fonts with other characters to be substituted, but
the default assignments use standard ASCII characters to repre-
sent everything. There is no difference between the various dis-
play options with respect to game play. Because we cannot repro-
duce the tiles or colors in the Guidebook, and because it is com-
mon to all ports, we will use the default ASCII characters from
the monochrome character display when referring to things you
might see on the screen during your game.

In order to understand what is going on in NetHack, first
you must understand what NetHack is doing with the screen. The
NetHack screen replaces the ``You see ...'' descriptions of text
adventure games. Figure 1 is a sample of what a NetHack screen
might look like. The way the screen looks for you depends on
your platform.

--------------------------------------------------------------------
The bat bites!

------
|....| ----------
|.<..|####...@...$.|
|....-# |...B....+
|....| |.d......|
------ -------|--










NetHack Guidebook 5





Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral
Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak

--------------------------------------------------------------------
Figure 1


3.1. 状态行(底部)

The bottom two lines of the screen contain several cryptic
pieces of information describing your current status. If either
status line becomes longer than the width of the screen, you
might not see all of it. Here are explanations of what the vari-
ous status items mean (though your configuration may not have all
the status items listed below):

等级
Your character's name and professional ranking (based on the
experience level, see below).

力量
A measure of your character's strength; one of your six ba-
sic attributes. A human character's attributes can range
from 3 to 18 inclusive; non-humans may exceed these limits
(occasionally you may get super-strengths of the form 18/xx,
and magic can also cause attributes to exceed the normal
limits). The higher your strength, the stronger you are.
Strength affects how successfully you perform physical
tasks, how much damage you do in combat, and how much loot
you can carry.

敏捷
Dexterity affects your chances to hit in combat, to avoid
traps, and do other tasks requiring agility or manipulation
of objects.

体质
Constitution affects your ability to recover from injuries
and other strains on your stamina.

智力
Intelligence affects your ability to cast spells and read
spellbooks.

知识
Wisdom comes from your practical experience (especially when
dealing with magic). It affects your magical energy.

魅力
Charisma affects how certain creatures react toward you. In
particular, it can affect the prices shopkeepers offer you.









NetHack Guidebook 6



联盟
Lawful, Neutral, or Chaotic. Often, Lawful is taken as good
and Chaotic as evil, but legal and ethical do not always co-
incide. Your alignment influences how other monsters react
toward you. Monsters of a like alignment are more likely to
be non-aggressive, while those of an opposing alignment are
more likely to be seriously offended at your presence.

地牢层数
How deep you are in the dungeon. You start at level one and
the number increases as you go deeper into the dungeon.
Some levels are special, and are identified by a name and
not a number. The Amulet of Yendor is reputed to be some-
where beneath the twentieth level.

金币
The number of gold pieces you are openly carrying. Gold
which you have concealed in containers is not counted.

Hit Points
Your current and maximum hit points. Hit points indicate
how much damage you can take before you die. The more you
get hit in a fight, the lower they get. You can regain hit
points by resting, or by using certain magical items or
spells. The number in parentheses is the maximum number
your hit points can reach.

能量
Spell points. This tells you how much mystic energy (mana)
you have available for spell casting. Again, resting will
regenerate the amount available.

防护等级
A measure of how effectively your armor stops blows from un-
friendly creatures. The lower this number is, the more ef-
fective the armor; it is quite possible to have negative ar-
mor class.

经验
Your current experience level and experience points. As you
adventure, you gain experience points. At certain experi-
ence point totals, you gain an experience level. The more
experienced you are, the better you fight and withstand mag-
ical attacks. Many dungeons show only your experience level
here.

时间
The number of turns elapsed so far, displayed if you have
the time option set.

Hunger status
Your current hunger status, ranging from Satiated down to
Fainting. If your hunger status is normal, it is not dis-
played.








NetHack Guidebook 7



Additional status flags may appear after the hunger status:
Conf when you're confused, FoodPois or Ill when sick, Blind when
you can't see, Stun when stunned, and Hallu when hallucinating.

3.2. 消息行(顶部)

The top line of the screen is reserved for messages that de-
scribe things that are impossible to represent visually. If you
see a ``--More--'' on the top line, this means that NetHack has
another message to display on the screen, but it wants to make
certain that you've read the one that is there first. To read
the next message, just press the space bar.

3.3. 地图(屏幕余下部分)

The rest of the screen is the map of the level as you have
explored it so far. Each symbol on the screen represents some-
thing. You can set various graphics options to change some of
the symbols the game uses; otherwise, the game will use default
symbols. 这里是一份默认符号含义的列表:

- and |
房间的墙面,或者打开的门。或坟墓(|)。

. 房间,冰,或无门门道的地面。

# 过道,或铁棒,或树,或可能是厨房的水池(如果您的地牢有水池),或吊桥。

> 下楼梯:到下一层的路。

< 上楼梯:到前一层的路。

+ 关闭的门或包含你可以学习咒语的魔法书。

@ 你的角色或一个人类。

$ 一堆金币。

^ 陷阱(一旦你发现它)。

) 武器。

[ 一套或一件护甲。

% 可食用的东西(不一定是健康的)。

? 卷轴。

/ 法杖。

= 戒指。









NetHack Guidebook 8



! 药水。

( 有用的项目(pick-axe, key, lamp...).

" 护身符或蜘蛛网。

* 宝石或岩石(可能有价值,可能没价值)。

` 巨石或塑像。

0 铁球。

_ 祭坛,或铁链。

{ 喷泉。

} 一池水或护城河或一池熔岩。

\ 华丽的宝座。

a-zA-Z and other symbols
Letters and certain other symbols represent the various in-
habitants of the Mazes of Menace. Watch out, they can be
nasty and vicious. Sometimes, however, they can be helpful.

I This marks the last known location of an invisible or other-
wise unseen monster. Note that the monster could have
moved. The 'F' and 'm' commands may be useful here.

你不需要记住所有这些符号;你可以通过“/”命令来询问游戏各种符号表示什么(详细信息见下一节)。


4. 命令

Commands are initiated by typing one or two characters.
Some commands, like ``search'', do not require that any more in-
formation be collected by NetHack. Other commands might require
additional information, for example a direction, or an object to
be used. For those commands that require additional information,
NetHack will present you with either a menu of choices or with a
command line prompt requesting information. Which you are pre-
sented with will depend chiefly on how you have set the menustyle
option.

For example, a common question, in the form ``What do you
want to use? [a-zA-Z ?*]'', asks you to choose an object you are
carrying. Here, ``a-zA-Z'' are the inventory letters of your
possible choices. Typing `?' gives you an inventory list of
these items, so you can see what each letter refers to. In this
example, there is also a `*' indicating that you may choose an
object not on the list, if you wanted to use something unexpect-
ed. Typing a `*' lists your entire inventory, so you can see the








NetHack Guidebook 9



inventory letters of every object you're carrying. Finally, if
you change your mind and decide you don't want to do this command
after all, you can press the ESC key to abort the command.

You can put a number before some commands to repeat them
that many times; for example, ``10s'' will search ten times. If
you have the number_pad option set, you must type `n' to prefix a
count, so the example above would be typed ``n10s'' instead.
Commands for which counts make no sense ignore them. In addi-
tion, movement commands can be prefixed for greater control (see
below). To cancel a count or a prefix, press the ESC key.

命令列表是相当长的,但是在游戏中任何时间可以通过“?”命令来阅读,它会获取一份有用的文本菜单。这里是供你参考的命令:

? 帮助菜单:display one of several help texts available.

/ 告诉符号代表什么。You may choose to specify a
location or type a symbol (or even a whole word) to explain.
Specifying a location is done by moving the cursor to a par-
ticular spot on the map and then pressing one of `.', `,',
`;', or `:'. `.' will explain the symbol at the chosen lo-
cation, conditionally check for ``More info?'' depending up-
on whether the help option is on, and then you will be asked
to pick another location; `,' will explain the symbol but
skip any additional information; `;' will skip additional
info and also not bother asking you to choose another loca-
tion to examine; `:' will show additional info, if any,
without asking for confirmation. When picking a location,
pressing the ESC key will terminate this command, or press-
ing `?' will give a brief reminder about how it works.

Specifying a name rather than a location always gives any
additional information available about that name.

& 告诉命令做什么。

< 上到前一层(如果你在楼梯或梯子上)。

> 下到下一层(如果你在楼梯或梯子上)。

[yuhjklbn]
向所指的方向走一步(见图2). If
you sense or remember a monster there, you will fight the
monster instead. Only these one-step movement commands
cause you to fight monsters; the others (below) are
``safe.''











NetHack Guidebook 10



y k u 7 8 9
\ | / \ | /
h- . -l 4- . -6
/ | \ / | \
b j n 1 2 3
(if number_pad is set)

Figure 2


[YUHJKLBN]
按此方向前进,直到您撞墙或遇到东西。

m[yuhjklbn]
前缀:移动而不拾起物体或战斗(即使你有怪兽在那里)

F[yuhjklbn]
前缀:打击怪物(即使你只是估计那里有一个)

M[yuhjklbn]
Prefix: move far, no pickup.

g[yuhjklbn]
前缀:移动直到发现有趣的东西。

G[yuhjklbn] or [yuhjklbn]
前缀:和“g”相同,但是通道分支不视为有趣。

_ 通过最短路径算法旅行到一个地图位置。The
shortest path is computed over map locations the hero knows
about (e.g. seen or previously traversed). If there is no
known path, a guess is made instead. Stops on most of the
same conditions as the `G' command, but without picking up
objects, similar to the `M' command. For ports with mouse
support, the command is also invoked when a mouse-click
takes place on a location other than the current position.

. 休息,一回合不行动。

a 应用(使用)工具(pick-axe, key, lamp...)。

A Remove one or more worn items, such as armor. Use `T' (take
off) to take off only one piece of armor or `R' (remove) to
take off only one accessory.

^A 重复之前的命令。

c 关门。










NetHack Guidebook 11



C Call (name) an individual monster.

^C Panic button.退出游戏。

d 丢掉东西。例如``d7a'' means drop seven items of ob-
ject a.

D 丢掉若干东西。In answer to the question ``What kinds
of things do you want to drop? [!%= BUCXaium]'' you should
type zero or more object symbols possibly followed by `a'
and/or `i' and/or `u' and/or `m'. In addition, one or more
of the blessed/uncursed/cursed groups may be typed.

DB - drop all objects known to be blessed.
DU - drop all objects known to be uncursed.
DC - drop all objects known to be cursed.
DX - drop all objects of unknown B/U/C status.
Da - drop all objects, without asking for confirmation.
Di - examine your inventory before dropping anything.
Du - drop only unpaid objects (when in a shop).
Dm - use a menu to pick which object(s) to drop.
D%u - drop only unpaid food.

^D 踢东西(通常是门) 。

e 吃食物。

E 在地上刻消息。Engraving the word
``Elbereth'' will cause most monsters to not attack you
hand-to-hand (but if you attack, you will rub it out); this
is often useful to give yourself a breather. (This feature
may be compiled out of the game, so your version might not
have it.)

E- - 用你的手指在灰尘上写。

f Fire one of the objects placed in your quiver. You may se-
lect ammunition with a previous `Q' command, or let the com-
puter pick something appropriate if autoquiver is true.

i 列出你的库存(你携带的每样东西)。

I 列出你库存选择的部分。

I* - list all gems in inventory;
Iu - list all unpaid items;
Ix - list all used up items that are on your shopping bill;
I$ - count your money.

o 打开门。

O 设置选项。A menu showing the current option values will
be displayed. You can change most values simply by select-
ing the menu entry for the given option (ie, by typing its








NetHack Guidebook 12



letter or clicking upon it, depending on your user inter-
face). For the non-boolean choices, a further menu or
prompt will appear once you've closed this menu. The avail-
able options are listed later in this Guidebook. Options
are usually set before the game rather than with the `O'
command; see the section on options below.

p 支付你的购物账单。

P 戴上戒指或其他配件 (amulet, blindfold).

^P 重复之前的信息。Subsequent ^P's repeat earlier
messages. The behavior can be varied via the msg_window op-
tion.

q Quaff (喝) something (potion, water, etc).

Q Select an object for your quiver. You can then throw this
using the `f' command. (In versions prior to 3.3 this was
the command to quit the game, which has now been moved to
`#quit'.)

r 宣读卷轴或魔法书。

R 移除配件 (ring, amulet, etc).

^R 重绘屏幕。

s 搜索你周围秘密门和陷阱。通常需要试几次来找到。

S 保存(并挂起)游戏。游戏会在你下次玩时自动恢复。

t 投掷物体或射出子弹。

T 脱下护甲。

^T 传送,如果你有这个能力。

v 显示版本号。

V 显示游戏历史。

w 手持武器。

w- - 不持东西,使用您的双手。

W 穿上护甲。

x 把你手持的武器同你替换的武器插槽里的项目交换。后者用来作为你的第二武器在从事双武器战斗的时候。注意如果其中一个插槽是空的,交换仍然进行。








NetHack Guidebook 13



X 进入探索(发现)模式, explained in its own section
later.

^X 显示你的姓名、角色、性别和联盟,以及在你游戏中的各种神。

z Zap a wand. To aim at yourself, use `.' for the direction.

Z Zap (cast) a spell. To cast at yourself, use `.' for the
direction.

^Z 挂起游戏。 (UNIX(R) versions with job control only).

: Look at what is here.

; 显示可见的符号相当什么类型的东西。

, 拾起一些东西。May be preceded by `m' to force a se-
lection menu.

@ 切换自动拾起选项开关。

^ 询问你早先发现的陷阱类型。

) 告诉你正手持的武器。

[ 告诉你正带的护甲。

= 告诉你正带的戒指。

" 告诉你正带的护身符。

( 告诉你正使用的工具。

* 告诉你正使用的装备;结合前面五种类型不同的命令为一个。

$ 清点你的金币数。

+ 列出你知道的咒语。Using this command, you can also
rearrange the order in which your spells are listed. They
are shown via a menu, and if you select a spell in that
menu, you'll be re-prompted for another spell to swap places
with it, and then have opportunity to make further ex-
changes.

\ 显示已发现的物体类型。

! Escape to a shell.



__________
(R)UNIX is a registered trademark of AT&T.








NetHack Guidebook 14



# 执行扩展命令。As you can see, the authors of
NetHack used up all the letters, so this is a way to intro-
duce the less frequently used commands. What extended com-
mands are available depends on what features the game was
compiled with.

#adjust
Adjust inventory letters (most useful when the fixinv option
is ``on'').

#chat
和某人说话。

#conduct
列出你已经遵循的挑战。 See the section
below entitled ``Conduct'' for details.

#dip 把物体装到东西里。

#enhance
提升或检查武器或咒语的技能。

#force
Force a lock.

#invoke
调用物体的特殊能力。

#jump
跳到另一个位置。

#loot
夺取你下方地上的盒子或袋子,或者从站在你一旁马的鞍上。

#monster
使用怪物的特殊能力(当变形成怪物形态)。

#name
命名一个项目或物体类型。

#offer
向神献祭。

#pray
向神灵祈求帮助。

#quit
退出程序,而不储存游戏。

#ride
骑(或停止骑)怪物。









NetHack Guidebook 15



#rub 摩擦灯或石头。

#sit 坐下。

#turn
Turn undead.

#twoweapon
切换双武器战斗开关。Note that you must use
suitable weapons for this type of combat, or it will be au-
tomatically turned off.

#untrap
Untrap something (trap, door, or chest).

#version
Print compile time options for this version of NetHack.

#wipe
擦拭你的脸。

#? 帮助菜单:获得可用扩展命令列表。

If your keyboard has a meta key (which, when pressed in com-
bination with another key, modifies it by setting the `meta'
[8th, or `high'] bit), you can invoke many extended commands by
meta-ing the first letter of the command. In NT, OS/2, and PC
NetHack,“Alt”键能以这种方式使用。

M-? #? (not supported by all platforms)

M-2 #twoweapon (unless the number_pad option is enabled)

M-a #adjust

M-c #chat

M-d #dip

M-e #enhance

M-f #force

M-i #invoke

M-j #jump

M-l #loot

M-m #monster

M-n #name










NetHack Guidebook 16



M-o #offer

M-p #pray

M-q #quit

M-r #rub

M-s #sit

M-t #turn

M-u #untrap

M-v #version

M-w #wipe

If the number_pad option is on, some additional letter com-
mands are available:

h 帮助菜单:display one of several help texts available,
like ``?''.

j 跳到另一个位置。相同于``#jump'' 或 ``M-j''。

k 踢东西(通常是门)。相同于“^D”。

l 夺取你下方地上的盒子或袋子,或者从站在你一旁马的鞍上。相同于“#loot”或“M-l”。

N 命名一个项目或物体类型。Same as ``#name'' or ``M-n''.

u Untrap a trap, door, or chest. Same as ``#untrap'' or ``M-
u''.


5. 房间和通道

Rooms and corridors in the dungeon are either lit or dark.
Any lit areas within your line of sight will be displayed; dark
areas are only displayed if they are within one space of you.
Walls and corridors remain on the map as you explore them.

秘密通道是隐藏的。你可以使用“s”(搜索)命令发现他们。

5.1. 门道

Doorways connect rooms and corridors. Some doorways have no
doors; you can walk right through. Others have doors in them,
which may be open, closed, or locked. To open a closed door, use








NetHack Guidebook 17



the `o' (open) command; to close it again, use the `c' (close)
command.

You can get through a locked door by using a tool to pick
the lock with the `a' (apply) command, or by kicking it open with
the `^D' (kick) command.

Open doors cannot be entered diagonally; you must approach
them straight on, horizontally or vertically. Doorways without
doors are not restricted in this fashion.

Doors can be useful for shutting out monsters. Most mon-
sters cannot open doors, although a few don't need to (ex. ghosts
can walk through doors).

秘密门是隐藏的。You can find them with the `s'
(search) command. Once found they are in all ways equivalent to
normal doors.

5.2. 陷阱 (`^')

There are traps throughout the dungeon to snare the unwary
delver. For example, you may suddenly fall into a pit and be
stuck for a few turns trying to climb out. Traps don't appear on
your map until you see one triggered by moving onto it, see some-
thing fall into it, or you discover it with the `s' (search) com-
mand. Monsters can fall prey to traps, too, which can be a very
useful defensive strategy.

There is a special pre-mapped branch of the dungeon based on
the classic computer game ``Sokoban.'' The goal is to push the
boulders into the pits or holes. With careful foresight, it is
possible to complete all of the levels according to the tradi-
tional rules of Sokoban. Some allowances are permitted in case
the player gets stuck; however, they will lower your luck.

5.3. 楼梯 (`<', `>')

In general, each level in the dungeon will have a staircase
going up (`<') to the previous level and another going down (`>')
to the next level. There are some exceptions though. For in-
stance, fairly early in the dungeon you will find a level with
two down staircases, one continuing into the dungeon and the oth-
er branching into an area known as the Gnomish Mines. Those
mines eventually hit a dead end, so after exploring them (if you
choose to do so), you'll need to climb back up to the main dun-
geon.

When you traverse a set of stairs, or trigger a trap which
sends you to another level, the level you're leaving will be de-
activated and stored in a file on disk. If you're moving to a
previously visited level, it will be loaded from its file on disk
and reactivated. If you're moving to a level which has not yet
been visited, it will be created (from scratch for most random








NetHack Guidebook 18



levels, from a template for some ``special'' levels, or loaded
from the remains of an earlier game for a ``bones'' level as
briefly described below). Monsters are only active on the cur-
rent level; those on other levels are essentially placed into
stasis.

Ordinarily when you climb a set of stairs, you will arrive
on the corresponding staircase at your destination. However,
pets (see below) and some other monsters will follow along if
they're close enough when you travel up or down stairs, and occa-
sionally one of these creatures will displace you during the
climb. When that occurs, the pet or other monster will arrive on
the staircase and you will end up nearby.

5.4. 梯子 (`<', `>')

Ladders serve the same purpose as staircases, and the two
types of inter-level connections are nearly indistinguishable
during game play.

5.5. 商店和购物

Occasionally you will run across a room with a shopkeeper
near the door and many items lying on the floor. You can buy
items by picking them up and then using the `p' command. You can
inquire about the price of an item prior to picking it up by us-
ing the ``#chat'' command while standing on it. Using an item
prior to paying for it will incur a charge, and the shopkeeper
won't allow you to leave the shop until you have paid any debt
you owe.

You can sell items to a shopkeeper by dropping them to the
floor while inside a shop. You will either be offered an amount
of gold and asked whether you're willing to sell, or you'll be
told that the shopkeeper isn't interested (generally, your item
needs to be compatible with the type of merchandise carried by
the shop).

If you drop something in a shop by accident, the shopkeeper
will usually claim ownership without offering any compensation.
You'll have to buy it back if you want to reclaim it.

Shopkeepers sometimes run out of money. When that happens,
you'll be offered credit instead of gold when you try to sell
something. Credit can be used to pay for purchases, but it is
only good in the shop where it was obtained; other shopkeepers
won't honor it. (If you happen to find a "credit card" in the
dungeon, don't bother trying to use it in shops; shopkeepers will
not accept it.)

The `$' command, which reports the amount of gold you are
carrying (in inventory, not inside bags or boxes), will also show
current shop debt or credit, if any. The `Iu' command lists un-
paid items (those which still belong to the shop) if you are








NetHack Guidebook 19



carrying any. The `Ix' command shows an inventory-like display
of any unpaid items which have been used up, along with other
shop fees, if any.

5.5.1. 商店差异

Several aspects of shop behavior might be unexpected.

* The price of a given item can vary due to a variety of factors.

* A shopkeeper treats the spot immediately inside the door as if
it were outside the shop.

* While the shopkeeper watches you like a hawk, he will generally
ignore any other customers.

* If a shop is "closed for inventory", it will not open of its
own accord.

* Shops do not get restocked with new items, regardless of inven-
tory depletion.


6. 怪兽

Monsters you cannot see are not displayed on the screen.
Beware! You may suddenly come upon one in a dark place. Some
magic items can help you locate them before they locate you
(which some monsters can do very well).

The commands `/' and `;' may be used to obtain information
about those monsters who are displayed on the screen. The com-
mand `C' allows you to assign a name to a monster, which may be
useful to help distinguish one from another when multiple mon-
sters are present. Assigning a name which is just a space will
remove any prior name.

The extended command ``#chat'' can be used to interact with
an adjacent monster. There is no actual dialog (in other words,
you don't get to choose what you'll say), but chatting with some
monsters such as a shopkeeper or the Oracle of Delphi can produce
useful results.

6.1. 战斗

If you see a monster and you wish to fight it, just attempt
to walk into it. Many monsters you find will mind their own
business unless you attack them. Some of them are very dangerous
when angered. Remember: discretion is the better part of valor.

If you can't see a monster (if it is invisible, or if you
are blinded), the symbol `I' will be shown when you learn of its
presence. If you attempt to walk into it, you will try to fight
it just like a monster that you can see; of course, if the








NetHack Guidebook 20



monster has moved, you will attack empty air. If you guess that
the monster has moved and you don't wish to fight, you can use
the `m' command to move without fighting; likewise, if you don't
remember a monster but want to try fighting anyway, you can use
the `F' command.

6.2. 你的宠物

You start the game with a little dog (`d'), cat (`f'), or
pony (`u'), which follows you about the dungeon and fights mon-
sters with you. Like you, your pet needs food to survive. It
usually feeds itself on fresh carrion and other meats. If you're
worried about it or want to train it, you can feed it, too, by
throwing it food. A properly trained pet can be very useful un-
der certain circumstances.

Your pet also gains experience from killing monsters, and
can grow over time, gaining hit points and doing more damage.
Initially, your pet may even be better at killing things than
you, which makes pets useful for low-level characters.

Your pet will follow you up and down staircases if it is
next to you when you move. Otherwise your pet will be stranded
and may become wild. Similarly, when you trigger certain types
of traps which alter your location (for instance, a trap door
which drops you to a lower dungeon level), any adjacent pet will
accompany you and any non-adjacent pet will be left behind. Your
pet may trigger such traps itself; you will not be carried along
with it even if adjacent at the time.

6.3. 坐骑

Some types of creatures in the dungeon can actually be rid-
den if you have the right equipment and skill. Convincing a wild
beast to let you saddle it up is difficult to say the least.
Many a dungeoneer has had to resort to magic and wizardry in or-
der to forge the alliance. Once you do have the beast under your
control however, you can easily climb in and out of the saddle
with the `#ride' command. Lead the beast around the dungeon when
riding, in the same manner as you would move yourself. It is the
beast that you will see displayed on the map.

Riding skill is managed by the `#enhance' command. See the
section on Weapon proficiency for more information about that.

6.4. 骨头楼层

You may encounter the shades and corpses of other adventur-
ers (or even former incarnations of yourself!) and their personal
effects. Ghosts are hard to kill, but easy to avoid, since
they're slow and do little damage. You can plunder the deceased
adventurer's possessions; however, they are likely to be cursed.
Beware of whatever killed the former player; it is probably still
lurking around, gloating over its last victory.








NetHack Guidebook 21



7. 物体

When you find something in the dungeon, it is common to want
to pick it up. In NetHack, this is accomplished automatically by
walking over the object (unless you turn off the autopickup op-
tion (see below), or move with the `m' prefix (see above)), or
manually by using the `,' command.

If you're carrying too many items, NetHack will tell you so
and you won't be able to pick up anything more. Otherwise, it
will add the object(s) to your pack and tell you what you just
picked up.

As you add items to your inventory, you also add the weight
of that object to your load. The amount that you can carry de-
pends on your strength and your constitution. The stronger you
are, the less the additional load will affect you. There comes a
point, though, when the weight of all of that stuff you are car-
rying around with you through the dungeon will encumber you.
Your reactions will get slower and you'll burn calories faster,
requiring food more frequently to cope with it. Eventually,
you'll be so overloaded that you'll either have to discard some
of what you're carrying or collapse under its weight.

NetHack will tell you how badly you have loaded yourself.
The symbols `Burdened', `Stressed', `Strained', `Overtaxed' and
`Overloaded' are displayed on the bottom line display to indicate
your condition.

When you pick up an object, it is assigned an inventory let-
ter. Many commands that operate on objects must ask you to find
out which object you want to use. When NetHack asks you to
choose a particular object you are carrying, you are usually pre-
sented with a list of inventory letters to choose from (see Com-
mands, above).

Some objects, such as weapons, are easily differentiated.
Others, like scrolls and potions, are given descriptions which
vary according to type. During a game, any two objects with the
same description are the same type. However, the descriptions
will vary from game to game.

When you use one of these objects, if its effect is obvious,
NetHack will remember what it is for you. If its effect isn't
extremely obvious, you will be asked what you want to call this
type of object so you will recognize it later. You can also use
the ``#name'' command for the same purpose at any time, to name
all objects of a particular type or just an individual object.
When you use ``#name'' on an object which has already been named,
specifying a space as the value will remove the prior name in-
stead of assigning a new one.











NetHack Guidebook 22



7.1. 诅咒和祝福

Any object that you find may be cursed, even if the object
is otherwise helpful. The most common effect of a curse is being
stuck with (and to) the item. Cursed weapons weld themselves to
your hand when wielded, so you cannot unwield them. Any cursed
item you wear is not removable by ordinary means. In addition,
cursed arms and armor usually, but not always, bear negative en-
chantments that make them less effective in combat. Other cursed
objects may act poorly or detrimentally in other ways.

Objects can also be blessed. Blessed items usually work
better or more beneficially than normal uncursed items. For ex-
ample, a blessed weapon will do more damage against demons.

There are magical means of bestowing or removing curses upon
objects, so even if you are stuck with one, you can still have
the curse lifted and the item removed. Priests and Priestesses
have an innate sensitivity to this property in any object, so
they can more easily avoid cursed objects than other character
roles.

An item with unknown status will be reported in your inven-
tory with no prefix. An item which you know the state of will be
distinguished in your inventory by the presence of the word
``cursed'', ``uncursed'' or ``blessed'' in the description of the
item.

7.2. 武器 (`)')

Given a chance, most monsters in the Mazes of Menace will
gratuitously try to kill you. You need weapons for self-defense
(killing them first). Without a weapon, you do only 1-2 hit
points of damage (plus bonuses, if any). Monk characters are an
exception; they normally do much more damage with bare hands than
they do with weapons.

There are wielded weapons, like maces and swords, and thrown
weapons, like arrows and spears. To hit monsters with a weapon,
you must wield it and attack them, or throw it at them. You can
simply elect to throw a spear. To shoot an arrow, you should
first wield a bow, then throw the arrow. Crossbows shoot cross-
bow bolts. Slings hurl rocks and (other) stones (like gems).

Enchanted weapons have a ``plus'' (or ``to hit enhancement''
which can be either positive or negative) that adds to your
chance to hit and the damage you do to a monster. The only way
to determine a weapon's enchantment is to have it magically iden-
tified somehow. Most weapons are subject to some type of damage
like rust. Such ``erosion'' damage can be repaired.

The chance that an attack will successfully hit a monster,
and the amount of damage such a hit will do, depends upon many
factors. Among them are: type of weapon, quality of weapon








NetHack Guidebook 23



(enchantment and/or erosion), experience level, strength, dexter-
ity, encumbrance, and proficiency (see below). The monster's ar-
mor class - a general defense rating, not necessarily due to
wearing of armor - is a factor too; also, some monsters are par-
ticularly vulnerable to certain types of weapons.

Many weapons can be wielded in one hand; some require both
hands. When wielding a two-handed weapon, you can not wear a
shield, and vice versa. When wielding a one-handed weapon, you
can have another weapon ready to use by setting things up with
the `x' command, which exchanges your primary (the one being
wielded) and alternate weapons. And if you have proficiency in
the ``two weapon combat'' skill, you may wield both weapons si-
multaneously as primary and secondary; use the `#twoweapon' ex-
tended command to engage or disengage that. Only some types of
characters (barbarians, for instance) have the necessary skill
available. Even with that skill, using two weapons at once in-
curs a penalty in the chance to hit your target compared to using
just one weapon at a time.

There might be times when you'd rather not wield any weapon
at all. To accomplish that, wield `-', or else use the `A' com-
mand which allows you to unwield the current weapon in addition
to taking off other worn items.

Those of you in the audience who are AD&D players, be aware
that each weapon which existed in AD&D does roughly the same dam-
age to monsters in NetHack. Some of the more obscure weapons
(such as the aklys, lucern hammer, and bec-de-corbin) are defined
in an appendix to Unearthed Arcana, an AD&D supplement.

The commands to use weapons are `w' (wield), `t' (throw),
`f' (fire, an alternative way of throwing), `Q' (quiver), `x'
(exchange), `#twoweapon', and `#enhance' (see below).

7.2.1. 投掷和射击

You can throw just about anything via the `t' command. It
will prompt for the item to throw; picking `?' will list things
in your inventory which are considered likely to be thrown, or
picking `*' will list your entire inventory. After you've chosen
what to throw, you will be prompted for a direction rather than
for a specific target. The distance something can be thrown de-
pends mainly on the type of object and your strength. Arrows can
be thrown by hand, but can be thrown much farther and will be
more likely to hit when thrown while you are wielding a bow.

You can simplify the throwing operation by using the `Q'
command to select your preferred ``missile'', then using the `f'
command to throw it. You'll be prompted for a direction as
above, but you don't have to specify which item to throw each
time you use `f'. There is also an option, autoquiver, which has
NetHack choose another item to automatically fill your quiver
when the inventory slot used for `Q' runs out.








NetHack Guidebook 24



Some characters have the ability to fire a volley of multi-
ple items in a single turn. Knowing how to load several rounds
of ammunition at once -- or hold several missiles in your hand --
and still hit a target is not an easy task. Rangers are among
those who are adept at this task, as are those with a high level
of proficiency in the relevant weapon skill (in bow skill if
you're wielding one to shoot arrows, in crossbow skill if you're
wielding one to shoot bolts, or in sling skill if you're wielding
one to shoot stones). The number of items that the character has
a chance to fire varies from turn to turn. You can explicitly
limit the number of shots by using a numeric prefix before the
`t' or `f' command. For example, ``2f'' (or ``n2f'' if using
number_pad mode) would ensure that at most 2 arrows are shot even
if you could have fired 3. If you specify a larger number than
would have been shot (``4f'' in this example), you'll just end up
shooting the same number (3, here) as if no limit had been speci-
fied. Once the volley is in motion, all of the items will travel
in the same direction; if the first ones kill a monster, the oth-
ers can still continue beyond that spot.

7.2.2. 武器熟练度

You will have varying degrees of skill in the weapons avail-
able. Weapon proficiency, or weapon skills, affect how well you
can use particular types of weapons, and you'll be able to im-
prove your skills as you progress through a game, depending on
your role, your experience level, and use of the weapons.

For the purposes of proficiency, weapons have been divided
up into various groups such as daggers, broadswords, and
polearms. Each role has a limit on what level of proficiency a
character can achieve for each group. For instance, wizards can
become highly skilled in daggers or staves but not in swords or
bows.

The `#enhance' extended command is used to review current
weapons proficiency (also spell proficiency) and to choose which
skill(s) to improve when you've used one or more skills enough to
become eligible to do so. The skill rankings are ``none'' (some-
times also referred to as ``restricted'', because you won't be
able to advance), ``unskilled'', ``basic'', ``skilled'', and
``expert''. Restricted skills simply will not appear in the list
shown by `#enhance'. (Divine intervention might unrestrict a
particular skill, in which case it will start at unskilled and be
limited to basic.) Some characters can enhance their barehanded
combat or martial arts skill beyond expert to ``master'' or
``grand master''.

Use of a weapon in which you're restricted or unskilled will
incur a modest penalty in the chance to hit a monster and also in
the amount of damage done when you do hit; at basic level, there
is no penalty or bonus; at skilled level, you receive a modest
bonus in the chance to hit and amount of damage done; at expert
level, the bonus is higher. A successful hit has a chance to








NetHack Guidebook 25



boost your training towards the next skill level (unless you've
already reached the limit for this skill). Once such training
reaches the threshold for that next level, you'll be told that
you feel more confident in your skills. At that point you can
use `#enhance' to increase one or more skills. Such skills are
not increased automatically because there is a limit to your to-
tal overall skills, so you need to actively choose which skills
to enhance and which to ignore.

7.3. 护甲 (`[')

Lots of unfriendly things lurk about; you need armor to pro-
tect yourself from their blows. Some types of armor offer better
protection than others. Your armor class is a measure of this
protection. Armor class (AC) is measured as in AD&D, with 10 be-
ing the equivalent of no armor, and lower numbers meaning better
armor. Each suit of armor which exists in AD&D gives the same
protection in NetHack. Here is an (incomplete) list of the armor
classes provided by various suits of armor:

dragon scale mail 1
plate mail 3
crystal plate mail 3
bronze plate mail 4
splint mail 4
banded mail 4
dwarvish mithril-coat 4
elven mithril-coat 5
chain mail 5
orcish chain mail 6
scale mail 6
studded leather armor 7
ring mail 7
orcish ring mail8
leather armor 8
leather jacket 9
no armor 10

You can also wear other pieces of armor (ex. helmets, boots,
shields, cloaks) to lower your armor class even further, but you
can only wear one item of each category (one suit of armor, one
cloak, one helmet, one shield, and so on) at a time.

If a piece of armor is enchanted, its armor protection will
be better (or worse) than normal, and its ``plus'' (or minus)
will subtract from your armor class. For example, a +1 chain
mail would give you better protection than normal chain mail,
lowering your armor class one unit further to 4. When you put on
a piece of armor, you immediately find out the armor class and
any ``plusses'' it provides. Cursed pieces of armor usually have
negative enchantments (minuses) in addition to being unremovable.

Many types of armor are subject to some kind of damage like
rust. Such damage can be repaired. Some types of armor may








NetHack Guidebook 26



inhibit spell casting.

The commands to use armor are `W' (wear) and `T' (take off).
The `A' command can also be used to take off armor as well as
other worn items.

7.4. 食物 (`%')

Food is necessary to survive. If you go too long without
eating you will faint, and eventually die of starvation. Some
types of food will spoil, and become unhealthy to eat, if not
protected. Food stored in ice boxes or tins (``cans'') will usu-
ally stay fresh, but ice boxes are heavy, and tins take a while
to open.

When you kill monsters, they usually leave corpses which are
also ``food.'' Many, but not all, of these are edible; some also
give you special powers when you eat them. A good rule of thumb
is ``you are what you eat.''

Some character roles and some monsters are vegetarian. Veg-
etarian monsters will typically never eat animal corpses, while
vegetarian players can, but with some rather unpleasant side-ef-
fects.

You can name one food item after something you like to eat
with the fruit option.

The command to eat food is `e'.

7.5. 卷轴 (`?')

Scrolls are labeled with various titles, probably chosen by
ancient wizards for their amusement value (ex. ``READ ME,'' or
``THANX MAUD'' backwards). Scrolls disappear after you read them
(except for blank ones, without magic spells on them).

One of the most useful of these is the scroll of identify,
which can be used to determine what another object is, whether it
is cursed or blessed, and how many uses it has left. Some ob-
jects of subtle enchantment are difficult to identify without
these.

A mail daemon may run up and deliver mail to you as a scroll
of mail (on versions compiled with this feature). To use this
feature on versions where NetHack mail delivery is triggered by
electronic mail appearing in your system mailbox, you must let
NetHack know where to look for new mail by setting the ``MAIL''
environment variable to the file name of your mailbox. You may
also want to set the ``MAILREADER'' environment variable to the
file name of your favorite reader, so NetHack can shell to it
when you read the scroll. On versions of NetHack where mail is
randomly generated internal to the game, these environment vari-
ables are ignored. You can disable the mail daemon by turning








NetHack Guidebook 27



off the mail option.

用于宣读卷轴的命令是 `r'。

7.6. 药剂 (`!')

Potions are distinguished by the color of the liquid inside
the flask. They disappear after you quaff them.

Clear potions are potions of water. Sometimes these are
blessed or cursed, resulting in holy or unholy water. Holy water
is the bane of the undead, so potions of holy water are good
things to throw (`t') at them. It is also sometimes very useful
to dip (``#dip'') an object into a potion.

The command to drink a potion is `q' (quaff).

7.7. 法杖 (`/')

Magic wands usually have multiple magical charges. Some
wands are directional--you must give a direction in which to zap
them. You can also zap them at yourself (just give a `.' or `s'
for the direction). Be warned, however, for this is often unwise.
Other wands are nondirectional--they don't require a direction.
The number of charges in a wand is random and decreases by one
whenever you use it.

When the number of charges left in a wand becomes zero, at-
tempts to use the wand will usually result in nothing happening.
Occasionally, however, it may be possible to squeeze the last few
mana points from an otherwise spent wand, destroying it in the
process. A wand may be recharged by using suitable magic, but
doing so runs the risk of causing it to explode. The chance for
such an explosion starts out very small and increases each time
the wand is recharged.

In a truly desperate situation, when your back is up against
the wall, you might decide to go for broke and break your wand.
This is not for the faint of heart. Doing so will almost cer-
tainly cause a catastrophic release of magical energies.

When you have fully identified a particular wand, inventory
display will include additional information in parentheses: the
number of times it has been recharged followed by a colon and
then by its current number of charges. A current charge count of
-1 is a special case indicating that the wand has been cancelled.

The command to 使用 a wand is `z' (zap). To break one, use
the `a' (apply) command.

7.8. 戒指 (`=')

Rings are very useful items, since they are relatively per-
manent magic, unlike the usually fleeting effects of potions,








NetHack Guidebook 28



scrolls, and wands.

Putting on a ring activates its magic. You can wear only
two rings, one on each ring finger.

Most rings also cause you to grow hungry more rapidly, the
rate varying with the type of ring.

The commands to use rings are `P' (put on) and `R' (remove).

7.9. 魔法书 (`+')

Spellbooks are tomes of mighty magic. When studied with the
`r' (read) command, they transfer to the reader the knowledge of
a spell (and therefore eventually become unreadable) -- unless
the attempt backfires. Reading a cursed spellbook or one with
mystic runes beyond your ken can be harmful to your health!

A spell (even when learned) can also backfire when you cast
it. If you attempt to cast a spell well above your experience
level, or if you have little skill with the appropriate spell
type, or cast it at a time when your luck is particularly bad,
you can end up wasting both the energy and the time required in
casting.

Casting a spell calls forth magical energies and focuses
them with your naked mind. Some of the magical energy released
comes from within you, and casting several spells in a row may
tire you. Casting of spells also requires practice. With prac-
tice, your skill in each category of spell casting will improve.
Over time, however, your memory of each spell will dim, and you
will need to relearn it.

Some spells are directional--you must give a direction in
which to cast them. You can also cast them at yourself (just
give a `.' or `s' for the direction). Be warned, however, for
this is often unwise. Other spells are nondirectional--they
don't require a direction.

Just as weapons are divided into groups in which a character
can become proficient (to varying degrees), spells are similarly
grouped. Successfully casting a spell exercises the skill group;
sufficient skill may increase the potency of the spell and reduce
the risk of spell failure. Skill slots are shared with weapons
skills. (See also the section on ``Weapon proficiency''.)

Casting a spell also requires flexible movement, and wearing
various types of armor may interfere with that.

The command to read a spellbook is the same as for scrolls,
`r' (read). The `+' command lists your current spells, their
levels, categories, and chances for failure. The `Z' (cast) com-
mand casts a spell.









NetHack Guidebook 29



7.10. 工具 (`(')

Tools are miscellaneous objects with various purposes. Some
tools have a limited number of uses, akin to wand charges. For
example, lamps burn out after a while. Other tools are contain-
ers, which objects can be placed into or taken out of.

The command to use tools is `a' (apply).

7.10.1. 容器

You may encounter bags, boxes, and chests in your travels.
A tool of this sort can be opened with the ``#loot'' extended
command when you are standing on top of it (that is, on the same
floor spot), or with the `a' (apply) command when you are carry-
ing it. However, chests are often locked, and are in any case
unwieldy objects. You must set one down before unlocking it by
using a key or lock-picking tool with the `a' (apply) command, by
kicking it with the `^D' command, or by using a weapon to force
the lock with the ``#force'' extended command.

Some chests are trapped, causing nasty things to happen when
you unlock or open them. You can check for and try to deactivate
traps with the ``#untrap'' extended command.

7.11. Amulets (`"')

Amulets are very similar to rings, and often more powerful.
Like rings, amulets have various magical properties, some benefi-
cial, some harmful, which are activated by putting them on.

Only one amulet may be worn at a time, around your neck.

The commands to use amulets are the same as for rings, `P'
(put on) and `R' (remove).

7.12. 宝石 (`*')

Some gems are valuable, and can be sold for a lot of gold.
They are also a far more efficient way of carrying your riches.
Valuable gems increase your score if you bring them with you when
you exit.

Other small rocks are also categorized as gems, but they are
much less valuable. All rocks, however, can be used as projec-
tile weapons (if you have a sling). In the most desperate of
cases, you can still throw them by hand.

7.13. 巨石 (``')

Statues and boulders are not particularly useful, and are
generally heavy. It is rumored that some statues are not what
they seem.









NetHack Guidebook 30



Very large humanoids (giants and their ilk) have been known
to use boulders as weapons.

7.14. 金币 (`$')

Gold adds to your score, and you can buy things in shops
with it. There are a number of monsters in the dungeon that may
be influenced by the amount of gold you are carrying (shopkeepers
aside).


8. 指导

As if winning NetHack were not difficult enough, certain
players seek to challenge themselves by imposing restrictions on
the way they play the game. The game automatically tracks some
of these challenges, which can be checked at any time with the
#conduct command or at the end of the game. When you perform an
action which breaks a challenge, it will no longer be listed.
This gives players extra ``bragging rights'' for winning the game
with these challenges. Note that it is perfectly acceptable to
win the game without resorting to these restrictions and that it
is unusual for players to adhere to challenges the first time
they win the game.

Several of the challenges are related to eating behavior.
The most difficult of these is the foodless challenge. Although
creatures can survive long periods of time without food, there is
a physiological need for water; thus there is no restriction on
drinking beverages, even if they provide some minor food bene-
fits. Calling upon your god for help with starvation does not
violate any food challenges either.

A strict vegan diet is one which avoids any food derived
from animals. The primary source of nutrition is fruits and veg-
etables. The corpses and tins of blobs (`b'), jellies (`j'), and
fungi (`F') are also considered to be vegetable matter. Certain
human food is prepared without animal products; namely, lembas
wafers, cram rations, food rations (gunyoki), K-rations, and C-
rations. Metal or another normally indigestible material eaten
while polymorphed into a creature that can digest it is also con-
sidered vegan food. Note however that eating such items still
counts against foodless conduct.

Vegetarians do not eat animals; however, they are less se-
lective about eating animal byproducts than vegans. In addition
to the vegan items listed above, they may eat any kind of pudding
(`P') other than the black puddings, eggs and food made from eggs
(fortune cookies and pancakes), food made with milk (cream pies
and candy bars), and lumps of royal jelly. Monks are expected to
observe a vegetarian diet.

Eating any kind of meat violates the vegetarian, vegan, and
foodless conducts. This includes tripe rations, the corpses or








NetHack Guidebook 31



tins of any monsters not mentioned above, and the various other
chunks of meat found in the dungeon. Swallowing and digesting a
monster while polymorphed is treated as if you ate the creature's
corpse. Eating leather, dragon hide, or bone items while poly-
morphed into a creature that can digest it, or eating monster
brains while polymorphed into a mind flayer, is considered eating
an animal, although wax is only an animal byproduct.

Regardless of conduct, there will be some items which are
indigestible, and others which are hazardous to eat. Using a
swallow-and-digest attack against a monster is equivalent to eat-
ing the monster's corpse. Please note that the term ``vegan'' is
used here only in the context of diet. You are still free to
choose not to use or wear items derived from animals (e.g.
leather, dragon hide, bone, horns, coral), but the game will not
keep track of this for you. Also note that ``milky'' potions may
be a translucent white, but they do not contain milk, so they are
compatible with a vegan diet. Slime molds or player-defined
``fruits'', although they could be anything from ``cherries'' to
``pork chops'', are also assumed to be vegan.

An atheist is one who rejects religion. This means that you
cannot #pray, #offer sacrifices to any god, #turn undead, or
#chat with a priest. Particularly selective readers may argue
that playing Monk or Priest characters should violate this con-
duct; that is a choice left to the player. Offering the Amulet
of Yendor to your god is necessary to win the game and is not
counted against this conduct. You are also not penalized for be-
ing spoken to by an angry god, priest(ess), or other religious
figure; a true atheist would hear the words but attach no special
meaning to them.

Most players fight with a wielded weapon (or tool intended
to be wielded as a weapon). Another challenge is to win the game
without using such a wielded weapon. You are still permitted to
throw, fire, and kick weapons; use a wand, spell, or other type
of item; or fight with your hands and feet.

In NetHack, a pacifist refuses to cause the death of any
other monster (i.e. if you would get experience for the death).
This is a particularly difficult challenge, although it is still
possible to gain experience by other means.

An illiterate character cannot read or write. This includes
reading a scroll, spellbook, fortune cookie message, or t-shirt;
writing a scroll; or making an engraving of anything other than a
single ``x'' (the traditional signature of an illiterate person).
Reading an engraving, or any item that is absolutely necessary to
win the game, is not counted against this conduct. The identity
of scrolls and spellbooks (and knowledge of spells) in your
starting inventory is assumed to be learned from your teachers
prior to the start of the game and isn't counted.










NetHack Guidebook 32



There are several other challenges tracked by the game. It
is possible to eliminate one or more species of monsters by geno-
cide; playing without this feature is considered a challenge.
When the game offers you an opportunity to genocide monsters, you
may respond with the monster type ``none'' if you want to de-
cline. You can change the form of an item into another item of
the same type (``polypiling'') or the form of your own body into
another creature (``polyself'') by wand, spell, or potion of
polymorph; avoiding these effects are each considered challenges.
Polymorphing monsters, including pets, does not break either of
these challenges. Finally, you may sometimes receive wishes; a
game without an attempt to wish for any items is a challenge, as
is a game without wishing for an artifact (even if the artifact
immediately disappears). When the game offers you an opportunity
to make a wish for an item, you may choose ``nothing'' if you
want to decline.


9. 选项

Due to variations in personal tastes and conceptions of how
NetHack should do things, there are options you can set to change
how NetHack behaves.

9.1. Setting the options

Options may be set in a number of ways. Within the game,
the `O' command allows you to view all options and change most of
them. You can also set options automatically by placing them in
the NETHACKOPTIONS environment variable or in a configuration
file. Some versions of NetHack also have front-end programs that
allow you to set options before starting the game.

9.2. Using the NETHACKOPTIONS environment variable

The NETHACKOPTIONS variable is a comma-separated list of
initial values for the various options. Some can only be turned
on or off. You turn one of these on by adding the name of the
option to the list, and turn it off by typing a `!' or ``no'' be-
fore the name. Others take a character string as a value. You
can set string options by typing the option name, a colon or
equals sign, and then the value of the string. The value is ter-
minated by the next comma or the end of string.

For example, to set up an environment variable so that ``au-
toquiver'' is on, ``autopickup'' is off, the name is set to
``Blue Meanie'', and the fruit is set to ``papaya'', you would
enter the command

% setenv NETHACKOPTIONS "autoquiver,\!autopickup,name:Blue Meanie,fruit:papaya"

in csh (note the need to escape the ! since it's special to the
shell), or









NetHack Guidebook 33



$ NETHACKOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya"
$ export NETHACKOPTIONS

in sh or ksh.

9.3. 使用配置文件

Any line in the configuration file starting with `#' is
treated as a comment. Any line in the configuration file start-
ing with ``OPTIONS='' may be filled out with options in the same
syntax as in NETHACKOPTIONS. Any line starting with ``DUN-
GEON='', ``EFFECTS='', ``MONSTERS='', ``OBJECTS='', ``TRAPS='',
or ``BOULDER='' is taken as defining the corresponding dungeon,
effects, monsters, objects traps or boulder option in a different
syntax, a sequence of decimal numbers giving the character posi-
tion in the current font to be used in displaying each entry. A
zero in any entry in such a sequence leaves the display of that
entry unchanged; this feature is not available using the option
syntax. Such a sequence can be continued to multiple lines by
putting a `\' at the end of each line to be continued.

If your copy of the game included the compile time AUTOPICK-
UP_EXCEPTIONS option, then any line starting with ``AUTOPICK-
UP_EXCEPTION='' is taken as defining an exception to the pick-
up_types option. There is a section of this Guidebook that dis-
cusses that.

The default name of the configuration file varies on differ-
ent operating systems, but NETHACKOPTIONS can also be set to the
full name of a file you want to use (possibly preceded by an
`@').

9.4. 自定义选项

Here are explanations of what the various options do. Char-
acter strings that are too long may be truncated. Some of the
options listed may be inactive in your dungeon.

align
Your starting alignment (align:lawful, align:neutral, or
align:chaotic). You may specify just the first letter. The
default is to randomly pick an appropriate alignment. Cannot
be set with the `O' command.

autodig
Automatically dig if you are wielding a digging tool and moving
into a place that can be dug (default false).

autopickup
Automatically pick up things onto which you move (default on).
See pickup_types to refine the behavior.

autoquiver
This option controls what happens when you attempt the `f'








NetHack Guidebook 34



(fire) command with an empty quiver. When true, the computer
will fill your quiver with some suitable weapon. Note that it
will not take into account the blessed/cursed status, enchant-
ment, damage, or quality of the weapon; you are free to manual-
ly fill your quiver with the `Q' command instead. If no weapon
is found or the option is false, the `t' (throw) command is ex-
ecuted instead. (default false)

boulder
Set the character used to display boulders (default is rock
class symbol).

catname
Name your starting cat (ex. ``catname:Morris''). Cannot be set
with the `O' command.

character
Pick your type of character (ex. ``character:Monk''); synonym
for ``role''. See ``name'' for an alternate method of specify-
ing your role. Normally only the first letter of the value is
examined; the string ``random'' is an exception.

checkpoint
Save game state after each level change, for possible recovery
after program crash (default on).

checkspace
Check free disk space before writing files to disk (default
on). You may have to turn this off if you have more than 2 GB
free space on the partition used for your save and level files.
Only applies when MFLOPPY was defined during compilation.

cmdassist
Have the game provide some additional command assistance for
new players if it detects some anticipated mistakes (default
on).

confirm
Have user confirm attacks on pets, shopkeepers, and other
peaceable creatures (default on).

DECgraphics
Use a predefined selection of characters from the DEC VT-
xxx/DEC Rainbow/ANSI line-drawing character set to display the
dungeon/effects/traps instead of having to define a full graph-
ics set yourself (default off). This option also sets up prop-
er handling of graphics characters for such terminals, so you
should specify it when appropriate even if you override the se-
lections with your own graphics strings.

disclose
Controls options for disclosing various information when the
game ends (defaults to all possibilities being disclosed). The
possibilities are:








NetHack Guidebook 35



i - disclose your inventory.
a - disclose your attributes.
v - summarize monsters that have been vanquished.
g - list monster species that have been genocided.
c - display your conduct.

Each disclosure possibility can optionally be preceded by a
prefix which let you refine how it behaves. Here are the valid
prefixes:

y - prompt you and default to yes on the prompt.
n - prompt you and default to no on the prompt.
+ - disclose it without prompting.
- - do not disclose it and do not prompt.

(ex. ``disclose:yi na +v -g -c'') The example sets inventory to
prompt and default to yes, attributes to prompt and default to
no, vanquished to disclose without prompting, genocided to not
disclose and not to prompt, conduct to not disclose and not to
prompt. Note that the vanquished monsters list includes all
monsters killed by traps and each other as well as by you.

dogname
Name your starting dog (ex. ``dogname:Fang''). Cannot be set
with the `O' command.

dungeon
Set the graphics symbols for displaying the dungeon (default
`` |--------||.-|++##.##<><>_|\\#{}.}..## #}''). The dungeon
option should be followed by a string of 1-41 characters to be
used instead of the default map-drawing characters. The dun-
geon map will use the characters you specify instead of the de-
fault symbols, and default symbols for any you do not specify.
Remember that you may need to escape some of these characters
on a command line if they are special to your shell.

Note that NetHack escape-processes this option string in con-
ventional C fashion. This means that `\' is a prefix to take
the following character literally. Thus `\' needs to be repre-
sented as `\\'. The special escape form `\m' switches on the
meta bit in the following character, and the `^' prefix causes
the following character to be treated as a control character.

The order of the symbols is: solid rock, vertical wall, hori-
zontal wall, upper left corner, upper right corner, lower left
corner, lower right corner, cross wall, upward T wall, downward
T wall, leftward T wall, rightward T wall, no door, vertical
open door, horizontal open door, vertical closed door, horizon-
tal closed door, iron bars, tree, floor of a room, dark corri-
dor, lit corridor, stairs up, stairs down, ladder up, ladder
down, altar, grave, throne, kitchen sink, fountain, pool or
moat, ice, lava, vertical lowered drawbridge, horizontal low-
ered drawbridge, vertical raised drawbridge, horizontal raised
drawbridge, air, cloud, under water.








NetHack Guidebook 36



You might want to use `+' for the corners and T walls for a
more aesthetic, boxier display. Note that in the next release,
new symbols may be added, or the present ones rearranged.

Cannot be set with the `O' command.

effects
Set the graphics symbols for displaying special effects (de-
fault ``|-\\/*!)(0#@*/-\\||\\-//-\\| |\\-/''). The effects op-
tion should be followed by a string of 1-29 characters to be
used instead of the default special-effects characters. This
string is subjected to the same processing as the dungeon op-
tion.

The order of the symbols is: vertical beam, horizontal beam,
left slant, right slant, digging beam, camera flash beam, left
boomerang, right boomerang, four glyphs giving the sequence for
magic resistance displays, the eight surrounding glyphs for
swallowed display, nine glyphs for explosions. An explosion
consists of three rows (top, middle, and bottom) of three char-
acters. The explosion is centered in the center of this 3 by 3
array.

Note that in the next release, new symbols may be added, or the
present ones rearranged.

Cannot be set with the `O' command.

extmenu
Changes the extended commands interface to pop-up a menu of
available commands. It is keystroke compatible with the tradi-
tional interface except that it does not require that you hit
Enter. It is implemented only by the tty port (default off),
when the game has been compiled to support tty graphics.

female
An obsolete synonym for ``gender:female''. Cannot be set with
the `O' command.

fixinv
An object's inventory letter sticks to it when it's dropped
(default on). If this is off, dropping an object shifts all
the remaining inventory letters.

fruit
Name a fruit after something you enjoy eating (ex. ``fruit:man-
go'') (default ``slime mold''). Basically a nostalgic whimsy
that NetHack uses from time to time. You should set this to
something you find more appetizing than slime mold. Apples,
oranges, pears, bananas, and melons already exist in NetHack,
so don't use those.

gender
Your starting gender (gender:male or gender:female). You may








NetHack Guidebook 37



specify just the first letter. Although you can still denote
your gender using the ``male'' and ``female'' options, the
``gender'' option will take precedence. The default is to ran-
domly pick an appropriate gender. Cannot be set with the `O'
command.

help
If more information is available for an object looked at with
the `/' command, ask if you want to see it (default on). Turn-
ing help off makes just looking at things faster, since you
aren't interrupted with the ``More info?'' prompt, but it also
means that you might miss some interesting and/or important in-
formation.

horsename
Name your starting horse (ex. ``horsename:Trigger''). Cannot
be set with the `O' command.

IBMgraphics
Use a predefined selection of IBM extended ASCII characters to
display the dungeon/effects/traps instead of having to define a
full graphics set yourself (default off). This option also
sets up proper handling of graphics characters for such termi-
nals, so you should specify it when appropriate even if you
override the selections with your own graphics strings.

ignintr
Ignore interrupt signals, including breaks (default off).

legacy
Display an introductory message when starting the game (default
on).

lit_corridor
Show corridor squares seen by night vision or a light source
held by your character as lit (default off).

lootabc
Use the old `a', `b', and `c' keyboard shortcuts when looting,
rather than the mnemonics `o', `i', and `b' (default off).

mail
Enable mail delivery during the game (default on).

male
An obsolete synonym for ``gender:male''. Cannot be set with
the `O' command.

menustyle
Controls the interface used when you need to choose various ob-
jects (in response to the Drop command, for instance). The
value specified should be the first letter of one of the fol-
lowing: traditional, combination, partial, or full. Tradi-
tional was the only interface available for earlier versions;








NetHack Guidebook 38



it consists of a prompt for object class characters, followed
by an object-by-object prompt for all items matching the se-
lected object class(es). Combination starts with a prompt for
object class(es) of interest, but then displays a menu of
matching objects rather than prompting one-by-one. Partial
skips the object class filtering and immediately displays a
menu of all objects. Full displays a menu of object classes
rather than a character prompt, and then a menu of matching ob-
jects for selection.

menu_deselect_all
Menu character accelerator to deselect all items in a menu.
Implemented by the Amiga, Gem, X11 and tty ports. Default '-'.

menu_deselect_page
Menu character accelerator to deselect all items on this page
of a menu. Implemented by the Amiga, Gem and tty ports. De-
fault '\'.

menu_first_page
Menu character accelerator to jump to the first page in a menu.
Implemented by the Amiga, Gem and tty ports. Default '^'.

menu_headings
Controls how the headings in a menu are highlighted. Values
are 'bold', 'inverse', or 'underline'. Not all ports can actu-
ally display all three types.

menu_invert_all
Menu character accelerator to invert all items in a menu. Im-
plemented by the Amiga, Gem, X11 and tty ports. Default '@'.

menu_invert_page
Menu character accelerator to invert all items on this page of
a menu. Implemented by the Amiga, Gem and tty ports. Default
'~'.

menu_last_page
Menu character accelerator to jump to the last page in a menu.
Implemented by the Amiga, Gem and tty ports. Default '|'.

menu_next_page
Menu character accelerator to goto the next menu page. Imple-
mented by the Amiga, Gem and tty ports. Default '>'.

menu_previous_page
Menu character accelerator to goto the previous menu page. Im-
plemented by the Amiga, Gem and tty ports. Default '<'.

menu_search
Menu character accelerator to search for a menu item. Imple-
mented by the Amiga, Gem and X11 ports. Default ':'.










NetHack Guidebook 39



menu_select_all
Menu character accelerator to select all items in a menu. Im-
plemented by the Amiga, Gem, X11 and tty ports. Default '.'.

menu_select_page
Menu character accelerator to select all items on this page of
a menu. Implemented by the Amiga, Gem and tty ports. Default
','.

monsters
Set the characters used to display monster classes (default
``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU-
VWXYZ@ '&;:~]''). This string is subjected to the same pro-
cessing as the dungeon option. The order of the symbols is ant
or other insect, blob, cockatrice, dog or other canine, eye or
sphere, feline, gremlin, humanoid, imp or minor demon, jelly,
kobold, leprechaun, mimic, nymph, orc, piercer, quadruped, ro-
dent, arachnid or centipede, trapper or lurker above, horse or
unicorn, vortex, worm, xan or other mythical/fantastic insect,
light, zruty, angelic being, bat or bird, centaur, dragon, ele-
mental, fungus or mold, gnome, giant humanoid, invisible mon-
ster, jabberwock, Keystone Kop, lich, mummy, naga, ogre, pud-
ding or ooze, quantum mechanic, rust monster, snake, troll, um-
ber hulk, vampire, wraith, xorn, apelike creature, zombie, hu-
man, ghost, golem, demon, sea monster, lizard, long worm tail,
and mimic. Cannot be set with the `O' command.

msghistory
The number of top line messages to save (and recall with ^P)
(default 20). Cannot be set with the `O' command.

msg_window
Allows you to change the way recalled messages are displayed.
(It is currently implemented for tty only.) The possible val-
ues are:

s - single message (default, this was the behavior before 3.4.0).
c - combination, two messages as `single', then as `full'.
f - full window, oldest message first.
r - full window, newest message first.

For backward compatibility, no value needs to be specified
(which defaults to `full'), or it can be negated (which de-
faults to `single').

name
Set your character's name (defaults to your user name). You
can also set your character's role by appending a dash and one
or more letters of the role (that is, by suffixing one of -A -B
-C -H -K -M -P -Ra -Ro -S -T -V -W). If -@ is used for the
role, then a random one will be automatically chosen. Cannot
be set with the `O' command.










NetHack Guidebook 40



news
Read the NetHack news file, if present (default on). Since the
news is shown at the beginning of the game, there's no point in
setting this with the `O' command.

null
Send padding nulls to the terminal (default off).

number_pad
Use the number keys to move instead of [yuhjklbn] (default 0 or
off). (number_pad:2 invokes the old DOS behavior where `5'
means `g', meta-`5' means `G', and meta-`0' means `I'.)

objects
Set the characters used to display object classes (default
``])[="(%!?+/$*`0_.''). This string is subjected to the same
processing as the dungeon option. The order of the symbols is
illegal-object (should never be seen), weapon, armor, ring,
amulet, tool, food, potion, scroll, spellbook, wand, gold, gem
or rock, boulder or statue, iron ball, chain, and venom. Can-
not be set with the `O' command.

packorder
Specify the order to list object types in (default
``")[%?+!=/(*`0_''). The value of this option should be a
string containing the symbols for the various object types.
Any omitted types are filled in at the end from the previous
order.

perm_invent
If true, always display your current inventory in a window.
This only makes sense for windowing system interfaces that im-
plement this feature.

pettype
Specify the type of your initial pet, if you are playing a
character class that uses multiple types of pets; or choose to
have no initial pet at all. Possible values are ``cat'',
``dog'' and ``none''. Cannot be set with the `O' command.

pickup_burden
When you pick up an item that would exceed this encumbrance
level (Unburdened, Burdened, streSsed, straiNed, overTaxed, or
overLoaded), you will be asked if you want to continue. (De-
fault `S').

pickup_types
Specify the object types to be picked up when autopickup is on.
Default is all types. If your copy of the game has the experi-
mental compile time option AUTOPICKUP_EXCEPTIONS included, you
may be able to use autopickup_exception configuration file
lines to further refine autopickup behavior.










NetHack Guidebook 41



prayconfirm
Prompt for confirmation before praying (default on).

pushweapon
Using the `w' (wield) command when already wielding something
pushes the old item into your alternate weapon slot (default
off).

race
Selects your race (for example, ``race:human''). Default is
random. Cannot be set with the `O' command.

rest_on_space
Make the space bar a synonym for the `.' (rest) command (de-
fault off).

role
Pick your type of character (ex. ``role:Samurai''); synonym for
``character''. See ``name'' for an alternate method of speci-
fying your role. Normally only the first letter of the value
is examined; `r' is an exception with ``Rogue'', ``Ranger'',
and ``random'' values.

runmode
Controls the amount of screen updating for the map window when
engaged in multi-turn movement (running via shift+direction or
control+direction and so forth, or via the travel command or
mouse click). The possible values are:

teleport - update the map after movement has finished;
run - update the map after every seven or so steps;
walk - update the map after each step;
crawl - like walk, but pause briefly after each step.

This option only affects the game's screen display, not the ac-
tual results of moving. The default is `run'; versions prior
to 3.4.1 used `teleport' only. Whether or not the effect is
noticeable will depend upon the window port used or on the type
of terminal.

safe_pet
Prevent you from (knowingly) attacking your pets (default on).

scores
Control what parts of the score list you are shown at the end
(ex. ``scores:5 top scores/4 around my score/own scores'').
Only the first letter of each category (`t', `a', or `o') is
necessary.

showexp
Show your accumulated experience points on bottom line (default
off).










NetHack Guidebook 42



showrace
Display yourself as the glyph for your race, rather than the
glyph for your role (default off). Note that this setting af-
fects only the appearance of the display, not the way the game
treats you.

showscore
Show your approximate accumulated score on bottom line (default
off).

silent
Suppress terminal beeps (default on).

sortpack
Sort the pack contents by type when displaying inventory (de-
fault on).

sound
Enable messages about what your character hears (default on).
Note that this has nothing to do with your computer's audio ca-
pabilities. This option is only partly under player control.
The game toggles it off and on during and after sleep, for ex-
ample.

sparkle
Display a sparkly effect when a monster (including yourself) is
hit by an attack to which it is resistant (default on).

standout
Boldface monsters and ``--More--'' (default off).

suppress_alert
This option may be set to a NetHack version level to suppress
alert notification messages about feature changes for that and
prior versions (ex. ``suppress_alert:3.3.1'').

time
Show the elapsed game time in turns on bottom line (default
off).

timed_delay
When pausing momentarily for display effect, such as with ex-
plosions and moving objects, use a timer rather than sending
extra characters to the screen. (Applies to ``tty'' interface
only; ``X11'' interface always uses a timer based delay. The
default is on if configured into the program.)

tombstone
Draw a tombstone graphic upon your death (default on).

toptenwin
Put the ending display in a NetHack window instead of on stdout
(default off). Setting this option makes the score list visi-
ble when a windowing version of NetHack is started without a








NetHack Guidebook 43



parent window, but it no longer leaves the score list around
after game end on a terminal or emulating window.

traps
Set the graphics symbols for displaying traps (default
``^^^^^^^^^^^^^^^^^"^^^^''). The traps option should be fol-
lowed by a string of 1-22 characters to be used instead of the
default traps characters. This string is subjected to the same
processing as the dungeon option.

The order of the symbols is: arrow trap, dart trap, falling
rock trap, squeaky board, bear trap, land mine, rolling boulder
trap, sleeping gas trap, rust trap, fire trap, pit, spiked pit,
hole, trap door, teleportation trap, level teleporter, magic
portal, web, statue trap, magic trap, anti-magic field, poly-
morph trap.

Cannot be set with the `O' command.

travel
Allow the travel command (default on). Turning this option off
will prevent the game from attempting unintended moves if you
make inadvertent mouse clicks on the map window.

verbose
Provide more commentary during the game (default on).

windowtype
Select which windowing system to use, such as ``tty'' or
``X11'' (default depends on version). Cannot be set with the
`O' command.

9.5. Window Port Customization options

Here are explanations of the various options that are used
to customize and change the characteristics of the windowtype
that you have chosen. Character strings that are too long may be
truncated. Not all window ports will adjust for all settings
listed here. You can safely add any of these options to your
config file, and if the window port is capable of adjusting to
suit your preferences, it will attempt to do so. If it can't it
will silently ignore it. You can find out if an option is sup-
ported by the window port that you are currently using by check-
ing to see if it shows up in the Options list. Some options are
dynamic and can be specified during the game with the `O' com-
mand.

align_message
Where to align or place the message window (top, bottom, left,
or right)

align_status
Where to align or place the status window (top, bottom, left,
or right).








NetHack Guidebook 44



ascii_map
NetHack should display an ascii character map if it can.

color
NetHack should display color if it can for different monsters,
objects, and dungeon features

eight_bit_tty
NetHack should pass eight-bit character values (for example,
specified with the traps option) straight through to your ter-
minal (default off).

font_map
NetHack should use a font by the chosen name for the map win-
dow.

font_menu
NetHack should use a font by the chosen name for menu windows.

font_message
NetHack should use a font by the chosen name for the message
window.

font_status
NetHack should use a font by the chosen name for the status
window.

font_text
NetHack should use a font by the chosen name for text windows.

font_size_map
NetHack should use this size font for the map window.

font_size_menu
NetHack should use this size font for menu windows.

font_size_message
NetHack should use this size font for the message window.

font_size_status
NetHack should use this size font for the status window.

font_size_text
NetHack should use this size font for text windows.

fullscreen
NetHack should try and display on the entire screen rather than
in a window.

hilite_pet
Visually distinguish pets from similar animals (default off).
The behavior of this option depends on the type of windowing
you use. In text windowing, text highlighting or inverse video
is often used; with tiles, generally displays a heart symbol








NetHack Guidebook 45



near pets.

large_font
NetHack should use a large font.

map_mode
NetHack should display the map in the manner specified.

mouse_support
Allow use of the mouse for input and travel.

player_selection
NetHack should pop up dialog boxes, or use prompts for charac-
ter selection.

popup_dialog
NetHack should pop up dialog boxes for input.

preload_tiles
NetHack should preload tiles into memory. For example, in the
protected mode MSDOS version, control whether tiles get pre-
loaded into RAM at the start of the game. Doing so enhances
performance of the tile graphics, but uses more memory. (de-
fault on). Cannot be set with the `O' command.

scroll_amount
NetHack should scroll the display by this number of cells when
the hero reaches the scroll_margin.

scroll_margin
NetHack should scroll the display when the hero or cursor is
this number of cells away from the edge of the window.

softkeyboard
Display an onscreen keyboard. Handhelds are most likely to
support this option.

splash_screen
NetHack should display an opening splash screen when it starts
up (default yes).

tiled_map
NetHack should display a tiled map if it can.

tile_file
Specify the name of an alternative tile file to override the
default.

tile_height
Specify the preferred height of each tile in a tile capable
port.

tile_width
Specify the preferred width of each tile in a tile capable port








NetHack Guidebook 46



use_inverse
NetHack should display inverse when the game specifies it.

vary_msgcount
NetHack should display this number of messages at a time in the
message window.

windowcolors
NetHack should display windows with the specified fore-
ground/background colors if it can.

wraptext
NetHack port should wrap long lines of text if they don't fit
in the visible area of the window.

9.6. Platform-specific Customization options

Here are explanations of options that are used by specific
platforms or ports to customize and change the port behavior.

altkeyhandler
Select an alternate keystroke handler dll to load (Win32 tty
NetHack only). The name of the handler is specified without
the .dll extension and without any path information. Cannot be
set with the `O' command.

altmeta
(default on, AMIGA NetHack only).

BIOS
Use BIOS calls to update the screen display quickly and to read
the keyboard (allowing the use of arrow keys to move) on ma-
chines with an IBM PC compatible BIOS ROM (default off, OS/2,
PC, and ST NetHack only).

flush
(default off, AMIGA NetHack only).

MACgraphics
(default on, Mac NetHack only).

page_wait
(default on, Mac NetHack only).

rawio
Force raw (non-cbreak) mode for faster output and more bullet-
proof input (MS-DOS sometimes treats `^P' as a printer toggle
without it) (default off, OS/2, PC, and ST NetHack only).
Note: DEC Rainbows hang if this is turned on. Cannot be set
with the `O' command.

soundcard
(default on, PC NetHack only). Cannot be set with the `O' com-
mand.








NetHack Guidebook 47



subkeyvalue
(Win32 tty NetHack only). May be used to alter the value of
keystrokes that the operating system returns to NetHack to help
compensate for international keyboard issues. OPTIONS=subkey-
value:171/92 will return 92 to NetHack, if 171 was originally
going to be returned. You can use multiple subkeyvalue state-
ments in the config file if needed. Cannot be set with the `O'
command.

video
Set the video mode used (PC NetHack only). Values are `autode-
tect', `default', or `vga'. Setting `vga' (or `autodetect'
with vga hardware present) will cause the game to display
tiles. Cannot be set with the `O' command.

videocolors
Set the color palette for PC systems using NO_TERMS (default
4-2-6-1-5-3-15-12-10-14-9-13-11, (PC NetHack only). The order
of colors is red, green, brown, blue, magenta, cyan,
bright.white, bright.red, bright.green, yellow, bright.blue,
bright.magenta, and bright.cyan. Cannot be set with the `O'
command.

videoshades
Set the intensity level of the three gray scales available (de-
fault dark normal light, PC NetHack only). If the game display
is difficult to read, try adjusting these scales; if this does
not correct the problem, try !color. Cannot be set with the
`O' command.

9.7. Configuring autopickup exceptions

There is an experimental compile time option called AU-
TOPICKUP_EXCEPTIONS. If your copy of the game was built with
that option defined, you can further refine the behavior of the
autopickup option beyond what is available through the pick-
up_types option.

By placing autopickup_exception lines in your configuration
file, you can define patterns to be checked when the game is
about to autopickup something.

autopickup_exception
Sets an exception to the pickup_types option. The autopick-
up_exception option should be followed by a string of 1-80
characters to be used as a pattern to match against the singu-
lar form of the description of an object at your location.

You may use the following special characters in a pattern:

*--- matches 0 or more characters.
?--- matches any single character.










NetHack Guidebook 48



In addition, some characters are treated specially if they
occur as the first character in the string pattern, specifically:

< - always pickup an object that matches the pattern that follows.
> - never pickup an object that matches the pattern that follows.

Can be set with the `O' command, but the setting is not pre-
served across saves and restores.

Here's a couple of examples of autopickup_exceptions:

autopickup_exception="<*arrow"
autopickup_exception=">*corpse"
autopickup_exception=">* cursed*"

The first example above will result in autopickup of any type of
arrow. The second example results in the exclusion of any corpse
from autopickup. The last example results in the exclusion of
items known to be cursed from autopickup. A `never pickup' rule
takes precedence over an `always pickup' rule if both match.

9.8. Configuring User Sounds

Some platforms allow you to define sound files to be played
when a message that matches a user-defined pattern is delivered
to the message window. At this time the Qt port and the win32tty
and win32gui ports support the use of user sounds.

The following config file entries are relevant to mapping
user sounds to messages:

SOUNDDIR
The directory that houses the sound files to be played.

SOUND
An entry that maps a sound file to a user-specified message
pattern. Each SOUND entry is broken down into the following
parts:

MESG - message window mapping (the only one supported in 3.4).
pattern - the pattern to match.
sound file - the sound file to play.
volume - the volume to be set while playing the sound file.

The exact format for the pattern depends on whether the
platform is built to use ``regular expressions'' or NetHack's own
internal pattern matching facility. The ``regular expressions''
matching can be much more sophisticated than the internal NetHack
pattern matching, but requires 3rd party libraries on some plat-
forms. There are plenty of references available elsewhere for
explaining ``regular expressions''. You can verify which pattern
matching is used by your port with the #version command.










NetHack Guidebook 49



NetHack's internal pattern matching routine uses the follow-
ing special characters in its pattern matching:

*--- matches 0 or more characters.
?--- matches any single character.

Here's an example of a sound mapping using NetHack's inter-
nal pattern matching facility:

SOUND=MESG "*chime of a cash register*" "gong.wav" 50

specifies that any message with "chime of a cash register" con-
tained in it will trigger the playing of "gong.wav". You can
have multiple SOUND entries in your config file.

9.9. Configuring NetHack for Play by the Blind

NetHack can be set up to use only standard ASCII characters
for making maps of the dungeons. This makes the MS-DOS versions
of NetHack completely accessible to the blind who use speech
and/or Braille access technologies. Players will require a good
working knowledge of their screen-reader's review features, and
will have to know how to navigate horizontally and vertically
character by character. They will also find the search capabili-
ties of their screen-readers to be quite valuable. Be certain to
examine this Guidebook before playing so you have an idea what
the screen layout is like. You'll also need to be able to locate
the PC cursor. It is always where your character is located.
Merely searching for an @-sign will not always find your charac-
ter since there are other humanoids represented by the same sign.
Your screen-reader should also have a function which gives you
the row and column of your review cursor and the PC cursor.
These co-ordinates are often useful in giving players a better
sense of the overall location of items on the screen.

While it is not difficult for experienced users to edit the
defaults.nh file to accomplish this, novices may find this task
somewhat daunting. Included in all official distributions of
NetHack is a file called NHAccess.nh. Replacing defaults.nh with
this file will cause the game to run in a manner accessible to
the blind. After you have gained some experience with the game
and with editing files, you may want to alter settings to better
suit your preferences. Instructions on how to do this are includ-
ed in the NHAccess.nh file itself. The most crucial settings to
make the game accessible are:

IBMgraphics
Disable IBMgraphics by commenting out this option.

menustyle:traditional
This will assist in the interface to speech synthesizers.

number_pad
A lot of speech access programs use the number-pad to review








NetHack Guidebook 50



the screen. If this is the case, disable the number_pad option
and use the traditional Rogue-like commands.

Character graphics
Comment out all character graphics sets found near the bottom
of the defaults.nh file. Most of these replace NetHack's de-
fault representation of the dungeon using standard ASCII char-
acters with fancier characters from extended character sets,
and these fancier characters can annoy screen-readers.

10. 得分

NetHack maintains a list of the top scores or scorers on
your machine, depending on how it is set up. In the latter case,
each account on the machine can post only one non-winning score
on this list. If you score higher than someone else on this
list, or better your previous score, you will be inserted in the
proper place under your current name. How many scores are kept
can also be set up when NetHack is compiled.

Your score is chiefly based upon how much experience you
gained, how much loot you accumulated, how deep you explored, and
how the game ended. If you quit the game, you escape with all of
your gold intact. If, however, you get killed in the Mazes of
Menace, the guild will only hear about 90% of your gold when your
corpse is discovered (adventurers have been known to collect
finder's fees). So, consider whether you want to take one last
hit at that monster and possibly live, or quit and stop with
whatever you have. If you quit, you keep all your gold, but if
you swing and live, you might find more.

If you just want to see what the current top players/games
list is, you can type nethack -s all on most versions.


11. 探索模式

NetHack is an intricate and difficult game. Novices might
falter in fear, aware of their ignorance of the means to survive.
Well, fear not. Your dungeon may come equipped with an ``ex-
plore'' or ``discovery'' mode that enables you to keep old save
files and cheat death, at the paltry cost of not getting on the
high score list.

There are two ways of enabling explore mode. One is to
start the game with the -X switch. The other is to issue the `X'
command while already playing the game. The other benefits of
explore mode are left for the trepid reader to discover.


12. Credits

The original hack game was modeled on the Berkeley UNIX
rogue game. Large portions of this paper were shamelessly








NetHack Guidebook 51



cribbed from A Guide to the Dungeons of Doom, by Michael C. Toy
and Kenneth C. R. C. Arnold. Small portions were adapted from
Further Exploration of the Dungeons of Doom, by Ken Arromdee.

NetHack is the product of literally dozens of people's work.
Main events in the course of the game development are described
below:


Jay Fenlason wrote the original Hack, with help from Kenny
Woodland, Mike Thome and Jon Payne.

Andries Brouwer did a major re-write, transforming Hack into
a very different game, and published (at least) three versions
(1.0.1, 1.0.2, and 1.0.3) for UNIX machines to the Usenet.

Don G. Kneller ported Hack 1.0.3 to Microsoft C and MS-DOS,
producing PC HACK 1.01e, added support for DEC Rainbow graphics
in version 1.03g, and went on to produce at least four more ver-
sions (3.0, 3.2, 3.51, and 3.6).

R. Black ported PC HACK 3.51 to Lattice C and the Atari
520/1040ST, producing ST Hack 1.03.

Mike Stephenson merged these various versions back together,
incorporating many of the added features, and produced NetHack
1.4. He then coordinated a cast of thousands in enhancing and
debugging NetHack 1.4 and released NetHack versions 2.2 and 2.3.

Later, Mike coordinated a major rewrite of the game, heading
a team which included Ken Arromdee, Jean-Christophe Collet, Steve
Creps, Eric Hendrickson, Izchak Miller, John Rupley, Mike Threep-
oint, and Janet Walz, to produce NetHack 3.0c.

NetHack 3.0 was ported to the Atari by Eric R. Smith, to
OS/2 by Timo Hakulinen, and to VMS by David Gentzel. The three
of them and Kevin Darcy later joined the main development team to
produce subsequent revisions of 3.0.

Olaf Seibert ported NetHack 2.3 and 3.0 to the Amiga. Norm
Meluch, Stephen Spackman and Pierre Martineau designed overlay
code for PC NetHack 3.0. Johnny Lee ported NetHack 3.0 to the
Macintosh. Along with various other Dungeoneers, they continued
to enhance the PC, Macintosh, and Amiga ports through the later
revisions of 3.0.

Headed by Mike Stephenson and coordinated by Izchak Miller
and Janet Walz, the development team which now included Ken Ar-
romdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, Matt
Day, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric
Raymond, and Eric Smith undertook a radical revision of 3.0.
They re-structured the game's design, and re-wrote major parts of
the code. They added multiple dungeons, a new display, special
individual character quests, a new endgame and many other new








NetHack Guidebook 52



features, and produced NetHack 3.1.

Ken Lorber, Gregg Wonderly and Greg Olson, with help from
Richard Addison, Mike Passaretti, and Olaf Seibert, developed
NetHack 3.1 for the Amiga.

Norm Meluch and Kevin Smolkowski, with help from Carl Sche-
lin, Stephen Spackman, Steve VanDevender, and Paul Winner, ported
NetHack 3.1 to the PC.

Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike
Engber, David Hairston, Michael Hamel, Jonathan Handler, Johnny
Lee, Tim Lennan, Rob Menke, and Andy Swanson, developed NetHack
3.1 for the Macintosh, porting it for MPW. Building on their de-
velopment, Barton House added a Think C port.

Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith port-
ed NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua
Delahunty, was responsible for the VMS version of NetHack 3.1.
Michael Allison ported NetHack 3.1 to Windows NT.

Dean Luick, with help from David Cohrs, developed NetHack
3.1 for X11. Warwick Allison wrote a tiled version of NetHack
for the Atari; he later contributed the tiles to the DevTeam and
tile support was then added to other platforms.

The 3.2 development team, comprised of Michael Allison, Ken
Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy,
Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric
Smith, Mike Stephenson, Janet Walz, and Paul Winner, released
version 3.2 in April of 1996.

Version 3.2 marked the tenth anniversary of the formation of
the development team. In a testament to their dedication to the
game, all thirteen members of the original development team re-
mained on the team at the start of work on that release. During
the interval between the release of 3.1.3 and 3.2, one of the
founding members of the development team, Dr. Izchak Miller, was
diagnosed with cancer and passed away. That release of the game
was dedicated to him by the development and porting teams.

During the lifespan of NetHack 3.1 and 3.2, several enthusi-
asts of the game added their own modifications to the game and
made these ``variants'' publicly available:

Tom Proudfoot and Yuval Oren created NetHack++, which was
quickly renamed NetHack--. Working independently, Stephen White
wrote NetHack Plus. Tom Proudfoot later merged NetHack Plus and
his own NetHack-- to produce SLASH. Larry Stewart-Zerba and War-
wick Allison improved the spell casting system with the Wizard
Patch. Warwick Allison also ported NetHack to use the Qt inter-
face.










NetHack Guidebook 53



Warren Cheung combined SLASH with the Wizard Patch to pro-
duce Slash'em, and with the help of Kevin Hugo, added more fea-
tures. Kevin later joined the DevTeam and incorporated the best
of these ideas in NetHack 3.3.

The final update to 3.2 was the bug fix release 3.2.3, which
was released simultaneously with 3.3.0 in December 1999 just in
time for the Year 2000.

The 3.3 development team, consisting of Michael Allison, Ken
Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy,
Timo Hakulinen, Kevin Hugo, Steve Linhart, Ken Lorber, Dean
Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet Walz, and
Paul Winner, released 3.3.0 in December 1999 and 3.3.1 in August
of 2000.

Version 3.3 offered many firsts. It was the first version to
separate race and profession. The Elf class was removed in pref-
erence to an elf race, and the races of dwarves, gnomes, and orcs
made their first appearance in the game alongside the familiar
human race. Monk and Ranger roles joined Archeologists, Barbar-
ians, Cavemen, Healers, Knights, Priests, Rogues, Samurai,
Tourists, Valkyries and of course, Wizards. It was also the
first version to allow you to ride a steed, and was the first
version to have a publicly available web-site listing all the
bugs that had been discovered. Despite that constantly growing
bug list, 3.3 proved stable enough to last for more than a year
and a half.

The 3.4 development team initially consisted of Michael Al-
lison, Ken Arromdee, David Cohrs, Jessie Collet, Kevin Hugo, Ken
Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and
Paul Winner, with Warwick Allison joining just before the re-
lease of NetHack 3.4.0 in March 2002.

As with version 3.3, various people contributed to the game
as a whole as well as supporting ports on the different platforms
that NetHack runs on:

Pat Rankin maintained 3.4 for VMS.

Michael Allison maintained NetHack 3.4 for the MS-DOS plat-
form. Paul Winner and Yitzhak Sapir provided encouragement.

Dean Luick, Mark Modrall, and Kevin Hugo maintained and en-
hanced the Macintosh port of 3.4.

Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas,
and Yitzhak Sapir maintained and enhanced 3.4 for the Microsoft
Windows platform. Alex Kompel contributed a new graphical inter-
face for the Windows port. Alex Kompel also contributed a Win-
dows CE port for 3.4.1.










NetHack Guidebook 54



Ron Van Iwaarden maintained 3.4 for OS/2.

Janne Salmijarvi and Teemu Suikki maintained and enhanced
the Amiga port of 3.4 after Janne Salmijarvi resurrected it for
3.3.1.

Christian ``Marvin'' Bressler maintained 3.4 for the Atari
after he resurrected it for 3.3.1.

There is a NetHack web site maintained by Ken Lorber at
http://www.nethack.org/.

- - - - - - - - - -

From time to time, some depraved individual out there in
netland sends a particularly intriguing modification to help out
with the game. The Gods of the Dungeon sometimes make note of
the names of the worst of these miscreants in this, the list of
Dungeoneers:











































NetHack Guidebook 55



Adam Aronow Izchak Miller Mike Stephenson
Alex Kompel J. Ali Harlow Norm Meluch
Andreas Dorn Janet Walz Olaf Seibert
Andy Church Janne Salmijarvi Pasi Kallinen
Andy Swanson Jean-Christophe Collet Pat Rankin
Ari Huttunen Jochen Erwied Paul Winner
Barton House John Kallen Pierre Martineau
Benson I. Margulies John Rupley Ralf Brown
Bill Dyer John S. Bien Ray Chason
Boudewijn Waijers Johnny Lee Richard Addison
Bruce Cox Jon W{tte Richard Beigel
Bruce Holloway Jonathan Handler Richard P. Hughey
Bruce Mewborne Joshua Delahunty Rob Menke
Carl Schelin Keizo Yamamoto Robin Johnson
Chris Russo Ken Arnold Roderick Schertler
David Cohrs Ken Arromdee Roland McGrath
David Damerell Ken Lorber Ron Van Iwaarden
David Gentzel Ken Washikita Ronnen Miller
David Hairston Kevin Darcy Ross Brown
Dean Luick Kevin Hugo Sascha Wostmann
Del Lamb Kevin Sitze Scott Bigham
Deron Meranda Kevin Smolkowski Scott R. Turner
Dion Nicolaas Kevin Sweet Stephen Spackman
Dylan O'Donnell Lars Huttar Stephen White
Eric Backus Malcolm Ryan Steve Creps
Eric Hendrickson Mark Gooderum Steve Linhart
Eric R. Smith Mark Modrall Steve VanDevender
Eric S. Raymond Marvin Bressler Teemu Suikki
Erik Andersen Matthew Day Tim Lennan
Frederick Roeber Merlyn LeRoy Timo Hakulinen
Gil Neiger Michael Allison Tom Almy
Greg Laskin Michael Feir Tom West
Greg Olson Michael Hamel Warren Cheung
Gregg Wonderly Michael Sokolov Warwick Allison
Hao-yang Wang Mike Engber Yitzhak Sapir
Helge Hafting Mike Gallop
Irina Rempt-Drijfhout Mike Passaretti

Brand and product names are trademarks or registered trademarks
of their respective holders.
















NetHack 3.4 December 2, 2003






====
感觉我前后几次翻译已经出现有不一致的地方了啊,而且转写或许是比翻译更好的选择。