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

コマンド選択前後のキャラを一致させよう

タイトルを見ただけでは、ちょっと分かりづらい内容かもしれませんね。
何をしようとしているか、具体的に申しますと、
時間によって違うキャラを登場させ、コマンドもそのキャラ用に変えて、
結果の画像&メッセージもそのキャラに一致するようにする改造です。

では、まず、ペットの画像とメッセージを変更しましょう。
ペットの設定の、一日の予定を組みます、から、やってはいけないこと、まで、
設定し直します。
例として、ペットAとペットBを、1時間おきに登場させるとします。

# ↓一日の予定を組みます(餌を与えられてから24時間のスケジュール)
# 上から順に0〜1時間、1〜2時間となっています。
# その間に表示させたい画像を以下に指定します。
# ただし、画像は全て同じ大きさのものを使用してください。
# 変更する場合は→'画像ファイル名',でワンセットですので、
# 点を間違って削除したりしないよう注意してください。
# かならず24時間分指定してください。
# 24時間以上経つとペットはお腹を空かせ、後はずっと鳴いた画像が表示されます。
@scheduleimg = (
                'name.gif',      # ←ペットAの画像に変更する
                'tume.gif',      # ←ペットBの画像に変更する
                'neteru.gif',    # ←ペットAの画像に変更する
                'neteru.gif',    # ←ペットBの画像に変更する

# 中略 24時間分設定する。

);

# ↓上の画像のリストと対になっています。
# 画像が表示される時の説明文です。
# かならず24個用意してください。
@schedulemsg = (
                '自分の体をなめています',      # ←ペットAのメッセージに変更する
                '爪をといでいます',            # ←ペットBのメッセージに変更する
                '寝ているようです',            # ←ペットAのメッセージに変更する
                'いびきをかいて寝ています',    # ←ペットBのメッセージに変更する

# 中略 24時間分設定する。

);

# ↓更に上と対になっています。
# その時間帯にペットが一番やってほしいこと(もしくは効果があること)。
# play = 遊ぶ,pat = なでる,feed = 餌をやる,hit = しかる,out = 外に出す。
# ない場合は点の間を空白。
# 複数ある場合は'play_pat',のように間を_で繋ぐ。
@scheduledsr = (
                'pat',    # ←ペットAのやって欲しいことに変更する
                'play',   # ←ペットBのやって欲しいことに変更する
                'pat',    # ←ペットAのやって欲しいことに変更する
                'pat',    # ←ペットBのやって欲しいことに変更する

# 中略 24時間分設定する。

);

# 更に続きます。
# その時間帯に来客者がやっては行けないことです。
# ただし、やってほしい事とやってはいけないことを重複させないようにしてください。
@schedulednt = (
                'hit_out_feed',        # ←ペットAのやってはいけないことに変更する
                'hit_pat_out_feed',    # ←ペットBのやってはいけないことに変更する
                'hit_out_feed',        # ←ペットAのやってはいけないことに変更する
                'hit_out_feed',        # ←ペットBのやってはいけないことに変更する

# 中略 24時間分設定する。

);

例では、1時間おきなので分かりやすいですが、そうでない人は、
何時間後がどのキャラなのか、紙などに書き出しておいた方が楽ですよ。

では次に、ペットAとペットB、それぞれのコマンドを選んだ後の反応を設定します。
元々用意されている方をペットAで使用し、新たに作った方をペットB用とします。
ペットの設定の、それぞれの反応を下記のように変更しましょう。

# もうすぐ終わりです。
# アクションを起こした後のそれぞれの反応を設定します。

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

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

ペットB用の配列の名前の最後には2が付いていますので、ご注意下さい。
あと、キャラ用に分けておいた方がよいと思われる箇所は、下記の所です。

# ↓ペットは時に予想もつかない行動を取ります。# ペットA用
$rnd_border    = 1;  # 何割かの確率で違う(マイナス)アクションを起こさせます。(0.1〜3)
$rnd_img       = 'keikai.gif'; # その時の画像
$rnd_msg       = '今日はいつもと違って様子が変です'; # その時のメッセージ
# ↓ペットは時に予想もつかない行動を取ります。# ペットB用
$rnd_img2       = 'keikai.gif'; # その時の画像
$rnd_msg2       = '今日はいつもと違って様子が変です'; # その時のメッセージ



### その他の画像 ###ペットA用
$dead_img    = 'dead.gif';   # 死んだ画像
$cry_img     = 'naku.gif';   # 鳴いてる画像
$tired_img   = 'tukare.gif'; # 餓死寸前(死亡一日前)
$gone_img    = 'gone.gif';   # 外出中の画像
$angry_img   = 'ikaku.gif';  # 威嚇している画像
$caution_img = 'keikai.gif'; # 警戒している画像

### その他の画像 ###ペットB用
#$dead_img2    = 'dead.gif';   # 死んだ画像            # 未使用
#$cry_img2     = 'naku.gif';   # 鳴いてる画像          # 未使用
#$tired_img2   = 'tukare.gif'; # 餓死寸前(死亡一日前)# 未使用
#$gone_img2    = 'gone.gif';   # 外出中の画像          # 未使用
$angry_img2   = 'ikaku.gif';  # 威嚇している画像
$caution_img2 = 'keikai.gif'; # 警戒している画像

### その他のメッセージ ###ペットA用
$out_msg     = '外出中のようです';             # 外出中
$hungry_msg  = 'うるさく鳴いています';         # 空腹時
$tired_msg   = 'なんだかぐったりしていますよ'; # 餓死寸前(死亡一日前)
$enemy_msg   = 'はあなたを敵とみなしています'; # 敵視
$caution_msg = 'はあなたを警戒しています';     # 警戒時

### その他のメッセージ ###ペットB用
#$out_msg2     = '外出中のようです';             # 外出中                # 未使用
#$hungry_msg2  = 'うるさく鳴いています';         # 空腹時                # 未使用
#$tired_msg2   = 'なんだかぐったりしていますよ'; # 餓死寸前(死亡一日前)# 未使用
$enemy_msg2   = 'はあなたを敵とみなしています'; # 敵視
$caution_msg2 = 'はあなたを警戒しています';     # 警戒時

### スペシャル画像&メッセージ ###ペットA用
# スペシャル画像1
$delight_img = 'love.gif';   # (サンプル)来訪者を喜んでいる画像
$delight_msg = 'あなたが来たことをすごく喜んでいます';   # その時のメッセージ
# スペシャル画像2
$friend_img  = 'friend.gif'; # (サンプル)友達と遊んでいる画像
$friend_msg  = '今日はお友達のピヨちゃんと遊んでいます'; # その時のメッセージ

### スペシャル画像&メッセージ ###ペットB用
# スペシャル画像1
$delight_img2 = 'love.gif';   # (サンプル)来訪者を喜んでいる画像
$delight_msg2 = 'あなたが来たことをすごく喜んでいます';   # その時のメッセージ
# スペシャル画像2
$friend_img2  = 'friend.gif'; # (サンプル)友達と遊んでいる画像
$friend_msg2  = '今日はお友達のピヨちゃんと遊んでいます'; # その時のメッセージ

こちらも、変数の最後に2が付いていますので、お間違えなく。

あとは、ペットA用とペットB用に分けたこれらのデータを、
時間によって分岐させてやればOKです。
その、分岐させるための時間のデータが入っている変数は、$timeafterなんですが、
これはペットのコンディション(sub condition)の中だけで設定しています。
ですが、アクションでもこの変数を参照したいので、場所を移動します。
ペットのコンディションの方はコメントにして、
ペットデータ(sub petdata)にコピーしましょう。

    # お腹が空いている時の処理
    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 ($bad - $good - $love > 5) {
        &petnow($angry_img,"$petname$enemy_msg");
        $swfurl = $img . 'catvoicerage.swf';
        if ($voice == 1) { &flash($swfurl); }
        return;
    }
    # スペシャル画像1
    if ($love > $special1) {
        if ($timeafter == $specialtime1a || $timeafter == $specialtime1b) {
            &petnow($delight_img,$delight_msg);
            return;
        }
    }

# ------------------------- #
# Sub Pet Data
# ペットデータ
# ------------------------- #
sub petdata {
    # 何日以上か面会がない場合、ペットの機嫌が下がる
    if (&checkday($lastvisit) >= $novisit) { $good--; }
    # 何日間食べていないか。
    $hungry = &checkday($lastfeed);
    
    # ゲストが何日ぶりの来訪かをチェックし、ラブ数を減らす
#    $love-- if $love - &checkday($gdate) > 1;
    $love = $love - &checkday($gdate);

    $agetotalday = &checkday($birth);
    &gettime($lastfeed);

    # 食後の経過時間を$timeafterに代入    # 挿入場所はどこでも構いません
    $timeafter = int((time - $lastfeed)/3600);

    &tabletop;
    print "名前:$font2$petname</font></td>\n";
    print "<td>性別:$font2$sex</font></td>\n";
    print "</tr>\n";

    print "<tr>\n";
    print "<td>名付け親:$font2$godfather</font></td>\n";
    print "<td>年齢:$font2生後$agetotalday日</font></td>\n";
    print "</tr>\n";

    print "<tr>\n";
    print "<td colspan=2>最後に餌を食べた日:$font2$date</font>\n";
    &tablebottom;
}

この$timeafterには、食後何時間経過したか、数字が入るんですが、
0時間〜1時間なら「0」、1時間〜2時間なら「1」、23時間〜24時間なら「23」という具合になりますので、
覚えておいて下さい。

ではでは、怒濤の条件分岐追加、行きますよん!
まずは、ペットのコンディション(sub condition)と、ペットフォーム(sub petform)から。

# ------------------------- #
# Sub Condition
# ペットのコンディション
# ------------------------- #
sub condition {
    print "</td>\n";
    print "</tr>\n";
    # 一定期間餌をあげないと死んでしまう。
    if (time >= $lastfeed + $daysec * $deadline) {
        $noaction = 1;
        $deadover = &checkday($lastfeed);

        print "<tr>\n";
        print "<td>\n";
        &tabletop;
        &petnow($dead_img,"$petnameは死にました。<br>死後$deadover日経っています。");

        print "<tr>";
        print "<td align=\"right\">\n";
        &input('hidden','mode','nopet','','');
        &input('hidden','name',$FORM{'name'},'','');
        &input('hidden','pass',$FORM{'pass'},'','');
        print "新しいペットを飼う\n";
        &input('submit','','OK','','');
        &tablebottom;
        print "</td>\n";
        print "</tr>\n";
        return;
    }  

    # 外出中の処理
    if ($out == 1 && (time - $outdate) < $dayhour[$comeback]) { 
        &petnow($gone_img,$out_msg);
        $noaction = 1;
        return;
    } else {$out = 0;}

    # お腹が空いている時の処理
    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 ($bad - $good - $love > 5) {
        if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &petnow($angry_img2,"$petname$enemy_msg2");
        }
        else {
        &petnow($angry_img,"$petname$enemy_msg");
        }
        $swfurl = $img . 'catvoicerage.swf';
        if ($voice == 1) { &flash($swfurl); }
        return;
    }
    # スペシャル画像1
    if ($love > $special1) {
        if ($timeafter == $specialtime1a || $timeafter == $specialtime1b) {
            if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
                $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
                $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
                $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

                &petnow($delight_img2,$delight_msg2);
            }
            else {
            &petnow($delight_img,$delight_msg);
            }
            return;
        }
    }
    # スペシャル画像2
    if ($love > $special2) {
        if ($timeafter == $specialtime2a || $timeafter == $specialtime2b) {
            if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
                $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
                $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
                $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

                &petnow($friend_img2,$friend_msg2);
            }
            else {
            &petnow($friend_img,$friend_msg);
            }
            return;
        }
    }

    # ラブポイントが一定以上でノーマル画像
    if ( $love >= $bad - $good ) {
        &petnow($scheduleimg[$timeafter],$schedulemsg[$timeafter]);
        return;
    }

    # どれにも当てはまらない場合、警戒画像を表示
    if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
        $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
        $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
        $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

        &petnow($caution_img2,"$petname$caution_msg2");
    }
    else {
    &petnow($caution_img,"$petname$caution_msg");
    }
}

# ------------------------- #
# 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 ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||    # ←上にif文分があるときは、elsifにする
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &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";
        }
        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;
}

何をやっているかといいますと、ペットBの時間の時には、ペットB用のデータを呼び出しているんです。
例では1時間おきですので、「1、3、5、・・・、23」ですが、
ここは、最初に設定したペットBを出す時間によって変えて下さい。

コマンドを新規に作りたい場合は、1回きりのイベントを作ろうの、
2つ目の四角以降を参考にして下さい。

では、次にアクション(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) {
        if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &petnow($rnd_img2,$rnd_msg2);
        }
        else {
        &petnow($rnd_img,$rnd_msg);
        }
        $love--;
    }
    elsif ($FORM{'good'} =~ /$fa/) {
        if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &petnow($good_img2{$fa},$good_msg2{$fa});
        }
        else {
        &petnow($good_img{$fa},$good_msg{$fa});
        }
        $love++;$good++;
        if ($fa eq "feed") { $lastfeed = time; }
    }
    elsif ($FORM{'bad'} =~ /$fa/) {
        if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &petnow($bad_img2{$fa},$bad_msg2{$fa});
        }
        else {
        &petnow($bad_img{$fa},$bad_msg{$fa});
        }
        $love--;$bad++;
    }
    else {
        if ($timeafter ==  1 || $timeafter ==  3 || $timeafter ==  5 ||
            $timeafter ==  7 || $timeafter ==  9 || $timeafter == 11 ||
            $timeafter == 13 || $timeafter == 15 || $timeafter == 17 ||
            $timeafter == 19 || $timeafter == 21 || $timeafter == 23) {

            &petnow($else_img2{$fa},$else_msg2{$fa});
        }
        else {
        &petnow($else_img{$fa},$else_msg{$fa});
        }
    }

    &openoutpetdata;

    $goodbye = time - (60 * 60 * 24 * $goodbye);
    $newlove = $love;
    &openinuserdata('action');
    &openoutuserdata;
    $actionflag = 1; # 飼い主ランキングのリンクを表示
    &bodybottom;
    &footer;
}

これで、コマンド選択前後のキャラが一致するはずです。
ちなみに、死亡、空腹時は、ペットA固定となります。