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

2回続けてコマンドを選べるようにしよう

うわぁ、ついにこれやっちゃいますか?(爆)
実はですね、改造自体はそれほど大変でもないんです。
ただ、少々問題がありまして…(^^;

まず実現方法から説明しますと、

普通は、コマンドを選んでOKを押すと「アクション」が呼び出され、
その結果が表示されるわけですが、
この画面に、再びコマンドとOKボタンを用意し、
OKが押されたら、また「アクション」を呼び出すのです。

つまり、これを延々続ければ、2回連続などと言わず、
何回でも繋げていけるのですが…。



問題というのは、訪問間隔のことです。
2回連続で「アクション」を呼ぶ以上、
訪問間隔の制限か掛かったままでは、2回目以降が弾かれてしまうので、

「このコマンドの時は、訪問間隔のチェックをしない」

という処理を追加して回避します。
つまり、ちょっとCGIに詳しい人なら、容易にイタズラできてしまうのです(T_T)

通常の1回だけの「アクション」で、そういった不正アクセスを回避する方法は、
【遊ぼー。】20thAEで突っ込みましたので、
そちらをお待ちいただきたいのですが、
2回以上連続となりますと…、うーん(^^;

その辺りの事を了解した上で、お使い下さい。



では、さっそく、
「アクション」(sub action)内の、
新たにコマンドを設置したいイベントに、改造を加えます。

例えば、遊ぶの良い反応の画面に追加したいときは…、

    elsif ($FORM{'good'} =~ /$fa/) {
        &petnow($good_img{$fa},$good_msg{$fa});
        $love++;$good++;
        if ($fa eq "feed") { $lastfeed = time }
        if ($fa eq 'play') {
            print "<tr>\n";
            print "<td>\n";
            &tabletop;
            &input('radio','mode','renev01',' checked','連続イベント01<br>');
            &input('radio','mode','renev02','','連続イベント02<br>');
            print "</td>\n";
            print "<td>\n";
            &input('radio','mode','renev03','','連続イベント03<br>');
            &input('radio','mode','renev04','','連続イベント04<br>');
            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('submit','','OK!','','<br>');
            print "</div>\n";
            &tablebottom;
        }
    }

次に「アクション」の頭の方で、訪問間隔のチェックをしているところがあるので、
上で追加した「renev01」「renev02」「renev03」「renev04」の時は、
訪問間隔のエラーを表示しないようにします。

# ------------------------- #
# Sub Action
# アクション
# ------------------------- #
sub action {
    $playmsg = "$playtime時間" if $playtime != 0;
    $playmsg = "$playminute分" if $playtime == 0;

    &checkname;
#    &error("まだ$playmsg経過していません") if $enter == 1;
    if ($enter == 1 && $FORM{'mode'} ne 'renev01' &&
                       $FORM{'mode'} ne 'renev02' &&
                       $FORM{'mode'} ne 'renev03' &&
                       $FORM{'mode'} ne 'renev04') {
        &error("まだ$playmsg経過していません");
    }

    &header;
    &title;
    &bodytop("ペットデータ($num代目)");

あとは、そのコマンドに対する反応を「アクション」内に作ります。

    if ($fa eq 'play') { $lastplay = time }
    if ($fa eq 'out')  { $out = 1; $outdate = time }
    
    if ($fa eq 'renev01') {
        &petnow('gazou.jpg',"メッセージ");
        $love++;
    }
    elsif ($fa eq 'renev02') {
        &petnow('gazou.jpg',"メッセージ");
        $love--;
    }
    elsif ($fa eq 'renev03') {
        &petnow('gazou.jpg',"メッセージ");
        $love += 5;
    }
    elsif ($fa eq 'renev04') {
        &petnow('gazou.jpg',"メッセージ");
        $love -= 5;
    }
    elsif ($rnd <= $rnd_border) {
        &petnow($rnd_img,$rnd_msg);
        $love--;
    }
    elsif ($FORM{'good'} =~ /$fa/) {
        &petnow($good_img{$fa},$good_msg{$fa});
        $love++;$good++;

現状ですと、ブラウザで戻ってやり直すことが出来てしまいますが、
対策をちょっと考えてみます(^^;