トップ «前の日記(2012/12/21) 最新 次の日記(2012/12/23)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 軍事 | 追記予定 | 通信 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


2012/12/22

[変愚蛮怒/スポイラー]「アングバンドの門が閉じる」謎処理

閉じかかる処理

昨今ネタにしている通り、変愚蛮怒はソースコードの違法建築物であるため、現在稼働していない奇妙な処理がソースの中に紛れ込んでいることがままある。以前から気になっていたのが、process_world()関数中のこれである。

   if (!(turn % (50*TURNS_PER_TICK)))
   {
     /* Check time and load */
     if ((0 != check_time()) || (0 != check_load()))
     {
       /* Warning */
       if (closing_flag <= 2)
       {
         /* Disturb */
         disturb(0, 0);

         /* Count warnings */
         closing_flag++;

         /* Message */
 #ifdef JP
 msg_print("アングバンドへの門が閉じかかっています...");
 msg_print("ゲームを終了するかセーブするかして下さい。");
 #else
         msg_print("The gates to ANGBAND are closing...");
         msg_print("Please finish up and/or save your game.");
 #endif

       }

       /* Slam the gate */
       else
       {
         /* Message */
 #ifdef JP
 msg_print("今、アングバンドへの門が閉ざされました。");
 #else
         msg_print("The gates to ANGBAND are now closed.");
 #endif


         /* Stop playing */
         p_ptr->playing = FALSE;

         /* Leaving */
         p_ptr->leaving = TRUE;
       }
     }
   }

check_time()並びにcheck_load()関数から0以外が帰ってくると、何度かの警告を経て、処理がアングバンドの門が閉じたと言われ、ゲームが終了する。随分剣呑な現象に見えるかもしれないが、これは単にセーブした上でゲームが強制終了するという機能で、データをロードすれば再びゲームを続けることができるようだ。

しかし、却って強制Qy@でもないのになんでこんな機能があるのかという疑念も湧く。check_time()とcheck_load()を覗くと以下の通りである。

 /*
  * Handle CHECK_TIME
  */
 errr check_time(void)
 {
 #ifdef CHECK_TIME

   time_t      c;
   struct tm   *tp;

   /* No restrictions */
   if (!check_time_flag) return (0);

   /* Check for time violation */
   c = time((time_t *)0);
   tp = localtime(&c);

   /* Violation */
   if (days[tp->tm_wday][tp->tm_hour + 4] != 'X') return (1);

 #endif

   /* Success */
   return (0);
 }
 /*
  * Handle CHECK_LOAD
  */
 errr check_load(void)
 {

 #ifdef CHECK_LOAD

   struct statstime    st;

   /* Success if not checking */
   if (!check_load_value) return (0);

   /* Check the load */
   if (0 == rstat("localhost", &st))
   {
     long val1 = (long)(st.avenrun[2]);
     long val2 = (long)(check_load_value) * FSCALE;

     /* Check for violation */
     if (val1 >= val2) return (1);
   }

 #endif

   /* Success */
   return (0);
 }

なるほど、すぐには分からん。 とりあえず、CHECK_TIMEとCHECK_LOADは昨今の公式バイナリでも他の方々の勝手版でもマクロ定義されてコンパイルされることはないので、現在これらの機能は死蔵されているも当然である。

そして関連の処理や配列を、あれこれ調べてみて結論は出た。これは、恐らくVanilla時代から実装されていたもので、リアルでプレイしてる時間帯、ならびに負荷を制限する機能なのだ。

check_time()関数で使われている、days配列変数の中身がこれである。

/*
 * Operating hours for ANGBAND (defaults to non-work hours)
 */
static char days[7][29] =
{
	"SUN:XXXXXXXXXXXXXXXXXXXXXXXX",
	"MON:XXXXXXXX.........XXXXXXX",
	"TUE:XXXXXXXX.........XXXXXXX",
	"WED:XXXXXXXX.........XXXXXXX",
	"THU:XXXXXXXX.........XXXXXXX",
	"FRI:XXXXXXXX.........XXXXXXX",
	"SAT:XXXXXXXXXXXXXXXXXXXXXXXX"
};

check_time()関数の流れはPC上の現在時刻を取得し、曜日を時刻を取得、上記の配列で該当する時間帯がXでない(つまり平日昼間の間)の場合に、Violation扱いとして1を返す。つまりこの時間帯以外にゲームプレイ中に何度か警告を出した後、穏便にゲームを終了するのである。

check_load()についてもrstat()関数という随分古い頃からのUNIX標準関数が使われているが、これは普通にLinuxでも stat()ならびにlstat()などと同等の関数で、この関数から得られるst.avenrun[2]は平たく言ってCPUの負荷である。それが予め決めた負荷以上がかかっている状態を感知するとViolation扱いとして、やはり穏便なゲーム終了を行う。

なんのことはない。これらはUNIX/Linux系でのみ稼働する、「時間」と「負荷」のチェック機構だった。邪推になるが、この機能を実装したであろう二十年以上も昔の実装者の目論見は恐らくこうである。

平日中にワークステーションを使って、Angbandを遊んでいる人間の屑がいる。
平日中にはゲーム禁止のため強制終了な。
あ、それ以外でもマシンの負荷がバリバリかかっている間は遊ぶことは許さん。

ようするにAngbandをこそこそと遊ぶようなハッカーの中でも底辺の手合いが、仕事をサボったり邪魔したりするのを、抑止していたのだ。いずれにせよ人間の屑が、この野郎。

[ヴィーヤウトゥムノ]千里眼『ボドリル』

Bodril the Seer.

-rilはクウェンヤあたりで「輝き」を意味する語感で、イドリルなど女性名に比較的使われている印象。Bodは海外の研究サイトの辞典などある程度探し回ったがはっきりとは分からなかった。

Bodril

 この7フィートを超える長身の女性は多元宇宙のいくつかの自治都市で一級の市民権を持ち、しばしば有力者の相談役や調停役を務めている。
 西方の『穢れ無き地』を出自とする神族であると言われるが、当人自身が生まれをほとんど語りたがらないので、真偽を含めた仔細は知れない。彼女の一族は不可視のものを見通す超常の能力をもっていると言われるが、彼女自身は並の人間以下の弱視持ちである。千里眼、先見者の通り名は、その見識と洞察を称えられたものだ。

[D'angband/開発]D'angband開発日誌 part34

進展内容

  • リファクタリング
    • 冗長なコメントの削除(2012/12/19~)
      • window stuff
      • Update stuff
      • Update torch
      • /* get a command */
      • Save the screen
      • etc..
    • ifdef JP による煩雑なローカライズの統合(2012/12/19~)
    • データ構造の改良(2012/12/22~)
      • creature_typeのstigmaticを削除(trait構造の編入済)
    • 関数構造の改良(2012/12/22~)
      • handle_stuff()関数に対象creatureの引数を追加。
      • メインウィンドウ、サブウィンドウ更新、クリーチャーのステータス再計算のフラグ立てを関数で行う仕様に変更(prepare_redraw()/prepare_window()/prepare_update())
    • 変数名の変更(2012/12/22~)
      • subjectivity_ptr -> creature_ptr
  • デバッグ
    • do_poly_self()に実装されていた変更先種族に規制がかからないバグを規制そのものを取り除く形に修正(変愚で行なったデバッグの追随)

保留内容

  • 変愚蛮怒のeffect.cで実装されていたステータス処理のリファクタリング中(2012/12/19~)
    • 超隠密や、構え、型なども既にtrait系列に加えているので統合可能。折を見て進めるべし。