SideMenu
hackaholic
編集
WikiMenu
開始行:
[[ソースコード]]~
http://members.shaw.ca/rob.ellwood/sources.txtより勝手に...
この項目はまだ書きかけです。
別翻訳:
http://sourceforge.jp/projects/jslashem/docs/jsources/ja/...
#contents
*1. この文書について [#d3c1bcec]
ネットハックを何[ヶ月|年]も楽しんでいるかい?何かこのゲー...
'94くらいからネットハックのソースを覗きはじめたんだ。この...
今、九ヶ月かかって、私はこのソースのおおまかな構造は捉え...
多分この文書には間違ってる箇所もあると思う。そして、多分…...
お願いだから、この文書は''自己責任''で使用してほしい。い...
この文書の全ての内容はNethack 3.1.3(この文書を書いてる時...
*2. よし、このゲームに変更を加えていくぞ! [#w0fa1f37]
さあ、君は先週ネットハックを始めて、Unixマシンのアカウン...
言い換えよう。この文書を読むためには少なくとも次のものが...
- 今あなたが使っているOSに関する基礎知識。ファイルを作っ...
- C言語に関するある程度の知識。printf("Hello world\n") く...
- Cコンパイラとそれに対する慣れ。
- 祝福された能力獲得の薬
*3. まず最初に [#p8513c03]
まずあなたは自分でソースをコンパイルしなくてはいけない。...
ちゃんとコンパイルに通せれば準備は完了だ。
*4. ウィザードモード [#i6dd6c6f]
恐らくは知っての通り、ウィザードモードはいくつかのコマン...
^E == 隠された扉や罠を見つける。
^F == 魔法の地図の魔法を唱える。
^G == 怪物を作る。
^I == 背負い袋の中のアイテムを識別する。
^O == 特別な階層の位置を知る。
^T == 同じ階層内でテレポートする。
^V == 違う階層へテレポートする。
^W == 願う。
^X == 能力を見る。
それに、いくつかの振る舞いが変わる。e.g. 怪物を作る巻物を...
nethack -u wizard -D
これでうまくいくはずだけど、次の点に注意:
- UNIX機を使っているなら、コンパイル時に指定したユーザID...
- include/config.hの中の#define WIZARDがある行の辺りを見...
ネットハックを改良していく中で、このモードをしっかり活用...
*5. 新しい階層をつくる [#b20b9045]
新しい階層を作るのは簡単だ。実を言うと、Cについて何も知ら...
ネットハックをコンパイルした際、utilディレクトリ下に'lev_...
このプログラムを使えばネットハックに新しい階層を加えるこ...
mylevel.des -----------
|
__ | __
\ V /
___\___/___
| | _
|lev_comp |/
| | -----> mylevel...
-------------
lev_compには'lev_comp.6'という名前のマニュアルがついてい...
nroff -man lev_comp.6 | more
もしそうでないなら、うーむ、.SHとか.PPとかのゴミに慣れて...
このマニュアルには(結構わかりづらいけど).desファイルの作...
例として、"dat/castle.des"ファイルの始めの部分を見てみよ...
MAZE:"castle",random
FLAGS: noteleport
GEOMETRY:center,center
MAP
}}}}}}}}}.............................................}}...
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-...
}|.....|-----------------------------------------------|...
}|.....+...............................................+...
}-------------------------------+-----------------------...
}}}}}}|........|..........+...........|.......S.S..........
.....}|........|..........|...........|.......|.|..........
.....}|........------------...........---------S--------...
.....}|...{....+..........+.........\.S....................
.....}|........------------...........---------S--------...
.....}|........|..........|...........|.......|.|..........
}}}}}}|........|..........+...........|.......S.S..........
}-------------------------------+-----------------------...
}|.....+...............................................+...
}|.....|-----------------------------------------------|...
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-...
}}}}}}}}}.............................................}}...
ENDMAP
簡単そうだろ?このファイルから城レベルができるんだ。ここ...
残りの部分でドア、罠、アイテム、そして怪物をランダムに、...
マニュアルに文法が示してあるから、思い切って全部作りかえ...
次のような行を
MONSTER:'@',"soldier",(08,06)
こんな風に変えてみよう。
MONSTER:'H',"minotaur",(08,06)
(ここでは特定の怪物(ミノタウロス)を選んでいるけど、こんな...
MONSTER:'D',RANDOM,(08,06) # ランダムにドラゴンをつくる
すれば種類で選ぶこともできたんだ。)
新しいcastle.desを保存して、datディレクトリから次のコマン...
../util/lev_comp castle.des (MS-DOSを使ってい...
これで新しい'castle.lev'ファイルが'dat'ディレクトリに出来...
さて今度はオリジナルを作ってみる番だ。僕たちがやりたかっ...
まずそのために、別のコンパイラを紹介しよう:dgn_comp,ダン...
問題の迷宮の設計図は"dungeon.def"と呼ばれている:
DUNGEON: "The Dungeons of Doom" "D" (25, 5)
ALIGNMENT: unaligned
%MULDGN BRANCH: "The Gnomish Mines" @ (2, 3)
%REINCARNATION LEVEL: "rogue" "R" @ (15, 4)
LEVEL: "oracle" "O" @ (5, 5)
LEVALIGN: neutral
LEVEL: "bigroom" "B" @ (10, 3) 15
%MULDGN CHAINBRANCH: "The Quest" "oracle" + (6, 2) po...
%MULDGN BRANCH: "Fort Ludios" @ (18, 4) portal
RNDLEVEL: "medusa" "none" @ (-5, 4) 2
LEVALIGN: chaotic
LEVEL: "castle" "none" @ (-1, 0)
CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down
BRANCH: "The Elemental Planes" @ (1, 0) no_down up
おそらく知っての通り、運命の大迷宮には特殊な階層(e.g.ビ...
mylevelという名前の階層をmylevel.desに作ったとしよう:
MAZE:"mylevel",' '
(*重要*:ファイル自体の名前はMAZEの行で指定したものと同じ...
運命の大迷宮にこの階層を加えるには、例えばビッグルームの...
LEVEL: "mylevel" "none" @ (15,2)
と入れればいい。これは、mylevelという階層を地下15+-2階の...
その後、../util/dgn_comp dungeon.def を走らせて'dungeon'...
もし新しい階層を読み込むときに何らかのエラーが発生した場...
最後に、もし新しい分岐を作りたいときには、次のように入力...
%MULDGN BRANCH: "newbranch" @ (18, 1)
その後に続けて、分岐の階層を指定していく。
DUNGEON: "newbranch" "S" (4,0)
DESCRIPTION: mazelike
LEVEL: "mylevel1" "none" @ (1, 0)
LEVEL: "mylevel2" "none" @ (2, 0)
LEVEL: "mylevel3" "none" @ (3, 0)
LEVEL: "mylevel4" "none" @ (4, 0)
さあ、早速.desファイルをいじって文法に慣れてみよう。新し...
もしかしたらこの章で君のしたいことは全部実現できるかもし...
*6. 新しい怪物をつくる [#r388af7d]
"気をつけろ!もう戻って来れないかもしれないぞ!それ...
ようこそ、モルドールの闇部へ...苦しいかもしれないが見返り...
さあ、はじめようか。
まず始めに、二つの''巨大''な配列があることを覚えておこう...
{"mymonster", S_HUMAN, 1, 10, 10, 0, 0, G_GENO | ...
{ { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
NO_ATTK, NO_ATTK, NO_ATTK },
WT_HUMAN, 400, PL_NSIZ, MS_HUMANOID, MZ_HUMAN, 0,...
M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMEST...
-name: ("mymonster") 怪物の名前
-symbol: (S_HUMAN) 使われる文字。monsym.hに全て定義してあ...
-level: (1) このレベルに達して初めてこの怪物が生成される。
-move rate: (10) 速さ。0 -全く動かない- から 30 -かなり素...
-[[AC]]: (10) ようくご存じでしょ?
-magic resistance: (0) 0から127まで
-alignment: (0) 属性。負の値は混沌、正の値は秩序を表す。
-creation/geno flags: (G_GENO | G_NOGEN) 生成フラグ。以下...
G_UNIQ /* 一度しか生成されない */
G_NOHELL /* ゲヘナでは生成されない */
G_HELL /* ゲヘナ以外では生成されない */
G_NOGEN /* 自然生成されない */
G_NOCORPSE /* 絶対に死体を残さない */
G_SGROUP /* 通常小さな集団で生成される */
G_LGROUP /* 通常大きな集団で生成される */
G_GENO /* 虐殺可能 */
一部訳略:その他はmonsym.h(現バージョン(3.4.3)で...
-attack: ({ { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,...
( 攻撃方法, 攻撃の種類, ダイス倍数, ダイスの面 )
攻撃方法は以下のうち一つ:
AT_NONE /* 攻撃しない (ex. 酸のブロッブ) */
AT_CLAW /* 爪 (パンチ、叩く、 等々.) */
AT_BITE /* 噛みつき */
AT_KICK /* 蹴り */
AT_BUTT /* 頭突き (ex. ユニコーン) */
AT_TUCH /* 触る */
AT_STNG /* 刺す */
AT_HUGS /* 抱きつき さば折り? */
AT_SPIT /* 唾吐き - 遠距離攻撃 */
AT_ENGL /* 飲み込み (e.g. 紫ワーム、ほこ...
AT_BREA /* ブレス - 遠距離攻撃 */
AT_EXPL /* 爆発 - 近づいて */
AT_GAZE /* にらみ - 遠距離攻撃 */
AT_TENT /* 触手 */
AT_WEAP /* 武器を用いる */
AT_MAGC /* 魔法を用いる */
攻撃の種類は以下の一つ:
AD_PHYS /* 通常の物理攻撃 */
AD_MAGM /* 魔法の矢 */
AD_FIRE /* 火のダメージ */
AD_COLD /* 冷気ダメージ */
AD_SLEE /* 睡眠の矢 */
AD_DISN /* 分解 (死の光線) */
AD_ELEC /* 電撃ダメージ */
AD_DRST /* 力の低下 (毒) */
AD_ACID /* 酸のダメージ */
AD_SPC1 /* buzz()((zap.c内にある光線の処...
AD_SPC2 /* buzz()用の拡張 */
AD_BLND /* 盲目 (光る目) */
AD_STUN /* 眩暈 */
AD_SLOW /* 減速 */
AD_PLYS /* 麻痺 */
AD_DRLI /* レベルドレイン (ヴァンパイア等...
AD_DREN /* 魔力吸い取り */
AD_LEGS /* 脚を傷つける (ザン) */
AD_STON /* 石化 (メデューサ、コカトリス等...
AD_STCK /* 捕まえる (ミミック等) */
AD_SGLD /* 金を盗む (レプラコーン等) */
AD_SITM /* アイテムを盗む (ニンフ) */
AD_SEDU /* かどわかし、複数のアイテムを盗...
AD_TLPT /* 瞬間移動させる (量子物理学) */
AD_RUST /* 装備を錆びさせる (錆びの怪物)*/
AD_CONF /* 混乱させる (アンバーハルク) */
AD_DGST /* 消化する (トラッパー等) */
AD_HEAL /* 回復させる (看護婦) */
AD_WRAP /* 捕まえる (うなぎ等) */
AD_WERE /* 獣化病にする */
AD_DRDX /* 器用さを減らす (クアシト) */
AD_DRCO /* 耐久を減らす */
AD_DRIN /* 知性を減らす (マインドフレイア...
AD_DISE /* 病気にする */
AD_DCAY /* 装備を腐らせる (茶色プリン) */
AD_SSEX /* 淫魔の誘惑 */
AD_DETH /* デス用 */
AD_PEST /* ペスティレンス用 */
AD_FAMN /* フェミン用 */
AD_CLRC /* 僧侶魔法 */
AD_SPEL /* ランダム魔法 */
AD_RBRE /* ランダムブレス */
AD_SAMU /* 魔除けを盗む (イェンダーの魔法...
AD_CURS /* 能力を盗る (グレムリン等) */
ダイス倍数/ダイスの面はダメージをさだめる:
1,6 ならばダメージは1から6の間
3,7 ならばダメージは3から21の間
よって、怪物は一ターンに最大六回攻撃できる。それより少な...
-weight: (WT_HUMAN) WT_DRAGON, WT_HUMAN,WT_ELFといった定...
-nutritional value: (400) 栄養価
-extension length: (PL_NSIZ) さあここが難関。これは通常の...
-sounds made: (MS_HUMAN). 発する音 (monflag.hより)
MS_SILENT /* 音を出さない */
MS_BARK /* 満月ならば吠える */
MS_MEW /* にゃー(ネコ等) */
MS_ROAR /* 吠える(ムーマク等) */
MS_GROWL /* うなる(吸魔の怪物等) */
MS_SQEEK /* ちゅーちゅー鳴く(ねずみ等) */
MS_SQAWK /* さえずる(鳥類) */
MS_HISS /* しゅー(蛇等) */
MS_BUZZ /* 羽音をたてる (殺人蜂等) */
MS_GRUNT /* ぶーぶー言う (あるいは独自の言...
MS_NEIGH /* いななく */
MS_WAIL /* もの悲しい音をだす(影) */
MS_GURGLE /* ごぼごぼ (ショウビレックス) */
MS_BURBLE /* ぶくぶく (ジャバウォック) */
MS_ANIMAL /* 動物の音をたてる */
MS_SHRIEK /* 叫んでほかの怪物を目覚めさせる...
MS_BONES /* 骨をならす (骸骨) */
MS_LAUGH /* ニヤニヤ、クスクス、嗤う */
MS_MUMBLE /* 何かを言う */
MS_IMITATE /* 何かをまねる (レオクロッタ) */
MS_ORC /* オークとしてしゃべる */
MS_HUMANOID /* 一般的な人型生物 */
MS_ARREST /* "Stop in the name of the law!"...
MS_SOLDIER /* 軍人として話す */
MS_GUARD /* "Please drop that gold and fol...
MS_DJINNI /* "Thank you for freeing me!" (...
MS_NURSE /* "Take off your shirt, please."...
MS_SEDUCE /* "Hello, sailor." (ニンフ) */
MS_VAMPIRE /* (吸血鬼等) */
MS_BRIBE /* 通行料を要求する */
MS_CUSS /* 非難したり (悪魔等) 脅したりす...
MS_RIDER /* 天上界の乗り手たち */
MS_LEADER /* クエストリーダー */
MS_NEMESIS /* クエストネメシス */
MS_GUARDIAN /* クエストの仲間 */
MS_SELL /* 支払いを求めたり、万引きについ...
MS_ORACLE /* 占う */
MS_PRIEST /* 寄付をもとめたり、文無しを追っ...
-physical size: (MZ_HUMAN) 大きさ。以下のうち一つ
MZ_TINY 0 /* < 2' */
MZ_SMALL 1 /* 2-4' */
MZ_MEDIUM 2 /* 4-7' */
MZ_HUMAN MZ_MEDIUM /* 人の大きさ */
MZ_LARGE 3 /* 7-12' */
MZ_HUGE 4 /* 12-25' */
MZ_GIGANTIC 7 /* 計り知れない大...
-resistance : (0) 食べた時得られるかもしれない特性
MR_FIRE /* 火に対する耐性 */
MR_COLD /* 冷気に対する耐性 */
MR_SLEEP /* 睡眠に対する耐性 */
MR_DISINT /* 分解に対する耐性 */
MR_ELEC /* 電撃に対する耐性 */
MR_POISON /* 毒に対する耐性 */
MR_ACID /* 酸に対する耐性 */
MR_STONE /* 石化に対する耐性 */
-First group of flags: (M1_NEEDPICK | M1_HUMANOID | M1_OM...
M1_FLY /* 浮かんだり飛んだりする */
M1_SWIM /* 水中を移動できる */
M1_AMORPHOUS /* ドアから染み出ることができる */
M1_WALLWALK /* 壁の中を動ける */
M1_CLING /* 天井に張りつける */
M1_TUNNEL /* 壁を掘り進める */
M1_NEEDPICK /* つるはしを持てば壁を掘り進める...
M1_CONCEAL /* アイテムの下に隠れられる */
M1_HIDE /* 隠れることができる */
M1_AMPHIBIOUS /* 水中でも生きることができる */
M1_BREATHLESS /* 呼吸しない */
M1_NOEYES /* 眼が無い */
M1_NOHANDS /* 手が無い */
M1_NOLIMBS /* 脚が無い */
M1_NOHEAD /* 頭が無い */
M1_MINDLESS /* 意思を持たない */
M1_HUMANOID /* 人型である */
M1_ANIMAL /* 動物型である */
M1_SLITHY /* 蛇型である */
M1_UNSOLID /* 物質的な体を持たない */
M1_THICK_HIDE /* 厚い皮や鱗を持つ */
M1_OVIPAROUS /* 卵を産める */
M1_REGEN /* 超回復能力を持つ */
M1_SEE_INVIS /* 透明視できる */
M1_TPORT /* 瞬間移動できる */
M1_TPORT_CNTRL /* 瞬間移動制御できる */
M1_ACID /* 酸を持つ */
M1_POIS /* 毒を持つ */
M1_CARNIVORE /* 動物食である */
M1_HERBIVORE /* 植物食である */
M1_OMNIVORE /* 雑食である */
M1_METALLIVORE /* 金属食である */
-Second group of flags: (M2_HUMAN | M2_STRONG | M2_COLLEC...
M2_NOPOLY /* プレイヤーは変化できない */
M2_UNDEAD /* アンデッドである */
M2_WERE /* 獣人である */
M2_ELF /* エルフである */
M2_DWARF /* ドワーフである */
M2_GIANT /* 巨人である */
M2_ORC /* オークである */
M2_HUMAN /* 人である */
M2_DEMON /* 悪魔である */
M2_MERC /* 番人や兵士である */
M2_LORD /* その種の王である */
M2_PRINCE /* その種の王子である */
M2_MINION /* 神の僕である */
M2_MALE /* 常にオス/男で生成される */
M2_FEMALE /* 常にメス/女で生成される */
M2_NEUTER /* オスでもメスでもない */
M2_PNAME /* 名前が固有名詞である */
M2_HOSTILE /* 常に敵対的である */
M2_PEACEFUL /* 常に友好的である */
M2_DOMESTIC /* 餌付けしてペットにできる */
M2_WANDER /* ふらふら動く */
M2_STALK /* 別の階へも追っていく */
M2_NASTY /* 特にいやらしい怪物である (経験...
M2_STRONG /* 強い/大きい怪物である */
M2_ROCKTHROW /* 巨岩を投げる */
M2_GREEDY /* 金が好きである */
M2_JEWELS /* 宝石が好きである */
M2_COLLECT /* 武器と食べ物を拾う */
M2_MAGIC /* 魔法のアイテムを拾う */
-Third group of flags: (0) 怪物の特性
M3_WANTSAMUL /* 例の魔除けを欲する */
M3_WANTSBELL /* 銀のベルを欲する */
M3_WANTSBOOK /* 死者の書を欲する */
M3_WANTSCAND /* 燭台を欲する */
M3_WANTSARTI /* クエストアーティファクトを欲す...
M3_WANTSALL /* アーティファクトを欲する */
M3_WAITFORU /* あなたに気づくまでじっとする */
M3_CLOSE /* 攻撃されない限り親密でいる (話...
M3_COVETOUS /* 強欲 (イェンダーの魔法使い) */
M3_WAITMASK /* waiting... (内部用マスクのよう...
-symbol color: (C(HI_DOMESTIC)) 色。C(RED), C(BROWN), C(H...
あなたは崇高なる開発チームの定めし以下のルールを守らなけ...
-ルール #1: 同種の怪物はmons[]の中で連続していなければな...
-ルール #2: 同種の怪物は強さの順に並んでいなければならない
-ルール #3: 怪物の生成頻度は生成フラグに含む (G_GENO|4 の...
-ルール #4: 同副種類(巨人等)の怪物はルール2に反しない限り...
これで完成だ。もちろん既に存在する怪物をコピーするところ...
たとえば、強力なケンタウロスが要るときには[[草原のケンタ...
さあ、ソース全体を再コンパイルしなくては。そう、*ソース全...
/* This source file is generated by 'makedefs'. Do not ...
#ifndef PM_H
#define PM_H
#define PM_GIANT_ANT 0
#define PM_KILLER_BEE 1
#define PM_SOLDIER_ANT 2
#define PM_FIRE_ANT 3
もうどういう仕組みかわかっただろう? ソースコード内では...
もし君がmakeあるいはndmakeを正しく設定できているならmake...
さあ、ウィザードモードで起動して怪物を作る巻物を願ってみ...
重要:
適切な#ifdef,#ifndefで元コードと自分のコードとを...
*7. 怪物を改良する [#k4bda353]
**7.0. 'monst'構造体 [#n61918e9]
6章を読み終えた君のことだ、自分の怪物が運命の大迷宮をさま...
今こそ'monst'構造体を紹介するときだ。この構造体は具体的な...
-nmon:現在の階層にいる全ての怪物はリストに含まれている。
Starting with a first monster descriptor ('fmon') you ...
all of them, thanks to this pointer to the next monster:
-------- -------- -------- ---...
fmon -> | nmon ---> | nmon --->| nmon --->| n...
| | | | | | | ...
| MONST| | MONST| | MONST| | M...
| #1 | | #2 | | #3 | | ...
-------- -------- -------- ---...
:data | これはpermonst構造体をさすポインタ。たとえばイモ...
:m_id | 怪物ごとに固有の値で、生成時につけられる。
:mnum | 固有の怪物番号。makedefsによってつけれらる。pm.h...
:m_lev | 変動後の怪物の倒しにくさレベル. つまり,怪物の...
:malign | この怪物の属性。正の値ならば殺してもいいってこ...
:mx, my | 地図上でのこの怪物の場所(x,y-座標で)。
:mux,muy | 怪物に君がいるとおもわれている場所。透明の能力...
:mtrack | Monster track???. 行動ルーチンに使われているみ...
:mappearance | ミミックやあの魔法使いのための場所。あなた...
:m_ap_type | mappearanceが示しているもの。以下のようにな...
:: M_AP_NOTHING 0 |/*mappearance は使われない --怪物は...
:: M_AP_FURNITURE 1 |/* 階段、扉、祭壇 等など。 */
:: M_AP_OBJECT 2 |/* なんらかのアイテム */
:: M_AP_MONSTER 3 |/* 怪物 */
:mtame | なつき度合い. もし0以上なら怪物は手なずけられて...
:mspec_used | 怪物の能力の制限時間. このカウンタが0になる...
:female | 雌か否か。 1 = yes, 0 = no.
:minvis | 怪物が透明かどうか。 1 = yes, 0 = no.
:cham | 怪物が実はカメレオンかどうか。 1 = yes, 0 = no.
:mundetected | 怪物が隠れていて(蛇とかのように)プレイヤ...
:mcan | 怪物が無力化の杖(もしくは魔法)を受けたか。
:mspeed | 怪物の速度に関する状態。 2ビットで4状態を表す。
:mflee | 怪物が今畏れをなしているか。
:mfleetim | (7 bits) 畏れが解除されるまでの時間。
:mcansee/mblinded | 怪物の目が見えるか / 暗闇状態の時間。
:mcanmove/mfrozen | 怪物が動けるか / 動けるまでの時間。
:msleep | 怪物が眠っているか
:mstun | monster is stunned.
:mconf | 怪物が混乱しているか。
:mpeaceful | 怪物が友好的か。
:mtrapped | 怪物が罠にかかっているか。
:mleashed | 紐が使われているか。
:isshk | 怪物が店主かどうか。
:isminion | 怪物が神の御使いかどうか。
:isgd | 怪物が番兵かどうか。
:ispriest | 司祭かどうか。
:iswiz | イェンダーの魔法使いかどうか。
:wormno | ワームのとき、ワームが作成されるごとに数値を設...
:mstrategy | 継続的な戦略 (とても特別な怪物に使われる)。~
(訳注:mflag3に基づくこのモンスターの行動原理に使用され...
:mtrapseen | かかったことのあるトラップの種類別対応表。
:mlstmv | 1度に2回行動するのを防ぐ(?)。 ~
(訳注:移動したときにそのターンは攻撃行動を起こさないよ...
:mgold | この怪物がどれだけ金持ちか。
:minvent | 'obj'構造体へのポインタ。このアイテム群は怪物...
:mw | この怪物が武器を装備しているならば、その武器。
:misc_worn_check | ワーム制御コード用のなんらかの値 (?)。~
(訳注:ワーム制御用ではなく,防具や鞍などの装備有無を管...
:weapon_check | 怪物が武器を拾ったときにチェックするフラ...
:mnamelth | 怪物に付けられた名前の長さ。
:mxlth | 拡張部分の構造体のサイズ。怪物ごとに異なる。ほと...
:meating | 怪物の食事のタイムアウト。
:mextra | 拡張部分の構造体へのアクセスポインタ。 例えば、...
がああああ! この構造体大きすぎ! そう思ってるだろうけ...
まず初めに次の質問に答えてみよう。『この怪物はM-FLAGで設...
(NOTE to UNIX users:ctagsを使うと便利だよ
関数を探すときは、ちょっとしたツールで驚くほど効率的に...
'ctags'コマンドでアイテム用のインデックスを作るには
以下の行を実行する。
ctags *.c (srcディレクトリー配下で)
これで'TAGS'ファイルが生成されるはずだ。 この後コマ...
を実行すればすぐにm_initweap関数の実装箇所を得られる...
また、'grep'コマンドは文字列を検索するのに向いている...
カメレオンのコードを探したい? 次のようにすればいい。
grep -i chamaleon | more
End of NOTE)
このm_initweap()関数は怪物がアイテムを得るところだ。この...
一番簡単な方法は、似たコードを探してコピーしてくること。...
本当に面白い怪物は自分専用のアイテムや攻撃方法を持ってい...
**7.1. 新しい攻撃タイプの追加 [#z82629df]
monattk.hファイルを編集しよう。 AT_TENTが定義されている行...
#define AT_HELLO 16 /* こんにちわ!と言って君...
これで新しい攻撃タイプになる。 今度は、新しいダメージを定...
#define AD_HELLO 39 /* 君は挨拶される */
今度はsrcディレクトリに移動し、mhitu.cファイル((怪物(mons...
case AT_EXPL:
case AT_BOOM:
#if 0 /*JP*/
pline("%s explodes!", Monnam(mtmp...
#else
pline("%sは爆発した!", Monnam(mt...
#endif
break;
case AT_MULTIPLY:
/* No message. */
break;
次のようなコードを追加する:
case AT_HELLO:
#if 0 /*JP*/
pline("%s says hello to you!", Mo...
#else
pline("%sはこんにちはと言った!",...
#endif
break;
ここで僕たちが最もよく使う関数の一つpline()を紹介しよう。...
次にmattacku()関数に注目しよう。 AT_HELLO攻撃用のコードを...
今度はhitmu()関数を見てくれ。 ここにAD_HELLO用のコードを...
case AD_FAMN:
#if 0 /*JP*/
pline("%s reaches out, and your body shri...
#else
pline("%sは腕を伸ばした、あなたの体はしな...
#endif
Monnam(mtmp));
exercise(A_CON, FALSE);
if (!is_fainted()) morehungry(rn1(40,40));
/* plus the normal damage */
break;
次のようなコードを追加する:
case AD_HELLO:
hitmsg(mtmp, mattk);
make_confused(2,FALSE);
break;
見てのとおりこの新しい攻撃はアンバーハルクの睨みのように...
これでmhitu.cファイルの編集は終わりだ。 今度はmhitm.c((怪...
**7.2. 新しい怪物の能力の追加 [#ha09b479]
この章では、怪物用の行動を追加する方法について説明するよ...
muse.cファイルを開いて#define MUSE_WAN_SPEED_MONSTER 7 の...
#define MUSE_SCR_SCARE_MONSTER 8
その次に、find_misc関数内の次のコードを探し、
if(obj->otyp == WAN_POLYMORPH && obj->spe > 0 && ...
&& monstr[monsndx(mdat)] < 6) {
m.misc = obj;
m.has_misc = MUSE_WAN_POLYMORPH;
}
次のコードを追加する:
if(obj->otyp == SCR_REMOVE_CURSE) {
m.misc =obj;
m.has_misc = MUSE_SCR_REMOVE_CURSE;
}
これで怪物は潜在的な行動として解呪の巻物を探せるようにな...
次のコードの直後に
case MUSE_WAN_POLYMORPH:
mzapmsg(mtmp, otmp, TRUE);
otmp->spe--;
#if 0
(void) newcham(mtmp, muse_newcham_mon(), ...
#else
/*JP
(void) mon_poly(mtmp, FALSE, "%s changes!...
*/
(void) mon_poly(mtmp, FALSE, "%sは姿を変...
#endif
if (oseen) makeknown(WAN_POLYMORPH);
return 2;
次のコードを追加しよう。
case MUSE_SCR_REMOVE_CURSE:
{
register struct obj *obj;
mreadmsg(mtmp,otmp);
#if 0 /*JP*/
pline("%s feels than someone is helping %...
mtmp->female?"her":"him");
#else
pline("誰かが%sを助けているような気がした...
#endif
if (!otmp->cursed) {
for(obj=mtmp->minvent;obj;obj=obj->nobj)
if (otmp->blessed || obj->owornmask...
(obj->otyp == LOADSTONE)) {
if (mtmp->mconf) blessorcurse...
else uncurse(obj);
}
}
if (oseen && !objects[SCR_REMOVE_CURSE].o...
&& !objects[SCR_REMOVE_CURSE].oc_una...
docall(otmp); /* not makeknown() */
m_useup(mtmp, otmp);
return 2;
}
**7.3. 'mextra'構造体の追加 [#nbbe7bff]
怪物の行動を面白いものにするにはmonst構造体への新しい変数...
long praytime;
だけど、これだと僕たちの怪物しか使わない4バイト割り当てら...
その代わりに新しい構造体を定義するといい。 君専用の新しい...
struct onlymymonster {
long praytime;
};
そして、monst.c内のこのモンスターの定義のextension length...
((struct onlymymonster *)&(mon)->mextra[0])->pray...
このような読みにくい記述を短縮するには#defineを使えばよい:
#define MYMONSTER(mon) ((struct onlymymonster *)&(m...
そうすれば次のように書けるようになる
MYMONSTER(mon)->praytime
mextra部分の使い方の例はeshk.h(店主用のコード)を参照す...
**7.4. databaseへの項目追加 [#te58d890]
databseソースファイル (dat/data.base) ((訳注:JNetHackで...
はコメント('#'で始まる行)の点在する多数の項目で構成されて...
それぞれの項目は、独立した行になっている多数のパターンで...
怪物やアイテムがプレイヤーに表示される説明文(ほとんどは...
***7.4.1. パターン一覧 [#de778e53]
パターン一覧の最も簡単な形式は、同じテキストを表示するア...
例えば次のとおり:
インキュバス
サキュバス
incubus
succubus
インキュバスとサキュバスは同じ種類の魔神で、それぞれ男...
性である。それらと関係を持つ愚かな人間は大抵手痛い目に...
注:この文章で例題をあげるにあたってインデントしてある。
実際のdata.baseでは、パターンは行頭に詰めて記述し、説明文...
全てのテキストを列挙するだけでは充分じゃない場合もたまに...
そんなときのために、'?'と'*'の特殊文字が使用可能だ。
'?'は一文字に対応して、'*'は0文字以上に対応する。 例えば...
*巨人
*giant
giant humanoid
巨人はいつも大地を歩いていたが,最近では彼らは非常に希...
となっている.彼らのサイズと言ったら,9フィートたらず...
空にもそびえる20フィート以上のものまでいる.大きなもの...
な岩を武器として使い,遠くからでもそれを投げつける.全...
類の巨人は人間(焼いたり,煮たり,揚げたりしたもの)が...
という点で共通している.彼らのテーブルマナーは伝説的だ.
この場合、"*giant"パターンは次の怪物に対応する:
giant, stone giant, hill giant, fire giant, frost giant...
「*巨人」パターンには次の怪物に対応する:
巨人、岩石巨人、丘の巨人、炎の巨人、吹雪の巨人、雷の巨人
特殊文字を含むパターンに無関係なテキストがマッチしちゃう...
これを可能にするために、取り消しパターンを複数列記するこ...
取り消しパターンは他のパターンよりもパターン一覧の前の方...
もしそれがマッチしている場合はそれがある項目自体を無視す...
このパターンは'~'を先頭につけることで記述する((この文字そ...
例えば次のとおり:
*モールド
カビ
~slime mold
*mold
モールド,カビ,糸状菌.菌類に属する多細胞有機体,綿の...
繊維組織網で構成された植物の体の典型.モールドの特色は...
の胞子の発芽に帰する.ほとんどのモールドは死体寄生であ...
特定の種は(例えばペニシリン,青カビ)はチーズや抗生物質...
に使われる.
[ The Concise Columbia Encyclopedia ]
"~slime mold"パターンを列記しなかったら、
プレイヤーがslime moldの情報を見ようとしたときに
この項目が表示されてしまう((slime moldが"*mold"に対応する...
最後に、上記で述べなかった点をいくつか記述しておく。
- パターンは空白やタブ文字で始めることができない。
これは空白で始まるものは説明文とみなされることから起こる...
- 対応するものが見つかるまでdata baseにおける記載順に項目...
(見つかった時点でスキャンは停止する)。
これは2つ以上の項目に対応するパターンに合致するテキストが...
通常はこれ(を取り消しパターンの代わりに使うの)は避けるべ...
有益である場合もあるかもしれない。
- テキストはパターンと比較される前に小文字に変換されるた...
全てのパターンは小文字で記述すべきである。
- ユーザが複数形で入力した場合、このゲームはアイテムやモ...
従って、通常はパターン一覧に単数形と複数形を両方指定する...
***7.4.2. 説明文 [#bb3dcb5d]
説明文は接頭字がタブ文字の複数の行から構成される(テキス...
次のASCIIマークアップ規約が適用される:
_xxx_ xxxを強調表示
[xxx] xxxをボールド表示
- (語中) ハイフン
- (数字の間) 半角ダッシュ
- (空白で囲まれた) 全角ダッシュ
... 省略記号
... (行中にそれだけ) 縦の省略記号
"xxx" xxxを会話文として囲む
number' 数字をフィート表示
注: これらはゲーム中においてまったく解釈はされないけど、
一貫とした形式でプレーヤーにテキストを表示するのに役立つ。
行は、右行端未調整(つまり左揃え)で、67文字より短くしな...
パラグラフの分割は前節を短い行で示すべきだ(字下げは使う...
パラグラフ間の空行は、引用もしくは他の特殊な目的のために...
(詩における句の間の分離等)。
終止符(および短文を終える他の句読点)には2つの空白文字を...
*(未翻訳)8. 新しいアイテムの追加 [#l96e3f20]
**8.0. 'objects'配列 [#mc127982]
**8.1. 道具の追加 [#z4a56b94]
**8.2. 杖の追加 [#tc8de3ae]
**8.3. 薬の追加 [#jb5c85d8]
**8.4. 防具/武器の追加 [#ua1bae32]
**8.5. 指輪の追加 [#cb0960ad]
**8.6. 魔除けの追加 [#h368c0fa]
**8.7. 魔法書の追加 [#o1da0c41]
**8.8. 食料の追加 [#w4f387bb]
*(未翻訳)9. 新しい種類の部屋の作成 [#m12b7de6]
*(未翻訳)10. 新しい種類の店の作成 [#ue5732f1]
*(未翻訳)11. 最後に [#l7db9237]
*(未翻訳)付録A リファレンス関数一覧 [#yed1fbdf]
終了行:
[[ソースコード]]~
http://members.shaw.ca/rob.ellwood/sources.txtより勝手に...
この項目はまだ書きかけです。
別翻訳:
http://sourceforge.jp/projects/jslashem/docs/jsources/ja/...
#contents
*1. この文書について [#d3c1bcec]
ネットハックを何[ヶ月|年]も楽しんでいるかい?何かこのゲー...
'94くらいからネットハックのソースを覗きはじめたんだ。この...
今、九ヶ月かかって、私はこのソースのおおまかな構造は捉え...
多分この文書には間違ってる箇所もあると思う。そして、多分…...
お願いだから、この文書は''自己責任''で使用してほしい。い...
この文書の全ての内容はNethack 3.1.3(この文書を書いてる時...
*2. よし、このゲームに変更を加えていくぞ! [#w0fa1f37]
さあ、君は先週ネットハックを始めて、Unixマシンのアカウン...
言い換えよう。この文書を読むためには少なくとも次のものが...
- 今あなたが使っているOSに関する基礎知識。ファイルを作っ...
- C言語に関するある程度の知識。printf("Hello world\n") く...
- Cコンパイラとそれに対する慣れ。
- 祝福された能力獲得の薬
*3. まず最初に [#p8513c03]
まずあなたは自分でソースをコンパイルしなくてはいけない。...
ちゃんとコンパイルに通せれば準備は完了だ。
*4. ウィザードモード [#i6dd6c6f]
恐らくは知っての通り、ウィザードモードはいくつかのコマン...
^E == 隠された扉や罠を見つける。
^F == 魔法の地図の魔法を唱える。
^G == 怪物を作る。
^I == 背負い袋の中のアイテムを識別する。
^O == 特別な階層の位置を知る。
^T == 同じ階層内でテレポートする。
^V == 違う階層へテレポートする。
^W == 願う。
^X == 能力を見る。
それに、いくつかの振る舞いが変わる。e.g. 怪物を作る巻物を...
nethack -u wizard -D
これでうまくいくはずだけど、次の点に注意:
- UNIX機を使っているなら、コンパイル時に指定したユーザID...
- include/config.hの中の#define WIZARDがある行の辺りを見...
ネットハックを改良していく中で、このモードをしっかり活用...
*5. 新しい階層をつくる [#b20b9045]
新しい階層を作るのは簡単だ。実を言うと、Cについて何も知ら...
ネットハックをコンパイルした際、utilディレクトリ下に'lev_...
このプログラムを使えばネットハックに新しい階層を加えるこ...
mylevel.des -----------
|
__ | __
\ V /
___\___/___
| | _
|lev_comp |/
| | -----> mylevel...
-------------
lev_compには'lev_comp.6'という名前のマニュアルがついてい...
nroff -man lev_comp.6 | more
もしそうでないなら、うーむ、.SHとか.PPとかのゴミに慣れて...
このマニュアルには(結構わかりづらいけど).desファイルの作...
例として、"dat/castle.des"ファイルの始めの部分を見てみよ...
MAZE:"castle",random
FLAGS: noteleport
GEOMETRY:center,center
MAP
}}}}}}}}}.............................................}}...
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-...
}|.....|-----------------------------------------------|...
}|.....+...............................................+...
}-------------------------------+-----------------------...
}}}}}}|........|..........+...........|.......S.S..........
.....}|........|..........|...........|.......|.|..........
.....}|........------------...........---------S--------...
.....}|...{....+..........+.........\.S....................
.....}|........------------...........---------S--------...
.....}|........|..........|...........|.......|.|..........
}}}}}}|........|..........+...........|.......S.S..........
}-------------------------------+-----------------------...
}|.....+...............................................+...
}|.....|-----------------------------------------------|...
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-...
}}}}}}}}}.............................................}}...
ENDMAP
簡単そうだろ?このファイルから城レベルができるんだ。ここ...
残りの部分でドア、罠、アイテム、そして怪物をランダムに、...
マニュアルに文法が示してあるから、思い切って全部作りかえ...
次のような行を
MONSTER:'@',"soldier",(08,06)
こんな風に変えてみよう。
MONSTER:'H',"minotaur",(08,06)
(ここでは特定の怪物(ミノタウロス)を選んでいるけど、こんな...
MONSTER:'D',RANDOM,(08,06) # ランダムにドラゴンをつくる
すれば種類で選ぶこともできたんだ。)
新しいcastle.desを保存して、datディレクトリから次のコマン...
../util/lev_comp castle.des (MS-DOSを使ってい...
これで新しい'castle.lev'ファイルが'dat'ディレクトリに出来...
さて今度はオリジナルを作ってみる番だ。僕たちがやりたかっ...
まずそのために、別のコンパイラを紹介しよう:dgn_comp,ダン...
問題の迷宮の設計図は"dungeon.def"と呼ばれている:
DUNGEON: "The Dungeons of Doom" "D" (25, 5)
ALIGNMENT: unaligned
%MULDGN BRANCH: "The Gnomish Mines" @ (2, 3)
%REINCARNATION LEVEL: "rogue" "R" @ (15, 4)
LEVEL: "oracle" "O" @ (5, 5)
LEVALIGN: neutral
LEVEL: "bigroom" "B" @ (10, 3) 15
%MULDGN CHAINBRANCH: "The Quest" "oracle" + (6, 2) po...
%MULDGN BRANCH: "Fort Ludios" @ (18, 4) portal
RNDLEVEL: "medusa" "none" @ (-5, 4) 2
LEVALIGN: chaotic
LEVEL: "castle" "none" @ (-1, 0)
CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down
BRANCH: "The Elemental Planes" @ (1, 0) no_down up
おそらく知っての通り、運命の大迷宮には特殊な階層(e.g.ビ...
mylevelという名前の階層をmylevel.desに作ったとしよう:
MAZE:"mylevel",' '
(*重要*:ファイル自体の名前はMAZEの行で指定したものと同じ...
運命の大迷宮にこの階層を加えるには、例えばビッグルームの...
LEVEL: "mylevel" "none" @ (15,2)
と入れればいい。これは、mylevelという階層を地下15+-2階の...
その後、../util/dgn_comp dungeon.def を走らせて'dungeon'...
もし新しい階層を読み込むときに何らかのエラーが発生した場...
最後に、もし新しい分岐を作りたいときには、次のように入力...
%MULDGN BRANCH: "newbranch" @ (18, 1)
その後に続けて、分岐の階層を指定していく。
DUNGEON: "newbranch" "S" (4,0)
DESCRIPTION: mazelike
LEVEL: "mylevel1" "none" @ (1, 0)
LEVEL: "mylevel2" "none" @ (2, 0)
LEVEL: "mylevel3" "none" @ (3, 0)
LEVEL: "mylevel4" "none" @ (4, 0)
さあ、早速.desファイルをいじって文法に慣れてみよう。新し...
もしかしたらこの章で君のしたいことは全部実現できるかもし...
*6. 新しい怪物をつくる [#r388af7d]
"気をつけろ!もう戻って来れないかもしれないぞ!それ...
ようこそ、モルドールの闇部へ...苦しいかもしれないが見返り...
さあ、はじめようか。
まず始めに、二つの''巨大''な配列があることを覚えておこう...
{"mymonster", S_HUMAN, 1, 10, 10, 0, 0, G_GENO | ...
{ { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,
NO_ATTK, NO_ATTK, NO_ATTK },
WT_HUMAN, 400, PL_NSIZ, MS_HUMANOID, MZ_HUMAN, 0,...
M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMEST...
-name: ("mymonster") 怪物の名前
-symbol: (S_HUMAN) 使われる文字。monsym.hに全て定義してあ...
-level: (1) このレベルに達して初めてこの怪物が生成される。
-move rate: (10) 速さ。0 -全く動かない- から 30 -かなり素...
-[[AC]]: (10) ようくご存じでしょ?
-magic resistance: (0) 0から127まで
-alignment: (0) 属性。負の値は混沌、正の値は秩序を表す。
-creation/geno flags: (G_GENO | G_NOGEN) 生成フラグ。以下...
G_UNIQ /* 一度しか生成されない */
G_NOHELL /* ゲヘナでは生成されない */
G_HELL /* ゲヘナ以外では生成されない */
G_NOGEN /* 自然生成されない */
G_NOCORPSE /* 絶対に死体を残さない */
G_SGROUP /* 通常小さな集団で生成される */
G_LGROUP /* 通常大きな集団で生成される */
G_GENO /* 虐殺可能 */
一部訳略:その他はmonsym.h(現バージョン(3.4.3)で...
-attack: ({ { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK,...
( 攻撃方法, 攻撃の種類, ダイス倍数, ダイスの面 )
攻撃方法は以下のうち一つ:
AT_NONE /* 攻撃しない (ex. 酸のブロッブ) */
AT_CLAW /* 爪 (パンチ、叩く、 等々.) */
AT_BITE /* 噛みつき */
AT_KICK /* 蹴り */
AT_BUTT /* 頭突き (ex. ユニコーン) */
AT_TUCH /* 触る */
AT_STNG /* 刺す */
AT_HUGS /* 抱きつき さば折り? */
AT_SPIT /* 唾吐き - 遠距離攻撃 */
AT_ENGL /* 飲み込み (e.g. 紫ワーム、ほこ...
AT_BREA /* ブレス - 遠距離攻撃 */
AT_EXPL /* 爆発 - 近づいて */
AT_GAZE /* にらみ - 遠距離攻撃 */
AT_TENT /* 触手 */
AT_WEAP /* 武器を用いる */
AT_MAGC /* 魔法を用いる */
攻撃の種類は以下の一つ:
AD_PHYS /* 通常の物理攻撃 */
AD_MAGM /* 魔法の矢 */
AD_FIRE /* 火のダメージ */
AD_COLD /* 冷気ダメージ */
AD_SLEE /* 睡眠の矢 */
AD_DISN /* 分解 (死の光線) */
AD_ELEC /* 電撃ダメージ */
AD_DRST /* 力の低下 (毒) */
AD_ACID /* 酸のダメージ */
AD_SPC1 /* buzz()((zap.c内にある光線の処...
AD_SPC2 /* buzz()用の拡張 */
AD_BLND /* 盲目 (光る目) */
AD_STUN /* 眩暈 */
AD_SLOW /* 減速 */
AD_PLYS /* 麻痺 */
AD_DRLI /* レベルドレイン (ヴァンパイア等...
AD_DREN /* 魔力吸い取り */
AD_LEGS /* 脚を傷つける (ザン) */
AD_STON /* 石化 (メデューサ、コカトリス等...
AD_STCK /* 捕まえる (ミミック等) */
AD_SGLD /* 金を盗む (レプラコーン等) */
AD_SITM /* アイテムを盗む (ニンフ) */
AD_SEDU /* かどわかし、複数のアイテムを盗...
AD_TLPT /* 瞬間移動させる (量子物理学) */
AD_RUST /* 装備を錆びさせる (錆びの怪物)*/
AD_CONF /* 混乱させる (アンバーハルク) */
AD_DGST /* 消化する (トラッパー等) */
AD_HEAL /* 回復させる (看護婦) */
AD_WRAP /* 捕まえる (うなぎ等) */
AD_WERE /* 獣化病にする */
AD_DRDX /* 器用さを減らす (クアシト) */
AD_DRCO /* 耐久を減らす */
AD_DRIN /* 知性を減らす (マインドフレイア...
AD_DISE /* 病気にする */
AD_DCAY /* 装備を腐らせる (茶色プリン) */
AD_SSEX /* 淫魔の誘惑 */
AD_DETH /* デス用 */
AD_PEST /* ペスティレンス用 */
AD_FAMN /* フェミン用 */
AD_CLRC /* 僧侶魔法 */
AD_SPEL /* ランダム魔法 */
AD_RBRE /* ランダムブレス */
AD_SAMU /* 魔除けを盗む (イェンダーの魔法...
AD_CURS /* 能力を盗る (グレムリン等) */
ダイス倍数/ダイスの面はダメージをさだめる:
1,6 ならばダメージは1から6の間
3,7 ならばダメージは3から21の間
よって、怪物は一ターンに最大六回攻撃できる。それより少な...
-weight: (WT_HUMAN) WT_DRAGON, WT_HUMAN,WT_ELFといった定...
-nutritional value: (400) 栄養価
-extension length: (PL_NSIZ) さあここが難関。これは通常の...
-sounds made: (MS_HUMAN). 発する音 (monflag.hより)
MS_SILENT /* 音を出さない */
MS_BARK /* 満月ならば吠える */
MS_MEW /* にゃー(ネコ等) */
MS_ROAR /* 吠える(ムーマク等) */
MS_GROWL /* うなる(吸魔の怪物等) */
MS_SQEEK /* ちゅーちゅー鳴く(ねずみ等) */
MS_SQAWK /* さえずる(鳥類) */
MS_HISS /* しゅー(蛇等) */
MS_BUZZ /* 羽音をたてる (殺人蜂等) */
MS_GRUNT /* ぶーぶー言う (あるいは独自の言...
MS_NEIGH /* いななく */
MS_WAIL /* もの悲しい音をだす(影) */
MS_GURGLE /* ごぼごぼ (ショウビレックス) */
MS_BURBLE /* ぶくぶく (ジャバウォック) */
MS_ANIMAL /* 動物の音をたてる */
MS_SHRIEK /* 叫んでほかの怪物を目覚めさせる...
MS_BONES /* 骨をならす (骸骨) */
MS_LAUGH /* ニヤニヤ、クスクス、嗤う */
MS_MUMBLE /* 何かを言う */
MS_IMITATE /* 何かをまねる (レオクロッタ) */
MS_ORC /* オークとしてしゃべる */
MS_HUMANOID /* 一般的な人型生物 */
MS_ARREST /* "Stop in the name of the law!"...
MS_SOLDIER /* 軍人として話す */
MS_GUARD /* "Please drop that gold and fol...
MS_DJINNI /* "Thank you for freeing me!" (...
MS_NURSE /* "Take off your shirt, please."...
MS_SEDUCE /* "Hello, sailor." (ニンフ) */
MS_VAMPIRE /* (吸血鬼等) */
MS_BRIBE /* 通行料を要求する */
MS_CUSS /* 非難したり (悪魔等) 脅したりす...
MS_RIDER /* 天上界の乗り手たち */
MS_LEADER /* クエストリーダー */
MS_NEMESIS /* クエストネメシス */
MS_GUARDIAN /* クエストの仲間 */
MS_SELL /* 支払いを求めたり、万引きについ...
MS_ORACLE /* 占う */
MS_PRIEST /* 寄付をもとめたり、文無しを追っ...
-physical size: (MZ_HUMAN) 大きさ。以下のうち一つ
MZ_TINY 0 /* < 2' */
MZ_SMALL 1 /* 2-4' */
MZ_MEDIUM 2 /* 4-7' */
MZ_HUMAN MZ_MEDIUM /* 人の大きさ */
MZ_LARGE 3 /* 7-12' */
MZ_HUGE 4 /* 12-25' */
MZ_GIGANTIC 7 /* 計り知れない大...
-resistance : (0) 食べた時得られるかもしれない特性
MR_FIRE /* 火に対する耐性 */
MR_COLD /* 冷気に対する耐性 */
MR_SLEEP /* 睡眠に対する耐性 */
MR_DISINT /* 分解に対する耐性 */
MR_ELEC /* 電撃に対する耐性 */
MR_POISON /* 毒に対する耐性 */
MR_ACID /* 酸に対する耐性 */
MR_STONE /* 石化に対する耐性 */
-First group of flags: (M1_NEEDPICK | M1_HUMANOID | M1_OM...
M1_FLY /* 浮かんだり飛んだりする */
M1_SWIM /* 水中を移動できる */
M1_AMORPHOUS /* ドアから染み出ることができる */
M1_WALLWALK /* 壁の中を動ける */
M1_CLING /* 天井に張りつける */
M1_TUNNEL /* 壁を掘り進める */
M1_NEEDPICK /* つるはしを持てば壁を掘り進める...
M1_CONCEAL /* アイテムの下に隠れられる */
M1_HIDE /* 隠れることができる */
M1_AMPHIBIOUS /* 水中でも生きることができる */
M1_BREATHLESS /* 呼吸しない */
M1_NOEYES /* 眼が無い */
M1_NOHANDS /* 手が無い */
M1_NOLIMBS /* 脚が無い */
M1_NOHEAD /* 頭が無い */
M1_MINDLESS /* 意思を持たない */
M1_HUMANOID /* 人型である */
M1_ANIMAL /* 動物型である */
M1_SLITHY /* 蛇型である */
M1_UNSOLID /* 物質的な体を持たない */
M1_THICK_HIDE /* 厚い皮や鱗を持つ */
M1_OVIPAROUS /* 卵を産める */
M1_REGEN /* 超回復能力を持つ */
M1_SEE_INVIS /* 透明視できる */
M1_TPORT /* 瞬間移動できる */
M1_TPORT_CNTRL /* 瞬間移動制御できる */
M1_ACID /* 酸を持つ */
M1_POIS /* 毒を持つ */
M1_CARNIVORE /* 動物食である */
M1_HERBIVORE /* 植物食である */
M1_OMNIVORE /* 雑食である */
M1_METALLIVORE /* 金属食である */
-Second group of flags: (M2_HUMAN | M2_STRONG | M2_COLLEC...
M2_NOPOLY /* プレイヤーは変化できない */
M2_UNDEAD /* アンデッドである */
M2_WERE /* 獣人である */
M2_ELF /* エルフである */
M2_DWARF /* ドワーフである */
M2_GIANT /* 巨人である */
M2_ORC /* オークである */
M2_HUMAN /* 人である */
M2_DEMON /* 悪魔である */
M2_MERC /* 番人や兵士である */
M2_LORD /* その種の王である */
M2_PRINCE /* その種の王子である */
M2_MINION /* 神の僕である */
M2_MALE /* 常にオス/男で生成される */
M2_FEMALE /* 常にメス/女で生成される */
M2_NEUTER /* オスでもメスでもない */
M2_PNAME /* 名前が固有名詞である */
M2_HOSTILE /* 常に敵対的である */
M2_PEACEFUL /* 常に友好的である */
M2_DOMESTIC /* 餌付けしてペットにできる */
M2_WANDER /* ふらふら動く */
M2_STALK /* 別の階へも追っていく */
M2_NASTY /* 特にいやらしい怪物である (経験...
M2_STRONG /* 強い/大きい怪物である */
M2_ROCKTHROW /* 巨岩を投げる */
M2_GREEDY /* 金が好きである */
M2_JEWELS /* 宝石が好きである */
M2_COLLECT /* 武器と食べ物を拾う */
M2_MAGIC /* 魔法のアイテムを拾う */
-Third group of flags: (0) 怪物の特性
M3_WANTSAMUL /* 例の魔除けを欲する */
M3_WANTSBELL /* 銀のベルを欲する */
M3_WANTSBOOK /* 死者の書を欲する */
M3_WANTSCAND /* 燭台を欲する */
M3_WANTSARTI /* クエストアーティファクトを欲す...
M3_WANTSALL /* アーティファクトを欲する */
M3_WAITFORU /* あなたに気づくまでじっとする */
M3_CLOSE /* 攻撃されない限り親密でいる (話...
M3_COVETOUS /* 強欲 (イェンダーの魔法使い) */
M3_WAITMASK /* waiting... (内部用マスクのよう...
-symbol color: (C(HI_DOMESTIC)) 色。C(RED), C(BROWN), C(H...
あなたは崇高なる開発チームの定めし以下のルールを守らなけ...
-ルール #1: 同種の怪物はmons[]の中で連続していなければな...
-ルール #2: 同種の怪物は強さの順に並んでいなければならない
-ルール #3: 怪物の生成頻度は生成フラグに含む (G_GENO|4 の...
-ルール #4: 同副種類(巨人等)の怪物はルール2に反しない限り...
これで完成だ。もちろん既に存在する怪物をコピーするところ...
たとえば、強力なケンタウロスが要るときには[[草原のケンタ...
さあ、ソース全体を再コンパイルしなくては。そう、*ソース全...
/* This source file is generated by 'makedefs'. Do not ...
#ifndef PM_H
#define PM_H
#define PM_GIANT_ANT 0
#define PM_KILLER_BEE 1
#define PM_SOLDIER_ANT 2
#define PM_FIRE_ANT 3
もうどういう仕組みかわかっただろう? ソースコード内では...
もし君がmakeあるいはndmakeを正しく設定できているならmake...
さあ、ウィザードモードで起動して怪物を作る巻物を願ってみ...
重要:
適切な#ifdef,#ifndefで元コードと自分のコードとを...
*7. 怪物を改良する [#k4bda353]
**7.0. 'monst'構造体 [#n61918e9]
6章を読み終えた君のことだ、自分の怪物が運命の大迷宮をさま...
今こそ'monst'構造体を紹介するときだ。この構造体は具体的な...
-nmon:現在の階層にいる全ての怪物はリストに含まれている。
Starting with a first monster descriptor ('fmon') you ...
all of them, thanks to this pointer to the next monster:
-------- -------- -------- ---...
fmon -> | nmon ---> | nmon --->| nmon --->| n...
| | | | | | | ...
| MONST| | MONST| | MONST| | M...
| #1 | | #2 | | #3 | | ...
-------- -------- -------- ---...
:data | これはpermonst構造体をさすポインタ。たとえばイモ...
:m_id | 怪物ごとに固有の値で、生成時につけられる。
:mnum | 固有の怪物番号。makedefsによってつけれらる。pm.h...
:m_lev | 変動後の怪物の倒しにくさレベル. つまり,怪物の...
:malign | この怪物の属性。正の値ならば殺してもいいってこ...
:mx, my | 地図上でのこの怪物の場所(x,y-座標で)。
:mux,muy | 怪物に君がいるとおもわれている場所。透明の能力...
:mtrack | Monster track???. 行動ルーチンに使われているみ...
:mappearance | ミミックやあの魔法使いのための場所。あなた...
:m_ap_type | mappearanceが示しているもの。以下のようにな...
:: M_AP_NOTHING 0 |/*mappearance は使われない --怪物は...
:: M_AP_FURNITURE 1 |/* 階段、扉、祭壇 等など。 */
:: M_AP_OBJECT 2 |/* なんらかのアイテム */
:: M_AP_MONSTER 3 |/* 怪物 */
:mtame | なつき度合い. もし0以上なら怪物は手なずけられて...
:mspec_used | 怪物の能力の制限時間. このカウンタが0になる...
:female | 雌か否か。 1 = yes, 0 = no.
:minvis | 怪物が透明かどうか。 1 = yes, 0 = no.
:cham | 怪物が実はカメレオンかどうか。 1 = yes, 0 = no.
:mundetected | 怪物が隠れていて(蛇とかのように)プレイヤ...
:mcan | 怪物が無力化の杖(もしくは魔法)を受けたか。
:mspeed | 怪物の速度に関する状態。 2ビットで4状態を表す。
:mflee | 怪物が今畏れをなしているか。
:mfleetim | (7 bits) 畏れが解除されるまでの時間。
:mcansee/mblinded | 怪物の目が見えるか / 暗闇状態の時間。
:mcanmove/mfrozen | 怪物が動けるか / 動けるまでの時間。
:msleep | 怪物が眠っているか
:mstun | monster is stunned.
:mconf | 怪物が混乱しているか。
:mpeaceful | 怪物が友好的か。
:mtrapped | 怪物が罠にかかっているか。
:mleashed | 紐が使われているか。
:isshk | 怪物が店主かどうか。
:isminion | 怪物が神の御使いかどうか。
:isgd | 怪物が番兵かどうか。
:ispriest | 司祭かどうか。
:iswiz | イェンダーの魔法使いかどうか。
:wormno | ワームのとき、ワームが作成されるごとに数値を設...
:mstrategy | 継続的な戦略 (とても特別な怪物に使われる)。~
(訳注:mflag3に基づくこのモンスターの行動原理に使用され...
:mtrapseen | かかったことのあるトラップの種類別対応表。
:mlstmv | 1度に2回行動するのを防ぐ(?)。 ~
(訳注:移動したときにそのターンは攻撃行動を起こさないよ...
:mgold | この怪物がどれだけ金持ちか。
:minvent | 'obj'構造体へのポインタ。このアイテム群は怪物...
:mw | この怪物が武器を装備しているならば、その武器。
:misc_worn_check | ワーム制御コード用のなんらかの値 (?)。~
(訳注:ワーム制御用ではなく,防具や鞍などの装備有無を管...
:weapon_check | 怪物が武器を拾ったときにチェックするフラ...
:mnamelth | 怪物に付けられた名前の長さ。
:mxlth | 拡張部分の構造体のサイズ。怪物ごとに異なる。ほと...
:meating | 怪物の食事のタイムアウト。
:mextra | 拡張部分の構造体へのアクセスポインタ。 例えば、...
がああああ! この構造体大きすぎ! そう思ってるだろうけ...
まず初めに次の質問に答えてみよう。『この怪物はM-FLAGで設...
(NOTE to UNIX users:ctagsを使うと便利だよ
関数を探すときは、ちょっとしたツールで驚くほど効率的に...
'ctags'コマンドでアイテム用のインデックスを作るには
以下の行を実行する。
ctags *.c (srcディレクトリー配下で)
これで'TAGS'ファイルが生成されるはずだ。 この後コマ...
を実行すればすぐにm_initweap関数の実装箇所を得られる...
また、'grep'コマンドは文字列を検索するのに向いている...
カメレオンのコードを探したい? 次のようにすればいい。
grep -i chamaleon | more
End of NOTE)
このm_initweap()関数は怪物がアイテムを得るところだ。この...
一番簡単な方法は、似たコードを探してコピーしてくること。...
本当に面白い怪物は自分専用のアイテムや攻撃方法を持ってい...
**7.1. 新しい攻撃タイプの追加 [#z82629df]
monattk.hファイルを編集しよう。 AT_TENTが定義されている行...
#define AT_HELLO 16 /* こんにちわ!と言って君...
これで新しい攻撃タイプになる。 今度は、新しいダメージを定...
#define AD_HELLO 39 /* 君は挨拶される */
今度はsrcディレクトリに移動し、mhitu.cファイル((怪物(mons...
case AT_EXPL:
case AT_BOOM:
#if 0 /*JP*/
pline("%s explodes!", Monnam(mtmp...
#else
pline("%sは爆発した!", Monnam(mt...
#endif
break;
case AT_MULTIPLY:
/* No message. */
break;
次のようなコードを追加する:
case AT_HELLO:
#if 0 /*JP*/
pline("%s says hello to you!", Mo...
#else
pline("%sはこんにちはと言った!",...
#endif
break;
ここで僕たちが最もよく使う関数の一つpline()を紹介しよう。...
次にmattacku()関数に注目しよう。 AT_HELLO攻撃用のコードを...
今度はhitmu()関数を見てくれ。 ここにAD_HELLO用のコードを...
case AD_FAMN:
#if 0 /*JP*/
pline("%s reaches out, and your body shri...
#else
pline("%sは腕を伸ばした、あなたの体はしな...
#endif
Monnam(mtmp));
exercise(A_CON, FALSE);
if (!is_fainted()) morehungry(rn1(40,40));
/* plus the normal damage */
break;
次のようなコードを追加する:
case AD_HELLO:
hitmsg(mtmp, mattk);
make_confused(2,FALSE);
break;
見てのとおりこの新しい攻撃はアンバーハルクの睨みのように...
これでmhitu.cファイルの編集は終わりだ。 今度はmhitm.c((怪...
**7.2. 新しい怪物の能力の追加 [#ha09b479]
この章では、怪物用の行動を追加する方法について説明するよ...
muse.cファイルを開いて#define MUSE_WAN_SPEED_MONSTER 7 の...
#define MUSE_SCR_SCARE_MONSTER 8
その次に、find_misc関数内の次のコードを探し、
if(obj->otyp == WAN_POLYMORPH && obj->spe > 0 && ...
&& monstr[monsndx(mdat)] < 6) {
m.misc = obj;
m.has_misc = MUSE_WAN_POLYMORPH;
}
次のコードを追加する:
if(obj->otyp == SCR_REMOVE_CURSE) {
m.misc =obj;
m.has_misc = MUSE_SCR_REMOVE_CURSE;
}
これで怪物は潜在的な行動として解呪の巻物を探せるようにな...
次のコードの直後に
case MUSE_WAN_POLYMORPH:
mzapmsg(mtmp, otmp, TRUE);
otmp->spe--;
#if 0
(void) newcham(mtmp, muse_newcham_mon(), ...
#else
/*JP
(void) mon_poly(mtmp, FALSE, "%s changes!...
*/
(void) mon_poly(mtmp, FALSE, "%sは姿を変...
#endif
if (oseen) makeknown(WAN_POLYMORPH);
return 2;
次のコードを追加しよう。
case MUSE_SCR_REMOVE_CURSE:
{
register struct obj *obj;
mreadmsg(mtmp,otmp);
#if 0 /*JP*/
pline("%s feels than someone is helping %...
mtmp->female?"her":"him");
#else
pline("誰かが%sを助けているような気がした...
#endif
if (!otmp->cursed) {
for(obj=mtmp->minvent;obj;obj=obj->nobj)
if (otmp->blessed || obj->owornmask...
(obj->otyp == LOADSTONE)) {
if (mtmp->mconf) blessorcurse...
else uncurse(obj);
}
}
if (oseen && !objects[SCR_REMOVE_CURSE].o...
&& !objects[SCR_REMOVE_CURSE].oc_una...
docall(otmp); /* not makeknown() */
m_useup(mtmp, otmp);
return 2;
}
**7.3. 'mextra'構造体の追加 [#nbbe7bff]
怪物の行動を面白いものにするにはmonst構造体への新しい変数...
long praytime;
だけど、これだと僕たちの怪物しか使わない4バイト割り当てら...
その代わりに新しい構造体を定義するといい。 君専用の新しい...
struct onlymymonster {
long praytime;
};
そして、monst.c内のこのモンスターの定義のextension length...
((struct onlymymonster *)&(mon)->mextra[0])->pray...
このような読みにくい記述を短縮するには#defineを使えばよい:
#define MYMONSTER(mon) ((struct onlymymonster *)&(m...
そうすれば次のように書けるようになる
MYMONSTER(mon)->praytime
mextra部分の使い方の例はeshk.h(店主用のコード)を参照す...
**7.4. databaseへの項目追加 [#te58d890]
databseソースファイル (dat/data.base) ((訳注:JNetHackで...
はコメント('#'で始まる行)の点在する多数の項目で構成されて...
それぞれの項目は、独立した行になっている多数のパターンで...
怪物やアイテムがプレイヤーに表示される説明文(ほとんどは...
***7.4.1. パターン一覧 [#de778e53]
パターン一覧の最も簡単な形式は、同じテキストを表示するア...
例えば次のとおり:
インキュバス
サキュバス
incubus
succubus
インキュバスとサキュバスは同じ種類の魔神で、それぞれ男...
性である。それらと関係を持つ愚かな人間は大抵手痛い目に...
注:この文章で例題をあげるにあたってインデントしてある。
実際のdata.baseでは、パターンは行頭に詰めて記述し、説明文...
全てのテキストを列挙するだけでは充分じゃない場合もたまに...
そんなときのために、'?'と'*'の特殊文字が使用可能だ。
'?'は一文字に対応して、'*'は0文字以上に対応する。 例えば...
*巨人
*giant
giant humanoid
巨人はいつも大地を歩いていたが,最近では彼らは非常に希...
となっている.彼らのサイズと言ったら,9フィートたらず...
空にもそびえる20フィート以上のものまでいる.大きなもの...
な岩を武器として使い,遠くからでもそれを投げつける.全...
類の巨人は人間(焼いたり,煮たり,揚げたりしたもの)が...
という点で共通している.彼らのテーブルマナーは伝説的だ.
この場合、"*giant"パターンは次の怪物に対応する:
giant, stone giant, hill giant, fire giant, frost giant...
「*巨人」パターンには次の怪物に対応する:
巨人、岩石巨人、丘の巨人、炎の巨人、吹雪の巨人、雷の巨人
特殊文字を含むパターンに無関係なテキストがマッチしちゃう...
これを可能にするために、取り消しパターンを複数列記するこ...
取り消しパターンは他のパターンよりもパターン一覧の前の方...
もしそれがマッチしている場合はそれがある項目自体を無視す...
このパターンは'~'を先頭につけることで記述する((この文字そ...
例えば次のとおり:
*モールド
カビ
~slime mold
*mold
モールド,カビ,糸状菌.菌類に属する多細胞有機体,綿の...
繊維組織網で構成された植物の体の典型.モールドの特色は...
の胞子の発芽に帰する.ほとんどのモールドは死体寄生であ...
特定の種は(例えばペニシリン,青カビ)はチーズや抗生物質...
に使われる.
[ The Concise Columbia Encyclopedia ]
"~slime mold"パターンを列記しなかったら、
プレイヤーがslime moldの情報を見ようとしたときに
この項目が表示されてしまう((slime moldが"*mold"に対応する...
最後に、上記で述べなかった点をいくつか記述しておく。
- パターンは空白やタブ文字で始めることができない。
これは空白で始まるものは説明文とみなされることから起こる...
- 対応するものが見つかるまでdata baseにおける記載順に項目...
(見つかった時点でスキャンは停止する)。
これは2つ以上の項目に対応するパターンに合致するテキストが...
通常はこれ(を取り消しパターンの代わりに使うの)は避けるべ...
有益である場合もあるかもしれない。
- テキストはパターンと比較される前に小文字に変換されるた...
全てのパターンは小文字で記述すべきである。
- ユーザが複数形で入力した場合、このゲームはアイテムやモ...
従って、通常はパターン一覧に単数形と複数形を両方指定する...
***7.4.2. 説明文 [#bb3dcb5d]
説明文は接頭字がタブ文字の複数の行から構成される(テキス...
次のASCIIマークアップ規約が適用される:
_xxx_ xxxを強調表示
[xxx] xxxをボールド表示
- (語中) ハイフン
- (数字の間) 半角ダッシュ
- (空白で囲まれた) 全角ダッシュ
... 省略記号
... (行中にそれだけ) 縦の省略記号
"xxx" xxxを会話文として囲む
number' 数字をフィート表示
注: これらはゲーム中においてまったく解釈はされないけど、
一貫とした形式でプレーヤーにテキストを表示するのに役立つ。
行は、右行端未調整(つまり左揃え)で、67文字より短くしな...
パラグラフの分割は前節を短い行で示すべきだ(字下げは使う...
パラグラフ間の空行は、引用もしくは他の特殊な目的のために...
(詩における句の間の分離等)。
終止符(および短文を終える他の句読点)には2つの空白文字を...
*(未翻訳)8. 新しいアイテムの追加 [#l96e3f20]
**8.0. 'objects'配列 [#mc127982]
**8.1. 道具の追加 [#z4a56b94]
**8.2. 杖の追加 [#tc8de3ae]
**8.3. 薬の追加 [#jb5c85d8]
**8.4. 防具/武器の追加 [#ua1bae32]
**8.5. 指輪の追加 [#cb0960ad]
**8.6. 魔除けの追加 [#h368c0fa]
**8.7. 魔法書の追加 [#o1da0c41]
**8.8. 食料の追加 [#w4f387bb]
*(未翻訳)9. 新しい種類の部屋の作成 [#m12b7de6]
*(未翻訳)10. 新しい種類の店の作成 [#ue5732f1]
*(未翻訳)11. 最後に [#l7db9237]
*(未翻訳)付録A リファレンス関数一覧 [#yed1fbdf]
ページ名: