/*==================================================================
 XMascot Ver 2.6
 TUT Computer Club "Project XMascot"
 Copyright(c) 1996,1997  Go Watanabe    go@cclub.tutcc.tut.ac.jp
                         Tsuyoshi Iida  iida@cclub.tutcc.tut.ac.jp
 All Rights Reserverd.
====================================================================*/

0.はじめに

 「おお、えんでぃんぐだ...  いやーおもろかった。つぎはだれにしやう...
   ぬ、なにか“ますこっと”ってのがあるぞ...  
   おぉ ゆれている、 おぉ のびるのびる、つつくとしゃべるし。
   ぬぬぬ、これって えっくす でほしいよなぁ。」

1.XMascot とは

 XMascot は、X Window System の画面上に可愛いマスコットを表示する
 プログラムです。以下のような機能を持ちます。

 ・揺れる    画面のなかでプリチーに揺れます。
 ・伸びる    鎖の長さをお好みに応じて伸び縮み可能です。
 ・喋る      別途音声再生のコマンド、音声データを準備することで、
             喋らせることが可能です
 ・アラーム  毎日ある時刻に定義したアクションをおこさせることができます。
 ・BIFF      メールの到着をしらせる BIFF として利用できます。
             From: Subject: も表示されるようになりました。
	     Ver2.5から youbin コマンドに対応しました。

 他にも次のようなことが可能です。

 ・マスコットの切替え   複数のマスコットを気分に応じて切替えできます。
                        Ver2.5 から、複数のメニューセットが登録できるように
                        なりました。
 ・重力/減衰係数の制御  振り子運動を忠実にシミュレートしています。

 マスコットデータとして以下の画像形式をサポートしています。

   GIF    *.gif  256色まで。transparent/interlace 対応
   BMP    *.bmp  全形式 (ただし、256色以上は 8bpp で誤動作する)
   MAG    *.mag  16色 または 256色

  ----------------------------------------------------------------
   2.6 では未対応 (imagelib verup 作業のときに処理してない)
   TIFF   *.tif  16色 または 256色 で、raw形式 か lzw圧縮形式

   これらは TrueColor では動作する
   PPM    *.ppm  256階調カラー         raw形式
   PGM    *.pgm  256階調グレイスケール raw形式
   PBM    *.pbm  2値モノクロ           raw形式
   PNM    *.pnm  PPM,PGM,PBM のどれか
  ----------------------------------------------------------------
 
 画像は拡張子ではなく、実際の内部データで判断されて読み込まれます。

 ------------------------------------------------------------------
  この機能は 2.6 alpha では TrueColor 以外で動作しない。
  (imagelib の不備による)

 よみこみに失敗した場合は、拡張子をもとに、
 拡張子topnm ,*toppm ,*topgm, *topbm コマンドが存在する場合は、それを
 呼び出してロードしてくれます。

   例: aaa.gif なら giftopnm や giftoppm などを呼び出す。
 ------------------------------------------------------------------

 透明色は自動的に判定されます。

 このバージョン(Ver2.6)では、サンプルとして 10個 の マスコットデータが
 含まれています。

 音声は pipipipi.au が入っています。
 また、あるXMascot愛好者の方から、メール着信用の音声を
 いくつか送っていただきました。(^^)
 
 sounds 以下の
  mi.{au,raw} mi2.{au,raw} mitime.{au,raw} 

 です。適宜御利用下さい。

 contrib 以下に怪しいおまけソフトが入っています。
 これらについてはそれぞれの README を参照して下さい。

 ****** Notice ******
 XMascot は非常にマシンに対する負荷が高く、Pentiumクラス以上でないと、
 快適な動作は期待できません。

 XMascot の最新版、および関連物は

  http://cclub.tutcc.tut.ac.jp/xmascot/
  ftp://cclub.tutcc.tut.ac.jp/pub/xmascot/

 で公開されています。

2.インストール方法

 コンパイルには、gcc 等 ansi 式の記述に対応したコンパイラが必要です。

 (a) config.tmpl の変更

  XMASDIR  
  
  標準のマスコットデータが格納されるディレクトリを設定します。
  ここに付属のマスコットや音声が格納されます。また、このディレクトリは
  標準でサーチパスの最後に追加されます。
  デフォルトは $(LIBDIR)/xmascot です。

 以下に示す項目を環境、要望にあわせて適宜 #define/#undef して下さい

  PERSONAL  個人のホームディレクトリにインストールします。

    PERSONAL を define すると、XMASCOT を個人のホームディレクトリに
    インストールします。 
    $HOME/bin/xmascot, $HOME/xmascot/* $HOME/XMascot
    ($HOME/$LANG/XMascot USE_I18Nの場合) としてインストールされます。
    $HOME/bin にパスを切って使用して下さい。
   
  NEED_DIFFTIME  difftime(3)が無い時に指定します。(SunOS4.1.Xなど)

  USE_BIFF   メールの着信お知らせ機能を使用します

    これを利用する場合は、自分の環境のディレクトリ構成に
    合わせて、MAILBOX_DIR が正しくメールのスプールを指すように
    設定して下さい。XMascot が想定するメールボックスは
    MAILBOX_DIR/ユーザ名 です。

    POPなどを利用している場合には、リソース *biffCmd: 、または
    起動時オプション -biffcmd にメールのチェック用のコマンドを
    指定して下さい。(mh の msgchk など)

    コマンドの返り値が 0:メールがある、1:ない、それ以外:状態変わらず
    と判定します。
  
  USE_BIFFLIST  着信お知らせ一覧を使います

    これを #undef すると、着信お知らせ From: Subject: 一覧の
    機能がなくなります。

  USE_YOUBIN    youbin 対応
   
    youbin コマンドを利用して youbin protocol でメールの確認
    を行ないます。path の通った場所に youbin コマンドが必要です。

  USE_SOUND  音声を使用します

    USE_SOUND を define すると、音声再生機能を組み込みます。
    XMascot の音声機能は、外部コマンドを呼び出す他力本願です。
    何らかの音声再生コマンドを準備して、その呼びだしコマンドを、
    SOUND_COMMAND に設定して下さい。%s に音声のファイル名が入ります。

    デフォルトは、SunOS や NetBSD で使用できる、cat %s > /dev/audio
    になっています。

  USE_I18N   国際化対応版にします

    USE_I18N を define すると、国際化対応版としてコンパイルします。
    国際化は X11R6 の Athene-widget によるものです。
    デフォルトで準備された設定ファイルは、日本語 euc になっています。
    使用しているコードが異なる場合は、japanese/XMascot.ad.sed のコードを
    nkf などで変換してください。

  DUMMY_SETLOCALE
    
    OS の setlocale が日本語の locale をサポートしておらず、また X が
    -DX_LOCALE をつけずにコンパイルしてあって、国際化機能が利用できない
    場合に、むりやり国際化機能を有効にしたいときに指定します。

  USE_DOUBLE 倍精度演算

    位置計算回りを double を使用します。揺れがとまりそうなときに、
    「カクッ」と動くことがなくなります。あと、とまったと見せかけて実は
    整数演算の誤差のため揺れ続けているということもなくなるはずです。(たぶん)
    数値演算プロセッサ(みんなあるよね^^)のある場合はこっちのがたぶん幸せです。

  USE_CHAINPAT 鎖に絵をはる
 
    鎖に絵を貼れるようにします。

  USE_SHADOW   影をつける

    マスコットに影をつけます。

  USE_XAW3D

    Xaw3D や Xaw95 を使用する際に指定します。

 (b)コンパイル/インストール

   % xmkmf -a
   % make
   % su
   # make install
  
  でインストールが完了します。

 (c) 動作確認

   以下の組合せでの動作を確認しています。

  GATEWAY2000       Pentium 120  OpenBSD 1.2/i386 gcc 2.7.2  XFree86 3.3
  DEC 3000          Alpha ?      DEC OSF/1 V3.0   gcc 2.6.0  X11R5
  SparcStation IPC  Sparc ?      SunOS 4.1.3      gcc 2.7.2  X11R6
  HP 9000/715       ?            HP-UX A.09.07    gcc 2.7.2  X11R6

3.起動方法

  XMascot の起動方法は次の通りです。

  xmascot [option] [filename]

  ファイル名を指定した場合、そのファイルをマスコットとして
  読み込み表示します。ファイルはサポートされている形式の画像データです。
  このマスコットは切替えメニュー0番の一番最後に登録されます。
  ファイル名を指定しない場合は、メニューに登録されたマスコットで起動します。

4.起動時オプション

 -geometry, fg, bg などの 通常のXToolkit のオプションに加えて、
  以下のような起動時オプションがあります。

  ★透明色指定オプション Ver2.6 からは削除しました。どうしても
    指定したい場合はリソースを利用して下さい。

 -verbose        デバッグ用の冗長表示モード
 -gravity n      重力加速度の指定  単位は cm/sec^2 です。
 -chainlength n  鎖の長さを指定します。単位は mm
 -damping n      減衰係数を指定します。0 で揺れが止まらなくなります。
 -degree n       振り始めの角度を指定します。
 -menuno n       起動時のメニューの番号を指定します。
 -no n           起動時のマスコットの番号を指定します。
 -magnify n      マスコットの画像の拡大率を指定します。
 -pinpat fname   ピンの部分の画像を変更します。
 -random         起動時のマスコットをランダムに指定します。
 -changetime min 一定時間ごとにマスコットを切替えます。
                 通常は、1つのメニューセットの中で次々かわります。
                 -random 併用時は random に切替わります。
 -allmenu        上記の切替えが全メニューに及びます
 -searchpath     マスコットおよび音声データのサーチパスを指定します。
                 パスは : で区切ります。
 -chainnum       鎖の個数を指定します。
 -drawtiming n   描画をコマ落ちさせます。n 回に一回の描画になります。

USE_CHAINPAT 指定時のみ有効

 -chainpat fname 鎖の部分の画像を変更します。

USE_SOUND 指定時のみ有効

 -soundcmd       音声再生用のコマンドを指定します。
 -soundstart     起動時の音声ファイルを指定します。
 -soundclick     クリック時の音声ファイルを指定します。
 -soundend       終了時の音声ファイルを指定します。
 -soundmail	 メール着信時の音声ファイルを指定します。
                 *これは USE_BIFF も必要

USE_BIFF 指定時のみ有効

 -nobiff             BIFF 機能を無効にします。
 -update sec         到着調査の時間間隔を秒単位で指定します。(デフォルト30秒)
 -noonce             メールが到着するたびにアクションを起こさせます
                     (デフォルトでは、メールを参照して、biffの起動が解除されて
                     からでないと、2通め以降はアクションは呼ばれません)
 -biffcmd cmd        メール到着をチェックするコマンドを指定します。
                     これを指定すると、メールスプールは参照しなくなります。
 -biffpat fname      メール到着を示すグラフィックのパターンを指定します。
 -biffpos str        パターンを表示する位置を指定します。(left,center,right)
 -biffgeometry geom  着信メール一覧の表示サイズと表示位置を指定します
 -bifffilter cmd     着信メール一覧表示の際に通すフィルタコマンドを指定します
 -popdowntime sec    着信メール一覧表示を自動的に消すまでの秒数を指定します。
                     0以下の数値にすると、自動に消えなくなります。
 -nobifflists        着信メール一覧表示をだしません( -popdowntime 0 と同じ)

USE_YOUBIN 指定時に有効

 -noyoubin           yobin を利用しない
 -server host        youbin server を指定する

USE_SHADOW 指定時のみ有効

 -shadow n       影を表示する際の、影のずれの量を指定します。
 -noshadow       影をつけません ( -shadow 0 と同じ )

5.操作方法

 XMascot の基本操作は、つぎの通りです。

 ピン : 左ボタン ドラッグ    マスコットの場所を移動できます
        右ボタン ドラッグ    メニューがでます

 本体 : 左ボタン ドラッグ    鎖の長さを調整できます
        左ボタン クリック    加速します
        右ボタン クリック    登録された音声を再生します
 
 BIFF の着信マーク: 
        左ボタン クリック  一覧表示が消えている場合、表示させます

6.メニューについて

 Ver2.5 からメニューの仕様がすこし変更になりました。
 ご注意下さい。

 Original Mascot  マスコット変更のメニューが複数ここに並べることができます。   
 .....            詳細はリソースに関する部分を参照して下さい。

 Change Parameter 重力加速度、減衰係数、影の幅、拡大率、鎖の数を変更できます

 Set Alarm/Chime  アラームの設定を行ないます

    アラームは４種類あります。
    (1)定時に実行 (Alarm)
    (2)一定時間経過したら一度だけ実行 (Timer)
    (3)一定時間毎に実行 (Interval)
    (4)毎時0/30分に実行 (Chime)
   

    また、USE_BIFFが有効な場合は、メール着信時のアクションも
    このメニューから設定します。

    ---a--- --b-- ----------c----------- --d---
    (*^o^*) 00:00 sound(pipipipi.au)     [TEST]

    a. このスイッチを ON (黒く反転)にすると、設定が有効になります。
    b. 時刻の設定(24時間表示)です。
       タイマーの場合はアクションをおこすまでの時間を 分:秒 で設定します。
       カップラーメンをつくるなら 03:00 です。
    c. 実行させるアクションを設定します。アクションについては、
       以降の章を参照してください
    d. アラームのテストを行ないます

  アラームで設定したデータは、ホームディレクトリの .xmascotrc に保存
  されます。

 Arrived Mail lists   着信メール一覧を再表示させます
 About XMascot        XMascot の著作権表示です
 Exit Program         XMascot を終了します

7. Biff 機能について

 XMascot は biff としての機能をもっています。
 着信マークの表示、From: Subject: 一覧表示、アクション駆動を行ないます。
 ★Ver2.5 から youbin コマンドの呼び出しをサポートしました

 動作はつぎのようになっています。

 (1) メールボックスが空なら 着信マーク と From: 一覧を消去

 (2) メールが来た場合、

     起動後始めてメールがくる(起動直後にメールボックスにメールがある場合も)
     または -noonce オプションが有効な場合は、
     ●メール着信音声の再生
     ●アラームメニューで設定したアクションを駆動する。
     ●そのあと、着信マークを表示

 (3) メールボックスのサイズが変化した(増えた/減った)場合は、
     ●一覧表時を変更して再表示する

     この一覧表示の表示場所/大きさは、オプション -biffgeometry で
     指定できます。書式は通常の geometry と同じです
     
    例: 右下すみ
       % xmascot -biffgeometry 200x100-0-0

 (4) -popdowntime で指定した秒数したら自動的に一覧表時を消す
     (0以下の値を与えると、自動的には消えなくなる)     
 
     一覧表示中の窓にマウスカーソルをいれると、自動的には消えません。

 通常は、コンパイル時に指定したメールボックスを参照してチェックしますが、
 オプション -biffcmd で外部コマンドを指定した場合には、このコマンド
 の返り値で判定されます

 返値  1 or 負数    メールボックスは空
       0            新規メールあり
       2            状態は変わらず
 
 外部コマンドを使用した場合は、一覧表示はそのコマンドの標準出力
 が使用されます。
 
 メールの一覧表示は、-bifffilter でフィルタコマンドを指定している場合
 にはこのコマンドでパイプ経由で処理してから表示されます。
 国際化対応でコンパイルしている場合、適宜フィルタを指定することで、
 日本語 Subject などを表示させることも可能です。
 フィルタには、nkf などが利用できます。

 例1: JIS の Subject: を表示させる

 locale が EUC の場合
 % xmascot -bifffilter "nkf -e"

 locale が SJIS の場合
 % xmascot -bifffilter "nkf -s"

 例2: From: の MIME もデコードさせたい場合

 locale が EUC の場合
 % xmascot -bifffilter "nkf -e -m"

 locale が SJIS の場合
 % xmascot -bifffilter "nkf -s -m"

8.アクション

以下のようなアクションが定義されています。
リソースで定義することで、マウスやキーボードでさまざまな操作を
定義させることができます。.Xdefaults や .Xresource の中で、
適宜 translations して御利用下さい。

ピン部分は、      XMascot.translations: #override ほにゃらら
マスコット部分は、XMascot.mascot_base.translations: #override ふにふに
です。

 例:  ピンの部分で中ボタンをクリックしたら、メニューの次の
      マスコットになって、クリック時の音声を再生させる。
      キーボードの Shift-R を押したら、ランダムにマスコットが変わる

 .Xdefaults に次のように加えます。

 XMascot.translations: #override <Btn2Up>: chg_next() snd_click()\n\
                                Shift<Key>R: chg_random() snd_click()

 アクションの定義の詳細は、Xに関する書籍などを参照して下さい。

また、アラームの設定もアクションで記述します。

例:  時間が来たら、マスコットがメニューの次のものになって、
     揺れ始める。 

     chg_next() start_move()

     時間が来たら、チャイムをならす。(pipipipi.au が必要)
   
     sound(pipipipi.au)

アクション一覧

 quit                      プログラムを終了します
 change(num,[menu])        メニュー menu の num 番のマスコットに変更します
 chg_file(fname [,title])  fname のファイルをマスコットとして
                           よみこみます。
                           これはメニューの一番下に登録されます。
 chg_next                  マスコットをメニューの次のエントリの
                           ものに変更します。
 chg_next_all              すべてのメニューを含めて次のエントリにします
 chg_random                マスコットをランダムに変更します
 chg_random_all            すべてのメニューを含めて次のエントリにします
 start_move                マスコットをすこし加速させます。
                           止まっていたら揺れ始めます。
 sound(fname1,...)         音声ファイルを連続再生します。
 snd_start                 開始時音声を再生します。
 snd_click                 クリック時音声を再生します。
 snd_end                   終了時音声を再生します。
 snd_mail                  メール着信音声を再生します。

 system(cmdline)           外部コマンドを実行します。
 chg_param(param1,dat1,..) パラメータを変更させます。
                           変更できるパラメータはつぎのとおりです。
                           grav 重力定数
                           dump 減衰係数
                           mag  拡大率
                           clen 鎖の長さ
                           
 bell(param)               ベルをならします。このベルは XBell を用いており、
                           USE_SOUND とは無関係です。paramは -100から100
                           の間で指定します。

 showbiff                  メール一覧表示を出します

9.リソース

 それぞれのオプションに対応したリソースがあります。
 それらについては、XMascot.ad.sed などを参照して下さい。

 マスコットの登録には以下のようなリソースを設定します。

 *menusNum: 1                         !メニューセットの個数の指定
 
 *menu0.title: ねこさんめにゅー       !1つめのメニューのタイトル
 *menu0.numsOfMenu: 10                !メニューに含まれるマスコットの個数

 メニューに登録するマスコットの数を指定します

 *menu0.masDat0.title: Neko Nyan Nyan       !マスコットの名前
 *menu0.masDat0.filename: neko.ppm          !ファイル名
 *menu0.masDat0.startSnd: nyan1.raw         !起動時音声
 *menu0.masDat0.clickSnd: nyan2.raw         !クリック時音声
 *menu0.masDat0.endSnd:   nyan3.raw         !終了時音声
 *menu0.masDat0.mailSnd:  nyan4.raw         !メール着信時音声
!*menu0.masDat0.rgb0: ffffff                !透明色(for ppm)
!*menu0.masDat0.col0: 15	            !透明色(for mag) 
 *menu0.masDat0.magnify: 1.0                !拡大率
 *menu0.masDat0.biffPos: right              !メール着信マークの表示位置

 menuの後の数値がメニューの番号です。
 masDatのあとの数値がマスコットの番号です。(0から始まります)

 なお、従来 (Ver2.4以前)のメニュー番号のない記述は、
 0番のメニューを上書きするようになってます。

10.著作権について

 ・本ソフトウェアはフリーソフトウェアです。
   改変しないまたはした形での、ソースとしての配布およびバイナリとしての配布
   すべてを認めます。ただし、著作権の表示は変更しないで下さい。
 ・本ソフトウェアの著作権は 渡邊 剛 および、飯田 剛 が保有します。
 ・本ソフトウェアと同時に配布されるサンプルのマスコットの画像データ
   の著作権は、以下の者が保有します。

   inu.mag / kuma.mag / neko.mag 
   neko2.mag / pen.mag /teru.mag  
   fish.mag / rabi.mag /saru.mag
   monohosi.mag /                 牧野 悌士 (makino@cclub.tutcc.tut.ac.jp)

 ・本ソフトウェアを商用使用して金銭的利益を得る行為は禁止します。
 ・本ソフトウェアは無保証であり、この使用によって生じたいかなる損害の責も、
   著作権者は負わないものとします。これに合意できない場合は、本ソフトの
   使用を認めません。

 作者からのお願い
   本ソフトウェアを雑誌などで紹介したい、また付録に収録したいなどの場合は
   なるべく著作権者に連絡してください。
   # どういう場所で紹介されたか知りたいなぁという希望です。強制ではありません

   各種 PC-UNIX(に限らずですが)などのソフトウェアパッケージとして
   収録されているなどの場合は特に連絡は必要ありません。
   # 最初にパッケージに追加するとかの場合は連絡あるとうれしいかも
   # FreeBSD packages, Linux JG, Debian-JP などなど。

 著作権者への連絡は、以下のアドレスへの E-mail で行なって下さい。
 
    go@cclub.tutcc.tut.ac.jp  渡邊 剛 (Go Watanabe) 

 なお、本ソフトはフリーですが、 ビール券、各地の名産品等あらゆる
 種類の寄付は常時受け付けております。
 寄付をしたからといってサポートがあるわけではありませんが、
 我々の創作意欲の原動力になるかもしれません :-)

 なにか寄付したいという方は、

 441 愛知県豊橋市天伯町雲雀ヶ丘1-1 
 豊橋技術科学大学 コンピュータクラブ

 あてに送るか、上記アドレスに連絡下さい。

11. 謝辞

 本ソフトをつくるきっかけとなった、
 「ときめきメモリアル」PS版 (c)1995 KONAMI
 の作成者の方々に感謝します。非常に楽しませていただきました。

 なまあたたかい目で見守ってくれた TUT-CCLUB のメンバーに感謝します。(^^;;
 
 - SPECIAL THANKS -

 YOUBIN の部分は、吉田＠豊橋技科大さんからいただいたパッチを
 もとにして作成しました。ありがとうございました。

 音声を提供していただいた "あるXMascot愛好者の方" 
 ★音声に関する感想などは、私(ごう)に送っていただければ転送します。

 大量のバグとりに大幅に協力していただいた、
 
 みやはら＠九工大さん
 Ｓｉａｎ＠東大駒場さん
 
 いろいろありがとうございました。

 ご感想、ご要望をよせていただいた皆様に感謝します。m(_ _)m

12. その他

 バグリポート、パッチ、ソースが汚いとの文句、感想、要望等は、上記アドレスか、
 ホームページ( URL: http://cclub.tutcc.tut.ac.jp/xmascot/ ) 
 にお寄せ下さい。

13. TO DO

 きれいなソースコード(永遠の課題)
 global 変数にさようなら
 真面目なエラー処理
 対応画像フォーマットの追加
 and so on...
