[Ver b2.0]
[Ver b1.4]
[Ver b1.3]
[Ver b1.2.1]
[Ver b1.1]
[Ver b1.0]
if ($I->{Sk}{Sm}) { $t2 .= qq|<option value="smokedfood=Sm">燻製を作る</option>\n| }
↓
if ($I->{Sk}{Sf}) { $t2 .= qq|<option value="smokedfood=Sf">燻製を作る</option>\n| }
Sm → Sf
作成で、不正なデータを送ることで殆ど全てのアイテムを作成できる不具合を修正します。
# Sub Compose #
sub compose {
↓
require "$set::dat_dir/compose.cgi";
# Sub Compose #
sub compose {
sub compose:
if ($I->{Sk}{Bs}) { $t2 .= qq|<option value="arms=Bs">鍛冶をする</option>\n| }
if ($I->{Sk}{Tk}) { $t2 .= qq|<option value="silverwork=Tk">宝飾品を作る</option>\n| }
if ($I->{Sk}{Ck}) { $t2 .= qq|<option value="dish_soup=Ck">調理する(スープ)</option>\n| }
if ($I->{Sk}{Ck}) { $t2 .= qq|<option value="dish_sandwich=Ck">調理する(サンドイッチ)</option>\n| }
if ($I->{Sk}{Ck}) { $t2 .= qq|<option value="dish_sweets=Ck">調理する(菓子)</option>\n| }
if ($I->{Sk}{Ck}) { $t2 .= qq|<option value="dish_other=Ck">調理する(その他)</option>\n| }
if ($I->{Sk}{Bg}) { $t2 .= qq|<option value="liquor=Bg">飲物を作る</option>\n| }
if ($I->{Sk}{Wv}) { $t2 .= qq|<option value="cloth=Wv">布を織る</option>\n| }
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}{Tl}) { $t2 .= qq|<option value="leathercraft=Tl">革製品を作る</option>\n| }
if ($I->{Sk}{Pl}) { $t2 .= qq|<option value="crops=Pl">農作物を作る</option>\n| }
if ($I->{Sk}{Dp}) { $t2 .= qq|<option value="dairyproduct=Dp">乳製品を作る</option>\n| }
if ($I->{Sk}{By}) { $t2 .= qq|<option value="bread=By">パンを焼く</option>\n| }
if ($I->{Sk}{Sm}) { $t2 .= qq|<option value="smokedfood=Sm">燻製を作る</option>\n| }
if ($I->{Sk}{Ca}) { $t2 .= qq|<option value="woodwork=Ca">木工製品を作る</option>\n| }
if ($I->{Sk}{Vt}) { $t2 .= qq|<option value="animaldrug=Vt">動物薬を作成する</option>\n| }
if ($I->{Sk}{Ph}) { $t2 .= qq|<option value="drug=Ph">調剤する</option>\n| }
if ($I->{Sk}{Cu}) { $t2 .= qq|<option value="preparation=Cu">治療の準備をする</option>\n| }
↓
foreach (sort { $CO{$a}{n} <=> $CO{$b}{n} } keys %CO) {
$t2 .= qq|<option value="$_">$CO{$_}{lab}</option>\n| if $I->{Sk}{$CO{$_}{sk}};
}
sub compose:
<select id=type style="visibility:visible" name=tp class=select>
↓
<select id=type style="visibility:visible" name=fi class=select>
sub compose_before:
($K,$V) = split(/=/,$F{tp});
&error('未実装') if ! -e "$set::itm_dir/$K.cgi";
require "$set::itm_dir/$K.cgi";
↓
&error('不正なエラー') if !$F{fi} || $F{fi} =~ /[^a-z_]/;
&error('Compose Skill Error') if $CO{$F{fi}}{sk} && !$I->{Sk}{$CO{$F{fi}}{sk}};
&error('未実装') if ! -e "$set::itm_dir/$F{fi}.cgi";
require "$set::itm_dir/$F{fi}.cgi";
sub compose_before:
<input type=hidden name=fi value="$K">
<input type=hidden name=sk value="$V">
↓
<input type=hidden name=fi value="$F{fi}">
sub compose_after:
&error('Compose Skill Error') if $F{sk} && !$I->{Sk}{$F{sk}};
↓
&error('Compose Skill Error') if $CO{$F{fi}}{sk} && !$I->{Sk}{$CO{$F{fi}}{sk}};
sub compose_after:
$Ui = $FI[$F{ci}-1];
$Ui->{dt}{qn} ||= 1;
↓
$Ui = $FI[$F{ci}-1];
$Ui->{dt}{qn} ||= 1;
&error('不正なエラー') unless &creativity_check($I,$Ui);
以下を compose.cgi という名前で data フォルダに保存
# --------------------------------------------------- #
# Script of Saga III Compose.cgi Version 1 (2.1)
#
# --------------------------------------------------- #
# 作成設定
# n = ラベルの番号。1から順に並ぶ。
# sk = 作成に必要なスキル。
# lab = リストのラベル。
%CO = (
'arms' => { n => 1, sk => 'Bs', lab => '鍛冶をする' },
'silverwork' => { n => 2, sk => 'Tk', lab => '宝飾品を作る' },
'dish_soup' => { n => 3, sk => 'Ck', lab => '調理する(スープ)' },
'dish_sandwich' => { n => 4, sk => 'Ck', lab => '調理する(サンドイッチ)' },
'dish_sweets' => { n => 5, sk => 'Ck', lab => '調理する(菓子)' },
'dish_other' => { n => 6, sk => 'Ck', lab => '調理する(その他)' },
'liquor' => { n => 7, sk => 'Bg', lab => '飲物を作る' },
'cloth' => { n => 8, sk => 'Wv', lab => '布を織る' },
'hat' => { n => 9, sk => 'Tl', lab => '帽子を作る' },
'clothes' => { n => 10, sk => 'Tl', lab => '服を作る' },
'leathercraft' => { n => 11, sk => 'Tl', lab => '革製品を作る' },
'crops' => { n => 12, sk => 'Pl', lab => '農作物を作る' },
'dairyproduct' => { n => 13, sk => 'Dp', lab => '乳製品を作る' },
'bread' => { n => 14, sk => 'By', lab => 'パンを焼く' },
'smokedfood' => { n => 15, sk => 'Sf', lab => '燻製を作る' },
'woodwork' => { n => 16, sk => 'Ca', lab => '木工製品を作る' },
'animaldrug' => { n => 17, sk => 'Vt', lab => '動物薬を作成する' },
'drug' => { n => 18, sk => 'Ph', lab => '調剤する' },
'preparation' => { n => 19, sk => 'Cu', lab => '治療の準備をする' },
);
# --------------------------------------------------- #
1;
対人の買い物で、個数指定販売でない場合に重量の表示が正しくない不具合を修正します。
sub decorate_item:
$Y *= $W if $F == 1;
↓
$Y *= $W if $F == 1;
$Z *= $W if $T == 2;
地図で、現在地通知設定を「フレンドにのみ通知」にしていても全てのプレイヤーに現在地を知られてしまう不具合を修正します。
sub map:
$Z = (split(/,/,$U->{fr},2))[0];
push(@{$V{$U->{pl}}},[$U->{id},$U->{nm},$U->{sx}.'f']) if $Z eq 'on' || $Z eq 'only' && grep { (split /\//)[0] eq $U->{id} } @FR;
↓
($Z,@{$U->{Fr}}) = split(/,/,$U->{fr});
push(@{$V{$U->{pl}}},[$U->{id},$U->{nm},$U->{sx}.'f']) if $Z eq 'on' || $Z eq 'only' && grep { (split /\//)[0] eq $I->{id} } @{$U->{Fr}};
相手のフレンドリストに自分がいるかを探さないといけないのに自分のリストから相手を探すというぼけたことをしてました…すみません
インフォメーション作成で文字実体参照が使えるように(問題が起こりそうなのでやらないほうがいいかも)
sub edit_information:
$t1 =~ s/<br>/\n/g;
↓
$t1 =~ s/<br>/\n/g;
$t1 =~ s/&/&/g;
sub make_information:
$F{in} =~ s/</</g;
$F{in} =~ s/>/>/g;
↓
$F{in} =~ s/</</g;
$F{in} =~ s/>/>/g;
$F{in} =~ s/&/&/g;
sub decode:
$V =~ s/</</g;
$V =~ s/>/>/g;
↓
$V =~ s/&/&/g;
$V =~ s/</</g;
$V =~ s/>/>/g;
sub rights:
print qq|<a href="#" onClick="GetView('creators')">$creators_label</a>\n| if !$set::stv;
↓
print qq|<a href="#" onClick="GetView('creators');return false">$creators_label</a>\n| if !$set::stv;
sub login_check: my $T = shift; # true -> return true, false -> error ↓ my $T = shift; # mode -> say, true -> return true, false -> error
sub login_check:
if ($T) { return 1 }
↓
if ($T =~ /\D/) { &say("$S->{nm}は現在ログイン中です",$T) }
if ($T) { return 1 }
sub bounty_after:
&login_check($U);
↓
&login_check($U,'bounty_before');
sub buy_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub buy_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub contact_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub cure_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub cure_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub destone:
&login_check($U);
↓
&login_check($U,'contact_before');
sub fight_player:
&login_check($U);
↓
&login_check($U,'contact_before');
sub trade_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub trade_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub find:
&found($I,"monster_$I->{pl}",$set::fvt,'探索','つ手に入れました',0,'monster');
↓
&found($I,"monster_$I->{pl}",$set::fvt,'探索','つ手に入れました',1,'monster');
sub find:
&reload_data('gl') if !$I->{Pl}{ev}{Ms};
↓
&reload_data('gl');
# Sub Farm Before # ↓ require "$set::lib_dir/status.cgi"; # Sub Farm Before #
sub farm_before:
&dead_check($I,'CLOSE');
↓
&dead_check($I,'CLOSE');
&get_appearance($I);
sub farm_after:
$I = &get_user('I');
↓
$I = &get_user('I');
&get_appearance($I);
sub trade_before:
my $checked;
と
$checked = ' checked';
と
$checked = '';
を全て削除
sub trade_before:
$t1 .= qq|<input type=radio name=Iob class=radio value="$_"$checked> |;
↓
$t1 .= "<input type=checkbox name=I$_ class=checkbox> ";
$t1 .= "<input type=text size=2 name=tI$_ class=textbox value=1> ";
sub trade_before:
$t2 .= qq|<input type=radio name=Uob class=radio value="$_"$checked> |;
↓
$t2 .= "<input type=checkbox name=U$_ class=checkbox> ";
$t2 .= "<input type=text size=2 name=tU$_ class=textbox value=1> ";
sub trade_before:
<tt>それぞれトレードする$set::orb{x}を選択してください。</tt><br>
↓
<tt>それぞれトレードする$set::orb{x}にチェックを入れ、個数をあわせて$set::okbボタンを押してしてください。</tt><br>
sub trade_after:
sub trade_after {
↓
sub trade_after {
my ($t1,$t2);
my ($Itc,$Utc,$count);
sub trade_after:
unless ($I->{ob} =~ s/$F{Iob}// || $I->{ob} =~ s/$F{Iob}//i) { &say('トレードに失敗しました','trade_before') }
else { @{$I->{Ob}} = split(//,$I->{ob}.uc($F{Uob})) }
&set_orb($I);
unless ($U->{ob} =~ s/$F{Uob}//) { &say('トレードに失敗しました','trade_before') }
else { @{$U->{Ob}} = split(//,$U->{ob}.uc($F{Iob})) }
&set_orb($U);
↓
foreach ('a' .. 'l') {
$count = 0;
while ($F{"I$_"} && $count < $F{"tI$_"}) {
$I->{ob} =~ s/$_// || $I->{ob} =~ s/$_//i || &say("$U->{nm}に渡す$set::orb{$_}$set::orb{x}が足りません",'trade_before');
$t1 .= &orb_image($_);
$U->{ob} .= uc($_);
$Itc++;
$count++;
}
$count = 0;
while ($F{"U$_"} && $count < $F{"tU$_"}) {
$U->{ob} =~ s/$_// || &say("$I->{nm}に渡す$set::orb{$_}$set::orb{x}が足りません",'trade_before');
$t2 .= &orb_image($_);
$I->{ob} .= uc($_);
$Utc++;
$count++;
}
}
&say("トレードする$set::orb{x}の数が一致しません",'trade_before') if $Itc != $Utc;
@{$I->{Ob}} = split(//,$I->{ob});
@{$U->{Ob}} = split(//,$U->{ob});
&set_orb($I);
&set_orb($U);
sub trade_after:
lc $F{Iob};
lc $F{Uob};
&set_record("$I->{nm}が$set::orb{$F{Iob}}$set::orb{x}を$U->{nm}の$set::orb{$F{Uob}}$set::orb{x}とトレードしました。");
&get_words($U);
&partner('',"$set::orb{x}をトレードしました");
↓
&set_record("$I->{nm}が$set::orb{x}のトレードに来ました。<br>\n$t1:$I->{nm}の出した$set::orb{x}<br>\n$t2:$U->{nm}の出した$set::orb{x}");
&get_words($U);
&partner($U->{w10},"$set::orb{x}をトレードしました。<br>\n$t1:$I->{nm}の出した$set::orb{x}<br>\n$t2:$U->{nm}の出した$set::orb{x}");
# 合成 Compose ####################################### # $dex = 2; # ダブルロールに成功したときは獲得経験値をn倍にする
sub compose_after:
&double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} =~ /(Fd|Mt)/;
↓
&double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} =~ /(Fd|Mt)/;
$Ui->{ex} = int($Ui->{ex} * $set::dex) if $I->{DB};
sub double_roll:
$Si->{qn} *= $set::ddu;
↓
$Si->{qn} *= $set::ddu;
$S->{DB} = 1;
応用でエクセレントロールのときも出来ますね。
グレード2以上のアイテムを「木の板:G2」のように表示します。
色分けされていても分かりにくい時にやってみてください。
sub decorate_item:
$V = $Si->{Nm} ? $Si->{Nm} : $Si->{nm};
↓
$V = $Si->{Nm} ? $Si->{Nm} : $Si->{nm};
$V .= ":G$Si->{gd}" if $Si->{gd} > 1;