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

コマンド(選択肢)を増やそう

そういえば、ことねっつの改造ページって、
こういった、基本的な改造方法って、掲載されてないですね(^^;;;
「時刻によって…」とか、余計な改造も付いてたりしてしまったので…。

というわけで、ここでは、ただ単純にコマンドを増やす改造を行います。
おいら的に出来るだけ細かく説明を入れながら進めていこうと思います。
なので、読むのがちょっと面倒かもしれませんが、
よろしくお付き合いのほど、お願い致しますm(_ _)m


では、実際にコマンドを増やす前に、
最初から用意されているコマンドが、どのようになっているのか、解説します。
コレが分かれば、追加の時もサックサクです(^-^) …多分。


うーんと、では、あまり特別なことをしていない「hit=しかる」を例にしてみます。

まず、プレイヤーの名前入力、新規ペット登録の時は、コマンドは関係ありません。
名前入力の後の、スケジュールに沿ったペットの状態で、まずは出てきます。
ペットフォーム(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;
        &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;
}

この23行目のような書式で、
チェックボタンと「しかる」という文字が表示され、
「しかる」を選択したときに「hit」という文字が、
スクリプトに受け渡されることになります。

そして33、34行目で、
そのスケジュールでの「良いコマンド」と「悪いコマンド」が受け渡されます。
設定のところで「feed_pat_hit」と、こんな感じで書かれていたところがありましたよね?
それが読みこまれ、スクリプトに受け渡されるのです。


ここで「しかる」を選択し、「OK!」を押すと、
modeに「hit」、goodに「良いコマンド群」、badに「悪いコマンド群」を持って、
スクリプトを実行し直します。

# ------------------------- #
# Main Program
# メイン処理
# ------------------------- #
&decode;
&openinpetdata;
&titlecheck;
if    ($FORM{'mode'} eq "end")       { &error("$endmsg") }
elsif ($FORM{'mode'} eq "newpet")    { &newpet           }
elsif ($FORM{'mode'} eq "nopet")     { &nopet            }
elsif ($FORM{'mode'} eq "owner")     { &ownerlist        }
elsif ($FORM{'mode'} eq "entername") { &petform          }
elsif ($FORM{'mode'} eq "back")      { &petform          }
elsif (!$FORM{'mode'})               { &entername        }
else                                 { &action           }
exit;

全ての処理はここで、modeに何が入っているかで分岐します。
先ほど、modeには「hit」が入りましたので、
条件を照らし合わせていくと…、一番最後の、
else { &action }
に当てはまることになり、アクション(sub action)が呼び出されます。

つまりコマンドは、この条件式の上の方と同じ文字列にしては、いけないということです。
どれにも当てはまらなければ、それはコマンドとして扱われ、アクションの処理が始まります。


では、mode「hit」で、アクションが呼び出されたとします。

# ------------------------- #
# 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(100) + 1); # Amend Ver 2.2
    $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--;
    }
    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;
}

最初の青いところで、$famodeの中身が渡されます。
つまり、今は$faは「hit」になっています。

2つ目の青いところで、good(良いコマンド群)の中に「hit」が入ってないか調べています。
入っていたら、ここ(↓)から、「hit」用の良い画像と良いメッセージを、表示します。

# ↓良いときの画像。左辺は変更しないでください。
%good_img = (
    'feed' , 'esa.gif',
    'pat'  , 'jare.gif',
    'play' , 'fun.gif',
    'hit'  , 'keikai.gif',
    'out'  , 'dash.gif',
);

# ↓良いときのメッセージ。
%good_msg = (
    'feed' , 'おいしそうに食べてます♪',
    'pat'  , 'お腹をみせて喜んでいます♪',
    'play' , 'とても楽しそうに遊んでいます♪',
    'hit'  , 'ちょっといじけてますが、大丈夫でしょう',
    'out'  , '喜んで外に飛び出していきました♪',
);

3つ目の青いところでは、goodと同じように、
今度はbad(悪いコマンド群)について、処理を行います。

最後、4つ目の青いところは、goodにもbadにも、
hit」が含まれていなかったときの処理です。


以上が、コマンドの主な動きです。



新たにコマンドを追加する場合は、簡単に説明すると、

1.コマンド名を決める(メイン処理の条件式に引っかからないモノ)
2.良い反応、悪い反応(feed_pat_hitと書いてあるところ)に新しいコマンドを追加する(必要があれば)
3.良い画像、悪い画像、どちらでもない画像、
  良いメッセージ、悪いメッセージ、どちらでもないメッセージにも、
  新しいコマンドの分を追加する。
4.ペットフォーム(sub petform)に、新しいコマンドを追加する。

では、実際に1つ、コマンドを追加してみましょう。
例として、「戦う」=「fight」(爆)を追加しますね。

まずは、設定の所から。

# その時間帯にペットが一番やってほしいこと(もしくは効果があること)。
# play = 遊ぶ,pat = なでる,feed = 餌をやる,hit = しかる,out = 外に出す。fight = 戦う。
# ない場合は点の間を空白。
# 複数ある場合は'play_pat',のように間を_で繋ぐ。
# 追加場所は適当です、各自のスケジュールに合わせてくださいね。
@scheduledsr = (
                'pat',
                'play',
                'pat',
                'pat',
                'pat',
                'pat',
                'out_fight',
                'out',
                'out',
                '',
                'pat',
                'hit',
                '',
                'pat',
                'play',
                'fight_hit',
                'out',
                'out',
                'out',
                'fight',
                'pat',
                'hit',
                'play',
                '',
);

# 更に続きます。
# その時間帯に来客者がやっては行けないことです。
# ただし、やってほしい事とやってはいけないことを重複させないようにしてください。
@schedulednt = (
                'hit_out_feed',
                'hit_pat_out_feed',
                'hit_out_feed',
                'hit_out_feed',
                'hit_out_fight',
                'hit',
                'hit',
                'hit',
                'hit',
                'hit_pat_play_out',
                'hit_out',
                'pat_fight_play',
                'hit',
                'hit_out_feed',
                'hit',
                'fight_pat_play',
                'hit',
                '',
                'fight',
                'hit_out_pat',
                'hit_out',
                'pat_play',
                'hit',
                'hit',
);

# もうすぐ終わりです。
# アクションを起こした後のそれぞれの反応を設定します。
# 新しいコマンドの分は、必ず追加してください。

# ↓良いときの画像。左辺は変更しないでください。
%good_img = (
    'feed' , 'esa.gif',
    'pat'  , 'jare.gif',
    'play' , 'fun.gif',
    'hit'  , 'keikai.gif',
    'out'  , 'dash.gif',
    'fight', 'fight.gif',
);
# ↓悪い時の画像。
%bad_img = (
    'feed' , 'tukare.gif',
    'pat'  , 'bite.gif',
    'play' , 'tukare.gif',
    'hit'  , 'dash.gif',
    'out'  , 'soppo.gif',
    'fight', 'fight.gif',
);
# ↓どっちでもないときの画像。
%else_img = (
    'feed' , 'soppo.gif',
    'pat'  , 'soppo.gif',
    'play' , 'boo.gif',
    'hit'  , 'bite.gif',
    'out'  , 'soppo.gif',
    'fight', 'fight.gif',
);
# ↓良いときのメッセージ。
%good_msg = (
    'feed' , 'おいしそうに食べてます♪',
    'pat'  , 'お腹をみせて喜んでいます♪',
    'play' , 'とても楽しそうに遊んでいます♪',
    'hit'  , 'ちょっといじけてますが、大丈夫でしょう',
    'out'  , '喜んで外に飛び出していきました♪',
    'fight', 'やる気満々のようです',
);
# ↓悪いときのメッセージ。
%bad_msg = (
    'feed' , 'いくらなんでも与え過ぎですよ',
    'pat'  , '触れられるのを嫌がっています',
    'play' , 'とてもそんな気分じゃないようです',
    'hit'  , '脱兎のごとく逃げていきました',
    'out'  , '無理やり外に放り出しました',
    'fight', 'シカトされました',
);
# ↓どっちでもないときのメッセージ。
%else_msg = (
    'feed' , 'あんまり食べたくないみたいです',
    'pat'  , 'ダルそうにあっちに行ってしまいました',
    'play' , '全く興味なさそうです',
    'hit'  , 'ムカついて噛み付いてきました',
    'out'  , 'しぶしぶ外へ出て行きました',
    'fight', '迷っているようです',
);





次にペットフォーム(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;
        &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','fight','','戦う<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;
}

説明が長かった割に、改造は簡単でしたね(爆)