この度はWebPetSystemをご利用頂きありがとうございます。このファイルはWebPetSystem(以下WPS)のマニュアルです。ご質問・ご要望はどんぞこCGIまでお願いします。
あなたがWeb上でCGIを使ってアドベンチャーゲームやシミュレーションゲームを作ろうとします。この時、2つの壁があなたの前に立ちはだかります。その一つはシステムの構築です。例えばあなたがPerlを使って一からゲームづくりを始めようとするならば、長い時間と労力を必要とするでしょう。しかしWPSはWPS-Scriptという簡易スクリプト言語を使用し、コマンドを並べるだけでゲームをつくることができます。WPS-ScriptはBASIC以上に簡単なので、何らかのプログラミング言語を扱ったことがあれば簡単に使いこなせるでしょうし、初心者の方でも十分理解が可能です。
もう一つの壁とは、データとセッションの管理です。アドベンチャーにしろ、シミュレーションにしろ、プレイヤーの進行状況を管理しなければゲームになりません。この時クッキーを使えば簡単にセッション管理ができます。しかし時にはクッキーを受け入れない設定にしている人もいます。また、そもそもクッキーでは容易にデータを書き換えることができます。クッキーは非常に強力なアイテムですが、データを簡単に改竄することができてしまうという点で、ゲームをつくる人にとっては、不都合が生じ得るのです。これに対し、WPSはクッキーを使いません(もちろん改造すれば使えますが)。データやセッションの管理はサーバ上のファイルで行います(WPSはPerl v.5001以降で動くCGIです)。
WPSではゲームのプレーヤーがブラウザの「戻る」ボタンや「再読込」ボタンを使用するとエラーが出るようにできています。これにより、やり直しのきかないより緊張感のあるゲームをつくることができます。
既にWPSになじみのある方はここを読み飛ばしても構いませんが、これからWPSで遊んでみようと思われる方は、次の単語について簡単に知っておいてください。
■WPSにログイン ↓ ユーザーデータの読み込み ↓ スクリプトデータの読み込み スクリプトに従って処理 ↓ 結果の表示と一時データファイルへの書き出し ■ログイン中(選択肢を選ぶこと=WPSへのアクセス) ↓ 一時データファイルの読み込み ↓ スクリプトデータの読み込み スクリプトに従って処理 ↓ 結果の表示と一時データファイルへの書き出し ■ログアウト ↓ 一時データファイルの読み込み ↓ スクリプトデータの読み込み スクリプトに従って処理 ↓ 結果の表示とユーザーデータの保存
圧縮ファイル(拡張子が.lzhやtar.gz)を適当なディレクトリに展開するといくつかのファイルがつくられます。下の例をパーミッション等の参考にしてください。
ファイル構成例 ......... permission wps_200/ ......... 700 or 705 (ファイル) /wps.cgi .... 700 or 705 /wps_base2.pl .... 600 or 604 /config.cgi ..... 600 or 604 (サブディレクトリ) /data/ ......... 700 or 707 /user.dat .... 600 or 606 /temp.dat .... 600 or 606 /lock/ ......... 700 or 707 /lock /script/ ......... 700 or 705 /sampl.dat.. 600 or 604
wps_200(このディレクトリは任意の名前)のパーミッションは705か700に設定してください。これに限らず、数字が小さい方がセキュリティは高まりますが、お使いのサーバの仕様によっては700などには設定できない場合があります。
CGIが所有者権限で動く場合は700にすることができます(最近のプロバイダなどでは、所有者権限でCGI動く場合その旨がHPに記載されていることが多いです)。このディレクトリにはwps.cgi、wps_base2.pl、config.cgiといった、WPSのエンジン部分を設置します。
wps.cgiを置くディレクトリに、さらにいくつかのサブディレクトリを設置します。dataディレクトリ(名前は任意)には、ユーザーのデータに関わるファイル群を置きます。このディレクトリには一時ファイルがつくられますので、パーミッションを、707にする必要があります。ただし、CGIが所有者権限で動く場合は、700にするべきです。
lockファイルには、lockというなまえの空のファイルを設置します。このlockディレクトリ(lockファイルではない)には、起動されたCGIごとに固有の番号がついたロックファイルが生成され、ユーザーデータに二重に書き込みがされないようにします。そのため、lockディレクトリのパーミッションは、707にする必要があります。dataディレクトリ同様、所有者権限で動くサーバであるなら、700を推奨します。
(参考:ファイルのパーミッションとは異なり、ディレクトリのパーミッションが「書込可」の場合、ファイルを作成したり削除したり、ファイルの名前を変えることができます。これはファイルのパーミッションに関係しません。)
最後に、scriptディレクトリをつくります。これは、必ずしも必要があるわけではないのですが、WPS-Scriptデータを設置する場所として利用すればファイルの管理がしやすくなるかもしれません。デフォルトでscript/になります。
以上のサブディレクトリは全て、config.cgi中の設定により任意の名前をつけることができます。本文では以後、特に断りが内限りデフォルトの名前(data/ lock/ script/)を使って説明していきます。
dataディレクトリにはユーザーデータファイルとテンポラリファイルを設置します。デフォルトでそれぞれuser.dat、temp.datとなりますが、config.cgiの設定を変えることによって、任意の名前をつけることができます。どちらのファイルもパーミッションを「書き込み可」にします。user.datは、実際の登録ユーザーのデータが書き込まれます。temp.datには、ユーザーがWPSにログインしている間のデータが書き込まれます。なお、拡張子がdatの場合、お使いのサーバによっては、ブラウザからデータ内容がみえることがあります。この場合、ファイルの名前を変えたり、拡張子をcgiにしてしまうことによって、回避してください。また、CGIが所有者権限で動くサーバでは、user.dat,temp.datのパーミッションを600にすることができます。
scriptディレクトリには、WPS-Scriptデータを設置します。このアーカイブにはサンプルとして、簡単なチュートリアル用のデータが付属しています。これらのデータはパーミッションを第三者に対して絶対に「書き込み可」にしないでください。具体的には604ないしは600(CGIが所有者権限で動く場合)です。
lockディレクトリは既に述べたように、lockという名前の空のファイルをおいておけば良いです。パーミッションは特に気にすることはありません(lockディレクトリは気にしてください)。
WPSは、設定ファイルとしてwps.cgiと同じディレクトリにあるconfig.cgiを読み込みます。このファイル自体はPerlで記述されいていますので、書き間違えた状態でwps.cgiを起動すると、Wps Errorという文字とともに、エラー箇所が表示されます。
設定ファイルのパーミッションは、所有者以外は「書込不可」にしてください。wps.cgiはconfig.cgiが所有者以外に書き込みを許可している場合、config.cgiを読み込まずにエラーを出して終了します。
このため、Windows上で起動する場合config.cgiを読み込み専用に設定しないとエラーになります。いちいち読みとり専用に設定するのが面倒な方は、wps.cgiのBEGINで囲まれているブロック内の所定の位置をコメントアウト(行頭に#をつける)してください。
設定ファイルの最初の数行は、動作チェックのさいに、日本語コードの判定用に使用されます。もっとも、このファイルでは日本語が必要になる箇所は1箇所だけなので、本当はどうでも良いのですが。
(表記について:n…数字 str…文字 url…ページのアドレス file…ファイル名 dir…ディレクトリ名)
テストモードの設定です。CGIを設置したら、まず値を2にしてください。この状態でwps.cgiを起動すると、動作チェックを行います。動作チェックに入った時点でwps.cgi本体は正常に動作しています。さらにコメントの中に赤字の表示がなければ、WPSはシステム全体として正しく動作しうることになります。
赤字が出ていればその箇所が青字になるように、設定ファイルやディレクトリ名、ファイル名を修正してくだださい。
$testの値を1にすると、デバッグモードになります。通常WPSは、ブラウザの「戻る」や「再読込」を行うと、エラーを出して処理を終えるのですが、デバッグモードではエラーになりませんので、テストプレーの際に必須となるでしょう。全てが順調であることが確認できたら最終的に値を0にします。
WPS-Scriptデータ(後述)を格納するためのディレクトリです。設定しなくて問題ありませんが、初期設定は`script/'になっています。後ろのスラッシュ / はディレクトリを表しますので必要です。$script_dirが設定されていると、WPSはWPS-Scriptを読み込む際に$script_dirを補ってファイルをみつけようとします。
$wps_datafile = 'file';WPS-Scriptデータ(後述)のメインデータの場所を表します。WPSはここに記述されたファイル名に、後で説明する$script_dirで設定されたディレクトリ名を補って、データを読み込みます。WPS-Scriptはいくつも分割できるのですが、WPSはまず一番最初にこのデータファイルを読み込んで処理を開始します。
$reg_datafile = 'file';WPS-Scriptデータの登録モード用データの場所を表します。WPS-Scriptは通常$wps_datafileで設定されたファイルを読み込みますが、ユーザーを登録するための処理に際しては、こちらで設定されたデータファイルを呼び出します。これは、$wps_datafileのデータ量を減らす為に設けられた設定です。WPSはここに記述されたファイル名に、先に説明した$script_dirで設定されたディレクトリ名を補って、登録用データを読み込みます。
データ(WPS-Scriptデータではなく、ユーザーデータ)を保存するディレクトリを設定します。初期設定では data/ となっています。このディレクトリの元に、ユーザーデータファイルとテンポラリファイルを設置します。このディレクトリは必ず設定する必要があります。というのも、これらのデータを置くディレクトリは、書き込み可能になっていなければならないのですが、最近のサーバではCGIを置いているディレクトリが書き込み可になっていると起動できない設定になっているものが多いからです。
$user_file = 'file';ユーザーデータのファイル名を設定します。中身は一行につき一人のデータがカンマ,で区切られたものです。
$temp_file = 'temp.dat';テンポラリデータのファイル名を設定します。ログイン中のユーザーデータはここで管理され、ログアウトした時にユーザーデータファイルへとデータが移行します。
WPSで日本語を扱う際にはjcode.plが必要です。jcode.plを持っていない方は入手する必要があります。
jcode.pl officiak page : http://srekcah.org/jcode/
$lock_dir = 'dir';ファイルロック用のディレクトリを設定します。WPSは一つのファイルに同時にアクセスすることのないよう、ロックをかけます。その際、OS依存のflockを使わずに、ロック中を示すファイルを作成しています。そのロックファイルを格納するのがこのディレクトリで、書き込み可でなければなりません。
$lock_file = 'file';$lock_dirに設置するファイル名です。このファイル自身に何か書き込んだり読み込んだりすることはないので、パーミッションを気にする必要はありません。このファイルが存在しない場合、WPSは「大変混雑しています」というエラーを出すでしょう。
$log_mode = n;WPSはユーザー登録時やログイン時にIPアドレスを記録することができます。$log_modeの値を1にすると登録時にだけ記録されます。値を2にするとログイン時にも記録されます。このデータは次の$log_fileで設定されたファイルに追加書き込みされていきます。
$log_file = 'file';$log_modeで1か2を設定した際に記録されるIPアドレスを書き込むファイル名を設定します。
$img_dir = 'dir';wps_img.cgiを利用する際にデフォルトで画像を置いておくディレクトリです。wps_img.cgiはほとんど利用価値がありませんので、この部分を設定する意味はたぶんほとんどないでしょう。詳細は別項にて扱います。
$max_user_num = n;ここで設定された値が、ユーザーを登録できる数の上限になります。
$max_temp_num = n;テンポラリファイルに書き込むことが出来る最大ユーザー数です。この値は小さめにしておいた方が良いでしょう。
$timeout = n;ログインしたユーザーが一定時間何もしない場合にセッションを無効にするまでの時間です。単位は秒です。タイムアウトしたユーザーは再度ログインしなければなりませんが、saveコマンドでデータがセーブされていない限り、タイムアウト時のデータは記録されません。
$deltime = n;登録したユーザーが一定期間ログインしなかった場合に強制的に登録抹消になるまでの時間です。単位は時間です。24 * 7 などのようにしておけば、計算が楽になります。
WPSはエラーを表示する場合、非常に簡素な画面になります。しかし、せっかく管理者がクールなデザインでゲームをつくっているのにエラー画面だけ浮いてしまうのも悲しいので、エラー画面はhtml形式のファイルにしておき、ここで設定しておけばWPSはテンプレートを読み込んでエラー画面にしてくれます。エラーメッセージは、テンプレートの中に<! error> という文字列を入れておくと置き換わります。
$body[0] = "str";以下順に、デフォルトのエラー画面における背景色、テキスト色、リンク色、既リンク色の指定をします。$error_templateが設定されている場合は無効になります。
$width = n (or "str");デフォルトのエラー画面の横幅です。
$errorback = 'url';デフォルトのエラー画面における戻るページのアドレスを指定します。
$modoru = "str";デフォルトのエラー画面で戻るページのリンクで表示される文字です。
(上3つの設定は$error_templateが設定されている場合は無効になります。)
まずWPSが動作するかを確認します。最低限、wps.cgiとconfig.cgiの二つだけがあれば、動作チェックは可能です。
設定ファイルの中の$testの値を2にすると、動作チェックモードになります。このモードの時にwps.cgiを起動すると、CGIは各ファイルやディレクトリが存在するかどうか、パーミッションが正しく設定されているかどうかを調べます。WPSの設置がうまくいかない方は、必ずこのモードで走らせて正しく動作しているかどうか確認してみてください。
WPSは、Perlのバージョン5.001以降でないと動きません。また設定ファイルが存在しなかったり、設定ファイルが正しく記述されていなかった場合は Wps Error : xxxxx というエラーを出して終了します。
(補足:WPSは乱数の種をしこむためにsrand()を使用していますが、Perlの5.004以降と以前とで若干の仕様の違いがあります。5.004以降であるならば、特に問題ありませんが、それより古いバージョンの場合は、wps.cgiを開いてコメントアウトしている箇所の指示に従って修正を加えてください。)
WPSに初めて触れる方は、まずはサンプルデータを使って練習してみます。既にWPSになれている方は読み飛ばしてください。
main.dat(通常WPS-Scriptデータ)とregist.dat(登録用WPS-Scriptデータ)を`script/'ディレクトリに設置してあることを確認します。
wps.cgiを起動するために、wps.cgiにリンクをはります。このとき、登録モードとして起動する必要がありますので、wps.cgi?mode=regとします。もちろん、管理者の環境に合わせてリンク先を指定してください。
名前の入力欄のname属性は、"username"に、パスワード欄は"password"にしてください。
参考:登録したユーザーは次回から入力フォームに自分の名前とパスワードを入れてwps.cgiにアクセス(ログイン)します。
(補足:入力フォームに入れたパスワードは平文でネットを流れていきます。ですから他でも利用しているような重要なパスワードを使うことは避けるべきです。SSLを使うという手もあるでしょうが…)
登録、ログインともに問題なく動作すれば完了です。さあ、今度はあなたのオリジナルなゲームを作ってみましょう。とはいえ、WPS-Scriptになれるまでは、付属のTipsなどを参照して試行錯誤することになるかもしれません。
perlやshellで書かれたCGIを一度でも設置してみた方は先頭行に#!ではじまる一文をみたことがあるはずです。WPSもこれを少し真似してWPS-Scriptデータの一行目は#で始まってモジュールを指定します。ここの指定を変えればモジュールを変更することができますが、実際にはwps_base.plとwps_base2.plしかないので通常`wps_base2'を指定してください。`.pl'は必要ありません。wps.cgiが補ってファイルを呼び出します。(本当は拡張モジュールの読み込みをする予定だったのですが…)
「#wps_base2」という一文は、main.datとregist.dat(またはそれに対応するWPS-Scriptデータファイル)にだけ書きます。後で説明しますがopenによって読み込まれる追加のWPS-Scriptデータには#wps_baseはいりません。
次に「コマンド」と「処理群」という概念について説明しておきます。WPSは「メッセージを表示しろ」とか、「選択肢を出せ」といったひとつひとつのコマンド(命令)を順々に処理していくことによって成り立ちます。このひとつひとつのコマンドがいくつか集まって「処理群」をつくります。
WPSデータは処理群から処理群へと移動(goやcallというコマンドを使う)することによって処理が進みます。そしてグループ内の一つ一つのコマンドは上から順に実行されます。次のグループへのジャンプがない(goがないということ)時点で、(あるいはendなどの明示的に処理を終了させるコマンドを出したとき)データ処理は終了します。
処理群には一意的な名前をつけます。これは行の先頭から書きます。そして処理群内の各コマンドは行の最初にタブ(TAB)を一つ入れて書きます(caseの「条件」だけはタブを2ついれます)。今のところ、一行につきひとつのコマンドしか書けません。
以下に簡単な例を示します
1 |#wps_base2 2 |Start 3 | var->A B C 4 | $A=1 5 | mes->"\$Aの値は$Aです。" 6 | go->Tugi 7 |Tugi 8 | rand(10) 9 | $RANDOM+1 10| mes->"ただいまの乱数は$RANDOMです。" 11| case{$RANDOM} 12| (-3) mes->"3以下の値" 13| (4) mes->"きっかり4" 14| (5-7)mes->"5から7の値" 15| (8-) mes->"8以上の値" 16|go->Owari 17|Owari 18| mes->"これで終了です。"
(便宜的に行番号をつけていますが、実際にはつけないでください。)
1行目:#wps_base2と書くことによってwps_base2.plを呼び出します。
2行目:行の先頭に処理群名「Start」。次の行からはタブをひとついれてコマンドを書きます。
3行目:変数(内部的に番号が振られている)に順にA,B,Cという名前をつけて使用することを宣言しています。実際に変数を使用するときは$A,$B,$Cの形で書きます。
4行目:変数$Aに「1」を代入。WPSでは原則として変数には数値しか代入できません(strというコマンドで特殊な変数に文字列を代入可)。
5行目:「$Aの値は1です。」とブラウザに表示されます。$の前に\をつけることで$がついていても変数とみなされません。
6行目:次のグループ「TUGI」に移動します。
7行目:グループ「TUGI」
8行目:0から9までの数を「予約変数$RANDOM」に代入します。
9行目:「ただいまの乱数は○です。」と表示。
11行目:条件分岐するためのコマンド"case"。下のかっこにはいっている数字が実際の条件です。
12行目:$RANDOMが3以下の時「3以下のの値」と表示されます。
13行目:$RANDOMが4の時。
14行目:$RANDOMが5以上7以下の時。
15行目:$RANDOMが8以上の時。
16行目:グループ「Owari」に移動
17行目:グループOwari
18行目:「これで終了です。」と表示。ここでもう別のグループに移動することがないので処理は終了です。
menuというコマンドを使うと、選択肢を表示することができます。選択肢には全て数値が当てられています。ユーザーがこの選択肢を選ぶと、$SELECT_NUMという変数にその数値が代入されます。WPSではこの数値を利用してユーザーの選択に応じた処理を行っていくのです。
1 |#wps_base2 2 |Start 3 | if{$SELECT_NUM >= 100} go->$SELECT_NUM 4 | go->MENU 5 | 6 |MENU 7 | mes->"次の選択肢を選んでください。" 8 | menu(101)->"これは選択番号1です" 9 | menu(102)->"これは選択番号2です" 10|101 11| mes->"1番が選ばれました。" 12| menu(1)->"もう一度" 13|102 14| mes->"2番が選ばれました。" 15| menu(1)->"もう一度"
3行目:もし$SELECT_NUMの値が100以上ならその数値と同じ名前の処理群に移動。
4行目:MENUという処理群に移動。これは3行目の条件に当てはまらなかった場合に行われる処理です。
8,9行目:それぞれ選択肢を表示をします。それぞれの選択肢は101と102という値を持っています。ユーザがどちらかの選択肢を選ぶと、WPSは再びStartから処理を始めますが、この時$SELECT_NUMの値が101か102なので、3行目の処理が行われます。
このように、WPSはブラウザ上でユーザーが選択肢を選ぶたびに、WPS-Scriptデータの一行目から処理を行っていくのです。そしてcaseやifなどの条件分岐を利用して、ゲームを進めていきます。
既にみたように、WPS-Scriptはユーザーの保持するデータを検討し、処理を行っていきます。WPS-Scriptにはcaseとifとselectという条件分岐用のコマンドがあります。このほかにも文字列用のstrck、userckなどがあります。
変数は半角英数字(a〜z,A〜Z,0〜9,アンダーバー"_")から構成します。WPSの予約変数がかなりあるため、小文字を推奨。
WPS-Scriptにおける変数の代入には次の方法があります。
$HOGE=1 # $HOGEに1を代入 $HOGE+ # $HOGEに+1します $HOGE+1 # これも$HOGEに1プラス $HOGE+++ # $HOGEに3プラスします $HOGE=$FOO # $HOGEに$FOOの値を代入します $HOGE+$FOO # $HOGEに$FOOの値をたします $HOGE- # $HOGEの値から1引きます $HOGE--- # $HOGEの値から3引きます $HOGE-$FOO # $HOGEから$FOOの値を引きます
変数同士の計算に注意してください。これは普通のプログラミング言語とは全くかけ離れた表記となります。例えば$HOGEに$FOOの値を足したいときに$HOGE = $HOGE + $FOO とはできません。$HOGE + $FOO となります。
宣言された変数(予約変数以外)は0以上99999999以下の整数値しかとりません。また、0以下の値になったときは強制的に0に、99999999以上の値の場合は99999999に設定されます。ただし時間変数のいくつかは例外的な振るまいをします。
mes->"STR"など、大概のコマンドでは変数を展開することができます。$hoge=5なら mes->"$hogeだよ" とすることで、「5だよ」となります。ただし、mes->"$hogeDAYO!" というふうに、半角英数字アンダーバーを変数のすぐ後につづけてしまうと、WPSはそれを$hogeDAYOという変数にとってしまいます。このばあいは、変数の最後に"\"をつけることによって、その文字を変数の名前ではないとWPSに判断させます。mes->"$hoge\DAYO!" これで「5DAYO!」という表示に。
次の変数はWPSが使用するために予約された変数です。変数宣言でこれらの名前を使うことはできませんが、スクリプト内で自由に使用することはできます。
$USERNAME ユーザー名(文字列) $PETNAME ペット名(文字列) $SELECT_NUM 選択肢番号が代入されます $CLICK_COUNT 今回WPSにアクセスしてから選択肢をクリックした回数 $RANDOM rand()を使うとこの変数に数値が代入されます $IMG_NAME 画像の名前(imgコマンドで変更可能) $IMG_ALT 画像のALT属性(imgコマンドで変更可能) $IMG_WIDTH 画像の横幅(imgコマンドで変更可能) $IMG_HEIGHT 画像の縦幅(imgコマンドで変更可能) $MENU_AC 選択肢番号の不正チェック用変数 $Wps_var 使用しているWps.cgiのバージョンです $Wps_Script_var 使用しているWPS-Scriptモジュールのバージョンです $Process_end 値を1以上にすると直ちに処理を終了することができます $Wps_Mode テストモードの時、1以上の数値になります $Browser 使用ブラウザ $Strings_ck strckコマンドを使用した際に利用します
($Browserは、"DoCoMo","J-PHONE","EZWEB","MSIE","Mozilla","Lynx"のいずれかを識別しますが、それ以外は"Unknown"となります。)
これも予約変数ですが利用頻度が高く重要です。
$PTIME 現在の時間 $STIME ユーザー登録をした時間 $LTIME 前回のログイン時間 $ATIME 今回のログイン時間
上の「時間変数」の値は1970年1月1日からの秒数です。
$PSTIME 登録してから現在までの時間 $PLTIME 前回ログアウトしてから現在までの時間 $PATIME 前回の選択肢選びから現在までの時間 $ASTIME 登録してから前回の選択肢を選んだまでの時間 $ALTIME 前回ログアウトから前回の選択肢を選んだまでの時間 $LSTIME 登録してから前回アクセスまでの時間
$Strings0, $Strings1...$Strings15までの16個の変数は予約変数です。str(N)->"XXX"で $StringsN(nは対応する数字)にXXXという文字列が代入されます。ただしこの変数はデータに記録されないので気を付けてください。WPSでは、ペットネーム以外、文字列を保存することができないのです。
WPS-Scriptデータは改行をLF形式にしてください。WPSは自動的に
と