PETROOM大改造
【萌え萌えキャラクターズと遊ぼー。】

ユーザーデータの改造について

これまでのランキング表示やその他の改造では、ペットデータに改造を加えることはあっても、
ユーザーデータに改造を加えることはしてきませんでした。

それは・・・、

面倒くさいからです(核爆)

いや、ホントです、面倒なんですってば(^^;;;

でも、そんなことを言っていたら、いつまで経っても先へ進めないので、
ここらで一発、手を付けようと思います。


まず、何が面倒くさいのかということですが、
実はまだプログラム自体をアップしていない方は、全然面倒くさくありません。
PETROOMをダウンロードしてきた時にお気付きと思いますが、
ユーザーデータ(user.dat)は一番最初は空っぽです、何も書かれていません。
だから、どうにでもなるんです、改造してから書き込まれていくわけですので。

問題は、すでにアップして誰かが遊びに来ている場合、特に200人とか300人とか、
大人数の方が遊びに来てしまっている場合です、結構大変です。

ユーザーデータを改造するということは、ユーザーデータのフォーマットが変わるということです。
つまり、今までのフォーマットでは正常に動かなくなるということなのです。
よって、すでに遊びに来ている方のデータを一人一人変更する必要があるのです。
300人いたら300人分です、うはぁ〜大変ですね。

しかも、改造途中で遊びに来てもらっては困るので、
ユーザーデータを改造しているときは、ペットルームを一時閉鎖しなければなりません。


以上を踏まえた上、覚悟して改造を施してくださいね。


では、ユーザーデータの改造とは、どういったものか、簡単にご説明します。
ようはユーザー個人の情報を増やすということです。

PETROOMでは、下記の4つの個人情報を最初から持っています。

1.お名前
2.パスワード
3.最後に訪れた時間
4.ラブポイント

この情報は、ユーザーデータの中身を見てみると、こんな風に並んでいます。

お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>
以下人数分

ここへ新たに個人情報を追加する、例えば「訪問回数」を加えるとします。
あ、でもまだ実際に改造はしないで下さいね、とりあえず読んで下さい。
まず、PETROOM(pet.cgi)を一時閉鎖します(リンクを外したり、パーミッションを変えたり、ファイルを消したり・・・)。
次にユーザーデータ(user.dat)をダウンロードします。
そして、ユーザーデータの中身をこんな風にする必要があります。

お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>
以下人数分

300人いたら、300人分です・・・。

で、とりあえず、この改造が無事終わったとします。

しばらくして、またユーザーデータの改造を、今度は「遊ぶ」を何回選んだか、を加えたくなったとします。
そしたら、またPETROOMを一時閉鎖して、データをダウンロードして、

お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>遊ぶカウント<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>遊ぶカウント<>
お名前<>パスワード<>最後に訪れた時間<>ラブポイント<>訪問回数<>遊ぶカウント<>
以下人数分

追加したいことが増える度にこんな事をしていたら、とても大変ですよね。
なので、初めてユーザーデータを改造するときに、
今後もユーザーデータの改造を追加していく可能性のある方は、ドカーンとダミーを作っておきましょう。
そうすると、ユーザーデータを変更する必要が、最初の一回だけになりますので。
ただし、ファイルはその分大きくなり、処理に時間が掛かるようになりますので、程々にしておきましょう。



では、プログラムの改造の前に、ユーザーデータ(user.dat)の改造を先に済ませておきましょう。
改造後、ユーザーデータを初期化して最初からやり直すつもりの方や、
初めて設置する方(user.datが空っぽ)は、このユーザーデータの改造は必要ありませんので、
ササッと読むだけで結構です。プログラムの改造だけ行って下さい。

まず、現在稼働中のPETROOMを一時閉鎖します。
閉鎖の方法はお好きなように。pet.cgiのパーミッションを644にするのが一番楽でしょうか。
次にユーザーデータ(user.dat)をダウンロードして、ファイルを開きます。

R.C.T-e<>rcte<>991443689<>7<>
タキザワ<>takizawa<>991444567<>3<>
まい<>mai<>991591364<>-2<>

こんな感じの文字列が、縦に人数分あるはずです。
各項目は<>で区切られていて、左から順番に、
お名前、パスワード、最後に訪れた時間、ラブポイント、となっています。

この後ろに、今後のために、そうですね、10項目ぐらい追加しておきましょう、この際(爆)
初期値としては、0が一番妥当と思われますので、下記のように追記して下さい。

R.C.T-e<>rcte<>991443689<>7<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>
タキザワ<>takizawa<>991444567<>3<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>
まい<>mai<>991591364<>-2<>0<>0<>0<>0<>0<>0<>0<>0<>0<>0<>

0<>」で1つになります、それを10個ずつ後ろに追加しました。
もちろん数は10でなくて構いません。ただ、いくつにしたのかを覚えておくことと、
必ず全員、同じ数だけ追加してください。

追加が終わったら保存しましょう。
次にプログラム(pet.cgi)の方を、ユーザーデータの改造に合わせて改造します。
追加した数が10じゃない人は、その分だけ追加してくださいね。
ではまず、ユーザー情報をチェック(sub checkname)の「新規ユーザーを登録」に、
下記のように追記してください。
あ、ちなみに緑の部分は「R.C.T-e推奨変更」の改造です。
ちょっと横に長いですが、お許し下さい(^^;

    # 新規ユーザーを登録
    if ($flag == 0) {
        $gdate = time - $dayhour[$playtime + 1];
        $love = 0;
        $dummy01 = 0;
        $dummy02 = 0;
        $dummy03 = 0;
        $dummy04 = 0;
        $dummy05 = 0;
        $dummy06 = 0;
        $dummy07 = 0;
        $dummy08 = 0;
        $dummy09 = 0;
        $dummy10 = 0;
        @new = @lines;
        push(@new,"$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$love<>$dummy01<>$dummy02<>$dummy03<>$dummy04<>$dummy05<>$dummy06<>$dummy07<>$dummy08<>$dummy09<>$dummy10<>\n");
        &openoutuserdata;
    }

同じように、ペットを新しく登録したときのユーザーデータも改造してください。
新規ペットの登場(sub newpet)に下記のように追記してください。

# ------------------------- #
# Sub New Pet
# 新規ペット登場
# ------------------------- #
sub newpet {
    $deadname = $petname;
    $petname = $FORM{'petname'};
    if ($petname eq "")                          { &error("ペットに名前をつけてください"); }
    if ($petname eq $deadname && $samename == 0) { &error("前と同じ名前はつけられません"); }
    if ( $FORM{'sex'} == 1 )                     { $sex = 'メス'; }  else { $sex = 'オス'; }
    $godfather = $FORM{'name'};
    $birth     = time;
    $dead      = 0;
    $lastfeed  = time;
    $lastplay  = time;
    $good      = 0;
    $bad       = 0;
    $out       = 0;
    $outdate   = 0;
    $num++;
    &openoutpetdata;
    $gdate = time - $dayhour[$playtime + 1];
    $dummy01 = 0;
    $dummy02 = 0;
    $dummy03 = 0;
    $dummy04 = 0;
    $dummy05 = 0;
    $dummy06 = 0;
    $dummy07 = 0;
    $dummy08 = 0;
    $dummy09 = 0;
    $dummy10 = 0;
    @new = "$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$loved<>$dummy01<>$dummy02<>$dummy03<>$dummy04<>$dummy05<>$dummy06<>$dummy07<>$dummy08<>$dummy09<>$dummy10<>\n";
    &openoutuserdata;
    &petform;
}

次にこのダミー達をユーザーデータに書き込むために、
書き込み用の変数に全部コピーします。
アクション(sub action)の下の方に、下記のように追記します。

    &openoutpetdata;

    $goodbye = time - (60 * 60 * 24 * $goodbye);
    $newlove = $love;
    $newdummy01 = $dummy01;
    $newdummy02 = $dummy02;
    $newdummy03 = $dummy03;
    $newdummy04 = $dummy04;
    $newdummy05 = $dummy05;
    $newdummy06 = $dummy06;
    $newdummy07 = $dummy07;
    $newdummy08 = $dummy08;
    $newdummy09 = $dummy09;
    $newdummy10 = $dummy10;
    &openinuserdata('action');
    &openoutuserdata;
    $actionflag = 1; # 飼い主ランキングのリンクを表示
    &bodybottom;
    &footer;
}

次は既存のユーザーのデータを読み込んでくる所に改造を加えます。
ユーザーデータの読み込み(sub openinuserdata)に、下記のように追記してください。

# ------------------------- #
# Sub Open In User Data
# ユーザーデータの読みこみ
# ------------------------- #
sub openinuserdata {
    if ($lockkey == 1) { &lock; }
    open(IN,"$userdata") || &error("Can't open $userdata");
    @lines = <IN>;
    close(IN);
    &unlock;

    foreach $line (@lines) {
        ($name,$pass,$gdate,$love,$dummy01,$dummy02,$dummy03,$dummy04,$dummy05,$dummy06,$dummy07,$dummy08,$dummy09,$dummy10) = split(/<>/,$line);

        if ($_[0] eq 'checkname') {
            if ($FORM{'name'} eq $name) {
                $flag = 1; # データの中にユーザーを確認
                if ($FORM{'pass'} ne $pass)
                    { &error("パスワードが間違っています"); }
                last;
            }
        }

最後にユーザーデータに書き込みを行う所に改造を加えますが、
実は、書き込むデータを作るのは、ユーザーデータの読み込み(sub openinuserdata)で行っています。
真ん中辺りのこの位置に下記のように追記してください。
ここで先ほどの書き込み用の変数が出てきます。

        if ($_[0] eq 'action') {
            if ($FORM{'name'} eq $name) {
                $gdate = time;
                push(@new,"$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$newlove<>$newdummy01<>$newdummy02<>$newdummy03<>$newdummy04<>$newdummy05<>$newdummy06<>$newdummy07<>$newdummy08<>$newdummy09<>$newdummy10<>\n");
            } else {
                if ($gdate >= $goodbye) { push(@new,$line); }
            }
        }

うーん、だいぶ横に長いですね・・・5個ぐらいで良かったかな(^^;

そんなわけで、ユーザーデータとプログラムの改造の方は終わりです。
2つ同時にアップしてくださいね。



この後、この追加した「$dummy??」を何に使うかは自由です。
分かりやすい名前に変えて使ってください。
例えば訪問回数でしたら、$dummy01を全部$visitcntをいう名前に置き換えて、
$newdummy01を全部$newvisitcntという名前に置き換えるだけで、
読み出しと書き込みの処理はOKですので、
後は、アクション(sub action)の中で、$visitcntをカウントアップするだけです。
(詳細は別ページで説明しますね)
もちろん、文字列を入れることも可能ですので、「遊ぼー。」や「一緒」のように、
その人が最後に選んだコマンドを格納しておくことも出来るようになるわけです。

・・・こんな説明で分かりましたでしょうか? とっても心配です(爆)

あ、余計に追加したその他のダミーは、ただ単に読み込まれて、そのまま書き込まれるだけです。
使用するその日が来るまでは、全く意味のないモノですが(^^;