Script of Saga III b2.0 修正点

戻る

主な修正内容



ファイルロックの修正
sos3.cgi: sub action
追加
    &{$md};
    &unlock('unlock');
master.cgi
追加
&unlock('unlock');
exit;
library/base.cgi: sub get_user
アレンジ
追加
    &lock($id) if $F ne 'unlocked';

    ($L) = &open_dat("$dir/$id.cgi");
library/base.cgi: sub set_user
追加
    &write_dat("$V/$S->{id}.cgi",join('<>',@L));

    &unlock($S->{id});
library/base.cgi: sub lock
修正前
    $I->{lock} = $V;
修正後
    $lock::table{$V} = 1;
library/base.cgi: sub unlock
差し替え
sub unlock {
my  $V = shift;
my  @L;

    return if !$V;

    @L = $V eq 'unlock' ? keys %lock::table : ($V);

    foreach (@L) {
        $V = "$set::loc_dir/$_";
        if    ($set::lky == 1) { rmdir($V)  }
        elsif ($set::lky == 2) { unlink($V) }
        delete $lock::table{$_};
    }
}
library/base.cgi: sub error
修正前
    &unlock($I->{lock});
修正後
    &unlock('unlock');
library/base.cgi: sub say
修正前
    $V ||= $I->{lock};
修正後
    $V ||= 'unlock';
library/bounty.cgi: sub bounty_after
削除
    &lock($F{ud});

削除
    &unlock($F{ud});
library/buy.cgi: sub buy_after
削除
    &lock($F{ud});

削除
    &unlock($F{ud});
library/cure.cgi: sub cure_after
削除
    &lock($F{ud});

削除
    &unlock($F{ud});
library/destone.cgi: sub destone
削除
    &lock($F{ud});

削除
    &unlock($F{ud});
library/fight.cgi: sub fight_player
削除
    &lock($F{ud});

削除
    &unlock($F{ud});

修正前
    &set_user($I);
    &set_user($U);
    &set_pet($I) if $I->{Co};
    &set_pet($U) if $U->{Co};
修正後
    &set_pet($I) if $I->{Co};
    &set_pet($U) if $U->{Co};
    &set_user($I);
    &set_user($U);
library/mail.cgi: sub mail_after
削除
    &lock($U->{id});

削除
    &unlock($U->{id});
library/main.cgi: sub main
削除
    &lock($F{id});

削除
    &unlock($F{id});
library/main.cgi: sub departure_monitor
削除
        &lock($D->[0]);

削除
            &lock($_);

削除
            &unlock($_);

削除
        &unlock($D->[0]);
library/message.cgi: sub message_after
アレンジ
修正前
    $U = &get_user('U');
修正後
    $U = &get_user('U',,'unlocked');
library/new.cgi: sub new_after
追加
    &lock($F{id});

    &regist_check;
library/partner.cgi: sub partner
修正前
    &unlock($I->{lock});
修正後
    &unlock('unlock');
library/trade.cgi: sub trade_after
削除
    &lock($F{id});

削除
    &unlock($U->{id});

library/bag.cgi: sub bag
荷物スロットに現在の所持数を表示。
「全てをパックにする」をできるようにする。
追加
        <tt>荷物スロット:$I->{Bs}/$I->{bs}</tt>

追加
    <option value="pack">パックにする</option>
    <option value="pack_all">全てをパックにする</option>
library/bank.cgi: sub bank_before
銀行でも「パックにする、パックを分ける、捨てる」をできるようにする。
銀行でも「全てをパックにする」をできるようにする。
荷物スロットと銀行スロットに現在の所持数/保管数を表示。
修正前
        $t2 .= qq|<input type=checkbox name=i$i class=checkbox> |;
修正後
        $t2 .= qq|<input type=checkbox name=$i class=checkbox> |;

修正前
    &header(CSS=>'sub');
修正後
    &header(CSS=>'sub',JavaScript=>'GetView');

修正前
    <tt>$I->{Sp}{Bk}{nm}スロット:$I->{bk} $set::wgt</tt><br>
修正後
    <tt>$I->{Sp}{Bk}{nm}スロット:$I->{Bk}/$I->{bk}</tt><br>

追加
    <tt>荷物スロット:$I->{Bs}/$I->{bs}</tt>

修正前
    <br>
    <div class=r>$set::but{OK} $set::but{CLOSE}</div>
修正後
    <div class=r>
    <select id=mode name=md class=select onChange="DisableObject('input','o','mode','bank_after','normal');">
    <option value="bank_after">銀行を利用する</option>
    <option value="pack">パックにする</option>
    <option value="pack_all">全てをパックにする</option>
    <option value="unpack_before">パックを分ける</option>
    <option value="dump">捨てる</option>
    </select>
    $set::but{OK}<br>
    <br>
    $set::but{CLOSE}
    </div>

修正前
    <input type=hidden name=md value="bank_after">
    <input type=hidden name=xx value="$I->{XX}">
修正後
    <input type=hidden name=xx value="$I->{XX}">
    <input type=hidden name=fl value="bank_before">
library/bank.cgi: sub bank_after
銀行に物を預けた時に値段と予約者が解除されない不具合を修正。
銀行スロットがいっぱいの時に表示されるメッセージの不具合をを修正。
荷物スロットがいっぱいの時でも預けたアイテムが引き出せてしまう不具合を修正。
銀行でも「パックにする、パックを分ける、捨てる」をできるようにする。
追加
    $U->{id} = $I->{id};

    &get_place($I);

修正前
        next if !$F{"i$i"};
修正後
        next if !$F{$i};

追加
        $U->{Sl}++;
        $I->{bg} -= $Ii->{qn} * $Ii->{wt};
        $Ii->{sp} = $Ii->{rs} = '';

追加
    &say("$I->{Sp}{Bk}{nm}スロットがいっぱいです。",'bank_before') if $U->{Sl} > $I->{bk};
    &say("荷物スロットがいっぱいです。",'bank_before') if grep($_,@{$I->{Bg}}) > $I->{bs};
library/base.cgi: sub set_user
所謂丸め誤差問題に対応(一部アレンジ)。
追加
    $V = index($S->{id},'_') ? $set::Udt_dir
                             : $set::npc_dir;

    $S->{bg} = abs sprintf "%.2f",$S->{bg} if $S->{bg} =~ /\.\d\d\d/;
library/base.cgi: sub login_check
ログインチェックの引数の指定でエラーになる不具合を修正。
修正前
my  $T = shift; # value = 'noerror'
修正後
my  $T = shift; # true -> return true, false -> error

修正前
        if ($T eq 'noerror') { return 1 }
修正後
        if ($T) { return 1 }
library/base.cgi: sub condition_initial
状態異常によけいな「・」が表示される不具合を修正。
追加
        delete $S->{Cd}{in};
        while (($K,$V) = each %{$S->{Cd}}) {
library/base.cgi: sub get_item
荷物スロットと銀行スロットに現在のアイテム数を表示する為のデータを変数に代入する。
追加
    $S->{Bs} = @K if $T == 0;
    $S->{Bk} = @K if $T == 3;

    $S->{Bg} = [@K];
library/blackmarket.cgi: sub blackmarket_before
闇市で、商品がない場合のメッセージが表示されない不具合を修正。
修正前
    &say("めぼしい商品はないようです・・・",'market') if !$U->{Bg};
修正後
    &say("めぼしい商品はないようです・・・",'market') if !@{$U->{Bg}};
library/buy.cgi: sub buy_before
死亡しているペットが「死亡」と表示されていない不具合を修正。
追加
        next if !$Up->{sp};
        $Up->{hg} = 0 if &get_passage($Up->{bt},$set::pyt) > $Up->{ls};
library/castle.cgi: sub castle_after
CONが増加するクラスチェンジはクラスチェンジ料金が正しく支払われない不具合を修正(一部アレンジ)。
追加
my ($L,$V,$Y,$M);

修正前
            $V = $set::clf * $L->{cn};
            $I->{Mlf} += $V;
            &reload_gage('lf','V');
            &M("$set::lab{lf}の上限が$V増加しました。");
修正後
            $Y = $set::clf * $L->{cn};
            $I->{Mlf} += $Y;
            &reload_gage('lf','V');
            &M("$set::lab{lf}の上限が$Y増加しました。");
library/compose.cgi: sub compose
作成画面で「全てをパックにする」をできるようにする。
追加
    <option value="pack">パックにする</option>
    <option value="pack_all">全てをパックにする</option>

library/compose.cgi: sub compose_before
作成で作成用アイテムデータがないときのエラーメッセージを追加。
追加
    &error('未実装') if ! -e "$set::itm_dir/$K.cgi";
    require "$set::itm_dir/$K.cgi";
library/compose.cgi: sub compose_after
エクセレント品が全く作成されない不具合を修正。
修正前
       &excellent_roll($I,$Ui->{dt}) if $Ui->{db};
修正後
       &excellent_roll($I,$Ui->{dt}) if $Ui->{dt}{db};
library/dry.cgi: sub dried_food
同じ種類のものを一度に複数干物にしたときにパック数がすべて同じになる不具合を修正。
修正前
    $Si = $FI{$Si->{nm}};
修正後
    $Si = {%{$FI{$Si->{nm}}}};
library/experience.cgi: sub experience
レベルアップ直後の経験値が正しく表示されない不具合を修正。
アイテムの使用でもレベルアップするよう修正。
移動
    &reload_data('ex') if $S->{id} eq $F{id};

    if ($S->{ex} >= $S->{lv} * $set::exl) {
        <中略>
    }

    &reload_data('ex') if $S->{id} eq $F{id};

修正前
    if ($S->{ex} >= $S->{lv} * $set::exl) {
        <中略>
    }
修正後
    &levelup_check($S);
library/experience.cgi:
アイテムの使用でもレベルアップするよう修正する為、レベルアップ判定部分をサブルーチン化する。
サブルーチンを追加。
# Sub Level Up Check #
sub levelup_check {
my  $S = shift;

    if ($S->{ex} >= $S->{lv} * $set::exl) {
        $S->{ex} -= $S->{lv} * $set::exl;
        $S->{lv}++ if $S->{lv} < $set::lvx;
        $S->{lb}+= $set::lub;
        &M("<span class=levelup>$S->{nm}の$set::lab{lv}がUP!</span>");
        &reload_data('lv') if $S->{id} eq $F{id};
        if ($S->{Sk}{Tb}) {
            $S->{Mlf} += $set::clf;
            &reload_gage('lf','V') if $S->{id} eq $F{id};
        }
    }
}
library/fight.cgi: sub baggage_check
戦闘時に装備が壊れてもステータス画面から装備品が消えない不具合を修正。
追加
        else {
            &reload_data($Ii->{eq});
            &reload_data('of') if $Ii->{eq} eq 'rh';
        }
library/find.cgi: sub found
森で、戦闘中に弓が壊れても狩りを続けることが出来る不具合を修正(一部アレンジ)。
追加
            &M("これ以上は持てません。") && last if $S->{bg} == $S->{Mbg};
        }
        last if $V5 eq 'hunting' && $S->{Rh}{cl} ne 'Bo';
library/logout.cgi: sub logout
ログイン中の人数の表示を正確にする。
追加
    &set_code('on');
    utime(time, time - $set::lgi, "$set::Ucd_dir/$I->{id}.cgi");
library/main.cgi: sub main
ログイン中の人数の表示を正確にする。
追加
    $precode = (stat("$set::Ucd_dir/$I->{id}.cgi"))[9];
    $precode += $I->{li} eq 'out' ? $set::lgi : 0;
library/new.cgi: sub make_code
ログイン中の人数の表示を正確にする。
追加
    chmod($set::pms,"$set::Ucd_dir/$I->{id}.cgi");
    utime(time, time - $set::lgi, "$set::Ucd_dir/$I->{id}.cgi");
library/orb.cgi: sub orb_before
オーブを纏めて表示する(一部アレンジ)。
修正前
my  $checked;
修正後
my ($count,$tcount);

修正前
    foreach (@{$I->{Ob}}) {
        $i++;
        $checked = /[a-z]/ ? ' checked' : '';
        $_ = lc $_;
        $t1 .= "<input type=checkbox name=$i class=checkbox$checked> ";
        $t1 .= &orb_image($_);
        $t1 .= "$set::orb{$_}$set::orb{x}<br>\n";
    }
修正後
    foreach ('a' .. 'l') {
        $count = $tcount = 0;
        $count++  while $I->{ob} =~ /$_/ig;
        $tcount++ while $I->{ob} =~ /$_/g ;
        if ($count) {
            $t1 .= qq|<input type=text size=2 name=$_ class=textbox value="$tcount"> |;
            $t1 .= &orb_image($_);
            $t1 .= "$set::orb{$_}$set::orb{x} x $count<br>\n";
        }
    }

修正前
    <tt>トレードに出す$set::orb{x}にチェックを入れてください。</tt><br>
修正後
    <tt>トレードに出す$set::orb{x}の個数を入力してください。</tt><br>
library/orb.cgi: sub orb_after
オーブを纏めて表示する(一部アレンジ)。
追加
my  %unique;

修正前
    @{$I->{Ob}} = split(//,$I->{ob});
修正後
    @{$I->{Ob}} = split(//,lc $I->{ob});

修正前
        $i++;
        $_ = $F{$i} ? lc $_ : uc $_;
修正後
        $F{$_} = 1 if $F{ta};
        $F{$_} = 0 if $F{ta} && !$unique{$_}++;
        $F{$_} = 0 if $F{tn};
        &say("数値以外使用できません",'orb_before') if $F{$_} =~ /[^\d]/;
        $_ = $F{$_} ? ($F{$_}--, $_) : uc $_;
library/pack.cgi: sub pack
オートパッキングを実装する(一部アレンジ)。
サブルーチンを新たに追加
# Sub Pack All #
sub pack_all {
    $I = &get_user('I');
    &say("パックスキルがありません",$F{fl}) if $I->{pc} < 2;

    &get_item($I);

    &auto_pack($I,$I->{Bg});

    &set_code;

    &sort_item($I);

    &set_item($I);

    &say("可能\なアイテムを全てパックにしました。",$F{fl});
}

# Sub Auto Pack #
sub auto_pack {
my  $S = shift;
my  $V = shift; # Bag
my  $T = shift; # Bank Slot
my ($Ii,$i,$X,%P);

    foreach $Ii (@{$V}) {
        next if !$Ii;
        next if &item_class_check($Ii) ne 'M';
        next if $Ii->{qn} >= $S->{pc};
        $X = "$Ii->{id}:$Ii->{ql}:$Ii->{gd}:$Ii->{ef}";
        if ($P{$X}) {
            foreach $i (0 .. $Ii->{qn}) {
                $Ii->{Qn} = $i;
                last if $P{$X}{qn} + $i >= $S->{pc};
            }
            $Ii->{qn}  -= $Ii->{Qn};
            $P{$X}{qn} += $Ii->{Qn};
            $P{$X}{sp}  = $Ii->{sp} = '' if $Ii->{Qn};
            $P{$X}{rs}  = $Ii->{rs} = '' if $Ii->{Qn};

            if (!$Ii->{qn}) {
                $T->{Sl}-- if $T;
                undef $Ii;
                next;
            }
        }
        $P{$X} = $Ii;
    }
}
library/pet.cgi: sub pet
ペットが寿命を迎えた際、信頼度と空腹度が「あの世でうらんでいる」「餓死」になる不具合を修正。
追加
            if ($age > $Ip->{ls}) {
                <中略>
                $saveflag = 1;
                $confidence = $stomach = $Ip->{ls};
            }
library/price.cgi: sub price_before
販売スロットに現在販売している数を表示(一部アレンジ)。
追加
    $I->{Vx} = 0;

    foreach $Ii (@{$I->{Bg}}) {
        $i++;
        next if !$Ii;
        $I->{Vx}++ if $Ii->{sp} && $Ii->{cl} ne 'Cu';

追加
    <div class=r><tt>販売スロット:$I->{Vx}/$I->{vx}</tt></div>
library/trade.cgi: sub trade_before
オーブを纏めて表示する(一部アレンジ)。
削除
my  %unique;

修正前
    @{$I->{Ob}} = grep { !$unique{$_}++ }
                  map  { $_ = lc $_ } split(//,$I->{ob});
    $checked = ' checked';
    foreach (@{$I->{Ob}}) {
        $t1 .= qq|<input type=radio name=Iob class=radio value="$_"$checked> |;
        $t1 .= &orb_image($_);
        $t1 .= "$set::orb{$_}$set::orb{x}<br>\n";
        $checked = '';
    }

    @{$U->{Ob}} = grep { /[a-z]/ } split(//,$U->{ob});
    $checked = ' checked';
    foreach (@{$U->{Ob}}) {
        $t2 .= qq|<input type=radio name=Uob class=radio value="$_"$checked> |;
        $t2 .= &orb_image($_);
        $t2 .= "$set::orb{$_}$set::orb{x}<br>\n";
        $checked = '';
    }
修正後
    $checked = ' checked';
    foreach ('a' .. 'l') {
        $count = 0;
        $count++ while $I->{ob} =~ /$_/ig;
        if ($count) {
            $t1 .= qq|<input type=radio name=Iob class=radio value="$_"$checked> |;
            $t1 .= &orb_image($_);
            $t1 .= "$set::orb{$_}$set::orb{x} x $count<br>\n";
            $checked = '';
        }
    }

    $checked = ' checked';
    foreach ('a' .. 'l') {
        $count = 0;
        $count++ while $U->{ob} =~ /$_/g;
        if ($count) {
            $t2 .= qq|<input type=radio name=Uob class=radio value="$_"$checked> |;
            $t2 .= &orb_image($_);
            $t2 .= "$set::orb{$_}$set::orb{x} x $count<br>\n";
            $checked = '';
        }
    }
library/unpack.cgi: sub unpack_before
荷物スロットに現在の所持数を表示。
追加
    <div class=r><tt>荷物スロット:$I->{Bs}/$I->{bs}</tt></div>
library/use.cgi: sub use
アイテム使用時に経験値が増加した場合、レベルアップするかチェックする。
追加
    &dead_check($I,'CLOSE');

    require "$set::lib_dir/experience.cgi";
library/use.cgi: sub type_expendable
同上。
追加
            &change_status($I,$K,$V,1);
            if ($K eq 'ex') { &levelup_check($I) }
library/water.cgi: sub water
決して水瓶が壊れない不具合を修正。
修正前
    &M("$Ii->{nm}がいっぱいになりました。");
修正後
    if (&roll_dice(100) <= $set::wbp) {
        &M("$Ii->{nm}が壊れました。");
        &change_status($I,'bg',-$Ii->{wt});
        $Ii->{qn} = 0;
    }
    else {
        &M("$Ii->{nm}がいっぱいになりました。");
    }
sos3.css
Mozilla系/Operaでもpaddingの扱いをIEと同じようにする為、表示の揺らぎを吸収。
追加
/* 全ての要素 */
* {
  -moz-box-sizing: border-box ;
  box-sizing: border-box ;
}
javascript/GetView.js
銀行で「パックにする、パックを分ける、捨てる」を行った時に銀行内のチェックボックスを無効表示する処理。
追加
function DisableObject(tag,hid,cid,keyvalue,flag) {
    try {
        var val1 = flag == 'reverse' ? true : false;
        var val2 = flag == 'reverse' ? false : true;
    	target1 = document.getElementsByTagName(tag);
    	target2 = GetObject(cid,self);
    	for (var i in target1) {
    	    if (target1[i].name && target1[i].name.indexOf(hid) == 0) {
    	        target1[i].disabled  = target2.value == keyvalue ? val1 : val2;
    	    }
    	}
    }
    catch (err) {}
}

以上の修正情報はUchimata様よりご提供頂きました。


library/base.cgi: sub change_status
既に病気になっていてもまた病気になった事と告げるメッセージが表示されてしまう不具合を修正。
修正前
        $S->{$T} = 0;
        if ($Y) {
修正後
        $S->{$T} = 0;
        if ($Y && !$S->{Cd}{$Y}) {
以上の修正情報はmomochi様よりご提供頂きました。






library/aboard.cgi: sub aboard_before
自動で航海する定期船の導入。
修正前
my  $L;
修正後
my ($V,@L);

修正前
    $L = &get_departure;
修正後
    @L = (&get_oceanliner($I),&get_departure);

修正前
    $L = &get_departure;
修正後
    @L = (&get_oceanliner($I),&get_departure);

修正前
    foreach (@$L) {
        &get_ship($I,$_->[0],'checked');
修正後
    foreach $V (@L) {
        &check_oceanliner($I,$V->[0]) || &get_ship($I,$V->[0],'checked');

修正前
        $t1 .= qq|<td rowspan=2 align=center><img src=$set::iim_dir/$I->{Si}{im}><br><input type=radio name=ud class=radio value="$_->[0]"$I->{Si}{Go}></td>|;
修正後
        $t1 .= qq|<td rowspan=2 align=center><img src=$set::iim_dir/$I->{Si}{im}><br><input type=radio name=ud class=radio value="$V->[0]"$I->{Si}{Go}></td>|;

library/aboard.cgi: sub aboard_after
同上。
追加
my ($V,$X,$L,$N);

修正前
    &set_ship($I,$V);
修正後
    &get_oceanliner($I);

    if (!&check_oceanliner($I,$V)) { &get_ship($I,$V); $N = "\n" }

修正前
    @{$I->{Si}{Pg}} = grep { $_ ne "$I->{id}\n" } @{$I->{Si}{Pg}};
修正後
    @{$I->{Si}{Pg}} = grep { $_ ne "$I->{id}$N" } @{$I->{Si}{Pg}};

追加
        $F{ud} = $I->{ab};
        $I->{ab} = '';

修正前
        push(@{$I->{Si}{Pg}},"$I->{id}\n");
修正後
        push(@{$I->{Si}{Pg}},"$I->{id}$N");

追加
    &set_oceanliner($I) || &set_ship($I,$V);
library/aboard.cgi
サブルーチンを追加する。
サブルーチンを新たに追加
# Sub Check Ocean Liner #
sub check_oceanliner {
my  $S = shift;
my  $V = shift;

    if ($V =~ /^[a-z]{3}_[a-z]{3}$/) {
        $S->{Si} = $S->{Ol}{$V};
        return 1;
    }
    return 0;
}

# Sub Get Ocean Liner #
sub get_oceanliner {
my  $S = shift;
my  ($L,%L,$K,$V);

    require "$set::dat_dir/oceanliner_ship.cgi";

    %{$S->{Pg}} = map { $_->[0] => $_->[1] }
                  map { [split(/<>/)] } &open_dat("$set::dat_dir/oceanliner_passenger.cgi");

    $S->{Ol} = {%OL};
    foreach $K (keys %OL) {
        $V = $S->{Ol}{$K};
        ($V->{nw},$V->{go}) = split(/_/,$K);
        $V->{pg} = @{$V->{Pg}} = split(/,/,$S->{Pg}{$K});
        $V->{Go} = ' checked' if $S->{ab} eq $K;
        push(@$L,$K) if $V->{nw} eq $S->{pl};
    }
    return $L;
}

# Sub Set Ocean Liner #
sub set_oceanliner {
my  $S = shift;
my  $V = shift;
my  (@L,$K);

    return 0 if $V !~ /^[a-z]{3}_[a-z]{3}$/;

    $S->{Pg}{$V} = join(',',@{$S->{Si}{Pg}});

    while (($K,$V) = each %{$S->{Pg}}) {
        push(@L,join('<>',$K,$V,"\n")) if $V;
    }

    &write_dat("$set::dat_dir/oceanliner_passenger.cgi",@L);
    return 1;
}
library/aboard.cgi:
使用していないサブルーチンを削除。
削除
    sub find_ship
library/attune.cgi:
汎用性を持たせる。
同じアイテムが何度も専用化できてしまう不具合を修正。
全置換
    'bag' を $F{fl} に全て置換

追加
            $t1 .= "$Ii->{nm}は専用化できません。<br>\n"
        }
        elsif ($Ii->{Ql}{Ns} && $Ii->{Ql}{Sc}) {
            $t1 .= "$Ii->{nm}は専用化できません。<br>\n"
        }

追加
    <input type=hidden name=ps value="$F{ps}">
    <input type=hidden name=fl value="$F{fl}">
library/bag.cgi: sub bag
ラベルを「アイテム」から「荷物」に変更。
「焼く」コマンドを追加。
修正前
    <div class=label>アイテム</div>
修正後
    <div class=label>荷物</div>

追加
    <option value="takeoff_all">装備を全て外す</option>
    <option value="roast">焼く</option>
library/base.cgi: sub get_user
使用していない構文を削除。
削除
    return $S if $W eq 'B';
library/base.cgi: sub change_status
無気力だと消費するVITが+1されるよう変更する。
追加
    $V += 1 if $T eq 'vt' && $S->{Cd}{En} && $V < 0;

    $S->{$T} += $V;
library/base.cgi: sub get_effect
帽子と釣竿の情報を追加する。
修正前
                 $Si->{cl} eq 'Dr' ? " $set::lab{ap} +$Si->{ef}":
修正後
                 $Si->{cl} eq 'Fr' ? " $Si->{ef}%":
                 $Si->{cl} eq 'Ht' ? " $Si->{ef}%":
                 $Si->{cl} eq 'Dr' ? " $set::lab{ap} +$Si->{ef}":
library/base.cgi: sub decorate_item
デラックス品に関係するプログラムを削除する。
削除
    $V = "<span class=Dx>Dx</span>".$V          if $Si->{Ql}{Dx};
library/base.cgi:
使用していないサブルーチンを削除。
削除
    sub get_quality
library/berry.cgi: sub berry
果実データファイルの変更に伴う修正。
LIFの再表示を行わない。
追加
    require "$set::lib_dir/find.cgi";
    require "$set::dat_dir/forest_berry_catalog.cgi";

修正前
    &say("環境保護区域です",'forest') if !$I->{Pl}{br};
    &say("環境保護区域です",'forest') unless -e "$set::itm_dir/$I->{Pl}{br}";
修正後
    &say("環境保護区域です",'forest') unless $CA{$I->{pl}};

修正前
    &found($I,'br',$set::wvt,'採取','つ手に入れました');
修正後
    &found($I,'forest_berry',$set::wvt,'採取','つ手に入れました');

修正前
    &reload_gage(['vt','lf'],'V');
修正後
    &reload_gage('vt','V');
library/break.cgi: sub break_check
break_checkが機能していない不具合を修正。
「壊れました」という表現を変更。
メイン画面の再表示をサブルーチン内で処理する。
削除
    &get_equipment($I,$E);

修正前
        &M("$S->{$E}{nm}が壊れました。");
修正後
        &M("$S->{$E}{nm}が破損しました。");

修正前
        foreach $Ii (@{$I->{Bg}}) {
            if ($Ii->{eq} eq $E) {
修正後
        foreach $Ii (@{$S->{Bg}}) {
            if ($Ii->{eq} eq $e) {

修正前
                    $I->{bg} -= $Ii->{wt};
修正後
                    $S->{bg} -= $Ii->{wt};

追加
        undef $S->{$E};
        &reload_data($e);
library/butcher.cgi: sub butcher_after
屠殺時に得られる経験値は得たアイテム分だけにする。
獲得できる経験値を減らす。
同じ動物を複数屠殺した時に、手に入るアイテムの量が正しく計算されない不具合を修正。
&break_checkの改造に伴う修正。
修正前
        foreach $Ui (@{$FI{$Ip->{nm}}}) {
修正後
        foreach $Ii (@{$FI{$Ip->{nm}}}) {
            $Ui = {%$Ii};

修正前
            &experience($I,$Ui->{Qn} * 20) if $I->{Sk}{Bc};
修正後
            &experience($I,$Ui->{qn} * 15) if $I->{Sk}{Bc};

修正前
    if ($I->{Rh}{ql}{Cp}) {
        &reload_data('rh') if &break_check('rh');
    }
    else {
        &reload_data('sb') if &break_check('sb');
    }
修正後
    $I->{Rh}{ql}{Cp} ? &break_check($I,'rh') : &break_check($I,'sb');
library/buy.cgi: sub buy_before
「自動販売機(Vm)」のスキルを実装する。
追加
        $Ui->{sp} ||= $Ui->{bp} * $Ui->{qn} + $set::lip if $U->{Sk}{Vm};
        next unless $Ui->{sp} && $Ui->{cl} ne 'Cu';
library/buy.cgi: sub buy_after
同上。
追加
        $Ui->{sp} ||= $Ui->{bp} * $Ui->{qn} + $set::lip if $U->{Sk}{Vm};
        next if !$F{"$i-$Ui->{id}-$Ui->{sp}"};
library/capture.cgi: sub capture_after
「臆病」な動物が現れない不具合を修正。
修正前
        $Up->{ch} = &roll_dice(4) - 1;
修正後
        $Up->{ch} = &roll_dice(5) - 1;
library/compose.cgi: sub compose
帽子を作成できるようにする。
酒を作る→飲物を作るに変更。
種を蒔く→農作物を作るに変更。
作成画面からでも調べたり値段設定が行えるようにする。
追加
    if ($I->{Sk}{Tl}) { $t2 .= qq|<option value="hat=Tl">帽子を作る</option>\n| }
    if ($I->{Sk}{Tl}) { $t2 .= qq|<option value="clothes=Tl">服を作る</option>\n| }

修正前
    if ($I->{Sk}{Bg}) { $t2 .= qq|<option value="liquor=Bg">酒を作る</option>\n| }
修正後
    if ($I->{Sk}{Bg}) { $t2 .= qq|<option value="liquor=Bg">飲物を作る</option>\n| }

修正前
    if ($I->{Sk}{Pl}) { $t2 .= qq|<option value="crops=Pl">種を蒔く</option>\n| }
修正後
    if ($I->{Sk}{Pl}) { $t2 .= qq|<option value="crops=Pl">農作物を作る</option>\n| }

追加
    <option value="compose_before">作成する</option>
    <option value="look">調べる</option>
    <option value="price_before">値段を設定する</option>
library/compose.cgi: sub compose_before
目安となる必要TECをアイテム毎に表示する。
一度に作成できる数量の上限を20とする。
荷物スロットとパックスキルを表示する。
修正前
my ($K,$V,$L,@L);
修正後
my ($K,$V,$X,$L,@L);

修正前
        $t1 .= qq|
library/compose.cgi: sub compose_after
作成時に帽子のボーナスを得られるようにする。
作成した個数は表示しない。
色々問題がある為、デラックス品作成は廃止する。
作成したアイテムの値段、重さ、栄養素を自動計算するプログラムを追加する。
追加
    $Ui = $FI[$F{ci}-1];
    $Ui->{dt}{qn} ||= 1;

追加
    require "$set::lib_dir/status.cgi";
    require "$set::lib_dir/item.cgi";
    require "$set::dat_dir/itemdata.cgi";

修正前
    if (&roll_dice($V) < $Ui->{rl} + $I->{dx} * 3 - ($I->{Gd} - 1) * 10) {
修正後
    if (&roll_dice($V) < $Ui->{rl} + $I->{dx} * 3 + &hat_bonus($I) - ($I->{Gd} - 1) * 10) {

修正前
        &M("$Ui->{Im}$Ui->{dt}{nm} x $Ui->{dt}{qn}を作成しました。");
修正後
        &M("$Ui->{Im}$Ui->{dt}{nm}を作成しました。");
        &set_item_data($Ui->{dt});

修正前
        &deluxe_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} eq 'Fd';
        &double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} eq 'Mt';
修正後
        &double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} =~ /(Fd|Mt)/;
library/compose.cgi: sub reduce_item
作成したアイテムの値段、重さ、栄養素を自動計算するプログラムを追加する。
追加
    &grade_check($S,$Si) if $Si->{gd} && $Ui->{ki} && $Ui->{ki} eq $Y;
    &add_item_data($Si,$Ui->{dt},$V,$Z);
library/compose.cgi: sub double_roll
規定値は二倍だが、一応設定で変更できるようにする。
修正前
        $Si->{qn} *= 2;
        &M("いつもの二倍の量を作成する事に成功しました。");
修正後
        $Si->{qn} *= $set::ddu;
        &M("いつもの$set::ddu倍の量を作成する事に成功しました。");
library/compose.cgi
帽子ボーナス用のサブルーチンを追加する。
消費する材料毎に値段、重さ、栄養素を加算していくサブルーチンを追加する。
サブルーチンを新たに追加
# Sub Add Item data #
sub add_item_data {
my  $Si = shift;
my  $Ui = shift;
my  $Y  = shift; # cl or id
my  $Z  = shift; # quantity
my  $X = $Si->{$Y};
my  ($K,$V);

    return if exists $FD{$Ui->{id}};

    # データに無い #
    if (!exists $FD{$X}) {
        $FD{$X}{bp} = $Si->{bp};
        $FD{$X}{wt} = $Si->{wt};
        if ($Si->{cl} eq 'Fd') {
            foreach (split(/,/,$Si->{ef})) {
                ($K,$V) = split(/=/);
                $FD{$X}{$K} = $V;
            }
        }
    }
    elsif ($FD{$X}{tp}) {
        $X = $FD{$X}{tp};
    }

    $Ui->{bp} += $FD{$X}{bp} * $Z;
    $Ui->{wt} += $FD{$X}{wt} * $Z;

    return if $Ui->{cl} ne 'Fd';

    foreach $K ('lf','hl','hy') {
        next if !$FD{$X}{$K};
        $Ui->{$K} += $FD{$X}{$K} * $Z;
    }
}

サブルーチンを新たに追加
# Sub Hat Bonus #
sub hat_bonus {
my  $S = shift;

    &get_equipment($S,'hd');

    return 0 if $S->{Hd}{cl} ne 'Ht';

    require "$set::lib_dir/break.cgi";

    &break_check($S,'hd');

    return $S->{Hd}{ef} + $set::grd[$S->{Hd}{gd}];
}
library/compose.cgi
デラックス品に関係するサブルーチンを削除。
サブルーチンを削除
        sub deluxe_roll
library/contact.cgi: sub contact_before
ロックに関係した修正。
ログイン中か否か、対戦を受け付けているかどうかの表示を加える。
修正前
        $U = &get_user('A',$_);
修正後
        $U = &get_user('A',$_,'unlocked');

追加
        $U->{Id} = index($U->{id},'_') ? $U->{id} : 'NPC';
        $U->{Li} = &login_check($U,1) ? '○' : $U->{vp} ? '▲' : '●';

追加
        $t1 .= qq|<option value="$U->{id}">$U->{Li} $U->{Id}: $U->{nm}($U->{jb})【$U->{Da}{in}】 R:$U->{rt}</option>\n|;
library/cure.cgi: sub cure_after
治療を受けたにも関わらず怪我が治らず、金も支払われないバグを修正。
修正前
#    &set_item($U);

#    &set_user($I);
#    &set_user($U);
修正後
    &set_item($U);

    &set_user($I);
    &set_user($U);
library/date.cgi: sub departure_time
定期船に伴う修正。
追加
    $ENV{'TZ'} = "JST-9";
    return sprintf("%02d:%02d",$set::scm) if !$V;
library/delete.cgi: sub delete_check
ロックに関係した修正。
修正前
        $U = &get_user('A',$_);
修正後
        $U = &get_user('A',$_,'unlocked');
library/delete.cgi: sub delete_file
ロックに関係した修正。
追加
    if (-e "$set::sip_dir/$id.cgi") { unlink "$set::sip_dir/$id.cgi" }
    &unlock($id);
library/dry.cgi: sub dry
汎用性を持たせる。
全置換
    'bag' を $F{fl} に全て置換
library/equip.cgi: sub equip
ダンジョン用に改造。
修正前
    &say($I->{M},'bag','Set,Reload');
修正後
    &say($I->{M},$F{fl},'Set,Reload');
library/farm.cgi:
農場で販売しているアイテムと家畜のファイルをそれぞれ一つに纏める。
サブルーチンの前に追加
require "$set::dat_dir/farm_item_catalog.cgi";
require "$set::dat_dir/farm_livestock_catalog.cgi";
require "$set::itm_dir/farm_sale_item.cgi";
require "$set::itm_dir/farm_sale_livestock.cgi";

library/farm.cgi: sub farm_before
農場で販売しているアイテムと家畜のファイルをそれぞれ一つに纏める。
農場の販売価格を市場買取価格と同額にする。
修正前
    &say("$I->{Sp}{Fm}{nm}は閉まっています",'CLOSE') unless -e "$set::itm_dir/$I->{Pl}{fm}";
    &say("$I->{Sp}{Fm}{nm}は閉まっています",'CLOSE') unless -e "$set::itm_dir/$I->{Pl}{ls}";
修正後
    &say("$I->{Sp}{Fm}{nm}は閉まっています",'CLOSE') unless exists $IC{$I->{pl}};
    &say("$I->{Sp}{Fm}{nm}は閉まっています",'CLOSE') unless exists $LC{$I->{pl}};

削除
    require "$set::itm_dir/$I->{Pl}{fm}";

修正前
    foreach $Ui (@FI) {
修正後
    foreach $Ui (@{$IC{$I->{pl}}}) {
        $Ui = $FI{$Ui};

修正前
        $Ui->{Sp} = int($Ui->{bp} * $set::mtp + $set::mpp) * $Ui->{qn};
修正後
        $Ui->{Sp} = $Ui->{bp} * $Ui->{qn};

削除
    require "$set::itm_dir/$I->{Pl}{ls}";

修正前
    foreach $Up (@FI) {
修正後
    foreach $Up (@{$LC{$I->{pl}}}) {
        $Up = $FL{$Up};

修正前
        $Up->{Sp} = int($Up->{bp} * $set::mtp + $set::mpp);
修正後
        $Up->{Sp} = $Up->{bp};
library/farm.cgi: sub farm_after
農場で販売しているアイテムと家畜のファイルをそれぞれ一つに纏める。
農場の販売価格を市場買取価格と同額にする。
「臆病」な家畜が現れない不具合を修正。
削除
    &get_place($I);

削除
    require "$set::itm_dir/$I->{Pl}{fm}";

修正前
    foreach $Ui (@FI) {
修正後
    foreach $Ui (@{$IC{$I->{pl}}}) {
        $Ui = $FI{$Ui};

修正前
        $Ui->{Sp} = int($Ui->{bp} * $set::mtp + $set::mpp) * $Ui->{qn};
修正後
        $Ui->{Sp} = $Ui->{bp} * $Ui->{qn};

削除
    require "$set::itm_dir/$I->{Pl}{ls}";

修正前
    foreach $Up (@FI) {
修正後
    foreach $Up (@{$LC{$I->{pl}}}) {
        $Up = $FL{$Up};

修正前
        $Up->{Sp} = int($Up->{bp} * $set::mtp + $set::mpp);
修正後
        $Up->{Sp} = $Up->{bp};

修正前
        $Up->{ch} = &roll_dice(4) - 1;
修正後
        $Up->{ch} = &roll_dice(5) - 1;
library/fight.cgi: sub fight_player
ガードがいる場所でも対戦を行えるようにする。
追加
    &partner('',"<img src=$set::mim_dir/envGd.gif><br><br>$I->{Pl}{nm}での戦闘は禁止されています") if $I->{Pl}{ev}{Gd} && !$U->{vp};

追加
    &partner('',"$U->{nm}とは暫く戦えません・・・") if @Den;

    # 対戦受付回数 #
    &change_status($U,'vp',-1) if $I->{Pl}{ev}{Gd};
library/fight.cgi: sub fight_creature
連闘した際に前回のデータが持ち越されてしまう不具合を修正。
ダンジョン用に一部修正。
プレイヤーが負傷または逃走後も処理が継続されてしまう不具合を修正。
ダンジョン内のモンスターは一定回数戦闘後、逃走せず自動的に死亡扱いにする。
先制攻撃が機能していない不具合を修正。
モンスターと戦闘した際のステータス再表示は呼び出し元で行うように修正する。
追加
local $battleisover;
undef $I->{DX};
undef $I->{BI};
undef $I->{WO} if !$F{dg};


修正前
my  $i;
修正後
my ($i,$counter);

修正前
    &M("$set::lab{lf}が低下している為、探索を中断しました。") && return 0 if $I->{lf} <= 10;

    $U->{Im} = "<img src=$set::iim_dir/$U->{im}><br><br>";
修正後
    &M("$set::lab{lf}が低下している為、探索を中断しました。") && return 0 if $I->{lf} <= 10 && !$F{dg};

    $U->{Im} = "<img src=$set::iim_dir/$U->{im}><br><br>" if $set::mim && $U->{im};

    $U->{nm} = $Dg->{mn} if $F{dg};

修正前
    &first_battle;
修正後
    $counter = &first_battle($I,$U);

追加
    while ($I->{lf} && $U->{lf}) {
        <中略>
    }

    if ($counter && !$battleisover)  {
        &initiative($counter);
        &M("<tt>カウンター攻撃</tt>");
        &concrete_battle($A,$D,'のカウンター!');
    }

追加
        &M("$U->{nm}は逃走した!</span><br>") && last if $i++ >= $V;
        last if $battleisover;
        &initiative(0);
        &concrete_battle($A,$D,'の攻撃。');
        &concrete_battle($D,$A,'の攻撃。');
        &M();
        $U->{lf} = 0 if $F{dg} && $i == $V;

削除
    &reload_gage(['lf','hl','ap','hy'],'V');
library/fight.cgi: sub concrete_battle
「Sn」(スニーク)が付いていない防具は先制攻撃が失敗する処理を追加。
ダンジョンでの逃走は禁止する。
ブーツの破壊判定は逃走を試みた時に行うよう修正。
「道連れ」成功時に攻撃側は兜による即死回避ロールを行う。
防御側の破壊判定の修正。
追加
    # 先制攻撃失敗 #
    if ($F && $A->{NZ}) {
        &M("だが$D->{Nm}は事前に物音に気付き攻撃を回避した。") && return;
    }
    # 狼の嗅覚 #
    if ($F && $D->{Sk}{Kn} && &skill_roll($D,$set::sKn,$D->{in} * 4)) {
        &M("$D->{Nm}はそれを素早く察知し、$A->{Nm}の攻撃を阻止した。") && return;
    }
    # 逃走 #
    if (!$F{dg} && $D->{Sk}{Rn} && $D->{lf} <= $D->{Mlf} * $set::sRn) {
        $battleisover = 2;
        &M("$D->{Nm}は逃走した。") && return;
    }

修正前
    if ($D->{lf} <= $D->{sc} && &roll_dice(100) <= $D->{BT} + $D->{DX} * 2) {
        $battleisover = 2;
        &M("$D->{Nm}は逃走した。");
        &destruction_check($D,'lg');
        return;
    }
修正後
    if (!$F{dg} && $D->{lf} <= $D->{sc}) {
        if (&roll_dice(100) <= $D->{BT} + $D->{DX} * 2) {
            &M("$D->{Nm}は逃走した!");
            $battleisover = 2;
        }
        else {
            &M("$D->{Nm}は逃走を試みたが失敗した!");
        }
        &destruction_check($D,'lg');
        return if $battleisover;
    }

修正前
    &destruction_check($D,'lh') if $MSG == 1;
    &destruction_check($D,'bd') if $ADM && !$MSG;
修正後
    &destruction_check($D,'lh') if $D->{SH};
    &destruction_check($D,'bd') if !$MSG;

追加
        &M("$D->{Nm}は$A->{Nm}を道連れに・・・。");
        return if &avoid_death($A);
        return if &helmet_roll($A,$D);
library/fight.cgi: sub injury_check
ダンジョン内は負傷後も継続して戦闘を行う。
修正前
    $battleisover = 1;
修正後
    $battleisover = 1 if !$F{dg};
library/fight.cgi: sub protector_check
「Sn」(スニーク)が付いていない防具は先制攻撃が失敗する処理を追加。
追加
    $S->{HM} = $S->{Hd}{cl} eq 'Hm' ? $S->{Hd}{ef} * $V + &equip_bonus($S,'Hd',$set::shb) : undef;
    $S->{NZ} = 1 if $S->{Hd}{cl} eq 'Hm' && !$S->{Hd}{ql}{Sn};

    # 鎧チェック #
    $S->{NZ} = 1 if $S->{Bd}{cl} eq 'Ar' && !$S->{Bd}{ql}{Sn};

追加
    $S->{BT} = $S->{Lg}{ef} + &equip_bonus($S,'Lg',$set::shb);
    $S->{NZ} = 1 if $S->{Lg}{cl} eq 'Bt' && !$S->{Lg}{ql}{Sn};
library/fight.cgi: sub dead_or_alive
殺害系スキルでも兜による即死回避ロールを行う。
兜の破壊判定は通常攻撃でLIFが0になる度に行うよう修正(今までは兜の即死回避ロールが成功したら破壊判定)。
追加(全部で三箇所)
        return if &avoid_death($D);
        return if &helmet_roll($A,$D);

修正前
        if ($D->{HM} && !$A->{Sk}{Fd} && &roll_dice(100) <= $D->{HM} + $D->{DX} * 2) {
            $D->{lf} = 1;
            &M("$D->{Nm}はなんとか一命を取り止めた!");
            &destruction_check($D,'hd');
            return;
        }
修正後
        return if &helmet_roll($A,$D);
library/fight.cgi: sub destruction_check
破壊判定の仮調整。
追加
my  $E;
my  $V;

追加
    $E = ucfirst($e);

###仮調整#########################################
$V = $e eq 'rh' ? 12:
     $e eq 'lh' || $e eq 'bd' ? 10:
     $e eq 'hd' || $e eq 'lg' ? 0.5 : 1;
##################################################

修正前
    if (&roll_dice($S->{$E}{db}) == 1) {
修正後
    if (&roll_dice($S->{$E}{db} * $V) == 1) {
library/fight.cgi: sub baggage_check
存在しない'of','df'の再表示を行わない。
三箇所ある以下の二行を削除する
            &reload_data('of') if $Ii->{eq} eq 'rh';
            &reload_data('df') if $Ii->{cl} eq 'Ar';

修正前
        if ($Ii->{Ql}{Rp}) {
            &reload_data($Ii->{eq});
            $Ii->{ql} .= ',Br';
            $Ii->{eq} = '';
        }
        else {
            &reload_data($Ii->{eq});
            &change_status($S,'bg',-$Ii->{wt});
            $Ii->{qn} = 0;
        }
修正後
        &reload_data($Ii->{eq});
        if ($Ii->{Ql}{Rp}) {
            $Ii->{ql} .= ',Br';
            $Ii->{eq} = '';
        }
        else {
            &change_status($S,'bg',-$Ii->{wt});
            $Ii->{qn} = 0;
        }
library/fight.cgi:
サブルーチンを新たに追加
# Sub Helmet Roll #
sub helmet_roll {
my  $A = shift;
my  $D = shift;
my  $F;

    return 0 if !$D->{HM} || $A->{Sk}{Fd};

    if (&roll_dice(100) <= $D->{HM} + $D->{DX} * 2) {
        $F = $D->{lf} = 1;
        &M("$D->{Nm}はなんとか一命を取り止めた!");
    }
    &destruction_check($D,'hd');
    return $F;
}
library/find.cgi: sub find
探索関連のデータファイル変更に伴う修正。
修正前
    &say("$I->{Pl}{nm}では探索ができません",'CLOSE') unless -e "$set::itm_dir/$I->{Pl}{it}";

    # 探索の特殊能力
    $I->{bonus} = $set::sSi if $I->{Sk}{Si};

    &encounter if $I->{Pl}{ev}{Ms};

    &get_item($I);

    &found($I,'it',$set::fvt,'探索','つ発見しました',1);
修正後
    # 探索の特殊能力
    $I->{bonus} = $set::sSi if $I->{Sk}{Si};

    &get_item($I);

    # モンスターが出現する #
    if ($I->{Pl}{ev}{Ms}) {
        $U = {};
        require "$set::lib_dir/fight.cgi";
        require "$set::dat_dir/find_monster_catalog.cgi";
        &say("$I->{Pl}{nm}では探索ができません",'CLOSE') unless $CA{$I->{pl}};
        &found($I,"find_monster_$I->{Pl}{kg}",$set::fvt,'探索','つ手に入れました',0,'monster');
    }
    # モンスターが出現しない #
    else {
        require "$set::dat_dir/find_item_catalog.cgi";
        &say("$I->{Pl}{nm}では探索ができません",'CLOSE') unless $CA{$I->{pl}} || $CA{$I->{Pl}{kg}};
        &found($I,'find_item',$set::fvt,'探索','つ発見しました',1);
    }

修正前
    &reload_data('gl');
    &reload_gage(['vt'],'V');
修正後
    &reload_data('gl') if !$I->{Pl}{ev}{Ms};
    &reload_gage('vt','V');
library/find.cgi: sub found
探索関連のデータファイル変更に伴う修正。
所持できるオーブの上限を設定。
モンスターと戦闘した際のステータス再表示は呼び出し元で行うように修正する。
金貨の画像を表示する。
修正前
my  ($i,$V,@V,$D,@FI);
修正後
my  ($i,$V,@V,$D,$F,@FI);

修正前
    require "$set::itm_dir/$S->{Pl}{$V0}";
修正後
    require "$set::itm_dir/$V0.cgi";

修正前
    @FI = sort { $a <=> $b } keys %FI;
修正後
    %CA = $CA{$S->{pl}} ? %{$CA{$S->{pl}}} : %{$CA{$S->{Pl}{kg}}};
    @FI = sort { $a <=> $b } keys %CA;

追加
            &M("<img src=$set::mim_dir/g.gif> $V $set::mnyを手に入れました。");

修正前
                if ($D <= $_) {
                    $Ii = $FI{$_};
                    last;
                }
修正後
                if ($D <= $_) {
                    $Ii = $FI{$CA{$_}};
                    last;
                }
追加
            $F = 'fought';
            &fight_creature($V) || last;

追加
            $Ii->{Im} = &orb_image($Ii->{ef});
            &M("$Ii->{Im}$Ii->{nm}を発見しましたが所持上限を超えたので捨てました。") && next if $set::mob && length $S->{ob} >= $set::mob;

追加
    &reload_gage(['lf','hl','ap','hy'],'V') if $F;
    &set_orb($S) if $S->{Ob};
library/find.cgi:
サブルーチンを削除
        sub encounter
library/fishing.cgi: sub fishing
釣竿の効果が本来の1/10になっていた不具合を修正。
釣りデータファイルの変更に伴う修正。
LIFの再表示を行わない。
追加
    require "$set::lib_dir/find.cgi";
    require "$set::dat_dir/$F{fl}_fish_catalog.cgi";

削除
    &error('Fishing Error','CLOSE') if !$F{fl};

修正前
    $backto = $F{fl} eq 'rv' ? 'river' : 'harbor';

    &say("釣り道具を持っていません",$backto) if !$F{ft};
修正後
    &say("釣り道具を持っていません",$F{fl}) if !$F{ft};

修正前
    &say("漁猟禁止区域です",$backto) if !$I->{Pl}{$F{fl}};
    &say("漁猟禁止区域です",$backto) unless -e "$set::itm_dir/$I->{Pl}{$F{fl}}";
    &say("$set::lab{vt}が足りません",$backto) if $I->{vt} < $set::yvt;
    &say('これ以上は持てません',$backto) if $I->{bg} >= $I->{Mbg};
修正後
    &say("漁猟禁止区域です",$F{fl}) unless $CA{$I->{pl}};
    &say("$set::lab{vt}が足りません",$F{fl}) if $I->{vt} < $set::yvt;
    &say('これ以上は持てません',$F{fl}) if $I->{bg} >= $I->{Mbg};

修正前
    &found($I,$F{fl},$set::yvt,'釣り','匹釣りました');
修正後
    &found($I,"$F{fl}_fish",$set::yvt,'釣り','匹釣りました');

修正前
    $I->{bonus} = $I->{lv} * 20 * $I->{Sk}{Fi} + $Ui->{ef};
修正後
    $I->{bonus} = $I->{lv} * 20 * $I->{Sk}{Fi} + $Ui->{ef} * 10;

修正前
    &reload_gage(['vt','lf'],'V');
修正後
    &reload_gage('vt','V');

修正前
    &say($I->{M},$backto,'Reload');
修正後
    &say($I->{M},$F{fl},'Reload');
library/forest.cgi: sub forest
染料採取コマンドを追加。
追加
    <option value="herb">薬草採取</option>
    <option value="dye">染料採取</option>
library/friends.cgi: sub friends_after
ロックに関係した修正。
修正前
        $U = &get_user('A',$F{ud},'noerror') || &say('存在しないIDです','friends_before');
修正後
        $U = &get_user('A',$F{ud},'unlocked') || &say('存在しないIDです','friends_before');
library/harbor.cgi: sub harbor
釣りに合わせてフォームで送るデータを修正する。
修正前
    <input type=hidden name=fl value="se">
修正後
    <input type=hidden name=fl value="harbor">
library/herb.cgi: sub herb
香辛料データファイルの変更に伴う修正。
LIFの再表示を行わない。
追加
    require "$set::lib_dir/find.cgi";
    require "$set::dat_dir/forest_herb_catalog.cgi";

修正前
    &say("環境保護区域です",'forest') if !$I->{Pl}{hb};
    &say("環境保護区域です",'forest') unless -e "$set::itm_dir/$I->{Pl}{hb}";
修正後
    &say("環境保護区域です",'forest') unless $CA{$I->{pl}};

修正前
    &found($I,'hb',$set::wvt,'採取','つ手に入れました');
修正後
    &found($I,'forest_herb',$set::wvt,'採取','つ手に入れました');

修正前
    &reload_gage(['vt','lf'],'V');
修正後
    &reload_gage('vt','V');
library/hunting.cgi: sub hunting
狩りデータファイルの変更に伴う修正。
追加
    require "$set::lib_dir/fight.cgi";
    require "$set::dat_dir/forest_animal_catalog.cgi";

修正前
    &say("禁猟区です",'forest') if !$I->{Pl}{ht};
    &say("禁猟区です",'forest') unless -e "$set::itm_dir/$I->{Pl}{ht}";
修正後
    &say("禁猟区です",'forest') unless $CA{$I->{pl}};

修正前
    &found($I,'ht',$set::wvt,'狩り','つ手に入れました',0,'hunting');
修正後
    &found($I,'forest_animal',$set::wvt,'狩り','つ手に入れました',0,'hunting');
library/install.cgi: sub install
略字が重複しないよう一部ソースを修正。
汎用性を持たせる。
修正前
            $Ii->{ql} =~ s/Fu/Lk,Sc,Tr,Ns/;
修正後
            $Ii->{ql} =~ s/Fu/Lk,Sc/;
            $Ii->{ql} .= ',Tr' if !$Ii->{Ql}{Tr};
            $Ii->{ql} .= ',Ns' if !$Ii->{Ql}{Ns};

置換
    'bag' を $F{fl} に置換
library/look.cgi: sub look
ダンジョン用に改造。
修正前
    &say($I->{M},'bag','Reload');
修正後
    &say($I->{M},$F{fl},'Reload');
library/look.cgi: sub nutritive_value
表示上の修正。
削除
    $Si->{Ef} =~ s/,/、/;
library/lumberjacking.cgi: sub lumberjacking
伐採データファイルの変更に伴う修正。
&break_checkの改造に伴う修正。
LIFの再表示を行わない。
追加
    require "$set::lib_dir/find.cgi";
    require "$set::dat_dir/forest_wood_catalog.cgi";

修正前
    &say("伐採禁止区域です",'forest') if !$I->{Pl}{wd};
    &say("伐採禁止区域です",'forest') unless -e "$set::itm_dir/$I->{Pl}{wd}";
修正後
    &say("禁猟区です",'forest') unless $CA{$I->{pl}};

修正前
    &found($I,'wd',$set::wvt,'伐採','本手に入れました');
修正後
    &found($I,'forest_wood',$set::wvt,'伐採','本手に入れました');

修正前
    if ($I->{Rh}{ql}{Lj}) {
        &reload_data('rh') if &break_check('rh');
    }
    else {
        &reload_data('sb') if &break_check('sb');
    }
修正後
    $I->{Rh}{ql}{Lj} ? &break_check($I,'rh') : &break_check($I,'sb');

修正前
    &reload_gage(['vt','lf'],'V');
修正後
    &reload_gage('vt','V');
library/mail.cgi: sub mail_before
ロックに関係した修正。
修正前
        $U = &get_user('A',$_,'noerror') or next;
修正後
        $U = &get_user('A',$_,'unlocked') or next;
library/main.cgi: sub main
ログイン時に定期船のチェックを行う。
追加
    &departure_monitor;
    &oceanliner_monitor;
library/main.cgi: sub main
アクションの選択肢に「イメージ画像の変更」を追加。
プレイヤーリストの選択肢に「ランキング」を追加。
イメージ画像タグのnameの値を修正。
追加
    <option value="levelup_before">レベルアップボーナス</option>
    <option value="face_before">イメージ画像の変更</option>

追加
    <option value="Si">販売情報</option>
    <option value="Rk">ランキング</option>

修正前
    <th nowrap class=padding><img name=im src=$set::mim_dir/$I->{im} class=image><br><span id=nm>$I->{nm}</span></th>
修正後
    <th nowrap class=padding><img name=I2 src=$set::mim_dir/$I->{im} class=image><br><span id=nm>$I->{nm}</span></th>

library/main.cgi:
サブルーチンを追加する。
サブルーチンを新たに追加
# Sub Ocean Liner Monitor #
sub oceanliner_monitor {
my (%D,$K,$V,$D,$F);

    return if !&schedule_monitor(2);
    return unless (stat("$set::dat_dir/oceanliner_passenger.cgi"))[7];

    %D = map { $_->[0] => $_->[1] }
         map { [split(/<>/)] } &open_dat("$set::dat_dir/oceanliner_passenger.cgi");

    require "$set::dat_dir/oceanliner_ship.cgi";
    require "$set::lib_dir/myrecord.cgi";

    while (($K,$V) = each %D) {
        ($OL{$K}{nw},$OL{$K}{go}) = split(/_/,$K);
        foreach $D (split(/<>/,$V)) {
            $U = &get_user('U',$D) or next;
            $F = &login_check($U,1) ? 1 : 0;
            $F = 2 if $U->{gl} < $OL{$K}{sp};
            if (!$F) {
                &change_status($U,'gl',-$OL{$K}{sp});
                &delete_place($U);
                $U->{pl} = $OL{$K}{go};
                &set_place($U);
            }
            $U->{ab} = '';
            &set_user($U);
            if ($F == 2) {
                &set_record("乗船料金が払えず、船に乗ることができませんでした。");
            }
            elsif ($F == 1) {
                &set_record("ログイン中だったため、船に乗ることができませんでした。");
            }
            else {
                &set_record("$OL{$K}{pl}に移動しました。<br>乗船料として$OL{$K}{sp} $set::mnyを支払いました。");
            }
        }
    }
    &write_dat("$set::dat_dir/oceanliner_passenger.cgi");
}
library/mine.cgi: sub mine_after
採掘データファイルの変更に伴う修正。
&break_checkの改造に伴う修正。
LIFの再表示を行わない。
追加
    require "$set::lib_dir/find.cgi";
    require "$set::dat_dir/mine_catalog.cgi";

修正前
    $V = $I->{Sk}{Gm} ? 'gs' : 'or';
修正後
    $V = $I->{Sk}{Gm} ? 'mine_gold' : 'mine_ore';

修正前
    &say("$I->{Pl}{nm}の$I->{Sp}{Mn}{nm}は閉鎖しています",'CLOSE') if !$I->{Pl}{$V};
    &say("$I->{Pl}{nm}の$I->{Sp}{Mn}{nm}は閉鎖しています",'CLOSE') unless -e "$set::itm_dir/$I->{Pl}{$V}";
修正後
    &say("$I->{Pl}{nm}の$I->{Sp}{Mn}{nm}は閉鎖しています",'CLOSE') unless $CA{$I->{pl}};

修正前
    if ($I->{Rh}{ql}{Mn}) {
        &reload_data('rh') if &break_check('rh');
    }
    else {
        &reload_data('sb') if &break_check('sb');
    }
    &reload_data('lh') if &break_check('lh');
修正後
    $I->{Rh}{ql}{Mn} ? &break_check($I,'rh') : &break_check($I,'sb');
    &break_check($I,'lh');

修正前
    &reload_gage(['vt','lf'],'V');
修正後
    &reload_gage('vt','V');
library/new.cgi: sub regist_check
ロックに関係した修正。
修正前
        $U = &get_user('A',$_);
修正後
        $U = &get_user('A',$_,'unlocked');
library/orb.cgi: sub orb_before
オーブのトレード設定にコマンドを追加。
武器にオーブをセットするフォームを削除。
追加
    <br>
    <input type=checkbox name=ta> 一個ずつ残してそれ以外はトレード<br>
    <input type=checkbox name=tn> リセット<br>
    <div class=r>$set::but{OK}</div>

削除
    <br>
    <form method=post action=$set::cgi_url>
    装備中の武器に$set::orb{x}をセットする<br>
    装備中の武器:$I->{Rh}{nm}<br>
    <br>
    <tt>$set::orb{x}を選択して下さい:
    <select name=ob class=select>$t2</select>
    </tt><br>
    <br>
    <div class=r><tt>一度セットした$set::orb{x}は取り外せません。</tt><br>
    <br>
    $set::but{OK}</div>
    <input type=hidden name=md value="orb_set">
    <input type=hidden name=id value="$F{id}">
    <input type=hidden name=ps value="$F{ps}">
    <input type=hidden name=xx value="$I->{XX}">
    </form>
library/orb.cgi:
サブルーチンを削除
# Sub Orb Set #
sub orb_set {
    &say('未実装','orb_before');
}

library/pack.cgi: sub pack
パックしたアイテムの予約登録データが解除されない不具合を修正。
効果が異なるアイテムはパックできないよう修正。
選択されていない時はメッセージを表示。
削除
my ($id,$gd,$ql);

修正前
        if ($id) {
修正後
        if ($Ui) {

修正前
            &say("同じものしかパックできません",$F{fl}) if $id ne $Ii->{id} || $ql ne $Ii->{ql};
修正後
            &say("同じものしかパックできません",$F{fl}) if $Ui->{id} ne $Ii->{id} || $Ui->{ql} ne $Ii->{ql} || $Ui->{ef} ne $Ii->{ef};

修正前
            &say("同じグレードの物しかパックできません",$F{fl}) if $gd != $Ii->{gd};
修正後
            &say("同じグレードの物しかパックできません",$F{fl}) if $Ui->{gd} != $Ii->{gd};

削除
            $id = $Ii->{id};
            $gd = $Ii->{gd};
            $ql = $Ii->{ql};

修正前
    $Ui->{sp} = '';
修正後
    &say("アイテムが選択されていません",$F{fl}) if !$Ui;

    $Ui->{sp} = $Ui->{rs} = '';
library/partner.cgi: sub partner_examine
ロックに関係した修正。
修正前
    $S = &get_user('A',$V) if $V;
修正後
    $S = &get_user('A',$V,'unlocked') if $V;
library/playerlist.cgi: sub playerlist
オーブを纏めて表示する。
対戦を受け付けているプレイヤーは▲で表示。
ロックに関係した修正。
ログインチェックの第二引数を1か0に統一する。
追加
my %unique;

修正前
        $U = &get_user('U',$_) or next;
修正後
        $U = &get_user('U',$_,'unlocked') or next;

修正前
        $U->{Li} = &login_check($U,'noerror') ? '○' : '●';
修正後
        $U->{Li} = &login_check($U,1) ? '○' : $U->{vp} ? '▲' : '●';

修正前
        @{$U->{Ob}} = map { &orb_image($_) }
                     grep { /[a-z]/ } split(//,$U->{ob});
修正後
        undef %unique;
        @{$U->{Ob}} = map  { &orb_image($_).$unique{$_} }
                      grep { !$unique{$_}++ }
                      grep { /[a-l]/ } split(//,$U->{ob});
library/playerlist.cgi: sub playerlist_statistics
ロックに関係した修正。
修正前
        $U = &get_user('A',$_);
修正後
        $U = &get_user('A',$_,'unlocked');
library/playerlist.cgi: sub sales_information
販売しているペットは年齢を共に表示する。
アイテムの情報に画像と耐久力を追加する。
ロックに関係した修正。
修正前
        $U = &get_user('A',$_);
修正後
        $U = &get_user('A',$_,'unlocked');

修正前
        $T->{nm} .= "+$T->{pl}" if $T->{pl};
        $T->{nm} .= " x $T->{qn}" if $T->{qn} > 1;
修正後
        &playerlist_decorate_item($T);
library/playerlist.cgi:
サブルーチンを追加。
サブルーチンを新たに追加する
# Ranking #
sub ranking {
my ($i,$j,$K,@L,%t0,$t0,$t1,$t2);

    &transfer_HTML($set::rnk_htm) if !&schedule_monitor(3);

    @L = map { &get_user('A',$_,'unlocked') } &get_allusersID();

    $t0 = <<"    END_OF_HTML";
    <tr>
    <th>位</th>
    <th>ID</th>
    <th nowrap>名前</th>
    <th>性</th>
    <th nowrap>職業</th>
    <th nowrap>ギ</th>
    <th>勝</th>
    <th>負</th>
    <th>殺</th>
    <th>死</th>
    <th nowrap>Rate</th>
    <th width=100%>コメント</th>
    </tr>
    END_OF_HTML

    %t0 = ( 'rt' => 'Rate',
            'wn' => '勝利数',
            'ls' => '敗北数',
            'kl' => '殺害数',
            'dt' => '死亡数',
            'gl' => '所持金' );

    foreach $K ('rt','wn','ls','kl','dt','gl') {
        @L = sort { $b->{$K} <=> $a->{$K} } @L;

        $t1 .= "<tr><th colspan=12 class=heading>$t0{$K}</th></tr>\n";
        $t1 .= $t0;

        for $i (0 .. $#L) {
            last if $i > $set::rnn;
            $U = $L[$i];
            $j = $i + 1 if !$i || $L[$i]{$K} != $L[$i-1]{$K};
            $j = "<span class=alert>$j</span>" if $j <= 3;
            $U->{gu} &&= "<img src=$set::mim_dir/guild$U->{gu}.gif>";
            $t1 .= qq|<tr>|;
            $t1 .= qq|<td nowrap align=right>$j</td>|;
            $t1 .= qq|<td>$U->{id}</td>|;
            $t1 .= qq|<td nowrap>$U->{nm}</td>|;
            $t1 .= qq|<td><img src=$set::mim_dir/$U->{sx}.gif></td>|;
            $t1 .= qq|<td nowrap>$U->{jb}</td>|;
            $t1 .= qq|<td>$U->{gu}</td>|;
            $t1 .= qq|<td>$U->{wn}</td>|;
            $t1 .= qq|<td>$U->{ls}</td>|;
            $t1 .= qq|<td>$U->{kl}</td>|;
            $t1 .= qq|<td>$U->{dt}</td>|;
            $t1 .= qq|<td nowrap>$U->{rt}</td>|;
            $t1 .= qq|<td>$U->{w1}</td>|;
            $t1 .= qq|</tr>\n|;
        }
    }

    $t2  = &header(CSS=>'list',GetTag=>1);
    $t2 .= "<table>\n$t1</table>\n";
    $t2 .= &footer(GetTag=>1);
    &write_dat($set::rnk_htm,$t2);
    &transfer_HTML($set::rnk_htm);
}

サブルーチンを新たに追加する
# Sub Playerlist Decorate Item #
sub playerlist_decorate_item {
my  $Si = shift;

    $Si->{nm} .= ' ('. &get_passage($Si->{bt},$set::pyt) . '歳)' if $Si->{bt};
    $Si->{nm} .= "+$Si->{pl}" if $Si->{pl};
    $Si->{nm} .= "[$Si->{db}]" if $Si->{db};
    $Si->{nm} = "<span class=i$Si->{gd}>$Si->{nm}</span>" if $Si->{gd};
    $Si->{nm} = "<span class=Ex>Ex</span>".$Si->{nm}      if $Si->{Ql}{Ex};
    $Si->{nm} = "<span class=broken>死んだ</span>".$Si->{nm} if $Si->{bt} && &get_passage($Si->{bt},$set::pyt) > $Si->{ls};
    $Si->{nm} = &item_image($Si).$Si->{nm};
    $Si->{nm} .= " x $Si->{qn}" if $Si->{qn} > 1;
}
library/price.cgi: sub price_after
販売枠の数以上に値段設定できてしまうバグを修正。
修正前
        if (exists $F{$i}) {
            $Ii->{qn} = 1 if $F{fl} eq 'pet';
            if (!$F{$i}) { $Ii->{sp} = $Ii->{rs} = '' }
            elsif ($I->{Sl} >= $I->{vx}) { &M("$Ii->{nm}:これ以上は販売できません。") }
            elsif ($F{$i} =~ /\D/) { &M("$Ii->{nm}:数値以外は使用出来ません。") }
            elsif ($F{$i} < $Ii->{bp} * $Ii->{qn} + $set::lip) { &M("$Ii->{nm}:設定価格が最低販売価格を下回っています。") }
            else {
                $Ii->{sp} = $F{$i};
                &M("$Ii->{nm}:値段を設定しました。");
            }
        }
修正後
        if (exists $F{$i}) {
            $Ii->{qn} = 1 if $F{fl} eq 'pet';
            $Ii->{sp} = $Ii->{rs} = '';
            next if !$F{$i};
            if ($I->{Sl} >= $I->{vx}) {
                &M("$Ii->{nm}:これ以上は販売できません。");
            }
            elsif ($F{$i} =~ /\D/) {
                &M("$Ii->{nm}:数値以外は使用出来ません。");
            }
            elsif ($F{$i} < $Ii->{bp} * $Ii->{qn} + $set::lip) {
                &M("$Ii->{nm}:設定価格が最低販売価格を下回っています。");
            }
            else {
                $Ii->{sp} = $F{$i};
                &M("$Ii->{nm}:値段を設定しました。");
            }
        }
library/repair.cgi:
汎用性を持たせる。
全置換
    'bag' を $F{fl} に全て置換
library/river.cgi: sub river
釣りに合わせてフォームで送るデータを修正する。
修正前
    <input type=hidden name=fl value="rv">
修正後
    <input type=hidden name=fl value="river">
library/sell.cgi: sub sell_after
デラックス品に関係するプログラムを修正する。
修正前
            $Ii->{Ql}{Dx} = $Ii->{sp} = $Ii->{rs} = '';
修正後
            $Ii->{sp} = $Ii->{rs} = '';
library/shopping.cgi:
市場で販売しているアイテムのファイルを一つに纏める。
市場の販売価格を市場買取価格と同額にする。
追加
require "$set::lib_dir/status.cgi";
require "$set::dat_dir/market_item_catalog.cgi";
require "$set::itm_dir/market_sale_item.cgi";
library/shopping.cgi: sub shopping_before
市場で販売しているアイテムのファイルを一つに纏める。
修正前
    &say("$I->{Sp}{Mk}{nm}は閉まっています",'market') unless -e "$set::itm_dir/$I->{Pl}{mk}";
修正後
    &say("$I->{Sp}{Mk}{nm}は閉まっています",'market') unless exists $IC{$I->{pl}};

削除
    require "$set::itm_dir/$I->{Pl}{mk}";

修正前
    foreach $Ui (@FI) {
修正後
    foreach $Ui (@{$IC{$I->{pl}}}) {
        $Ui = $FI{$Ui};

修正前
        $Ui->{Sp} = int($Ui->{bp} * $set::mtp + $set::mpp);
修正後
        $Ui->{Sp} = $Ui->{bp};
library/shopping.cgi: sub shopping_after
市場で販売しているアイテムのファイルを一つに纏める。
市場の販売価格を市場買取価格と同額にする。
細かい修正。
削除
    &get_place($I);

    require "$set::itm_dir/$I->{Pl}{mk}";

修正前
    foreach $Ui (@FI) {
修正後
    foreach $Ui (@{$IC{$I->{pl}}}) {
        $Ui = $FI{$Ui};

修正前
            $Ui->{Sp} = int(($Ui->{bp} * $set::mtp + $set::mpp) * $I->{Ap}) * $F{hm};
修正後
            $Ui->{Sp} = int($Ui->{bp} * $I->{Ap}) * $F{hm};

削除
            &get_quality($Ui);

修正前
            if ($Ui->{cl} ne 'Fd' && $Ui->{cl} ne 'Mt') {
修正後
            if (&item_class_check($Ui) ne 'M') {
library/stance.cgi: sub stance_before
ガードがいる場所で対戦を受け付けるかどうかを設定できるようにする。
追加
    $I = &get_user('I');

    $I->{vp} ||= 0;

追加
    新しい設定値:<input type=text name=sc class=textbox size=3 value="$I->{sc}"><br>
    <br>
    <tt>ガードがいる場所でも対戦を受け付けるかどうかを設定します。</tt><br>
    <tt>回数が0の場合は対戦を受け付けません。</tt><br>
    受け付ける回数:<input type=text name=vp class=textbox size=2 value="$I->{vp}"><br>
library/stance.cgi: sub stance_after
同上。
追加
    &say("半角数字以外は使用できません",'stance_before') if $F{fc} =~ /[^\d]/ || $F{vp} =~ /[^\d]/;

追加
    $I->{sc} = $F{sc};
    $I->{vp} = $F{vp};
library/takeoff.cgi: sub takeoff
存在しない'of','df'の再表示を行わない。
ダンジョン用に改造。
削除
        &reload_data('of') if $Ii->{eq} eq 'rh';
        &reload_data('df') if $Ii->{cl} eq 'Ar';

修正前
    &say($I->{M},'bag','Reload');
修正後
    &say($I->{M},$F{fl},'Reload');
library/takeoff.cgi: sub takeoff_all
存在しない'of','df'の再表示を行わない。
ダンジョン用に改造。
削除
    &reload_data('of');
    &reload_data('df');

修正前
    &say('全装備品を解除しました','bag','Reload');
修正後
    &say('全装備品を解除しました',$F{fl},'Reload');
library/transfer.cgi: sub transfer_before
服により移動費を減額する処理を入れる。
追加
    &transfer_vitality;
    &dress_bonus;
library/transfer.cgi: sub transfer_after
同上。
追加
    &transfer_vitality;
    &dress_bonus(1);

修正前
    &say("$I->{Pl}{nm}に移動しました",'transfer_before','Reload');
修正後
    &M("$I->{Pl}{nm}に移動しました。");
    &say($I->{M},'transfer_before','Reload');
library/transfer.cgi:
サブルーチンを追加する。
サブルーチンを新たに追加
# Sub Dress Bonus #
sub dress_bonus {
my  $F = shift; # Break check or not

    &get_equipment($I,'bd');

    return if $I->{Bd}{cl} ne 'Ds';

    $set::tmn -= int($I->{Bd}{ef} / 5 * 2);
    $set::tmn -= $set::grd[$I->{Bd}{gd}];

    return if !$F;

    require "$set::lib_dir/break.cgi";
    &break_check($I,'bd');
}
library/use.cgi: sub use
ダンジョン用に改造。
修正前
    &say($I->{M},'bag','Reload');
修正後
    &say($I->{M},$F{fl},'Reload');
library/use.cgi: sub type_expendable
ゲージの再表示でEXPとGを除外する。
追加
            next if $K =~ /^(gl|ex)$/;
            &reload_gage($K,$V);
library/yield.cgi: sub yield
家畜が日々生産するアイテムの量が正しく計算されていない不具合を修正。
牛飼い以外は取得できる生産品の量を1/2にする。
修正前
my  $Ii;
修正後
my ($Ii,$Ui);

削除
my  $dice;
my  $percent;

修正前
    &get_bonus($I,'Br');
修正後
    $I->{bonus} = $I->{Sk}{Br} ? 1 : 0.5;

修正前
        $percent = $Ip->{hg} / $Ip->{hx} * 100 * $I->{bonus} + $I->{dx};

        foreach $Ii (@{$FI{$Ip->{nm}}}) {
            &error('Yield Error') if $time > 30;
            for $j (1 .. $time) {
                $dice = &roll_dice(100);
                if ($dice <= $percent) {
                    last if $j * $Ii->{wt} + $I->{bg} > $I->{Mbg};
                    $Ii->{qn} = $j;
                }
            }

            &M("$Ii->{nm}の収穫はありません。") && next if !$Ii->{qn};
            &say("荷物スロットに空きがありません",'pet') if @{$I->{Bg}} >= $I->{bs};

            push (@{$I->{Bg}},{%$Ii});

            $I->{bg} += $Ii->{qn} * $Ii->{wt};

            $Ii->{Im} = &item_image($Ii);

            &M("$Ii->{Im}$Ii->{nm}を$Ii->{qn}つ手に入れました。");
        }
修正後
        foreach $Ii (@{$FI{$Ip->{nm}}}) {
            $Ui = {%$Ii};
            $Ui->{qn} = int($Ii->{qn} * $time * $I->{bonus} * $Ip->{hg} / $Ip->{hx} + 0.5);

            &M("$Ii->{nm}の収穫はありません。") && next if !$Ui->{qn};
            &say('重すぎて持てません','pet') if $Ui->{qn} * $Ii->{wt} + $I->{bg} > $I->{Mbg};
            &say('荷物スロットに空きがありません','pet') if @{$I->{Bg}} >= $I->{bs};

            push (@{$I->{Bg}},$Ui);

            $I->{bg} += $Ui->{qn} * $Ii->{wt};

            $Ii->{Im} = &item_image($Ii);

            &M("$Ii->{Im}$Ii->{nm}を$Ui->{qn}つ手に入れました。");
        }
set.cgi
修正
$lky = 1;                    # ファイルのロック(no=0 mkdir=1 symlink=2)

修正
# 市場 Market ######################################## #
$mix = 20;                   # 闇市の1アイテム在庫数最大値
$mpp = 0;                    # 闇市の販売価格(最低販売価格に加算する額)
$mtp = 2.0;                  # 闇市の販売価格(最低販売価格の何倍で売るか)

追加
# プレイヤーデータ設定 Player's Data ################# #
$mob = 24;                   # オーブに所持上限をつける(yes=上限値,no=0)
$fcp = 500;                  # イメージ画像変更料金

追加
# 戦闘 Fight ######################################### #
$mim = 1;                    # モンスター画像を使用する(yes=1,no=0)

修正
# 合成 Compose ####################################### #
$erb = 5;                    # エクセレントロールとダブルロールの基本成功率
$ddu = 2;                    # ダブルロールで作成されるアイテムの数

追加
# ダンジョン Dungeon ################################# #
$dvt = 5;                    # ダンジョンの探索で消費するVIT

追加
# その他 Others ###################################### #
$rnn = 20;                   # ランキングで一項目毎に表示する人数

削除
# ラベルデータ Label Data ############################ #
        'of' => '攻撃力',
        'df' => '防御力',

追加
# ユーザーデータ User Data ########################### #
        'vp', # 対戦受付フラグ   Versus Player
        'dg', # ダンジョンデータ Dungeon Data

追加
# パス Path ########################################## #
$dgn_dir = './dungeon';         # dungeonディレクトリ(700,707,777)
$rnk_htm = './ranking.html';    # ranking.html

manualファイルの差し替え
aromor.html
beginner.html
item01.html
item02.html
item03.html
menu.html
nutrition.html
weapon.html
CSSファイルの差し替え
sos3.css
libraryファイルの追加
dungeon.cgi
dye.cgi
face.cgi
item.cgi
roast.cgi
データファイルの差し替え
data/itemdictionary.cgi
data/place.cgi
item/arms.cgi
item/bread.cgi
item/cloth.cgi
item/clothes.cgi
item/crops.cgi
item/dairyproduct.cgi
item/dish_other.cgi
item/dish_sandwich.cgi
item/dish_soup.cgi
item/dish_sweets.cgi
item/drug.cgi
item/liquor.cgi
item/leathercraft.cgi
item/monster_cov.cgi
item/monster_gho.cgi
item/monster_ven.cgi
item/product.cgi
item/vessel.cgi
item/woodwork.cgi
データファイルを追加
data/farm_item_catalog.cgi          # どの農場でどのアイテムが売られているかを設定しているファイル (644)
data/farm_livestock_catalog.cgi     # どの農場でどのペットが売られているかを設定しているファイル (644)
data/find_item_catalog.cgi          # どの探索場所でどのアイテムが何%の確率で手に入るかを設定しているファイル (644)
data/find_monster_catalog.cgi       # どの探索場所でどのモンスターが何%の確率で出現するかを設定しているファイル (644)
data/forest_animal_catalog.cgi      # どの森でどの動物が何%の確率で出現するかを設定しているファイル (644)
data/forest_berry_catalog.cgi       # どの森でどの果実が何%の確率で採取できるかを設定しているファイル (644)
data/forest_dye_catalog.cgi.cgi     # どの森でどの染料が何%の確率で採取できるかを設定しているファイル (644)
data/forest_herb_catalog.cgi        # どの森でどの薬草が何%の確率で採取できるかを設定しているファイル (644)
data/forest_wood_catalog.cgi        # どの森でどの材木が何%の確率で伐採できるかを設定しているファイル (644)
data/harbor_fish_catalog.cgi        # どの港でどの魚が何%の確率で獲れるかを設定しているファイル (644)
data/itemdata.cgi                   # アイテム作成で重さと金額と栄養素を自動で計算させる為のデータファイル (644)
data/market_item_catalog.cgi        # どの市場でどのアイテムが売られているかを設定しているファイル (644)
data/mine_catalog.cgi               # どの鉱山でどのインゴットが何%の確率で手に入るかを設定しているファイル (644)
data/oceanliner_passenger.cgi       # 定期船に予約が入る度にプレイヤーのIDを保存するファイル (606)
data/oceanliner_ship.cgi            # 定期船のファイル (644)
data/river_fish_catalog.cgi         # どの川でどの魚が何%の確率で獲れるかを設定しているファイル (644)
dungeon/dungeon_fir.cgi             # フィル・ドゥ・ヌイのダンジョンファイル (644)
dungeon/dungeon_fir_monster.cgi     # フィル・ドゥ・ヌイのダンジョンモンスターファイル (644)
item/dungeon_item.cgi               # ダンジョン内で手に入るアイテムデータを格納したファイル (644)
item/farm_sale_item.cgi             # 農場で売っている全てのアイテムデータを格納したファイル (644)
item/farm_sale_livestock.cgi        # 農場で売っている全ての家畜のデータを格納したファイル (644)
item/find_item.cgi                  # 探索で手に入るアイテムのデータファイル (644)
item/forest_animal.cgi              # 森の動物のデータファイル (644)
item/forest_berry.cgi               # 果実アイテムのデータファイル (644)
item/forest_dye.cgi                 # 染料のデータファイル (644)
item/forest_herb.cgi                # 薬草アイテムのデータファイル (644)
item/forest_wood.cgi                # 材木アイテムのデータファイル (644)
item/hat.cgi                        # 帽子アイテムのデータファイル (644)
item/market_sale_item.cgi           # 市場で売っている全てのアイテムデータを格納したファイル (644)
item/mine_gold.cgi                  # 金鉱のインゴットアイテムのデータファイル (644)
item/mine_ore.cgi                   # 鉄鉱のインゴットアイテムのデータファイル (644)
item/monster_tow.cgi                # 暗黒の塔のモンスターデータを格納したファイル (644)
item/river_fish.cgi                 # 川魚のファイル (644)
place/tow.cgi                       # 暗黒の塔にいるプレイヤーのIDを保存する空ファイル (606)
データファイルを削除
item/farm_livestock_all.cgi
item/farm_sale_all.cgi
item/farm_sale_all2.cgi
item/find_item_all.cgi
item/find_item_all2.cgi
item/forest_berry_all.cgi
item/forest_herb_all.cgi
item/forest_hunting_all.cgi
item/forest_wood_all.cgi
item/market_sale_bat.cgi
item/market_sale_fir.cgi
item/market_sale_lyn.cgi
item/market_sale_mil.cgi
item/market_sale_qui.cgi
item/market_sale_thi.cgi
item/market_sale_uls.cgi
item/mine_gold_all.cgi
item/mine_ore_all.cgi
item/river_fish_all.cgi
アイテム画像を差し替え(itemimage/)
roastedchicken.gif
wood1.gif
wood4.gif
wood5.gif
wood6.gif
wood7.gif
wood8.gif
アイテム画像名を変更(itemimage/)
sautedfish.gif → sauteedfish.gif
メイン画像を追加(mainimage/)
g.gif
アイテム画像を追加(itemimage/)
aloe.gif
bonnet.gif
bratkartoffeln.gif
buttons.gif
camouflagedye.gif
capeline.gif
casquette.gif
checkdye.gif
cloche.gif
cutofcloth.gif
derbyhat.gif
dresspattern.gif
energydrink.gif
felthat.gif
flowerdye.gif
frenchtoast.gif
friedvegetables.gif
gratinsoup.gif
hamburgersteak.gif
herbchicken.gif
huntinghat.gif
icecream.gif
jaguardye.gif
knithat.gif
normalhelmet.gif
oceanliner.gif
paisleydye.gif
picturehat.gif
pointedhat.gif
polkadotdye.gif
pudding.gif
slouchhat.gif
springwater.gif
stripedye.gif
suede.gif
suedearmor.gif
suedeboots.gif
suedehelmet.gif
tophat.gif
workcap.gif



Copyright 2000-2007 Missing Link All Rights Reserved.