2016/12/06
■ [変愚蛮怒/開発]変愚蛮怒のマルチプラットホーム対応の痕跡について
Roguelike Advent Calendar 2016 の6日目の記事です。
変愚蛮怒はAngband/Zangbandからのフォークにあやかり、様々機種や環境でプレイできるような配慮、あるいはその痕跡がソースコード上にあれこれ残っています。今となってはSourceForge上のリリースバイナリにはWindowsとMac系の公開しかされていませんし、Unix/Linux系(ディストリビューション上の差異が山ほどある以上、当然ではあるのですが)は元より各人好きにコンパイルして遊んでくれ、と言った調子でREADME関連もほとんど放置しっぱなしになっています。
もう遊ぶ機会がないだろう&実装と動作の保証がないだろうという環境は何年前から放置されているのか分かったものではなく、最近に至って手前がソースのメンテナンス作業上で、削除してしまった多環境対応部分もあります(これを書いている間にそれがまだ不十分であることに気づいて愕然としていますが)
Advent Calendarの枠が空いてましたので、その辺について将来の保守や拡張に役に立つのか分からない備忘向けの話を一つ。
main*.cソース上の痕跡
今更の話ですが、変愚蛮怒のソースコードはC言語で書かれています。さらにゲームシステム部分のほとんどは、多数のプリプロセッサ(#ifdefとか)を挟みつつも、どのプラットホームでも同じソースコードで実装し、各プラットホームの入出力とは独立しています。
そして、各プラットホームの実装はほぼ全て各main.cに数千行かけて集約されていました。対応は以下の形になっていたようです。
- main.c …Unix/Linux系アプリケーションを中心に他のある程度互換性を持ったOSに対応するためのmain()及び各入出力処理の実装。
- main-cap.c …Termcapのインターフェース上で入出力を動作するための追加実装。
- main-dos.c …DOS一般のテキストコンソール上で入出力を動作させるための追加実装。
- main-gcu.c …Cursesのインターフェース上で入出力を実現するための追加実装。
- main-ibm.c …恐らくOS/2のGUIインターフェース上で入出力を実現するための追加実装。
- main-x11.c …X Window System GUIアプリケーションとしての入出力処理の追加実装。
- main-xca.c …X Athena WidgetsのGUIインターフェース上で入出力を実現するための追加実装。
- main-win.c …WindowsアプリケーションとしてのWinMain()及び各入出力処理の実装。
- main-mac.c …旧MacOSアプリケーションとしてのmain()及び各入出力処理の実装(MacOSXにどう対応しきっているかは未確認)
変愚蛮怒の現在のリポジトリに独立したソースレベルとして現存しているものだけだとこれだけですが、main.cやゲームシステム部分の#ifdefをのぞくとさらに過去に実装していたと思われるAMIGAのなどの痕跡も残っていました。
ANGBAND_SYS変数
グローバル変数上にANGBAND_SYSと呼ばれるcptr(char *)変数があり、ここに前項で述べたmain-???.cの???に当たる部分が保管されています。この変数はlib/prefなどにならんでいる。システム設定のためのスクリプトファイル(*.prf)のどれを読み込むかに用いられます。
また、prfファイル中のスクリプトでもこれを参照して分岐処理が行えるようになっています。以下はpref.prfの引用です。
##### System Specific Subfiles ##### ?:[IOR [EQU $SYS xaw] [EQU $SYS x11]] %:pref-x11.prf ?:[EQU $SYS gcu] %:pref-gcu.prf ?:[EQU $SYS ami] %:pref-ami.prf ?:[EQU $SYS mac] %:pref-mac.prf ?:[IOR [EQU $SYS win] [EQU $SYS dos] [EQU $SYS ibm]] %:pref-win.prf ?:[EQU $SYS emx] %:pref-emx.prf ?:[EQU $SYS acn] %:pref-acn.prf
というか、前項で述べたami(AMIGA)以外にもemxとかacnとかが残っていますね。acnはRISC OS、emxはibm系の派生のようですが、実装上の意図は良くわかんなくなっています。
ゲームシステム実装ソース上で#ifdefのために定義されていたもの
はい、既にこの辺のコミットで消してしまいました。
- USE_VME,USE_AMI,USE_LSL,USE_SLA,USE_EMX プリプロセッサを除去。 / Remove USE_VME,USE_AMI,USE_LSL,USE_SLA,USE_EMX preprocessors.
- VM プリプロセッサを除去。 / Remove VM preprocessor.
- SYS_III, SYS_V, ATARI, SUNOS プリプロセッサを除去。 / Remove SYS_III, SYS_V, ATARI, SUNOS preprocessors.
- SYS_III, SYS_V, ATARI プリプロセッサを除去。 / Remove SYS_III, SYS_V, ATARI preprocessors.
- #define MSDOS プリプロセッサを除去。 / Remove #define MSDOS preprocessor.
- #define USE_286 プリプロセッサを除去。 / Remove #define USE_286 preprocessor.
- #define AMIGA プリプロセッサを除去。 / Remove #define AMIGA preprocessor.
つうか、全二項の痕跡残したままでこいつらだけ消してチケット作業完了しているのは本当いい加減ですね。セルフ訴訟。
最後に
大体こんな感じです。改めてAngbandが長い伝統あるオープンソースであると共に、古き良き時代の文化の残り香みたいなものを感じざるを得ませんが、反面保守やらの障壁になっている問題もありますので、引き続き何らかの対応をとっていきたいと思っています。
カレンダーの7日目はargrath氏の「NetHack 3.6.0 1周年」となります。
■ [ヴィーヤウトゥムノ] 忍耐強きもの『イブ=ツトゥル』/Yibb-Tstll the Patient One (L.Dark 'P') 修正&着色
=== Num:706 Lev:46 Rar:2 Spd:+10 Hp:3025 Ac:100 Exp:16000 ドロドロにただれた身体を持った黒い巨人。てらてらと輝く頭部の表面を、二つ の目が別々に滑るように動きまわる。大きなマントをまとっており、その中には 無数の夜のゴーントがいる。夜のゴーント達はイブ=スティトゥルの乳房に吸い 付いたり、取り付いたりしている。この怪物はドリームランドの「クレドの密林 」の開けた場所でゆっくりと回転しながら、すべての空間とすべての時間を見通 している。(ラムレイ「オーク・ディーンの恐怖」) それは通常地下 46 階で出現し、素早く動いている、しかし侵入者を追跡しな い。この狂気を誘う邪悪なるモンスターを倒すことは 50 レベルのキャラクタに とって 約14153.85 ポイントの経験となる。それはカオスや因果混乱や放射性廃 棄物のブレスを吐くことがある、なおかつ的確に魔法を使うことができ、テレ ポートバック、暗闇、死者復活、デーモン一体召喚、アンデッド一体召喚の呪文 を唱えることがある(確率:1/4)。それは AC100 の防御力と 3025 の体力がある。 それは素早く体力を回復する。それは酸と稲妻と炎と冷気と毒とカオスの耐性を 持っている。それは侵入者をしばらくは見ており、 300 フィート先から侵入者に 気付くことがある。それは 12 個までの上質なアイテムを持っていることがあ る。それは 1d166 のダメージで触って全ステータスを減少させ、 1d166 のダ メージで触って全ステータスを減少させる。
http://sikabane-works.net/monzetsu_diary/?date=20140306#p03を修正&着色
鬼畜大佐『ロムンクァリィ』
相変わらずそこはかとなく感じる痴女感。あれ、ゴルちゃんは?
アッキ=ニンジャ『ウルウェン』
前回の正気度チャレンジで一度精神崩壊したんだ。 逃げ出さざるを得んだろう。