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

車様専用:えー・・・例の改造(爆)

ではでは、早速「キャラ3人のgood、bad、elseをカウントする」から行きましょう。
3人x3種類ですので、変数が9つ必要ですので、
まずはユーザーデータのダミーを増やしてしまいましょう。
・・・って、すでにdummy20までありますね(^^;

次に、ダミーの名前を分かりやすく変更しましょう。
ここでは、説明の都合上、勝手に名前を付けますが、
分かりやすい名前に変更してお使い下さいませ。

で、ダミー11なんですが、
一部dummyt11と、なぜか「t」が入っていましたので、お気をつけ下さい(^^;
一文字でも違うと、違う変数として扱われてしまいますので・・・。

−楓用−
$dummy04$char1good(6箇所)
$newdummy04$newchar1good(2箇所)

$dummy05$char1bad(6箇所)
$newdummy05$newchar1bad(2箇所)

$dummy06$char1else(6箇所)
$newdummy06$newchar1else(2箇所)


−雪用−
$dummy07$char2good(6箇所)
$newdummy07$newchar2good(2箇所)

$dummy08$char2bad(6箇所)
$newdummy08$newchar2bad(2箇所)

$dummy09$char2else(6箇所)
$newdummy09$newchar2else(2箇所)


−守矢用−
$dummy10$char3good(6箇所)
$newdummy10$newchar3good(2箇所)

$dummy11$char3bad(6箇所)
$newdummy11$newchar3bad(2箇所)

$dummy12$char3else(6箇所)
$newdummy12$newchar3else(2箇所)


これで、変数の保存と読み込みの部分はOKです。


あとは、これらをカウントアップする場所ですが、
とりあえず、通常の反応の時から行きましょう。
通常の反応は、アクション(sub action)の下の方、

elsif ($FORM{'good'} =~ /$fa/) {

から始まるところです。
そこへ、下記のように追記してください。

と、ここで気付いたことがありましたので・・・(^^;
時刻による分岐の条件で、雪と守矢で、「10時間後」がダブっております。
一応緑で示しておきますが、他の箇所もこうなっておりますので、修正してくださいね。

    elsif ($FORM{'good'} =~ /$fa/) {
    if ($timeafter ==  1 || $timeafter ==  4 || $timeafter ==  7 ||
        $timeafter == 10 || $timeafter == 13 || $timeafter == 16 ||
        $timeafter == 19 || $timeafter == 22) {

        &petnowwaku($good_img2{$fa},$good_msg2{$fa});
        $char2good++;                                   # 雪goodカウントアップ
    }
    elsif ($timeafter ==  2 || $timeafter ==  5 || $timeafter ==  8 ||
           $timeafter == 11 || $timeafter == 10 || $timeafter == 17 ||
           $timeafter == 20 || $timeafter == 23) {

        &petnowwaku($good_img3{$fa},$good_msg3{$fa});
        $char3good++;                                   # 守矢goodカウントアップ
    }
    else {
    &petnowwaku($good_img{$fa},$good_msg{$fa});
    $char1good++;                                       # 楓goodカウントアップ
    }
    $love++;$good++;
    if ($fa eq "feed" && $hungry != 0) { $lastfeed = time; }                        # ★
    }
    elsif ($FORM{'bad'} =~ /$fa/) {
    if ($timeafter ==  1 || $timeafter ==  4 || $timeafter ==  7 ||
        $timeafter == 10 || $timeafter == 13 || $timeafter == 16 ||
        $timeafter == 19 || $timeafter == 22) {

        &petnowwaku($bad_img2{$fa},$bad_msg2{$fa});
        $char2bad++;                                   # 雪badカウントアップ
    }
    elsif ($timeafter ==  2 || $timeafter ==  5 || $timeafter ==  8 ||
           $timeafter == 11 || $timeafter == 10 || $timeafter == 17 ||
           $timeafter == 20 || $timeafter == 23) {

        &petnowwaku($bad_img3{$fa},$bad_msg3{$fa});
        $char3bad++;                                   # 守矢badカウントアップ
    }
    else {
    &petnowwaku($bad_img{$fa},$bad_msg{$fa});
    $char1bad++;                                       # 楓badカウントアップ
    }
    $love--;$bad++;
    }
    else {
    if ($timeafter ==  1 || $timeafter ==  4 || $timeafter ==  7 ||
        $timeafter == 10 || $timeafter == 13 || $timeafter == 16 ||
        $timeafter == 19 || $timeafter == 22) {

        &petnowwaku($else_img2{$fa},$else_msg2{$fa});
        $char2else++;                                   # 雪elseカウントアップ
    }
    elsif ($timeafter ==  2 || $timeafter ==  5 || $timeafter ==  8 ||
           $timeafter == 11 || $timeafter == 10 || $timeafter == 17 ||
           $timeafter == 20 || $timeafter == 23) {

        &petnowwaku($else_img3{$fa},$else_msg3{$fa});
        $char3else++;                                   # 守矢elseカウントアップ
    }
    else {
    &petnowwaku($else_img{$fa},$else_msg{$fa});
    $char1else++;                                       # 楓elseカウントアップ
    }
    }

    &openoutpetdata;

キャラ毎に&petnowwakuで画像とメッセージを表示しますので、
そのすぐ後に、それぞれのキャラの、それぞれの状態(good、bad、else)のカウンタをプラス1します。

特別なイベントや、ランダムで機嫌の悪いときなどの場合も、
基本的には、&petnow&petnowwakuのすぐ下で、
キャラ毎のどれかのカウンタをプラス1すればOKです。

例えば、ランダムで機嫌が悪かったときに、それぞれのbadをプラス1するときは、

    elsif ($rnd <= $rnd_border) {
    if ($timeafter ==  1 || $timeafter ==  4 || $timeafter ==  7 ||
        $timeafter == 10 || $timeafter == 13 || $timeafter == 16 ||
        $timeafter == 19 || $timeafter == 22) {

        &petnowwaku($rnd_img2,$rnd_msg2);
        $char2bad++;                                   # 雪badカウントアップ
    }
    elsif ($timeafter ==  2 || $timeafter ==  5 || $timeafter ==  8 ||
           $timeafter == 11 || $timeafter == 10 || $timeafter == 17 ||
           $timeafter == 20 || $timeafter == 23) {

        &petnowwaku($rnd_img3,$rnd_msg3);
        $char3bad++;                                   # 守矢badカウントアップ
    }
    else {
    &petnowwaku($rnd_img,$rnd_msg);
    $char1bad++;                                       # 楓badカウントアップ
    }
    $love--;
    }

これでカウントアップの改造は終了です〜。
キャラ毎に何かのカウンタをアップダウンさせたいときは、
今回のように、&petnow&petnowwakuのすぐ下に、
カウンタを増減するプログラムを追記していくだけでOKです。

ちなみに、
プラス1 → $○○○++;
マイナス1 → $○○○--;
プラス2以上など → $○○○ = $○○○ + 2;

あ、ただし、アクション(sub action)の中だけです、
ペットのコンディションやペットフォームでカウントアップしても、
データに保存されませんので、ご注意下さい。



では次に「個人ランキングでgood数の多いキャラを表示する」、行ってみましょう。
「個人ランキング」(全体ランキングもそうですが)は、他の処理とはちょっと異なっていまして、
いわゆるユーザーデータの読み込みが行われません。
・・・いや、行われるのですが、個人を特定しないのです(?)。 えぇと、つまり、(^^;
個人別に持っているgoodなどのカウンタは、個人を特定しないので、読み込まれないのです。
$char1goodなど、先ほど作った変数がそのまま使えないのです。
ですので、ランキング用に新たに変数を作り、
その変数にどの画像を表示するか、直接ファイル名を入れます。

ユーザーデータの読み込み(sub openinuserdata)に、下記のように追記してください。
ちなみに同点の場合、優先順位は楓・雪・守矢です。
4つとも内容は一緒ですので、コピペでOKです。

    if ($_[0] eq 'ownerlist') {
        if ($love >= $loved) {
        @lovelist[$lovenum] = "$love<>$name";                # ★
        $lovenum++;
        if ($FORM{'name'} eq $name) {                        # ★
            $ownername = $name;                             # ★
            $ownerrank = '好きな人';                    # ★
            $ownerlove = $love;                             # ★
            if ($char1good >= $char2good) {
                if ($char1good >= $char3good) {
                    $ownergood = '楓の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
            else {
                if ($char2good >= $char3good) {
                    $ownergood = '雪の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
        }                                                    # ★
        if ($bestlove < $love)
            { $bestowner = "$name"; $bestlove = $love; }
        } elsif ($love >= $loved_k) {                        # ★
        @lovelist_k[$lovenum_k] = "$love<>$name";            # ★
        $lovenum_k++;                                        # ★
        if ($FORM{'name'} eq $name) {                        # ★
            $ownername = $name;                             # ★
            $ownerrank = '気になる人';                        # ★
            $ownerlove = $love;                             # ★
            if ($char1good >= $char2good) {
                if ($char1good >= $char3good) {
                    $ownergood = '楓の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
            else {
                if ($char2good >= $char3good) {
                    $ownergood = '雪の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
        }                                                    # ★
        } elsif ($love >= $disliked) {                        # ★
        @otherlist[$othernum] = "$love<>$name";             # ★
        $othernum++;                                        # ★
        if ($FORM{'name'} eq $name) {                        # ★
            $ownername = $name;                             # ★
            $ownerrank = 'それ以外の人';                    # ★
            $ownerlove = $love;                             # ★
            if ($char1good >= $char2good) {
                if ($char1good >= $char3good) {
                    $ownergood = '楓の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
            else {
                if ($char2good >= $char3good) {
                    $ownergood = '雪の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
        }                                                    # ★
        } else {
        @hatelist[$hatenum] = "$love<>$name";                # ★
        $hatenum++;                                            # ★
        if ($FORM{'name'} eq $name) {                        # ★
            $ownername = $name;                             # ★
            $ownerrank = '嫌いな人';                        # ★
            $ownerlove = $love;                             # ★
            if ($char1good >= $char2good) {
                if ($char1good >= $char3good) {
                    $ownergood = '楓の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
            else {
                if ($char2good >= $char3good) {
                    $ownergood = '雪の画像ファイル名';
                }
                else {
                    $ownergood = '守矢の画像ファイル名';
                }
            }
        }                                                    # ★
        }
    }

それぞれのgoodを比較し、$ownergoodと言う新しい変数にファイル名を入れます。
あとは、これを個人ランキングで表示するだけです。
表示方法ですが、とりあえず「あかりと一緒」と同じにしておきますが、
テーブルタグを駆使して、レイアウトはご自由に変更して下さい(^^;

# ------------------------- #    # ★
# Sub Owner Disp                # ★
# 飼い主個人情報                # ★
# ------------------------- #    # ★
sub ownerdisp {
    &header;
    &title;
    $bestlove = $lovenum = $lovenum_k = $hatenum = $othernum = 0;
    &openinuserdata('ownerlist');

    &bodytop('プレイヤー個人情報');
    &tabletop;

    if ($bestowner eq $ownername) {
    $ownerrank = '一番好きな人';
    }

    print "<DIV align=center><BR>\n";
    print "$ownernameさん<br>";
    print "$ownerrank<br>";
    print "$ownerloveポイント<br>";

    $allnum = $lovenum + $lovenum_k + $hatenum + $othernum;
    print "あなたの順位は$allnum人中 第$ownercnt位です。<br>";
    print "</DIV></TD><TD align=center><IMG src=$img$ownergood>\n";

    &tablebottom;
    &bodybottom;
    &footer;
}