
                   X Magical Dron 操作説明書


０、はじめに

Xmdの最新バージョンは、 
Xmd Homepage: http://home2.highway.or.jp/manchang/xmd.htm 
に掲載されます。なるべく新しいバージョンのserver/clientを御利用
下さい。
xmd-1.23.tar.gz 以降に附属のサーバと、xmd-1.22.tar.gz 以前のクラ
イアントは接続できません。

------------------------------------------------------------------

１、ゲームの概要

大学の、"client-serverシステム(socket)を利用したアプリケーシ
ョンを作成せよ"、という課題として、作成致しました。

いわゆる「落ちゲー」です 。１人〜１０人で遊ぶことが出来ます。

(Ver 1.20でサポートされた１人プレイの方法は README.xmdbot を
参照して下さい。)

以下をすべて満たす環境で実行する事ができます。

・X Window System を使用できる環境 (X11R4以降)
・Displayの解像度が縦600dot以上のマシン
  (画面が小さい方は、-geometory で調節してください。)
・10色前後の新しいカラーを確保できるマシン
  (最大同時表示色数256色以上が目安でしょうか)

動作確認 
	Ver 1.27
         Linux 2.0.30    + X11R6   (XFree86 3.1)

	Ver 1.26
	 SunOS 4.1.4     + X11R6.3
         FreeBSD 2.1.7.1 + X11R6.3 (XFree86 3.3)

	Ver 1.12
         FreeBSD 2.2.2R  + X11R6.3 (XFree86 3.3)

	Ver 1.10
	 BSD/OS 3.0      + X11R6
	 Solaris 2.5.1   + X11R6.3

makeの方法はINSTALLファイルを参照して下さい。
(基本的に xmkmf; make を行うだけです)


* 名前からもわかるように、ゲームセンターにある「マジカルドロップ」 *
* というゲームを参考にして、ゲームルールを作成しました。しかしなが *
* ら、本物のマジカルドロップはコレとは比較にならないほど素晴らしい *
* ゲームであり。また、マジカルドロップのコピーという訳でもありませ *
* んので、その点、御了解くださいませ。                             *


２、起動方法

socket通信を利用した、マルチクライアントの対戦ゲーム(２人以上)ですの
で、まずサーバを起動する必要があります。サーバは xmdsever という名前
でmakeされているはずですので、適当なdirectoryに移動し、

#xmdserver [-p portnumber] &

で起動しておいて下さい。

次にクライアントを起動します。2〜10人(client)まで参加できます。

#xmd -s servername [-p portnumber] [-n nickname]

[...]内はoptionalです。nicknameは、ゲーム画面内での貴方の名前になり
ます。ircと同じく、最大9文字となっています。省略すると環境変数USER
の値が使用されます。この環境変数が設定されていないマシンでは、 -n 
を指定しないと起動しませんのでご注意下さい。

server, clientともに、port番号を省略するとdefault値である 4170番が
使用されます。

# ver. 1,22より、-w オプションは廃止されました。タイマ割り込みで自動
# 的に適切なwaitが入ります :)

-display などのXの標準的なoptionも使用できますが、その場合は必ず -s
指定よりも後ろに書いて下さい。

xmdを引数なしで起動すると、バージョン情報とusageを表示して終了しま
す。

色を多数使用しますので、256色程度の発色数しかないマシンでは、netscape,
xv等の色をたくさん使うアプリケーションを終了してから、xmdを起動してく
ださい。色が確保できないと起動しません。

無事クライアントが起動したら次に進みます。



３、画面構成と操作法

画面構成はおおよそ以下のようになっています。

|----------------|---------|
|☆☆●○○△●☆|nick list|
|☆　○　○☆☆●|         |
|　　●　☆　△△|         |
|　　　　　　△　|         |
|　　　　　　　　|   (4)   |
|　    (1)   　　|         |
|----------------|         |
|message box (2) |---------|
|----------------|contorol |
|                |    panel|
|　　　　　  ☆　|         |
|　(3) 　　  --  |   (5)   |
|----------------|---------|


(3)の画面に居る自キャラを左右に動かし、(1)にある宝石を吸い取ります。
吸い取った宝石を別の場所で発射します。その時点で同じ宝石が縦に３つ
（以上）並ぶと、その宝石は消えます。また、その消える宝石に隣接して
いる同じ種類の宝石も消えます。

吸い取る宝石の個数は、同じ種類ならいくつでもＯＫで、何回でも吸う事が
できます。縦に同じ種類の宝石が並んでいる場合、これらは一気に吸われま
す。
発射するときは必ず一度に全部発射されます。

例えばこの状態、

|----------------|
|☆☆●○○△●☆|
|☆　○　○☆☆●|
|　　●　☆　△△|
|　　　　　　△　|
|　　　　　　　　|
|　          　　|
|----------------|
|                |
|　　　　　  ☆　|
|　          --  |
|----------------|

ここから、キャラをいちばん左まで動かし、「☆」を発射しますと、

|----------------|
|※※●○○△●☆|
|※　○　○☆☆●|
|※　●　☆　△△|
|　　　　　　△　|
|　　　　　　　　|
|　　　　　　　　|
|----------------| <--- dead line
|　　　　　　　　|
|　  　　　　　　|
|--　　　　　　　|
|----------------|

縦に「☆」が３つそろいますので、その３つの「☆」と、それに隣接した「☆」
、つまり「※」で表示した部分の「☆」が消えます。

この作業を繰返すのが、このゲームの主な操作です。

一定時間ごとにあらたな宝石が一列ずつ降って来るため、どんどん宝石を消して
いかないといけません。最後の図で示した"dead line"まで、宝石が来てしまう
と、ゲームオーバーとなります。

ゲームを進めていくと、あらたな一列の宝石が降ってくるタイミングが速くなり
ます。

(2)の部分には、「ゲームスタート」「連鎖した」「hoge君からの攻撃を受けた」
などの各種情報が表示されます。

(4)のニックネームリストのWindowには、

 0: Sato      7
 1: Morishita 3
 2: Fusa      9

などという情報が表示されています。ここで、n: はプレイヤ番号を表し、nick
nameのあとの数字は「そのプレイヤがあと何列でゲームオーバーになるか」を
表します。後者はリアルタイムに変動します。ゲームオーバーになった人間の
欄にはdeadと表示されます。

(5)の部分には、

 STATUS  --- 「ゲーム開始まち」、「ゲーム中」 などの状態表示
 TARGET  --- 対戦ゲームにおける「妨害宝石」を送り込む相手
 TAMA    --- いま自分が宝石を何個持っているのか

を表示します。

"Big screen" ボタンを押すと、大きな画面でゲームできます。21インチ程度の
大きなdisplayをお持ちの方はお試し下さい。ただし一度大きくすると、元には
戻りません(そのうち修正します)。

 
４、対戦プレイ

本ゲームは2人以上の対戦プレイができます。クライアントが２つ以上サーバに
接続された状態で誰かが「start!」ボタンを押す(またはキーボードの s キー
を押す)とゲームがスタートします。

対戦落ちゲーにつきものの対戦相手への「妨害」ですが、これは「連鎖消し」が
行われたときに、任意の対戦相手への、連鎖数に応じた（妨害）宝石列が送り込
まれることによって為されます。

「連鎖」の定義ですが、このゲームでは「一定時間内に複数回、宝石が消去された
とき」連鎖として扱うことにします。

妨害宝石列を送り込む相手は、キーボード操作で選択出来るようにしてあります。
ランダムにすることも可能です。
画面には、「各対戦者が、あと何列でゲームオーバーになるか」が常時表示されて
いますので、これを見て送り込む相手を決定すると良いでしょう。

最後まで生き残ったものがWinnerとなります。ゲームが終了すると、
・そのゲームの連鎖記録とスコア
・誰が何回勝ったかを示す表
が表示され、またリプレイするかどうかを尋ねられますので、どちらか選択して
下さい。

とりあえず、エキスパート向けの、激しい戦いが展開されるようなゲームバラン
スにしてあります。頑張って練習して下さい。10回もプレイすればコツはつかめ
るとおもいますので。
慣れてくれば、かなりキワドイ勝負となって楽しいですよぉ ：)

# chat機能が無いので、IRCができる環境にある人は、これを併用することをお勧
# めします(^^)



５、キーバインド

まず、キーボードの "Numlock" キーは、(あれば)Offにしておいてください。Onだ
と正常に操作できません。

キーバインドは以下の様になっています。

d   左に移動
f   右に移動
j   宝石を吸う
k   宝石を吐く

SPACE： 自分の画面の宝石を一列増やす
0〜9 ： 妨害宝石を送り込むプレイヤを プレイヤ n にする
r    ： 上をランダムで決める
s    :  ゲームをスタートする(マウスで Start! をクリックするのと同じ)。

カーソルキーの上下左右４方向を、以下のように使用することもできます。

LEFT  左へ移動
RIGHT 右へ移動
DOWN  宝石を吸う
UP    宝石を吐く

上級者の場合、自分の画面に宝石が殆んど無くなってしまうことがあります。
そういった場合にスペースキーを押すと、自分に一列宝石が送られてきます。
状況に応じて活用して下さい :)


----------------------------------------------------------------------


６、著作権表示／免責

このプログラムはフリーソフトウェアです。著作権は "Team Ayanami" が保持
します。

個人間での金銭授受を伴わない、アーカイブ状態でのコピーは自由に行なっ
て構いませんが、無断でWeb,BBS,NewsGroup,雑誌 等に転載することを禁止し
ます。
(転載前に、xmd@wildbird.or.jp まで御連絡下さい。)

このソフトを利用した事によるいかなる損害に対しても、我々はその責任を
一切負いません。ご自分の責任でご使用ください、

# 不具合の報告も xmd@wildbird.or.jp までお願いします。ここに送信すると
# メンバー全員にメールが転送されます。
# ゲームの感想等も、ぜひこちらまで送って下さい☆


７、 Team Ayanami : xmd プロジェクトメンバー

97年8月現在、全員、早稲田大学理工学部情報学科３年です。私(佐藤)はりう
ねんしましたが(笑)。

・サーバ担当
  Ariyoshi Fusa  <g95p1081@mse.waseda.ac.jp>

・クライアント担当 (socket & protocol設計)
  Yuji Morishita <g95p1262@mse.waseda.ac.jp>
		 IRC nickname : moris または moriss

・クライアント担当 (Xt, bot & documentation)
  Yusuke Sato    <g95p0557@mse.waseda.ac.jp>
		 IRC nickname : kaidempa または kaidesopa
                 ほめぱげ     : http://home2.highway.or.jp/manchang/

上にも書きましたが、不具合報告、感想などは xmd@wildbird.or.jp まで
お願いします。

# プログラムテクニックを教えてくださったり、テストプレイに協力して
# くださった、きんじ様、はいご様、みぢゅく様、どうもありがとうござ
# いました。
# その他、感想や助言を下さった皆様、ありがとうございました。


８、履歴

1997/ 7/31 ver 1.00  非公開

	やっと完成。提出期限ぎりぎりっ。

1997/ 8/ 5 ver 1.10  一般公開
                      
	・xmdserver.c 内の関数名を一部変更
	・waitの自動測定機能を追加
	・windowの大きさを小さくした
	・NICK COLLISIONの検出ミス修正
	・targetの表示のバグ修正
	・XSync()を使用して、確実な表示を行うように変更
	・XAllocNamedColor()まわりの処理を改善
	・変数関係の整理整頓
	etc...

1997/ 8/12 ver. 1.11

	・SunOS 5.4 では bcopy/bzero が使用できないそうなので、
          memcpy/memset を使用するように変更。
	・setsockopt() による、
  	   (1)"bind: Address already in use" が出てしまうエラー
	   (2)socketへのwriteをバッファリングしてしまうことによる
	      いくつかの不具合
	  の修正。
	  (この修正部分が、BSD系できちんとmakeできるか少し不安が
	   あります。プレイされた方、よろしければ動作報告をお願い
	   します。FreeBSDではOKでした。)
	・自分がdeadした後に、対戦者の状態がうまく表示されないバグ
	  を修正。まだちょっとアヤシイですが (^^;
	・"YOUR STATUS" Windowがいつまでも "Wait" のままだったりす
	  るバグを修正。
	・popup_shellのタイトルバーの文字列をきちんとしたものに変
	  更。
	・wait自動判定をした場合、ちょっとwaitがかかりすぎるという
	  意見があった為、微調整。

1997/ 8/13 ver. 1.12

	・clientを引数なしで起動したとき表示するusageとともに、
	  version情報も表示するように変更。
	・リプレイしたときに、TAMAの初期値が0でない事があったのを
	  修正。

1997/ 8/14 ver. 1.13 (公開version)

	・ゲームスタート前に、カウントダウンをするように変更(現状
	  だと突然ゲームが始まって、とまどうので)
	・ゲーム開始直後に、新しい宝石１列が送られてくる現象を修正。
	  最初の一列はゲーム開始後5秒で送られてきます(妨害宝石を除
	  く)。

1997/ 8/15 ver. 1.20

	・一人プレイ用の、xmdbotというclient(対戦相手となるコンピュ
	  ータ)を作成。使用方法は README.xmdbot を御覧下さい。

1997/ 8/16 ver. 1.21

	・xmdbotのバグ取りなど
	  (1)オプション解析にgetopt()を使用するようにした
	  (2)sleep()の使用に起因するバグが出たのでsleep()
	     の廃止。
	・xmdで、リプレイ時の初期画面で自キャラが表示されないバグを
	  修正。

1997/ 8/19 ver. 1.22 (再公開に向けての大幅変更)

	・xselect.c を少し変更(関数名、変数名の整理等)。
	・xmdbotがALLSTATE命令を理解するようになった(死亡したプレイ
	  ヤーに妨害宝石を送らない)。
	・-w オプションの廃止(xmd)。for loopによるウエイト処理を追放。
	  すべてXtAppAddTimeOut()を利用した非同期処理に変更。ふぅ〜。
	・変数名statの使用は、FreeBSDやSunOSでコアダンプを引き起こす
	  ので(知らなかった)、これをstat_に変更。(xmdbot)
	・早い間隔でPUYO命令が来た場合に、deadした事を報告する前にst=2
	  となってしまう場合があった。ややいい加減だが、st=2 のときも
	  タイマ割り込みで "MYSTATE:mypd:*;" を送信する様に変更。
	  (カナリ対症療法デスネ ^^);
	  これにより、BUGSの2番は *とりあえず* fixされた模様。
	・連鎖時に、「誰に何列送信(攻撃)したか」を表示するようにした。
	・delete.c, xselect.c  内で、セミコロンを付けないでメッセージ
	  を送信していた箇所を修正。
	・OSがLinuxの場合は、<getopt.h> がインクルードされるように変更。
	・Imakefileの微修正。 (-g -Wall にしました。)
	・"warning: unused variable hoge" の完全除去。
	・"warning: embedded `\0' in format" の完全除去(不要でした...)。
	・"warning: implicit declaration of function `hoge'" を大部分除去
	  した(Linux,FreeBSDで確認)。まだ完全では無いです..特にSunOS..。
	・スペースキーで自分の宝石を一列増やせる様になった！！(重要)
	  活用して下さい：)

	サーバの初めての変更
	・select()のタイムアウトの設定が初回しかされていなかったのを修正。
	・select()のタイムアウトの時間を5 -> 1(sec) に変更。
	  timeoutが短い方が、メッセージの結合が減る(気がする..)。
	  結合の主原因は、クライアント側でメッセージが到着してもすぐに
	  read()しない場合がある(selectLockフラグによるread()の抑制)か
	  らですが....。ver 1.23 で完全解決予定。
	・変数名connect -> connect_ への変更(システムコールとの衝突)
	・usage表示が思いきり間違っていたのを修正 (^^;

1997/ 8/19 ver. 1.23

	・一度に２つ以上のメッセージが(結合した状態で)readされても正常
	  に(逐次)処理されるように変更！！！
	  待ち行列 'xmd_queue' (片方向の環状リスト) による。(xmd)
	・受信キューの実装により、サーバのsleep()が不要になったので、
	  除去(この変更により、xmdbotが一時的に使用不能に)。
	  BUGSの1番がfixされたことになる。
	・selectLock -> execLock へ、変数の名称変更。
	・xmdserverのバージョンをv2.0とした。xmd-1.22.tar.gz 以前に含ま
	  れるクライアントとは ＊接続できなくなりました＊ ！！
	  ご注意下さい！

1997/ 8/19 ver. 1.24 (公開version)
	・すべての #define を "xmddefs.h" にまとめた。
	・汚かったプロトタイプ宣言を "xmdproto.h" にまとめた。
	  古いフォーマット(仮引数を書いていない)だったのも修正。
	・xmdbotにも受信キューを実装した (xmdとちがい、ほぼ即時readなの
	  でなくてもまぁ、動くのですが...)。
	・xif3.c -> main.c へ名称変更。算譜自体も雑然としていたので少し
	  だけ奇麗に書き直した。

1997/ 8/20 ver. 1.25
	・不要(過剰)なキャストがおこなわれていたのを修正。
	・listen()の引数がおかしかったのを修正。(xmdserver)
	・消しているアニメーションの最中に妨害宝石がきてしまう
	  不具合を修正。
	・サーバからの１つのメッセージが、２回以上に分かれて受信された
	  場合に出るであろう不具合を修正。
	・"start!"をクリックしなくても、 s キーでスタートできるように
	  した。
	・Imakefileの修正(SunOS4向け)

1997/ 8/25 ver. 1.26
	・message widgetに表示した文字を、2秒後に消すようにした。いまま
	  では適当なタイミングで(get, put, 連鎖終了時など)消していた。 
	・妨害宝石を送るタイミングが妙だったのを修正。連鎖後、即座に送
	  られるようになった。
	・ターゲットを"Random"にした時に、毎回ランダムに相手をえらぶの
	  ではなく、一度乱数で相手を決めると以後ずっとその相手に妨害宝
	  石を送っていた(;_;)バグを修正。
	・リプレイ時に、queue_checkのタイムアウト設定を行っていなかった
	  のと、キューを初期化していなかったのを修正。
	・XtRemoveTimeOut()まわりのバグを修正。

1997/ 8/26 ver. 1.27
	・さらに、XtRemoveTimeOut()まわりのバグを修正(v1.26はbuggyでし
	  た)。
	・ゲームセット時のスコア表示／勝敗表表示の為の準備。

1997/ 8/27 ver. 1.28
	・ゲームオーバー時にスコアを表示するようにした。
	・同時に、対戦プレイの戦績(何勝何敗)を表示するようにした。
	・KeyBindトグルスイッチの廃止。

今後の予定

	・キー先行入力バッファを設け、無効なキー入力をなくす。
	・１０クライアント以上が参加しようとしたときに、適切な処理
	  をしていない(接続拒否等)のを修正(xmdserver)。
	・fdopen(sockfd, "hoge") を利用してストリーム入出力を行った方が
	  良い、というアドバイスを受けたので、できればそのように変更。
	  受信キューは不要になりそうですね ^^;
	・10人程度のプレイだと、送信メッセージバッファが足りなくなる
	  箇所がありそうなので、見直す。
	・VC++を学習してWindowsへ移植 (ホントカ?? :-)
