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

1回きりのイベントを作ろう

この改造を行う前に、ユーザーデータの改造を済ませておいて下さい。

PETROOMに用意されているスペシャル画像は、ラブポイントと訪問した時のタイミングによって、
条件さえ整えば、何回でも表示されます。
でも、たった1回だけ発生させたいイベントもありますよね?

ここでは、ある条件を満たして、特別なイベントを発生させたあとは、
たとえ条件が整っても二度と発生させない、1回きりのイベントについて説明致します。

どんな風にして実現するのかと言いますと、
ユーザーデータに「イベントを発生させたことがあるかないかの目印」を作り、
条件が整ったときにその目印を確認して、発生させたことがなければイベントを発生させ、目印を付ける。
すでに発生したことがあれば(目印が付いていれば)、このイベントは無視する。
こんな事をプログラムで実現すればOKです。

実は、日付によるイベントは、これと同じような処理をしています。
ただ、その時に使った「最後に訪れた日」の情報は、たまたま最初からユーザーデータに保存されていたんです。
なので、ユーザーデータの改造は必要なかったんですが、
今回は、新たに目印用の変数が必要になりますので、ユーザーデータの改造も必要なわけです。


では、どんな流れのイベントを作ろうとしているか説明します。
好感度がある値以上になったとき、ペットが空腹や外出中でなくて、まだこのイベントを発生させたことがなければ、
イベントを発生(画像&メッセージの表示)させ、コマンドも特別なものを用意する。
1回でも発生させたことがある場合は、このイベントは発生させない。


それと、
訪問回数が20回を超えたときのイベントも作ってみましょう。
訪問回数については、別ページの「訪問回数をチェックしよう」をご覧下さい。

では実際に改造に取り掛かりましょう。
まずは、イベント発生の目印用の変数を作ります、というかダミーの名前を変えるだけです(^^;
ここではダミー02と、ダミー03を使うこととします。
全ての$dummy02を、$event01に変更します、全部で6ヶ所です。
全ての$newdummy02を、$newevent01に変更します、全部で2ヶ所です。
全ての$dummy03を、$event02に変更します、全部で6ヶ所です。
全ての$newdummy03を、$newevent02に変更します、全部で2ヶ所です。

次にペットのコンディション(sub condition)の外出中の処理、空腹時の処理より下に、
下記のように追記します。

    # お腹が空いている時の処理
    if ($hungry > 0) {
        # お腹が空いて餓死寸前
        if ($hungry >= $deadline - 1) { &petnow($tired_img,$tired_msg); }
        else { &petnow($cry_img,$hungry_msg);
            $swfurl = $img . 'catvoice.swf';
            if ($voice == 1) { &flash($swfurl); }
        }
        $plusfeed  = 'feed';
        $minusfeed = 'hit_pat_play_out';
        return;
    }

    # 好感度の1回きりのイベント
    if ($love >= 50 && $event01 == 0) {
        $disp_img = '喜ぶ画像.gif';
        $disp_msg = '50達成おめでとう!';
        &petnow($disp_img,$disp_msg);
        return;
    }

    # 訪問回数の1回きりのイベント
    if ($visitcnt >= 20 && $event02 == 0) {
        $disp_img = '喜ぶ画像.gif';
        $disp_msg = '20回ありがとう!';
        &petnow($disp_img,$disp_msg);
        return;
    }

    # 食後の経過時間を$timeafterに代入
    $timeafter = int((time - $lastfeed)/3600);

ラブポイントが50以上で、目印が0(イベントを発生させたことがない)ならば、
喜ぶ画像とメッセージを表示します。

訪問回数が20以上で、目印が0(イベントを発生させたことがない)ならば、
喜ぶ画像とメッセージを表示します。

次にペットフォーム(sub petform)に下記のように追記します。

# ------------------------- #
# Sub Pet Form
# ペットフォーム
# ------------------------- #
sub petform {
    &checkname;
    if (!$petname) { &nopet;exit; }
    &header;
    &title;
    &bodytop("ペットデータ($num代目)");
    &petdata;
    &condition;
    if ($noaction == 0 && $enter != 1) {
        print "<tr>\n";
        print "<td>\n";
        &tabletop;
        if ($love >= 50 && $event01 == 0 && $hungry == 0) {
            &input('radio','mode','event01_01',' checked','好感度アップ');
            print "</td>\n";
            print "<td>\n";
            &input('radio','mode','event01_02','','好感度ダウン');
            print "</td>\n";
            print "</tr>\n";
        }
        elsif ($visitcnt >= 20 && $event02 == 0 && $hungry == 0) {
            &input('radio','mode','event02_01',' checked','誉める');
            print "</td>\n";
            print "<td>\n";
            &input('radio','mode','event02_02','','叱る');
            print "</td>\n";
            print "</tr>\n";
        }
        else {
        &input('radio','mode','feed',' checked','餌をあげる<br>');
        &input('radio','mode','pat','','なでる<br>');
        &input('radio','mode','out','','外に出す');
        print "</td>\n";
        print "<td>\n";
        &input('radio','mode','play','','遊ぶ<br>');
        &input('radio','mode','hit','','しかる<br>');
        &input('radio','mode','owner','','飼い主ランキング');
        print "</td>\n";
        print "</tr>\n";
        }

        print "<tr>\n";
        print "<td colspan=\"2\">\n"; 
        print "<div align=\"right\">\n";
        &input('hidden','name',$FORM{'name'},'','');
        &input('hidden','pass',$FORM{'pass'},'','');
        &input('hidden','good',"$scheduledsr[$timeafter]$plusfeed",'','');
        &input('hidden','bad',"$schedulednt[$timeafter]$minusfeed",'','');
        &input('submit','','OK!','','<br>');
        print "</div>\n";
        &tablebottom;
    } else { $actionflag = 1; }
    &bodybottom;
    &openoutpetdata;
    &footer;
}

ラブポイントが50以上で、イベントを発生させたことがなくて、空腹時じゃなかったら、
「好感度アップ」と「好感度ダウン」というコマンドを表示します。

訪問回数が20以上で、イベントを発生させたことがなくて、空腹時じゃなかったら、
「誉める」と「叱る」というコマンドを表示します。

では次に、アクション(sub action)に下記のように追記します。

# ------------------------- #
# Sub Action
# アクション
# ------------------------- #
sub action {
    $playmsg = "$playtime時間" if $playtime != 0;
    $playmsg = "$playminute分" if $playtime == 0;

    &checkname;
    &error("まだ$playmsg経過していません") if $enter == 1;

    &header;
    &title;
    &bodytop("ペットデータ($num代目)");
    &petdata;
    srand(time);
    $rnd = int(rand(10) + 1);
    $fa = $FORM{'mode'};

    if ($fa eq 'play') { $lastplay = time; }
    if ($fa eq 'out')  { $out = 1; $outdate = time; }
    
    if ($fa eq 'event01_01') {
        $disp_img = '喜ぶ画像.gif';
        $disp_msg = '好感度がアップしました。';
        &petnow($disp_img,$disp_msg);
        $love = $love + 10;
        $event01 = 1;
    }
    elsif ($fa eq 'event01_02') {
        $disp_img = '悲しむ画像.gif';
        $disp_msg = '好感度がダウンしました。';
        &petnow($disp_img,$disp_msg);
        $love = $love - 10;
        $event01 = 1;
    }
    elsif ($fa eq 'event02_01') {
        $disp_img = '誉められる画像.gif';
        $disp_msg = '嬉しそうです。';
        &petnow($disp_img,$disp_msg);
        $event02 = 1;
    }
    elsif ($fa eq 'event02_02') {
        $disp_img = '叱られる画像.gif';
        $disp_msg = '悲しそうです。';
        &petnow($disp_img,$disp_msg);
        $event02 = 1;
    }
    elsif ($rnd <= $rnd_border) {
        &petnow($rnd_img,$rnd_msg);
        $love--;
    }
    elsif ($FORM{'good'} =~ /$fa/) {
        &petnow($good_img{$fa},$good_msg{$fa});
        $love++;$good++;
        if ($fa eq "feed") { $lastfeed = time; }
    }
    elsif ($FORM{'bad'} =~ /$fa/) {
        &petnow($bad_img{$fa},$bad_msg{$fa});
        $love--;$bad++;
    }
    else {
        &petnow($else_img{$fa},$else_msg{$fa});
    }

    &openoutpetdata;

    $goodbye = time - (60 * 60 * 24 * $goodbye);
    $newlove = $love;
    &openinuserdata('action');
    &openoutuserdata;
    $actionflag = 1; # 飼い主ランキングのリンクを表示
    &bodybottom;
    &footer;
}

選んだコマンドが好感度アップなら、
喜ぶ画像とメッセージを表示して、ラブポイントをプラス10、イベント発生の目印を1にします。
選んだコマンドが好感度ダウンなら、
悲しむ画像とメッセージを表示して、ラブポイントをマイナス10、イベント発生の目印を1にします。

選んだコマンドが誉めるなら、
誉められる画像とメッセージを表示します。
選んだコマンドが叱るなら、
叱られる画像とメッセージを表示します。

以上でOKです。
ここまでの所で、何をやっているのか大体分かる方は、もう自由にイベントを追加できると思います。
条件や目印を増やすだけで、かなり複雑な処理も可能です。
例えば、「一緒」では、
ランダムイベントで「志保乱入」と「雅史混入」というのがあるのですが、
それぞれにカウンタを設け、どちらも2回以上発生したら、
「お詫びのデート」が選択肢に追加されるイベントを発生させ、カウンタをクリアします。
そうすると、また2回以上ランダムが発生すると、お詫びイベントがまた発生します。
こんな改造も、上記の応用で作れますです。