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

何人中第何位なのかを表示しよう

本来、自分がどのランクにいるか確認するためのランキング表示ですが、
オリジナルのPETROOMでは、ソートもされていないですし、
人数が増えるとどんどん縦に長くなり、自分のランクがよく分からなくなることがあります。

そこで、自分は一体何人中第何位なのか、という情報を追加してみましょう。

ですが、この改造、ちょっとした問題がありまして・・・(^^;
どんな問題かというと、「一番なついている人が必ずしも第1位とは限らない(場合がある)」という、
なんとも、とんでもない仕様なのです(^^;;;

どんな場合かと言いますと、それは「一番」が複数いるとき、つまりラブポイントが同点の時ですね。
ここの改造の場合、第1位はソートによってお名前順で一番先の人がなりますが、
オリジナルのPETROOMでは、登録が早かった人が一番になるためです。
「遊ぼー。」では、この問題を回避するため、また別の改造を施していますが、
今回それは掲載いたしません、改造の手間の方が遙かに掛かるからです。
というか、かなりいじりますので、上手く掲載する自信がないのです(^^;
もしかしたら、そのうちアップするかもしれませんが、現状はこの仕様でお願い致します。
実際、トップが同点になる場合はあまりありませんし、
そのような注記をしていただければ、それほど問題でもありませんので。

ではでは、注意事項を。
この改造には、第何位なのかを調べるために、ソート(並び替え)を行う必要があります。
ソートの改造がお済みでない方は、
ランキング表示をソート(並び替え)しようの改造を行ってからご覧下さい。


また、ランキング表示に個人別を追加している方と、していない方で、
若干違いがありますので、分けてご説明します。
個人別を追加しようと思っている方は、
先にランキング表示を個人別にしてみようを行ってください。


また、ソートのプログラム追加により、
ランキング表示にラブポイントを追加することも可能になります。
(詳しくはソートの方を見て下さい)
ラブポイント追加の改造とかぶる部分がありますので、飛ばせるところは飛ばせますが、
特に明記はしませんので、「あ、ここやってある」程度に思ってください(^^;


●ランキング表示に個人別を追加していない方用

【1】
最初にそれぞれソートを行った各ランクのリストを結合して、
1つのソートされた順位リストを作ります。
そこから、ユーザーのお名前が上から何番目に出てくるかを調べます。
これが、順位になります。
ユーザーデータの読み込み(sub openinuserdata)の下の方に、
下記のように追加してください。
緑の所は、すでに改造済みのはずの所です。

        if ($_[0] eq 'ownerlist') {
            if ($love >= $loved) {
                @lovelist[$lovenum] = "$love<>$name";
                $lovenum++;
                if ($bestlove < $love)
                    { $bestowner = "$name"; $bestlove = $love; }
            } elsif ($love <= $disliked) {
                @hatelist[$hatenum] = "$love<>$name";
                $hatenum++;
            } else {
                @otherlist[$othernum] = "$love<>$name";
                $othernum++;
            }
        }
    }
    if ($_[0] eq 'ownerlist') {
        &user_sort_r(@lovelist);
        @lovelist = @newtxt;

        &user_sort_r(@hatelist);
        @hatelist = @newtxt;

        &user_sort_r(@otherlist);
        @otherlist = @newtxt;

        @alllist = @lovelist;
        push(@alllist,@otherlist,@hatelist);

        $ownercnt = 1;
        foreach $allcnt (@alllist) {
            ($love,$name) = split(/<>/,$allcnt);
            if ($FORM{'name'} eq $name) {
                last;
            }
            $ownercnt++;
        }
    }
}

# ------------------------- #
# Sub User Sort
# ユーザーソート


【2】
次にランキング表示の方をいじりましょう。
とりあえず一番上に表示させますが、あとでお好きなところへ変更して下さい。
まずはこのまま設置して、動くことを確認してからにしましょう。

飼い主ランキング(sub ownerlist)に下記のように追記して下さい。

# ------------------------- #
# Sub Owner List
# 飼い主ランキング
# ------------------------- #
sub ownerlist {
    &header;
    &title;
    $bestlove = $lovenum = $hatenum = $othernum = 0;
    &openinuserdata('ownerlist');

    &bodytop('飼い主ランキング');
    &tabletop;

    $allnum = $lovenum + $hatenum + $othernum;
    print "あなたの順位は$allnum人中 第$ownercnt位です。<br>";

    print "$font2$petnameが一番なついている人は</font><br>";
    if ($bestlove < $loved) { print "いません<br>\n";}
    else { print "$bestownerさんです<br>\n"; }
    print "<br>\n";

順位の表示はこれで完了です、お疲れ様でした〜。
続けて、プレイヤーの明示を行う方へ。


【3】
ユーザーデータの読み込み(sub openinuserdata)の下の方に、
下記のように追記します。

        if ($_[0] eq 'ownerlist') {
            if ($love >= $loved) {
                @lovelist[$lovenum] = "$love<>$name";
                $lovenum++;
                if ($FORM{'name'} eq $name) {
                    $ownername = $name;
                }
                if ($bestlove < $love)
                    { $bestowner = "$name"; $bestlove = $love; }
            } elsif ($love <= $disliked) {
                @hatelist[$hatenum] = "$love<>$name";
                $hatenum++;
                if ($FORM{'name'} eq $name) {
                    $ownername = $name;
                }
            } else {
                @otherlist[$othernum] = "$love<>$name";
                $othernum++;
                if ($FORM{'name'} eq $name) {
                    $ownername = $name;
                }
            }
        }

プレイヤーのお名前を$ownernameと言うところに保存しておきます。


【4】
次に、飼い主ランキング(sub ownerlist)を下記のように変更します。
緑色の部分は、ソートで追加した部分です。
その中にオレンジ色の部分を追加してください。
ちなみにオレンジ色の部分の下3ブロックは、3ブロックとも同じ内容なので、コピペでOKですよ。
あ、#もお忘れなく(^^;

# ------------------------- #
# Sub Owner List
# 飼い主ランキング
# ------------------------- #
sub ownerlist {
    &header;
    &title;
    $bestlove = $lovenum = $hatenum = $othernum = 0;
    &openinuserdata('ownerlist');

    &bodytop('飼い主ランキング');
    &tabletop;

    print "$font2$petnameが一番なついている人は</font><br>";
    if ($bestlove < $loved) { print "いません<br>\n";}
#   else { print "$bestownerさんです<br>\n"; }
    else {
        if ($ownername eq $bestowner) {
            print "<FONT color=white><B>$bestowner</B></FONT>さんです<br>\n";
        }
        else {
            print "$bestownerさんです<br>\n";
        }
    }
    print "<br>\n";

    print "$font2$petnameがなついている人は</font><br>";
    if ($lovenum == 0) { print "いません<br>"; }
#   else { foreach $owner (@lovelist)  { print "$ownerさん<br>\n"; } }
    else {
        foreach $owner (@lovelist) {
            ($love,$name) = split(/<>/,$owner);
#           print "$nameさん($loveポイント)<br>\n";
            if ($name eq $ownername) {
                print "<FONT color=white><B>$name</B></FONT>さん($loveポイント)<br>\n";
            }
            else {
                print "$nameさん($loveポイント)<br>\n";
            }
        }
    }
    print "<br>\n";

    print "$font2$petnameが嫌いな人は</font><br>";
    if ($hatenum == 0) { print "いません<br>";}
#   else { foreach $owner (@hatelist)  { print "$ownerさん<br>\n"; } }
    else {
        foreach $owner (@hatelist) {
            ($love,$name) = split(/<>/,$owner);
#           print "$nameさん($loveポイント)<br>\n";
            if ($name eq $ownername) {
                print "<FONT color=white><B>$name</B></FONT>さん($loveポイント)<br>\n";
            }
            else {
                print "$nameさん($loveポイント)<br>\n";
            }
        }
    }
    print "<br>\n";
    
    print "$font2それ以外の人</font><br>";
    if ($othernum == 0) { print "いません<br>"; }
#   else { foreach $owner (@otherlist) { print "$ownerさん<br>\n"; } }
    else {
        foreach $owner (@otherlist) {
            ($love,$name) = split(/<>/,$owner);
#           print "$nameさん($loveポイント)<br>\n";
            if ($name eq $ownername) {
                print "<FONT color=white><B>$name</B></FONT>さん($loveポイント)<br>\n";
            }
            else {
                print "$nameさん($loveポイント)<br>\n";
            }
        }
    }

    &tablebottom;
    &bodybottom;
    &footer;
}

ランキング表示に表示しようとしている名前と、保存しておいたプレイヤーの名前が、
同じかどうか判断し、同じなら文字を修飾しています。
ラブポイントを表示させたくない方は、($loveポイント)を消してください。
これで完了でございます、お疲れ様でした〜。





●ランキング表示に個人別を追加している方用

最初にそれぞれソートを行った各ランクのリストを結合して、
1つのソートされた順位リストを作ります。
そこから、ユーザーのお名前が上から何番目に出てくるかを調べます。
これが、順位になります。

まず、●ランキング表示に個人別を追加していない方用の【1】と同じように、
オレンジの部分をユーザーデータの読み込み(sub openinuserdata)の下の方に追加します。

追加しましたか?

では次に、個人別で追加した飼い主個人情報(sub ownerdisp)に下記のように追記します。

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

    &bodytop('飼い主個人情報');
    &tabletop;

    if ($bestowner eq $ownername) {
        $ownerrank = '一番なついている人';
    }

    print "$ownernameさん<br>";
    print "$ownerrank<br>";
    print "$ownerloveポイント<br>";

    $allnum = $lovenum + $hatenum + $othernum;
    print "あなたの順位は$allnum人中 第$ownercnt位です。<br>";

    &tablebottom;
    &bodybottom;
    &footer;
}

これで、ランキングの個人別表示に順位が表示されるようになります。

ついでに、普通のランキング表示にも順位を表示したい方は、
●ランキング表示に個人別を追加していない方用の【2】と同じように、
オレンジの部分を飼い主ランキング(sub ownerlist)に追加します。

プレイヤーの明示を行わない方は、これで完了です、お疲れ様でした。

プレイヤーの明示ですが、個人別情報の改造の時に、すでに準備が出来ていますので、
あとは、●ランキング表示に個人別を追加していない方用の【4】を追加するだけです。