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

Ver2.1 → Ver2.3

Ver2.1からVer2.3のバージョンアップで、

ファイルロックの強化、
セキュリティの強化、
ペットの名前・性別の固定の有無、

が追加されました。
また、細かな不具合修正も行われています。


このページでは、現在お使いのVer2.1を、Ver2.3と同程度に改造します。
その際、すでに改造ページの改造を施している方は、省略できる部分があります。

ではさっそく、プログラムの上の方から、
説明を交えながら、バージョンアップしてみましょう。
枠の下に説明がありますので、それを読んでから改造してください。

それと、まだVer2.3自体不安定のようですので、バックアップを必ず取って下さい。
スクリプトと、ユーザーデータと、ペットデータ、全部です。
「消えちゃった」「動かなくなっちゃった」といわれても、困りますので(^^;
よろしくお願い致します。

# ########################設定はここから############################

# このCGIの名前
$cgiurl = './pet.cgi';

# jcodeパールのパス
require './jcode.pl';

# データファイル名
$userdata = './user.dat';               # 来客者情報が入ってるデータ
$petdata  = './pet.dat';                # ペットの情報が入ってるデータ
#$lockkey  = 1;                          # ファイルのロック(0=使用しない 1=使用する)
#$lockfile = './pet.lock';               # ロックファイル名
$lockkey  = 1;                          # ファイルのロック(0=no 1=mkdir 2=symlink) Amend Ver 2.2
$lockfile = './petlock';                # ロックファイル名
$method   = 'POST';                     # POSTかGETを選択

# イメージ画像が入ってるフォルダの相対パス
# CGIと同じ場所にフォルダを置く場合は'./フォルダ名/'; 上の階層は'../フォルダ名/';
# swfファイルと角画像もこのフォルダの中に格納します
$img = '';

ファイルロックの方法が変わり、選べるようになりました。
が、おいらよく知りません、この辺り(^^;
たしか、symlinkは、使えるサーバと使えないサーバがあったような気がしますので、
symlinkがダメなときは、mkdirにしておきましょう。






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

ランダムイベントの発生確率が%で設定できるようになりました。
ここでは、5%としています。
詳細は後ほど、乱数の発生の所で。
改造は、それを読んでからの方がいいかもしれません。






# 終了時に画像を表示する(yes = 1,no = 0)
$ending      = 1;
# 終了画像
$endimg      = 'neteru.gif';
# 終了時のメッセージ
$endmsg      = 'お疲れ様でした';

# Ver2.2 追加分
$namefixed   = ''; # ペットの名前を固定する(yes=名前を入力)
$sexfixed    = ''; # ペットの性別を固定する(yes='オス'か'メス'を入力)

# ########################設定はここまで############################
# ここから先を変更する場合はご自分の責任において変更してください。

ペットの名前・性別固定用の設定です。
改造ページの「ペットの名前を固定しよう」の改造を行っている方は、
必要ありませんので、飛ばしちゃってください。






# ------------------------- #
# Sub Title Check
# タイトルチェック
# ------------------------- #
sub titlecheck {
    if  ($FORM{'mode'} eq "nopet") { $title = "$nopet" } # Add Ver 2.2
    elsif ($FORM{'petname'} ne "") { $title = "$FORM{'petname'}$titlesub" } # Amend Ver 2.2
    elsif ($petname ne "")         { $title = "$petname$titlesub"         }
    else                           { $title = "$nopet"                    }
}

ペットがいない部屋にも関わらず、「空き部屋」と出ないことがあった不具合を修正します。
やらなくても特に問題はありませんので、飛ばしちゃってもいいです(^^;






    # 新規ユーザーを登録
    if ($flag == 0) {
        $gdate = time - $dayhour[$playtime + 1];
        @new = @lines;
        push(@new,"$FORM{'name'}<>$FORM{'pass'}<>$gdate<>0<>\n");
        &openoutuserdata;
        $love = 0; # Add Ver 2.2
    }

R.C.T-e推奨変更点の改造を行っている方は、必要ありません。
新規登録したときに、直前の人のラブポイントを参照してしまう不具合の修正です。






    # ゲストが何日ぶりの来訪かをチェックし、ラブ数を減らす
#   $love-- if &checkday($gdate) > 1; # 簡単モード
    $love = $love - &checkday($gdate);

簡単モードと書いてある行、
Ver2.1では、$love -という文字が入っていましたが、
今回なくなっています。
R.C.T-e推奨変更点の改造を行っている方は、必要ありません。






    &bar('','新しいペットの情報を登録してください');

    print "<tr>\n";
    print "<td>\n";
    &tabletop;
    print "名前:";
#    &input('text','petname','',' maxlength="10"','');
    # Amend Ver 2.2 #
    if ($namefixed) { print "$namefixed\n"; &input('hidden','petname',$namefixed,'','') }
    else { &input('text','petname','',' maxlength="10"','') }
    # End Amend #
    print "</td>\n";
    print "</tr>\n";

    print "<tr>\n";
    print "<td>\n";
    print "性別:";
#    &input('radio','sex','0',' checked','オス');
#    &input('radio','sex','1','','メス');
    # Amend Ver 2.2 #
    if ($sexfixed) { print "$sexfixed" }
    else {
        &input('radio','sex','0',' checked','オス');
        &input('radio','sex','1','','メス');
    }
    # End Amend #
    print "</td>\n";
    print "</tr>\n";

ペットの名前・性別固定用の追加です。
改造ページの「ペットの名前を固定しよう」の改造を行っている方は、
必要ありませんので、飛ばしちゃってください。






# ------------------------- #
# Sub New Pet
# 新規ペット登場
# ------------------------- #
sub newpet {
    $deadname = $petname;
    $petname = $FORM{'petname'};
    &error("不正があります") if time < $lastfeed + $daysec * $deadline; # Add Ver 2.2
    if ($namefixed) { $petname = $namefixed; $deadname = '' } # Add Ver 2.2
    if ($petname eq "") { &error("ペットに名前をつけてください") }
    if ($petname eq $deadname && $samename == 0) { &error("前と同じ名前はつけられません") }
    if ( $FORM{'sex'} == 1 ) { $sex = 'メス' } else { $sex = 'オス' }
    $sex = $sexfixed if $sexfixed; # Add Ver 2.2
    $godfather = $FORM{'name'};
    $birth     = time;
    $dead      = 0;
    $lastfeed  = time;
    $lastplay  = time;
    $good      = 0;
    $bad       = 0;
    $out       = 0;
    $outdate   = 0;
    $num++;
    &openoutpetdata;
    $gdate = time - $dayhour[$playtime + 1];
    @new = "$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$loved<>\n";
    &openoutuserdata;
    &petform;
}

1つ目のオレンジは、セキュリティの強化です。
不正なアクセス方法を拒否します・・・こんな事をわざわざやる人がいるんですねぇ・・・。
2つ目、3つ目のオレンジは、ペットの名前・性別固定用の追加です。
改造ページの「ペットの名前を固定しよう」の改造を行っている方は、
必要ありませんので、飛ばしちゃってください。






# ------------------------- #
# 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);
    $rnd = int(rand(100) + 1); # Amend Ver 2.2
    $fa = $FORM{'mode'};

上の方で少し触れましたが、ここがランダムイベントの乱数を発生させているところです。
発生する乱数が1〜100になりました。
問題となるのは、何らかの改造を施し$rndを条件文に使っている方です。
今までは1〜10だったのですが、これが1〜100になってしまいますので、
プログラムの変更が必要になる場合があります。

特に、$rnd == ○という条件式を使っていた方は、
そのままですと、10分の1ではなく、100分の1の確率になりますので、
$rnd >= 1 && $rnd <= 10などと、幅を持たせるようにして下さい。

「別に確率は今のままでいいや」と言う方は、飛ばしちゃってください。






# ------------------------- #
# Sub Error
# エラー
# ------------------------- #
sub error {
#    &unlock;
    $_[1] || &unlock; # Amend Ver 2.2
    if ($headflag == 0) { &header }
    print "<center><hr width='80%'><P>\n";
    if ($FORM{'mode'} eq 'end' && $ending == 1) {
        print "<center>\n";
#        print "<img src=\"$img$endimg\">\n";
#        print "</center>\n";
        print "<img src=\"$img$endimg\"><br><br>\n"; # Amend Ver2.2
        print "<a href=$backurl target=\"$backtarget\">$backword</a></center>\n"; # Amend Ver2.2
    }
    print "<P>$font2<B>$_[0]</B></font>\n";
    print "<P><hr width='80%'></center>\n";
    &footer;
    exit;
}

1つ目は、おいらの知識では解析不能です(爆)
多分なんですが、場合によってファイルをロックしないようにしているんだと思うんですが・・・。
とりあえず、改造は施してください、ロック強化には必須です。
2つ目の所は、終了画面の時に、戻り先を表示するようにしたんですね。
そういえば、今までありませんでしたね(^^;
ここは、両方とも改造しておきましょう。






# ------------------------- #
# Sub Lock
# ロック
# Amend for Ver 2.2
# ------------------------- #
sub lock {
#    local($flag) = 0;
#    foreach (1 .. 5) {
#        if (-e $lockfile) { sleep(1); }
#        else {
#            open(LOCK,">$lockfile");
#            close(LOCK);
#            $flag = 1;
#            last;
#        }
#    }
#    if ($flag == 0) { &error("現在、他の人が使用しています"); }
    return if !$lockkey;
    if ($lockkey == 1) {
        local($flag) = 10;
        rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);
        while (!mkdir($lockfile, 606)) {
            --$flag or &error("現在、他の人が使用しています", 1);
            select(undef, undef, undef, 1);
        }
    }
    elsif ($lockkey == 2) {
        unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
        while (!symlink(".", $lockfile)) {
            if (--$retry <= 0) { &error('現在、他の人が使用しています') }
            sleep(1);
        }
    }
}

# ------------------------- #
# Sub Unlock
# アンロック
# Amend for Ver 2.2
# ------------------------- #
sub unlock {
#    if (-e $lockfile) { unlink($lockfile); }
    if    ($lockkey == 1) { rmdir($lockfile)  }
    elsif ($lockkey == 2) { unlink($lockfile) }
}

今回の目玉ですねー。ファイルロックの強化です。
中身をそっくり入れ替えてください。
詳しいことはおいらにもよく分かりません、すみません。
何にせよ、前より具合はいいはずです。






と、ここまでで、Ver2.1は、Ver2.3と同程度、というか同じになります。