はじめにやること,メイジの魔法, 耐性・状態異常・エゴアイテムについての情報を少しまとめてみました.
Angband は,いわゆる「ローグライクゲーム」 (家庭用ゲーム機ではチュンソフトの「不思議のダンジョン」シリーズなど, ランダムに生成される迷宮を冒険するゲーム)のひとつで, J.R.R.トールキンの指輪物語の世界をベースにしたものです. MAngband は,そのマルチプレイヤー版で, ネットワークを介してサーバに接続し,複数のプレイヤーが 同時に遊ぶことができます.
このゲームの勝利条件はただひとつ,指輪物語の世界における 邪神ともいうべき暗黒の帝王モルゴス(Morgoth, Lord of Darkness) を倒すことにあります. 彼は迷宮の地下100階以降に出現し, プレイヤーを粉砕すべく向かってきます. プレイヤーは互いに協力ないし競争し, 最終的に彼を倒した者が「勝利者」の称号を獲得することができます.
このゲームは,サーバが公開されており, ローカルなサーバを作るなどして内輪で遊ぶことが可能です. このページでは,OUCCでローカルに設置して約1年遊んだサーバの情報が載っています.
より詳細な MAngband についての説明は, 公式サイト を参照してください. チュートリアルの日本語訳 も置かれています. これを書いている時点(2002/6/6)では, ソースコードのライセンスが変わると書かれていますが, まだ新バージョンがリリース待ちになっています.
こちら で使われている日本語クライアントが 0.7 ベースでは ウィンドウ設定も保存できるので一番優秀かもしれません。 ただし,日本語通らないクライアントを利用している人のことも 考えるようにしてください.
OUCC 内輪用サーバでは,archive/mang-j022-dsb.zip が推奨です.
クライアントのアーカイブを展開して,mangband.exe (作成者によっては mang-xxx.exe のような名前の場合もあります) を実行すると,メタサーバ(サーバ情報を管理しているサーバ)に接続に行きます. ここで接続したいサーバを選択しますが, OUCC で立ち上げているサーバのように内輪で立ち上げているサーバに接続するには, "Q" を押して手動でのサーバ名入力モードに移行し,IPアドレスまたは サーバ名を入力します.これに続いてキャラクター名とパスワードを入力し, サーバ名が正しく,ログインに成功すれば,ゲームが始まります. 毎回同じサーバにログインする場合,付属の ini ファイルに ホスト名,キャラクター名を記述しておくと楽です.
WindowsXP上で動作させると,一部のフォントでは 床などが正しく表示できないようです. "lib/users/xp-font-win.prf" で "lib/users/font-win.pref" を置き換えるのが 無難なようです.
パスワードは,最初にゲームを遊ぶ際に決定します. このときのパスワードが間違っていると,次に遊ぶときに ログイン失敗となってしまうので,気をつけてください.
また,mangband で利用されているパスワードは, 直前1バイトとの XOR を取っているだけの単純な符号化を利用しているため, サーバ上のファイルにアクセスできるユーザであれば, 非常に簡単に解析することができます.
筆者は,内輪で遊ぶ用に設置したサーバで, パスワードが分からなくなった人を救出するために 解析スクリプトを作成した経験がありますが, それ自体は30分もあれば完了する作業でした.
よって,MAngband で利用するパスワードは, ばれてもかまわない程度のパスワードを利用することをお勧めします. 他のサイトなどで利用しているパスワードと一致させないようにしましょう.
アイテムや魔法,モンスターに関する詳細な情報が記述された スポイラーは,各種 FTP サイトなどから英語版をダウンロード可能です。 日本語版も様々なサイトで作成されていますので, 「Angbaand」「スポイラー」などで検索して探してみるとよいでしょう.
Angband は,J.R.R.トールキンの作品である「指輪物語」 「ホビットの冒険」「シルマリルの物語」の世界をベースにしており, 多くの魅力的な登場人物,アイテム,そして敵たちがゲームにも登場します. ゲームをより楽しむために,そして作品をより楽しむために, これらの原作を読みながらゲームを遊ぶことをお勧めします. また,マルチプレイヤーの MAngband 以外にも 多数の Angband のバリアント(変種)が公開されていますので, それらを遊んでみるのもよいでしょう.
以下はキャラクター作成に関する情報です. キャラクターを作ったら,はじめにやること を見ながらでも,ゲームをぼちぼち遊んでみてください.
その他にも チュートリアルや, hirozo の MangBand 写真館さんからのリンクなども ありますので,参考にしてみてください.
まず最初にサーバに接続すると,キャラクター作成が始まります. 性別,種族,職業を選び,キャラクターの重視する能力値の優先順位を 選ぶことで,キャラクターが生成されます.
能力値は,以下の6つです.
能力値 | 日本語訳 | 影響する要素 |
---|---|---|
STR(Strength) | 腕力 | 攻撃力,持てる荷物の量 |
INT(Intelligence) | 知能 | 魔法の道具の発動成功率,メイジの魔法能力 |
WIS(Wisdom) | 知恵 | 魔法への抵抗力,プリーストの魔法能力 |
DEX(Dexterity) | 器用 | 命中力,回避力,罠解除,盗みを防ぐ確率 |
CON(Constitution) | 耐久 | HP,ステータス異常に対する耐性 |
CHR(Charisma) | 魅力 | 店での取引の価格 |
キャラクターの職業は,戦士,盗賊,メイジ,プリースト,レンジャー,パラディン の6種類です. キャラクター選択画面では先に種族を選んでから職業を選びますが, 先にどの職業を選ぶかを決めてから,種族を選んだほうが無難です.
職業 | 職業の特徴 |
---|---|
戦士(Warrior) | 高い戦闘力を有します.魔法は使えないので,アイテムに頼ることになります. この「アイテムに頼る」というところが曲者で,慣れるまでは難しいように思います. 重視する能力は腕力および耐久力,次に器用さです. |
盗賊(Rogue) | 罠感知や解除,飛び道具の扱いに長けています. メイジの魔法のうち,探索に関連する部分を一部使えるため, 戦士に比べると安心して探索が進行できます. 重視すべき能力はやはり攻撃力に直結する腕力, 飛び道具での戦闘に大きく影響する器用さです. |
レンジャー(Ranger) | 戦士にはかないませんが高い戦闘力を持ち, メイジの魔法のほとんどを使います. そのため,プレイヤーの好みに応じて戦術の幅も広がっています. ただし,呪文の習得はメイジよりも遅く,成功率も低くなります. 攻撃+補助魔法という感じの戦い方になるので,使いやすい職業の1つです. 重視すべき能力は,腕力,知能,器用さです. |
メイジ(Mage) | メイジは接近戦闘力では非常に劣りますが, レベルが上がれば専用の強力な魔法を使えます. 魔法が大好きな人にはお勧めの職業で, 最も重視すべき能力はMPに直結する知能です. また,腕力が低いと荷物が運べなかったり,武器を装備したときに ペナルティを受けることから,腕力にも高い値を設定すると,少し楽になります. |
プリースト(Priest) | メイジとは対になり,回復や防御の魔法を得意としますが, レベルが上がると強力な攻撃魔法なども習得します. 接近戦闘力はメイジよりは高いですが,祝福されていない刃物を 装備することはできません.序盤は鞭などが良い武器となります. プリーストの魔法は賢さで勝負です. やはり接近戦は必要になるので腕力,耐久力も重要です. |
パラディン(Paladin) | プリーストの魔法を使える戦士です. 成功率などで不利になりますがプリーストのすべての魔法を使うことができ, 刃物の制限もありません. レンジャーと並んで扱いやすい職業です. 腕力,賢さ,耐久力を高めにして,補助魔法を使いながら戦う戦士になります. |
職業ごとの能力修正を次に示します. これが,各職業が使う能力値を端的に示しています.
上昇する能力値は青字で示しています. 経験値修正は,1レベルの上昇に必要な経験値が, 標準から何%余分に必要になるかを示す値です. 低いほどキャラクターの成長が早くなります.
職業 | STR | INT | WIS | DEX | CON | CHR | 経験値修正 | HP 修正 |
---|---|---|---|---|---|---|---|---|
戦士 | +5 | -2 | -2 | +2 | +2 | -1 | 0% | +9 |
メイジ | -5 | +3 | 0 | +1 | -2 | +1 | +30% | 0 |
プリースト | -1 | -3 | +3 | -1 | 0 | +2 | +20% | +2 |
盗賊 | +2 | +1 | -2 | +3 | +1 | -1 | +25% | +6 |
レンジャー | +2 | +2 | 0 | +1 | +1 | +1 | +30% | +4 |
パラディン | +3 | -3 | +1 | 0 | +2 | +2 | +35% | +6 |
キャラクターの種族は,人間,ハーフエルフ,エルフ,ホビット,ノーム, ドワーフ,ハーフオーク,ハーフトロル,ドゥナダン,ハイエルフの10種類から 選択します.種族ごとに能力値へのボーナスが異なるため, 職業の長所を伸ばせる種族を選ぶと,有利にゲームを進めることができます. もちろん,趣味だけで種族を選ぶのもひとつの選択です.
以下の表では,上昇する能力値を,青い文字で示しています. 基本的には,ドゥナダンとハイエルフだけが能力値的に有利なかわり, 成長に大きく時間がかかるようになっています.
種族 | STR | INT | WIS | DEX | CON | CHR | 経験値修正 | HP 基本値 |
---|---|---|---|---|---|---|---|---|
人間(Human) | 0 | 0 | 0 | 0 | 0 | 0 | 0% | 10 |
ハーフエルフ(Half-Elf) | -1 | +1 | 0 | +1 | -1 | +1 | +10% | 9 |
エルフ(Elf) | -1 | +2 | +1 | +1 | -2 | +1 | +20% | 8 |
ホビット(Hobbit) | -2 | +2 | +1 | +3 | +2 | +1 | +10% | 7 |
ノーム(Gnome) | -1 | +2 | 0 | +2 | +1 | -2 | +25% | 8 |
ドワーフ(Dwarf) | +2 | -3 | +2 | -2 | +2 | -3 | +20% | 11 |
ハーフオーク(Half-Orc) | +2 | -1 | 0 | 0 | +1 | -4 | +10% | 10 |
ハーフトロル(Half-Troll) | +4 | -4 | -2 | -4 | +2 | -6 | +20% | 12 |
ドゥナダン(Dunadan) | +1 | +2 | +2 | +2 | +3 | +2 | +80% | 10 |
ハイエルフ(High-Elf) | +1 | +3 | -1 | +3 | +1 | +5 | +100% | 10 |
キャラクターを作ったら,タイトル画面の後,街に放り出されます. はじめにやること を見ながら,ゲームをぼちぼち遊んでみてください.
MAngband では,ダンジョンと町を行き来するために Word of Recall の魔法あるいは巻物を使います. 移動先を通常はダンジョンの深さで指定しますが, そこで深さにマイナスの値を設定すると,飛んだ瞬間に クライアントが落ちて,以降そのキャラクターが使えなくなるという 問題が起こりました.
何も装備していない部位が「呪われている」扱いになり, 何も装備できなくなることがあります. そのときは,一度ログアウトすると復帰するようです.
エゴアイテム「of Istari」の e_info.txt の記述で, 命中/ダメージ修正がいずれも "-5" と指定されていますが, これが 251 として扱われて,超強力なアイテムが生成されてしまう ことがあります. "5" くらいにしておくのが無難です.
死んだとき,通常はすべての金とアイテムを失い,経験値は半分になります. しかしこれでは厳しすぎる(初めて遊ぶ人が多い場合には嬉しくない)ので,金が半額残り, 経験値も保存されるようにしました(アイテムは全て死んだ場所に落ちます). この処理は server/xtra2.c に記述されています. コメントが書いてありますので,それを参考にしてソースコードを 変更していきます.単純には,その金や経験値を減らす処理のコードを コメントアウトしたり,少し数値を直すだけで終わります.
お金に関する処理は,関数 void player_death(int Ind) を変更します. /* Drop gold if players has any */ if (p_ptr->alive && p_ptr->au) { /* Put the player's gold in the overflow slot */ invcopy(&p_ptr->inventory[INVEN_PACK], 488); /* Drop no more than 32000 gold */ /* if (p_ptr->au > 32000) p_ptr->au = 32000; この行をコメントアウト*/ /* Set the amount */ p_ptr->inventory[INVEN_PACK].pval = p_ptr->au / 2; /* 本当は 0 になるところを gold 1/2 で抑える */ p_ptr->au -= p_ptr->au / 2; }
経験値は,void resurrect_player(int Ind) を変更します. /* Lose some experience */ /* 以下の三つの行をコメントアウトしてください.*/ /* p_ptr->max_exp -= p_ptr->max_exp / 2; */ /* p_ptr->exp -= p_ptr->exp / 2; */ /* check_experience(Ind); */ /* こんな感じ. */ 少し泥臭い気もしますが.
最大化モードが ON になると,最終的な能力の最大値に種族と職業の修正が 加わるようになります.最大化モードが OFF のサーバではすべての能力が 18/100 まで上昇しますが,最大化モードが ON になると, たとえばエルフのメイジは知能が 18/160 まで上昇するかわり 腕力が 18/60 までしか上昇しない, といった種族・職業ごとの個性が反映されるようになります.
最大化モードを ON にするには,server/birth.c にある bool player_birth(..) の中を書き換えます. /* Actually Generate */ /* このコメントを目印に */ p_ptr->maximize = TRUE; /* この行を追加します */
やはり誰がどのユニークモンスターを多く殺しているか,あるいは 何で死んでいるかは気になるところなので, キャラクターやユニークモンスターが死んだ場合,それをログファイルに 記録するようにします. メッセージ出力そのものは server/xtra2.c に書かれているので, そこで一緒にログも出力するようにします.
まず,ログの仕様を以下のように定めました. [時刻]出来事 時刻の形式は,"yy/mm/dd HH:MM" とします. 出来事として注目する事象はプレイヤーやユニークモンスターの死亡だけなので, 次のように決定しました.ユニークモンスターの名前には '"' や ',' が含まれているので,セパレータには '#' を選択しています. K#player-name#died-from (was Killed; 死亡) D#player-name#died-from (ghost was Destroyed; 消滅) F#player-name#died-from (Fruits-bat; フルーツバット) C#player-name (Commited suicide; 自殺) R#player-name (Retired; 勝利の後引退) S#uniq-name#player-name (Slain: ユニークの殺害) S#uniq-name#player-name#party-name (同上, パーティ戦闘の場合)
ログを生成する関数を xtra2.c に追加します. void oucc_write_log(char* log) { FILE* log_file; time_t t; char buf[64]; time(&t); strftime(buf, 64, "%y/%m/%d %H:%M", localtime(&t)); log_file = fopen("oucc-log.txt", "a"); if (log_file == NULL) return; fprintf(log_file, "[%s]%s", buf, log); fclose(log_file); }
player_death 関数に,プレイヤー死亡時のメッセージ出力処理を追加します. まず,ログ生成用バッファの宣言を関数の先頭に追加します. char log_buf[1024]; 関数本体に以下のようにログ生成を書き足します. /* Get rid of him if he's a ghost */ if (p_ptr->ghost) { /* Tell players */ sprintf(buf, "%s's ghost was destroyed by %s.", p_ptr->name, p_ptr->died_from); msg_broadcast(Ind, buf); /* ここを追加 */ sprintf(log_buf, "D#%s#%s\n", p_ptr->name, p_ptr->died_from); oucc_write_log(log_buf); /* 省略 */ } /* Tell everyone he died */ if (p_ptr->fruit_bat == -1) { sprintf(buf, "%s was turned into a fruit bat by %s!", p_ptr->name, p_ptr->died_from); /* ここを追加 */ sprintf(log_buf, "F#%s#%s\n", p_ptr->name, p_ptr->died_from); } else if (p_ptr->alive) { sprintf(buf, "%s was killed by %s.", p_ptr->name, p_ptr->died_from); /* ここを追加 */ sprintf(log_buf, "K#%s#%s\n", p_ptr->name, p_ptr->died_from); } else if (!p_ptr->total_winner) { sprintf(buf, "%s committed suicide.", p_ptr->name); sprintf(log_buf, "C#%s\n", p_ptr->name); /* ここを追加 */ } else { sprintf(buf, "The unbeatable %s has retired to a warm, sunny climate.", p_ptr->name); sprintf(log_buf, "R#%s\n", p_ptr->name); /* ここを追加 */ } /* Tell the players */ /* handle the secret_dungeon_master option */ if ((strcmp(p_ptr->name,cfg_dungeon_master)) || (!cfg_secret_dungeon_master)) { msg_broadcast(Ind, buf); oucc_write_log(log_buf); /* ここを追加 */ }
monster_death 関数にも,ユニークモンスターを倒した場合の記録処理を書き足しま す. 先ほどと同様,変数宣言を書き足します. char log_buf[160]; ユニークモンスターを倒した時の処理に,以下のように書き加えます. (このソースコードの位置はコメントを参考に見つけてください) /* give credit to the killer by default */ sprintf(buf,"%s was slain by %s.",(r_name + r_ptr->name), p_ptr->name); /* ここを追加 */ sprintf(buf, "%s#%s\n", (r_name + r_ptr->name), p_ptr->name); /* give credit to the party if there is a teammate on the level, and the level is not 0 (the town) */ if (p_ptr->party) { for (i = 1; i <= NumPlayers; i++) { if ( (Players[i]->party == p_ptr->party) && (Players[i]->dun_depth == p_ptr->dun_depth) && (i != Ind) && (p_ptr->dun_depth) ) { sprintf(buf, "%s was slain by %s.", (r_name + r_ptr->name), parties[p_ptr->party].name); sprintf(buf, "%s#%s#%s\n", (r_name + r_ptr->name), p_ptr->name, parties[p_ptr->party].name); /* ここを追加 */ break; } }
通常の状態で MAngband を make すると,メタサーバに報告して みんなが接続に来てしまうので,内輪で遊ぶためには メタサーバへの報告の項目を FALSE に変更します. また,勝利後の自動引退までの時間を -1 に設定して, 勝利者になった人がモルゴスの鉄冠やグロンドで遊べるようにします.
REPORT_TO_METASERVER = false RETIRE_TIMER = -1
CFLAGS = -Wall -g -pipe -D"USE_GCU" -I/usr/include/ncurses LIBS = -lncurses
Written by てぃる
このページは,大阪大学コンピュータクラブ所属時に作成したものです.