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

応用:ランダム+カウンタ+コマンド

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

ではでは、ユーザーデータの改造を使った、特殊イベントを組んでみましょう。
これから挙げるサンプルは、
コマンド選択後にランダムで「いきなり噛み付く」と「いきなりふて寝」を用意し、
それぞれ2回以上発生したら、お詫びイベントとしてコマンドに「好感度アップ」を追加する、
という改造を施したものです。
イベント発生後にカウンタをクリアしますので、またそれぞれ2回以上発生すると、
お詫びイベントもまた発生します。


ではまず、ダミーの名前を変更しましょう。
噛み付くイベント用のカウンタと、ふて寝イベント用のカウンタの、2つ必要です。
空いているダミーの名前を、変更してください。

(例)
全ての$dummy03を、$kamitukuに変更します、全部で6ヶ所です。
全ての$newdummy03を、$newkamitukuに変更します、全部で2ヶ所です。

全ての$dummy04を、$futeneに変更します、全部で6ヶ所です。
全ての$newdummy04を、$newfuteneに変更します、全部で2ヶ所です。

これで、読み込みと保存はOKになります。


ではプログラムの方に移りましょう。
最初に「いきなり噛み付く」と「いきなりふて寝」のランダムイベントを作成します。
2パターン用意しましたので、お好きな方をお使いいただくか、
参考にして、ご自分で改造してみてもOKですよ〜。

パターン1:発生確率がそれぞれ10分の1。
つまり、ランダムイベント全体では5分の1で発生する事になります。
アクション(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 ($rnd <= $rnd_border) {      # 最初からあるランダムイベントは削除
#       &petnow($rnd_img,$rnd_msg);
#       $love--;
#   }

    if ($rnd == 1) {                # いきなり噛み付くイベント
        $disp_img = 'bite.gif';
        $disp_msg = 'いきなり噛み付きました。';
        &petnow($disp_img,$disp_msg);
        $love--;
        $kamituku++;
    }
    elsif ($rnd == 2) {             # いきなりふて寝イベント
        $disp_img = 'neteru.gif';
        $disp_msg = 'いきなりふて寝しました。';
        &petnow($disp_img,$disp_msg);
        $love--;
        $futene++;
    }
    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;
}

簡単に説明しますと、
$rndには、ランダムで1〜10の数字が入ってきます。
もし、それが1だったら「いきなり噛み付く」イベント発生で、
もし2だったら「いきなりふて寝」イベントが発生します。
どちらも確率は10分の1ですね、合わせて5分の1です。
それぞれの中身では、好感度をマイナス1して、カウンタをプラス1しています。


パターン2:イベントを時刻で分岐、確率は10分の1。
昼間は「いきなり噛み付く」イベント、夜は「いきなりふて寝」イベントになります。
アクション(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 ($rnd <= $rnd_border) {      # 最初からあるランダムイベントは削除
#       &petnow($rnd_img,$rnd_msg);
#       $love--;
#   }

    if ($rnd == 1) {
        ($isec,$imin,$ihour,$iday,$imon,$iyear) = localtime(time); # 現在時刻の取得
        $iyear += 1900;
        $imon++;

        if ($ihour >= 7 && $ihour < 19) { # いきなり噛み付くイベント
            $disp_img = 'bite.gif';
            $disp_msg = 'いきなり噛み付きました。';
            $kamituku++;
        }
        else {                            # いきなりふて寝イベント
            $disp_img = 'neteru.gif';
            $disp_msg = 'いきなりふて寝しました。';
            $futene++;
        }
        &petnow($disp_img,$disp_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;
}

7:00〜19:00の間は「いきなり噛み付く」イベント、
19:00〜7:00の間は「いきなりふて寝」イベントが発生します。


次に、お詫びイベントを作成します。
ペットのコンディション(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;
    }

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

    # お詫びイベント
    if ($kamituku >= 2 && $futene >= 2) {
        $disp_img = 'naku.gif';
        $disp_msg = '申し訳なさそうにしています。';
        &petnowwaku($disp_img,$disp_msg);
        return;
    }

    # ラブポイントがある基準以下の場合、威嚇画像を表示
    if ($bad - $good - $love > 5) {
        &petnow($angry_img,"$petname$enemy_msg");
        $swfurl = $img . 'catvoicerage.swf';
        if ($voice == 1) { &flash($swfurl); }
        return;
    }

それぞれのカウンタが2以上なら、お詫びイベント発生です。
他にもイベントを追加している方は、優先順位が高い方を上にして下さい。
順番というか、挿入した場所を覚えておいて下さい。
次のペットフォームで同じ位置に挿入することになりますので。

では、好感度アップのコマンドを追加しましょう。

# ------------------------- #
# 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;
        &input('radio','mode','feed',' checked','餌をあげる<br>');
        &input('radio','mode','pat','','なでる<br>');
        &input('radio','mode','out','','外に出す');
        if ($kamituku >= 2 && $futene >= 2 && $hungry == 0) {
            &input('radio','mode','lpup','','好感度アップ');
        }
        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;
}

# ------------------------- #
# 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 ($kamituku >= 2 && $futene >= 2 && $humgry == 0) {
        $kamituku = $futene = 0;
    }

#   if ($rnd <= $rnd_border) {      # 最初からあるランダムイベントは削除
#       &petnow($rnd_img,$rnd_msg);
#       $love--;
#   }

    if ($fa eq 'lpup') { # 好感度アップ
        &petnow('喜ぶ画像ファイル名',"メッセージ");
        $love += 10;
    }

    elsif ($rnd == 1) {
        ($isec,$imin,$ihour,$iday,$imon,$iyear) = localtime(time); # 現在時刻の取得
        $iyear += 1900;
        $imon++;

        if ($ihour >= 7 && $ihour < 19) { # いきなり噛み付くイベント
            $disp_img = 'bite.gif';
            $disp_msg = 'いきなり噛み付きました。';
            $kamituku++;
        }
        else {                            # いきなりふて寝イベント
            $disp_img = 'neteru.gif';
            $disp_msg = 'いきなりふて寝しました。';
            $futene++;
        }
        &petnow($disp_img,$disp_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します。

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