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

条件によってコマンドを増減しよう

好感度が増えていったり、その他の条件が揃ったときなどに、
選択できるコマンドがだんだん増えていったら、プレイヤーのやる気も出て来ますよねっ。
そんなわけで、条件によってコマンドを増減する方法を説明いたします。

が、例によって効率がとても悪いです(爆)
まぁ、パッと見は分かりやすいので、こちらの方が具合がよいと言えばよいので。


ここでは、好感度によってコマンドを変化させてみます。
さっそく、ペットフォーム(sub petform)を見てみましょう。
コマンドと、OKボタンの表示の所ですが、
どんな感じかと言いますと、こんな感じです。

餌をあげる
なでる
外に出す
遊ぶ
しかる
飼い主ランキング

実際は枠線はないですが、こんな風になっています。
で、ここでいじりたいのは、コマンドの部分(上のブロック)だけですので、
条件で分岐させる部分は、上だけで良いことになります。

では、とりあえず好感度によって、分岐させてみましょう。

# ------------------------- #
# 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 < 0) {
            &input('radio','mode','feed',' checked','餌をあげる');
            print "</td>\n";
            print "<td>\n";
            &input('radio','mode','owner','','飼い主ランキング');
            print "</td>\n";
            print "</tr>\n";
        }
        elsif ($love < 5) {
            &input('radio','mode','feed',' checked','餌をあげる<br>');
            &input('radio','mode','pat','','なでる;');
            print "</td>\n";
            print "<td>\n";
            &input('radio','mode','hit','','しかる<br>');
            &input('radio','mode','owner','','飼い主ランキング');
            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;
}

ラブポイントが0未満ならコマンドは2つだけ、
0以上5未満なら、コマンドは4つだけ、
5以上なら、コマンドは6つ、表示されます。

飼い主ランキングの移動を施してある方は、
こんな風になると思います。

    if ($noaction == 0 && $enter != 1) {
        print "<tr>\n";
        print "<td>\n";
#       &tabletop;
        print "<table width=\"100%\" border=\"0\" cellspacing=\"$f_space\" cellpadding=\"0\">\n";
        print "<tr>\n";
        print "<td valign=top>\n";
        if ($love < 0) {
            &input('radio','mode','feed',' checked','餌をあげる;');
            print "</td>\n";
            print "<td valign=top>\n";
#           &input('radio','mode','owner','','飼い主ランキング');
            print "</td>\n";
            print "</tr>\n";
        }

このほかにも、1回きりのイベントの時などに、
コマンドを追加している方もいらっしゃると思いますが、
基本的に上から優先度の高い順に並べます。

その場合、最初のifif、最後のelseelseでよいのですが、
その間に入るifelsifに変更してください。

下記は一回きりのイベントと、ランキング表示の移動を追加した状態のものです。

# ------------------------- #
# 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;
        print "<table width=\"100%\" border=\"0\" cellspacing=\"$f_space\" cellpadding=\"0\">\n"; # ランク表示の移動
        print "<tr>\n";
        print "<td valign=top>\n";
        if ($love >= 50 && $event01 == 0 && $hungry == 0) {                   # 1回きりのイベント
            &input('radio','mode','event01_01',' checked','好感度アップ');
            print "</td>\n";
            print "<td valign=top>\n";
            &input('radio','mode','event01_02','','好感度ダウン');
            print "</td>\n";
            print "</tr>\n";
        }
        elsif ($love < 0) {
            &input('radio','mode','feed',' checked','餌をあげる;');
            print "</td>\n";
            print "<td valign=top>\n";
#           &input('radio','mode','owner','','飼い主ランキング');
            print "</td>\n";
            print "</tr>\n";
        }
        elsif ($love < 5) {
            &input('radio','mode','feed',' checked','餌をあげる<br>');
            &input('radio','mode','pat','','なでる;');
            print "</td>\n";
            print "<td valign=top>\n";
            &input('radio','mode','hit','','しかる<br>');
#           &input('radio','mode','owner','','飼い主ランキング');
            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 valign=top>\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;
}

あとはこれを参考に、優先度の高いものが上から並ぶようにし、
条件文を変更して、間のifelsifにします。

で、ここでちょっとややこしいのが、空腹時の処理です。
空腹時の処理よりも優先度が高い場合は問題ないですが、
追加しようとしているものが、空腹時より優先度が低いものでしたら、
条件文の中に、「&& $hungry == 0」を追加してください。
(1回きりのイベントの条件式にように)