SoSII 修正

SoSII beta0.0 to 0.1 (修正箇所)

1.My Recordをメニューにも表示する選択機能。

注意:別ウィンドウでも開くようになりますが、パスワードがアドレスに表示されますのでご注意下さい。

Function add My Record to the menu bar.It will open a new window. But be careful. It will show the password on the adress bar.

File -> sos2.cgi

Add to the setup part.
$def_mr  = 0;          # My Recordをメニューにも表示する(yes=1,no=0)

Sub Routine -> menu

Before
print qq|<a href=$homurl $target>Return</a>|;

After
print qq|<a href=$homurl $target>Return</a>|;
print qq||<a href=$cgiurl?mode=my_record&id=$id&pass=$ps target=_blank>My Record</a>| if $def_mr;

2.プレイヤーリストのBountyとRateに非戦闘系は載せないようにする。

Not adding non-fighters at Bounty & Rate List.

File -> sos2.cgi
Sub Routine -> list_order

Before
%order = ('ID',$id,'Name',$nm,'Rate',$rt,'Money',$mn,'Bounty',$rw,'Job',$jb);

After
%order = ('ID',$id,'Name',$nm,'Rate',$rt,'Money',$mn,'Bounty',$rw,'Job',$jb);
next if $Fm{'order'} eq 'Bounty' && $sp !~ /Tf/;
next if $Fm{'order'} eq 'Rate'   && $sp !~ /Tf/;

3.クラスチェンジ可能な職業が複数だと反映されないというバグを修正。

Amend the error of class change when the jobs before are more than one doesn't reflect.

File -> ufs2.cgi
Sub Routine -> class_change

Before
if ($ujb eq $Fm{'ujb'}) {
	@ljbs = split(/,/,$uoj);
    last;
}

After
if ($ujb eq $Fm{'ujb'}) {
    $uoj  =~ s/,/\,/g;
    @ljbs = split(/,/,$uoj);
    last;
    }

Sub Routine -> re_upr

Before
if ($Fm{"uoj$_"} ne $uoj) { $uoj = $Fm{"uoj$_"} }

After
if ($Fm{"uoj$_"} ne $uoj) { $uoj = $Fm{"uoj$_"}; $uoj =~ s/,/\,/g }

4.旅芸人のデータを変更(レア装備できないエラー修正)。

Amend the data of itinerant entertainer.

File -> ufs2.cgi

Before
旅芸人<>Bw<><>道化師<>5000<><><><><>1<>1<>

After
旅芸人<>BwLi<><>道化師<>5000<><><><><>1<>1<>

SoSII beta0.1 to 0.2 (修正箇所)

1.ID順に並ばないという一部サーバ仕様エラーを修正。

Amend to get ID list in order( only who didn't have ID in order before).

File -> sos2.cgi
Sub Routine -> get_file

Before
@usrfile = grep /\.dat/,readdir(DIR);

After
@usrfile = sort grep /\.dat/,readdir(DIR);

2.攻撃力増加アイテム、防御力増加アイテムを略字があるのにも関わらず販売できないというバグを修正。

Amend the error can't sell item that has 'Oi' & 'Pi'.

File -> sos2.cgi
Sub Routine -> goods_after

Before
@INi  = ('Sw','Kn','Kt','Ax','Gv','Wd','Bw','Mi','Sh','Ar','Jw','Na','V',
         'Fd','Hb','Di','Lc','Ig','Rb','Bg','Ca','Ss','Yw','Ys','Ya','Yt');
@INs  = ('Zs','Zk','Zt','Zx','Zg','Zw','Zb','Zm','Zl','Za','Zj','Zq','Yv',
         'Zf','Zh','Zd','Zc','Zi','Zr','Zn','Zz','Zv','Yx','Yy','Yz','Yj');

After
@INi  = ('Sw','Kn','Kt','Ax','Gv','Wd','Bw','Mi','Sh','Ar','Jw','Na','V','Pi','Oi',
         'Fd','Hb','Di','Lc','Ig','Rb','Bg','Ca','Ss','Yw','Ys','Ya','Yt');
@INs  = ('Zs','Zk','Zt','Zx','Zg','Zw','Zb','Zm','Zl','Za','Zj','Zq','Yv','Zp','Zo',
         'Zf','Zh','Zd','Zc','Zi','Zr','Zn','Zz','Zv','Yx','Yy','Yz','Yj');

3.黒ごまとマイナス食品をかけ合わせたときにプラスにならないバグを修正。

Amend the error when you put minus items together.

File -> sos2.cgi
Sub Routine -> set_item

Before
$bp = $sts; $bp =~ tr/0-9//d; $bp .= int($iak);

After
$bp = $sts; $bp =~ tr/0-9\-//d; $bp .= int($iak);

4.接触相手のデータのdeadとpoisonに色をつけるように変更→設定部分で色を変えられます。

Put colors to the partner's data 'dead' & 'poison' when you contact.

File -> sos2.cgi

Add to the setup part.
$pznclr = 'purple';      # 接触相手のpoisonの色
$dedclr = 'red';         # 接触相手のdeadの色

Sub Routine -> partner_data

Before
print qq|状態:$pav<br>\n|;

After
$av_clr = $dedclr if $pav eq 'dead'; $av_clr = $pznclr if $pav eq 'poison';
print qq|状態:<font color=$av_clr>$pav</font><br>\n|;

5.質屋の自動売値設定にパーセンテージを追加。

Add percentage function to pawn broker's auto selling system.

File -> sos2.cgi

Add to the setup part.
$def_ap  = 10;		  # 買取品を自動で何%か上乗せして売る(yes=%,no=0)

Sub Routine -> set_item

Before
if ($Fm{"$_"}) {
    if ($pmn >= $pc) {
        if ($space || $sts =~ /Ti/ || $def_ad) {
            $pmn -= $pc; $mn += $pc;
            push (@msg,"$itemを売りました");
            $words .= "[$id] $nmから$itemを$pc\Gで買い取りました。";
            if ($sts =~ /Ti/) { $space++ }
            elsif ($def_as) { $pc += $def_as; push(@pitems,"$item△$sts△$pc") }
            else { push(@pitems,"$item△$sts") }
            $returnbag = 0; $space--;
            shift(@pitems) if $def_ad;
        } else { push (@msg,"$pnmは$itemを買う気がないようです") }
    } else { push (@msg,"$pnmは$itemを買うお金がありません") }
}

After
if ($Fm{"$_"}) {
    if ($pmn >= $pc) {
        if ($space || $sts =~ /Ti/ || $def_ad) {
            $pmn -= $pc; $mn += $pc;
            push (@msg,"$itemを売りました");
            $words .= "[$id] $nmから$itemを$pc\Gで買い取りました。";
            if ($sts =~ /Ti/) { $space++ }
            elsif ($def_ap || $def_as) {
                $pc += $def_as if $def_as;
                $pc += int($def_ap * $pc / 100) if $def_ap;
                push(@pitems,"$item△$sts△$pc");
            }
            else { push(@pitems,"$item△$sts") }
            $returnbag = 0; $space--;
            shift(@pitems) if $def_ad;
        } else { push (@msg,"$pnmは$itemを買う気がないようです") }
    } else { push (@msg,"$pnmは$itemを買うお金がありません") }
}

6.デフォルトのステラツィオ発見率を1%に変更。

Change the default percent of finding Stellatios.

File -> sos2.cgi

7.bit.datに切り札とダミー人形を追加。

Add item datas to bit.dat.

File -> bit.dat

切り札<>00050100Oi<>1<>
ダミー人形<>00080500Pi<>3<>

SoSII beta0.2 to Normal 1.0 (修正箇所)

1.聖職者に「観察」を使用したときに起こるタイムラグを修正。

Amend the problem when you use skill [観察] and contact priest.

File -> sos2.cgi
Sub Routine -> cure_revive

Before
@prclines = &get_partner("$Fm{'pd'}");

After
@prclines = &get_partner("$Fm{'pd'}");
($php,$ptm) = &hprecover($php,$pxp,$psp,$pav,$ptm,$pfg);

2.ステラツィオ設定時にNetscape及びIE5.5で起こるブラウザエラーの修正。

Amend the problem when you set stellatio using NN or IE5.5.

File -> sos2.cgi
Sub Routine -> stell_after

Before
foreach (0 .. $stellalength) {
    $initial = substr($is,$_,1);
    print "$initial";
    if ($Fm{$_}) { $initial = lc($initial) } else { $initial = uc($initial) }
    $newis .= $initial;
}

After
foreach (0 .. $stellalength) {
    $initial = substr($is,$_,1);
    if ($Fm{$_}) { $initial = lc($initial) } else { $initial = uc($initial) }
    $newis .= $initial;
}

SoSII 1.0 to 1.1 (修正箇所)

1.プログラム上でIDデータを取得していないときはMy Recordをメニューに表示しない。

Show MyRecord button on the menu only when the program acquired ID.

File -> sos2.cgi
Sub Routine -> menu

Before
print qq||<a href=$cgiurl?mode=my_record&id=$id&pass=$ps target=_blank>My Record</a>| if $def_mr;

After
print qq||<a href=$cgiurl?mode=my_record&id=$id&pass=$ps target=_blank>My Record</a>| if $def_mr && $id;

2.質屋が手動でレアアイテムに値段付けできないバグを修正。

Amend error when pawn broker set rare item's price by manual.

File -> sos2.cgi
Sub Routine -> goods_after

Before
if ($sts =~ /Li/ && $sp !~ /Li/) { push (@msg,"あなたはレアアイテムを売ることができません"); $price = '' }

After
if ($sts =~ /Li/ && $sp !~ /Li/ && $sp !~ /Pb/) { push (@msg,"あなたはレアアイテムを売ることができません"); $price = '' }

3.質屋が古いアイテムを順に捨てていく仕様を→Maxより多くなったら捨てるに変更($def_ad = 1のとき)。

Pawn broker will dump item when her items are more than her maximum level from now on. To use, you have to set $def_ad = 1

File -> sos2.cgi
Sub Routine -> sell_after

Before
shift(@pitems) if $def_ad;

After
shift(@pitems) if $def_ad && $#pitems >= $pxi;

4.UfSIIでキャラクターの個別設定をしたときのコメントの不具合(半角スペースを入れると切れる)を修正。

Amend the problem when you edit each charcters comment in UfSII.

File -> ufs2.cgi
Sub Routine -> edit_player

Before
print qq|<tr><td>コメント</td><td><input type=text size=60 name=cm value=$cm></td></tr>\n|;

After
print qq|<tr><td>コメント</td><td><input type=text size=60 name=cm value="$cm"></td></tr>\n|;

5.その他

Others.

bit.datの全てのレアアイテムからIe(壊れない)を外しました。
cjb.datのクラスチェンジ料金を(5000、10000) から(4000、8000)に変更しています。

SoSII 1.1 to 1.2 (修正箇所)

1.戦闘で引き分けた場合、MyRecordにIDが記録されない不具合を修正。

Put ID in My Record when fight ends by draw.

File -> sos2.cgi
Sub Routine -> fmsg

Before
'引',"$nmの挑戦を受けましたが、戦いは引き分けに終わりました。",

After
'引',"[$id] $nmの挑戦を受けましたが、戦いは引き分けに終わりました。",

2.質屋は最低販売価格にに関係なく値段設定ができるように変更。

Pawn Broker can set free price regardless of minimum goods price.

File -> sos2.cgi
Sub Routine -> goods_after

Before
elsif ($def_gp && $Fm{"T$x"} < $pc) { push (@msg,"$itemの最低販売価格は$pc\Gです"); $price = '' }

After
elsif ($def_gp && $Fm{"T$x"} < $pc && $sp !~ /Pb/) { push (@msg,"$itemの最低販売価格は$pc\Gです"); $price = '' }

3.表記ミスの修正。

Amend misprint.

File -> sos2.cgi
Sub Routine -> note_before

Before
push (@msg,"[$Fm{'pd'}] 相手に手紙をを書くことができます");

After
push (@msg,"[$Fm{'pd'}] 相手に手紙を書くことができます");

4.手紙を送る前に相手のIDが存在するかチェックする。

Check partner's ID before the mail is sent.

File -> sos2.cgi
Sub Routine -> note_before

Before
@rcdlines = &get_user("$Fm{'id'}");

After
@rcdlines = &get_user("$Fm{'id'}");
&get_partner("$Fm{'pd'}");

5.不正対策→毎回パスワードを参照するよう修正。

Check password everytime. Step for cheeting game.

File -> sos2.cgi
Sub Routine -> OKbuttoninform

Before
print qq|<input type=hidden name=pd value="$Fm{'pd'}">\n| if $_[0] =~ /o/;

After
print qq|<input type=hidden name=pd value="$Fm{'pd'}">\n| if $_[0] =~ /o/;
print qq|<input type=hidden name=ps value="$Fm{'ps'}">\n|;

Sub Routine -> get_user

Before
$av,$wn,$lz,$dt,$mn,$bg,$xi,$tm,$lf,$fe,$cm,$is,$ht,$fg,$rw,$kl) = split(/<>/,$_[0]);

After
$av,$wn,$lz,$dt,$mn,$bg,$xi,$tm,$lf,$fe,$cm,$is,$ht,$fg,$rw,$kl) = split(/<>/,$_[0]);
&error("パスワードが違います") if $Fm{'ps'} ne $ps && $Fm{'ps'} ne $admpas && $Fm{'mode'} ne 'make_con';

Sub Routine -> make_con

Before
&error("パスワードが間違っています") if $ps ne $Fm{'pass'} && $Fm{'pass'} ne $admpas;

After
&error("パスワードが間違っています") if $ps ne $Fm{'pass'} && $Fm{'pass'} ne $admpas;
$Fm{'ps'} = $Fm{'pass'};

Sub Routine -> make_new

Before
&error("同一のホストが既に存在しています") if $zpoint;

After
&error("同一のホストが既に存在しています") if $zpoint;
$Fm{'ps'} = $Fm{'pass'};

Sub Routine -> menu

Before
print qq||<a href=$cgiurl?mode=my_record&id=$id&pass=$ps target=_blank>My Record</a>| if $def_mr && $id;

After
print qq||<a href=$cgiurl?mode=my_record&id=$id&pass=$ps&ps=$ps target=_blank>My Record</a>| if $def_mr && $id;

6.自分に報奨金をかけられなくなるよう修正→バグ対策。

Player can not add reward to themselves for now on.

File -> sos2.cgi
Sub Routine -> reward

Before
sub reward {
    if ($Fm{'price'} =~ /[^0-9]/ || !$Fm{'price'}) { push (@msg,"金額を入力してください"); return }

After
sub reward {
    if ($Fm{'id'} eq $Fm{'pd'}) {  push (@msg,"自分に報奨金をかけることはできません"); return }
    if ($Fm{'price'} =~ /[^0-9]/ || !$Fm{'price'}) { push (@msg,"金額を入力してください"); return }

7.表記ミスの修正。

Amend misprint.

File -> ufs2.cgi
Sub Routine -> edit_title

Before
&table_top('アイテム設定','1');

After
&table_top('タイトル設定','1');

8.タグ閉じ忘れの修正。

Amend forgotten tag.

File -> ufs2.cgi
Sub Routine -> menu

Before
print qq|</tr>\n|;
print qq|<tr>\n|;
print qq|<td align=center colspan=4 bgcolor=$thd_clr><b>職業案内所:他の基本職に転職します</b></td>\n|;
print qq|<tr>\n|;

After
print qq|</tr>\n|;
print qq|<tr>\n|;
print qq|<td align=center colspan=4 bgcolor=$thd_clr><b>職業案内所:他の基本職に転職します</b></td>\n|;
print qq|</tr>\n|;
print qq|<tr>\n|;

9.銘入り証明書デフォルトをレアからノーマル扱いに変えました。

Change 銘入り証明書 rare to normal.

SoSII 1.2 to 1.3 (修正箇所)

1.相手に直接メッセージを残すときのMy RecordにIDがついていない。

Amend Myrecord. There was no ID in My Record when the player left message to other player.

File -> sos2.cgi
Sub Routine -> words_after

Before
&add_record("$nm:「$Fm{'words'}」");

After
&add_record("[$id] $nm:「$Fm{'words'}」");

2.狼の嗅覚使用時に自分の一時使用品が表示されるのを相手のに修正。

Amend when the player use wolf's sense, he could see the items of his instead of the enemy's.

File -> sos2.cgi
Sub Routine -> words_after

Before
if ($bp) { print qq|$bn<br>| } else { print qq|なし<br>| }

After
if ($pbp) { print qq|$pbn<br>| } else { print qq|なし<br>| }

3.聖職者が死んでいた場合、治療できない処理を追加。

Amend when priest dies he can't cure or revive.

File -> sos2.cgi
Sub Routine -> cure_revive

Before
push (@msg,"$pnmは蘇生できる体力がありません");return }

After
push (@msg,"$pnmは蘇生できる体力がありません");return }
if ($pav eq 'dead') { push (@msg,"$pnmは死んでいます"); return }

4.鍛冶+銀細工のスキルを持つ場合の不具合を修正(鍛冶+銀細工があった場合銀細工作成も可能にする)。

Amend the problem for person who has both skill (blacksmith and silvercraft).

File -> sos2.cgi
Sub Routine -> blacksmith

Before
if ($sp =~ /Ws/ && $sp =~ /As/) { $trnd = int(rand(3)) }
elsif ($sp =~ /Ws/) { $trnd = int(rand(1)) }
elsif ($sp =~ /As/) { $trnd = int(rand(2)) + 1 }
elsif ($sp =~ /Sc/) { $trnd = 3 }

After
if ($sp =~ /Ws/ && $sp =~ /As/ && $sp =~ /Sc/) { $trnd = int(rand(4)) }
elsif ($sp =~ /Ws/ && $sp =~ /As/) { $trnd = int(rand(3)) }
elsif ($sp =~ /Ws/ && $sp =~ /Sc/) { $trnd = (0,3)[int(rand(2))] }
elsif ($sp =~ /As/ && $sp =~ /Sc/) { $trnd = int(rand(3)) + 1 }
elsif ($sp =~ /Ws/) { $trnd = int(rand(1)) }
elsif ($sp =~ /As/) { $trnd = int(rand(2)) + 1 }
elsif ($sp =~ /Sc/) { $trnd = 3 }

SoSII 1.3 to 1.4 (修正箇所)

1.タグの閉じ忘れ。

Forgotten tag to close.

File -> sos2.cgi
Sub Routine -> saga

Before
print qq|現在のプレイ人数:$playernow</b></div></td>\n|;

After
print qq|現在のプレイ人数:$playernow</b></div></td></tr>\n|;

2.戦闘処理のエラー。

Error at fighting program.

File -> sos2.cgi
Sub Routine -> fight

Before
if ($bp  =~ /Oi/) { ($uo = $bp) =~ tr/A-Za-z//d }
if ($bp  =~ /Pi/) { ($up = $bp) =~ tr/A-Za-z//d }
if ($pbp =~ /Oi/) { ($po = $bp) =~ tr/A-Za-z//d }
if ($pbp =~ /Pi/) { ($pp = $bp) =~ tr/A-Za-z//d }

After
if ($bp  =~ /Oi/) { ($uo = $bp) =~ tr/A-Za-z//d }
if ($bp  =~ /Pi/) { ($up = $bp) =~ tr/A-Za-z//d }
if ($pbp =~ /Oi/) { ($po = $pbp) =~ tr/A-Za-z//d }
if ($pbp =~ /Pi/) { ($pp = $pbp) =~ tr/A-Za-z//d }

3.プレイヤーリストの分割表示。

Split player's list view.

File -> sos2.cgi

Add to the setup part.
$def_pg = 20;          # リストで1回に表示する件数

Add New Sub Routine.
# Sub Page #
sub page {
    ($first,$total,$eachpage) = @_;
    $start = $first eq '' ? 0 : $first;
    $end   = $start + ($eachpage - 1);
    $end   = $total if $end >= $total;
    $next  = $end + 1;
    $back  = $start - $eachpage;
}

Sub Routine -> player_list

Before
&header;

After
&header;
&page($Fm{'page'},$#odrlines,$def_pg);
$page_cmd = "$cgiurl?mode=list&order=$Fm{'order'}&page=";
print qq|<b>[<a href=$page_cmd&all=on>一括表\示</a>]</b>|;
if ($Fm{'all'}) { $start = 0; $end = $#odrlines }
else {
    print qq|<b>[<a href=$page_cmd$back>前の$def_pg件</a>]</b>| if $back >= 0;
    print qq|<b>[<a href=$page_cmd$next>次の$def_pg件</a>]</b>| if $end != $total;
}
for ($i=0; $i <= $#odrlines; $i += $def_pg ) {
    $page_no = $i / $def_pg + 1;
    if ($i == $Fm{'page'} && !$Fm{'all'}) { print "<b>[$page_no]</b>" }
    else { print qq|<b>[<a href=$page_cmd$i>$page_no</a>]</b>| }
}

ページの下にもリンクを表示させたい場合は 同サブルーチンの最後
print qq|</table>\n|;
この下にも 同じ物を追加します。

Sub Routine -> player_list

Before
foreach (0 .. $#odrlines) {

After
foreach ($start .. $end) {

簡易リスト表示に設定している場合は
Sub Routine -> player_list
foreach (0 .. $#odrlines) {
の下の方を変更して下さい。

4.My Record(プレイヤーデータの下のボタンを押した時)の別窓表示。

Open My Record by new window.

File -> sos2.cgi
Sub Routine -> player_data

Before
&form('start');

After
print qq|<form method=$method action=$cgiurl target=_blank>\n|;

SoSII 1.4 to 1.5 (修正箇所)

1.セキュリティ強化1&商品を購入時のアイテムのずれ(買ったものと違う物が手に入る)を修正。

この機能はapuさん、FQFDさんに教えて頂いたものを参考にさせていただいてます。ありがとうございました。

Fix the Error when player get's wrong item by accident when they buy & Strengthen security.

File -> sos2.cgi
Sub Routine -> buy_before

Before
&input('checkbox',"$_",'on','','');

After
&input('checkbox',"$_",'on','','');
&input('hidden',"i$_","$item$price",'','');

Sub Routine -> buy_after

Before
@prclines = &get_partner("$Fm{'pd'}");

After
@prclines = &get_partner("$Fm{'pd'}");
&error("$pnmと現在接触する事ができません。") if $pfg eq "SS";

Before
if ($mn >= $price) {

After
if ($Fm{"i$_"} ne "$item$price"){ push(@msg,"エラーのため$itemを買うことが出来ませんでした") }
elsif (!$price) { push(@msg,"$itemは価格設定されていません") }
elsif ($mn >= $price) {

2.セキュリティ強化2(紹介状がなくても会える不正対策)。

Strengthen security. For person who meets special NPC without introduction.

File -> sos2.cgi
Sub Routine -> contact_action

Before
@rcdlines = &get_user("$Fm{'id'}");
@prclines = &get_partner("$Fm{'pd'}");

After
@rcdlines = &get_user("$Fm{'id'}");
@prclines = &get_partner("$Fm{'pd'}");
if ($psp =~ /(V[a-z])/ && $bg !~ /$1/) { &error("$pnmに会うためにはあるアイテムが必要です") }

3.弓、剣(剣の舞)、斧、刀の装備が外れた際に(盗まれる、壊れる)に、ユーザーのデータから装備中の略字が外れないバグを修正。

Fix users status data error when axe,katana,sword,bow got stolen or broken.

File -> sos2.cgi
Sub Routine -> fight

Before
push (@msg,"$itemが壊れました"); last;

After
$sp =~ s/Qb//g if $sts =~ /Bw/;
$sp =~ s/Qk//g if $sts =~ /Kt/;
$sp =~ s/Qx//g if $sts =~ /Ax/;
$sp =~ s/Qm//g if $sts =~ /Sw/;
push (@msg,"$itemが壊れました"); last;

Before
&joinitem('iI'); &fmsg('奪');

After
$psp =~ s/Qb//g if $sts =~ /Bw/;
$psp =~ s/Qk//g if $sts =~ /Kt/;
$psp =~ s/Qx//g if $sts =~ /Ax/;
$psp =~ s/Qm//g if $sts =~ /Sw/;
&joinitem('iI'); &fmsg('奪');

4.両手持ち武器が倍壊れやすいバグを修正(今までは勝利時、敗北時両方とも壊れていたのを勝利時のみに修正)。

Fix the trouble when double handed item got broken.For now on, double handed item will not break when you loose.

File -> sos2.cgi
Sub Routine -> fight

Before
if ($result == -1 && $sts =~ /Qs/ && $sts !~ /Ie/) { $breakitem = 1 }

After
if ($result == -1 && $sts =~ /Qs/ && $sts !~ /Qw/ && $sts !~ /Ie/) { $breakitem = 1 }

SoSII 1.5 to 1.6 (修正箇所)

1.セキュリティ強化。

尚、この修正はSOS2BBSで投稿して頂いた方々の記事を参考にしました。この場を借りてお礼を申し上げます。

Strengthen security.

File -> sos2.cgi,ufs2.cgi
Sub Routine -> saga

Before
# Main Program #
&decode;

After
# Main Program #
&decode;
if ($Fm{'id'} =~ /\W/) { &error('不正な入力です')}

SoSII 1.6 to 1.7

1.ufs2.cgiのセキュリティ強化。

草餅様より情報提供を頂きました。この場を借りてお礼申し上げます。

Strengthen security.

File -> ufs2.cgi
Sub Routine -> made_free,gave_item,adding_item,re_all,re_player,re_title,re_item,re_lwr,re_upr

以上の全てのサブルーチンの1行目に以下の行を追加。

Add in the firstline
if ($Fm{'pass'} ne $pass) { &error('パスワードが違います') }

2.デコード処理の強化。

Strengthen Decode.

File -> sos2.cgi
Sub Routine -> fight

Before
$value =~ s/\,/,/g;

After
$value =~ s/\,/,/g;
$value =~ s/△/▲/g;

3.特定のアイテムが無いと出会えない相手にそのアイテムを売る事を禁じる処理。

Adding program to prohibit a player who wants to sale the item to the person who need it to meet.

File -> sos2.cgi
Sub Routine -> sell_before

Before
if ($sts =~ /Q[swat]/) { print qq|   装備中:【$item】・・・$pc\G \n| }
elsif ($sts =~ /Wi/)   { print qq|   買取不可:【$item】 \n| }
else { &input('checkbox',"$_",'on','',''); print qq|$item・・・$pc\G \n| }

After
if ($sts =~ /Q[swat]/) { print qq|   装備中:【$item】・・・$pc\G \n| }
elsif ($sts =~ /Wi/)   { print qq|   買取不可:【$item】 \n| }
elsif ($sts =~ /(V[a-z])/ && $psp =~ /$1/) { print qq|   買取不可:【$item】 \n| }
else { &input('checkbox',"$_",'on','',''); print qq|$item・・・$pc\G \n| }

4.戦闘時に「暴走」よってマイナスダメージを与えるエラーを修正。

暴走と愛犬が同時に発動した時に限り、愛犬によって一時的に勝者の体力がマイナスになる瞬間があり、それにより勝者が敗者に与える暴走のダメージがマイナス(結果的に相手の体力が上がってしまう)になるエラーの修正。

When the skill of Run wild and Lovely dog strikes in same time, there is an error decreasing hit point.

File -> sos2.cgi
Sub Routine -> fight_sub

Before
if (!$Bkdice && $Ws =~ /Bk/) { $hWh = int($Wh/2); &fmsg('走'); $Lh -= $hWh }

SoSII 1.7 to 1.8 (修正箇所)

修正に当りSoSBBSを参考にさせて頂きました。掲示板に情報を寄せて頂いた方々にこの場を借りてお礼申し上げます。

1.管理者がプレイヤーにアイテムを渡すとそのプレイヤーの保存時刻がリセットされるバグの修正。

Amend when administer gives item to a player, his saved time will reset.

File -> ufs2.cgi
Sub Routine -> gave_item

Before
&userout;

After
&userout(1);

2.ロックにsymlinkを追加。

Add symlink to lock system.

File -> sos2.cgi,ufs2.cgi
Sub Routine -> lock

Before
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);
    }
}

After
local($flag) = 10;
if    ($lockkey == 1) {
    rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);
    while (!mkdir($lockfile,0755)) {
        --$flag or &error('現在、サーバが混み合っています',1);
        sleep(1);
    }
}
elsif ($lockkey == 2) {
    unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
    while (!symlink(".",$lockfile)) {
        --$flag or &error('現在、サーバが混み合っています',1);
        sleep(1);
    }
}

Sub Routine -> unlock

Before
if ($lockkey) { rmdir($lockfile) }

After
if    ($lockkey == 1) { rmdir($lockfile)  }
elsif ($lockkey == 2) { unlink($lockfile) }

3.Decodeのソースを修正。

Amend decode.

File -> sos2.cgi,ufs2.cgi

Sub Routine -> decode

Before
if ($ENV{'REQUEST_METHOD'} eq "POST") {

After
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    $post = 1;

Before
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

&jcode'convert(*name,'sjis');

After
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

以下の行を追加。
$value =~ s/"/&quot;/g;
$value =~ s/V/V/g;

4.タグの閉じ忘れ。

Amend forgotten tag.

File -> sos2.cgi

Sub Routine -> player_list

Before
print qq|</table>\n|;

After
print qq|</table></center>\n|;

Before
print qq|<td colspan=3>$cm_</tr><tr bgcolor=$ltclr>\n<td>|;

After
print qq|<td colspan=3>$cm_</td></tr><tr bgcolor=$ltclr>\n<td>|;

5.コーディングミス。

Mistaken coding.

File -> sos2.cgi

Sub Routine -> list_order

Before
if ($Fm{'mode'} eq '' || 'save_game') {

After
if ($Fm{'mode'} eq '' || $Fm{'mode'} eq 'save_game') {

Sub Routine -> find_item

Before
if ($Fm{'sp'} =~ /Ft/) { $rnd -= 2; $rnd = 1 if $rnd < 1 }

After
if ($sp =~ /Ft/) { $rnd -= 2; $rnd = 1 if $rnd < 1 }

Sub Routine -> fight_sub

Before
return ($Lh,$Lv,$Lt,$Lr,$Wh,$Wv,$Wt,$Wm);

After
return ($Lh,$Lv,$Lt,$Lr,$Wh,$Wv,$Wt);

6.ステラツィオの所持上限処理のミス。

Mistaken max total of stellatio.

File -> sos2.cgi

Sub Routine -> find_item

Before
if ($def_xs && length($is) > $def_xs) { push (@msg,'ステラツィオを発見しましたが、所持オーバーの為捨てました');return }

After
if ($def_xs && length($is) > $def_xs - 1) { push (@msg,'ステラツィオを発見しましたが、所持オーバーの為捨てました');return }

7.登録制限していても新規登録出来てしまう不正対策。

Amend for the new registing error.

File -> sos2.cgi

Sub Routine -> make_new

Before
if ($Fm{'name'} eq "") { &error("名前を入力してください") }

After
if (!$def_ne) { &error("新規登録受付停止中") }
if ($Fm{'name'} eq "") { &error("名前を入力してください") }

8.ブラウザの戻るボタンにより何度もリネーム出来る不正対策。

Amend for the renaming error.

File -> sos2.cgi

Sub Routine -> name_before

Before
@rcdlines = &get_user("$Fm{'id'}");

After
@rcdlines = &get_user("$Fm{'id'}");
if ($bp !~ /Na/) { return }

9.セキュリティ対策。

For security.

File -> sos2.cgi

Sub Routine -> Before starting Sub Routine

Before
if ($Fm{'id'} =~ /\W/) { &error('不正な入力です')}

After
if ($Fm{'id'} =~ /\W/) { &error('不正な入力です')}
if ($Fm{'pd'} =~ /\W/) { &error('不正な入力です')}
if ($Fm{'pd2'} =~ /\W/) { &error('不正な入力です')}

10.死亡中はセーブアイテムと銘入り証明書を使用出来ないように修正。

Amend not to use saving items & inscription certificate when the player is dead.

File -> sos2.cgi

Sub Routine -> use_after

Before
elsif ($sts =~ /Ss/) { &set_item("セーブ時に$itemを使用します") }

After
elsif ($sts =~ /Ss/) {
    if ($av eq 'dead') { &umsg('死') }
    else { &set_item("セーブ時に$itemを使用します") }
}

Before
if ($sp  =~ /Ws|As|Sc/) { &set_item("銘入り品の名前を変更することができます") }

After
if ($av eq 'dead') { &umsg('死') }
elsif ($sp  =~ /Ws|As|Sc/) { &set_item("銘入り品の名前を変更することができます") }

11.ブラウザの戻るボタンによる装備品捨て対策、装備品売却対策、ステラツィオ不正交換対策、鑑定対策、治療対策。

Amend for dumping and selling item which is worn by using back button. And also trading stellatio and judging item and cure & revive.

File -> sos2.cgi

Sub Routine -> dump_after,sell_after

Before
if ($Fm{"$_"}) {

After
if ($Fm{"$_"} && $sts !~ /Q[swat]/) {

Sub Routine -> trade_after

Before
$is =~ s/$Fm{'U'}//; $is .= uc($Fm{'P'});
$pis =~ s/$Fm{'P'}//; $pis .= uc($Fm{'U'});

After
$count = ($is =~ s/$Fm{'U'}//); $is .= uc($Fm{'P'});
return if !$count;
$count = ($pis =~ s/$Fm{'P'}//); $pis .= uc($Fm{'U'});
return if !$count;

Sub Routine -> judge_after

Before
return if $fg ne 'JB';

After
return if $fg ne 'JB';
if ($hp < 2) { push (@msg,'体力が足りません'); return }

Sub Routine -> cure_revive

Before
if ($Fm{'mode'} eq 'cr') {

After
if ($Fm{'mode'} eq 'cr') {
    if ($av ne 'poison') { return }

Before
if ($Fm{'mode'} eq 'rv') {

After
if ($Fm{'mode'} eq 'rv') {
    if ($av ne 'dead') { return }

12.アドレス直打ち対策。

Adding code for Player who use GET.

File -> sos2.cgi

Sub Routine -> contact_check,sell_after,buy_after,find_item,use_after,dump_after,goods_after,name_after,judge_after,levy

Adding in the first line
if (!$post) { return }

13.アドレス直打ち対策2。

Adding code for Player who use GET.

File -> sos2.cgi

Sub Routine -> fee_after

Before
return if $fg ne 'FB';

After
return if $fg ne 'FB';
return if $sp !~ /Ad|Rv/;

14.不要コードの削除。

Delete code which doesn't need.
File -> sos2.cgi

Sub Routine -> contact_check

Delete

$def_hd -= $def_bh if $psp =~ /By/ && $sp =~ /X/;

15.体力が1の時は必ず隠れた人物の探索に失敗するように変更。

Change system, when player's hit point is 1, always fails to find other hidden player.
File -> sos2.cgi

Sub Routine -> contact_check

Before
if (!$rnd) { push (@msg,"$pnmを発見することに成功しました"); &partnerout }
else       { push (@msg,"散々探しましたが、$pnmはどこにもいませんでした"); $notfound = 1;
    if ($hp > 2) { push (@msg,'疲れの為、体力を消耗しました'); $hp--; &userout } }

After
if (!$rnd && $hp > 1) { push (@msg,"$pnmを発見することに成功しました"); &partnerout }
else {
    push (@msg,"散々探しましたが、$pnmはどこにもいませんでした"); $notfound = 1;
    if ($hp > 1) { push (@msg,'疲れの為、体力を消耗しました'); $hp--; &userout }
}

SoSII 1.8 to 1.9 (修正箇所)

主に1.8のバグ修正。
ご指摘頂いた皆様にお礼申し上げます。

1.Ver1.8の「14.不要コードの削除」を訂正。

Correct a mistake of deleted code.

File -> sos2.cgi
Sub Routine -> contact_check

Before
$def_hd += $def_th if $psp =~ /Hd/;

After
$def_hd += $def_th if $psp =~ /Hd/;
$def_hd -= $def_bh if $prw >= $def_rp && $sp =~ /X/;

2.Ver1.8の「5.コーディングミス。」の訂正。

Correct a mistake of fixed code.

File -> sos2.cgi
Sub Routine -> list_order

Before
if ($Fm{'mode'} eq '' || $Fm{'mode'} eq 'save_game') {

After
if ($Fm{'mode'} eq '' || $Fm{'mode'} eq 'norm_save' || $Fm{'mode'} eq 'hide_save') {

3.Ver1.8の「3.Decodeのソースを修正。」の訂正。

Correct a mistake of fixed code.

File -> sos2.cgi
Sub Routine -> decode

Delete
$value =~ s/V/V/g;

4.招待状が必要な相手に接触する際の不具合を修正。

Error of meeting person with invitation.

File -> sos2.cgi
Sub Routine -> contact_action

Before
if ($psp =~ /(V[a-z])/ && $bg !~ /$1/) { &error("$pnmに会うためにはあるアイテムが必要です") }

After
if ($psp =~ /(V[a-z])/) {
    $vflag = $1;
    &splititem('i');
    foreach (@items) {
        $right = 1 if (split(/△/))[1] =~ /$vflag/;
    }
    if (!$right) {
        &error("$pnmに会うためにはあるアイテムが必要です");
    }
}

Sub Routine -> contact_check

Before
if ($psp =~ /(V[a-z])/ && $bg !~ /$1/) { push (@msg,"$pnmに会うためにはあるアイテムが必要です"); $notfound = 1 }

After
if ($psp =~ /(V[a-z])/) {
    $vflag = $1;
    &splititem('i');
    foreach (@items) {
        $right = 1 if (split(/△/))[1] =~ /$vflag/;
    }
    if (!$right) {
        push (@msg,"$pnmに会うためにはあるアイテムが必要です");
        $notfound = 1;
    }
}

5.駄目押し。

Add for sure.

File -> sos2.cgi
Sub Routine -> name_after

Before
return if $fg ne 'NB';

After
return if $fg ne 'NB';
if ($bp !~ /Na/) { return }

SoSII 1.9 to 1.10 (修正箇所)

1.9のバグ修正。ご指摘頂きました。ありがとうございました。

1.Ver1.9の「招待状が必要な相手に接触する際の不具合を修正。」の修正。

Correct a mistake of 'Error of meeting person with invitation'.

File -> sos2.cgi
Sub Routine -> contact_check

Before
if ($psp =~ /(V[a-z])/) {
    $vflag = $1;
    &splititem('i');
    foreach (@items) {
        $right = 1 if (split(/△/))[1] =~ /$vflag/;
    }
    if (!$right) {
        push (@msg,"$pnmに会うためにはあるアイテムが必要です");
        $notfound = 1;
    }
}

After
if ($psp =~ /(V[a-z])/) {
    $vflag = $1;
    &splititem('i');
    foreach (@items) {
        $right = 1 if (split(/△/))[1] =~ /$vflag/;
    }
}
if ($vflag && !$right) {
    push (@msg,"$pnmに会うためにはあるアイテムが必要です");
    $notfound = 1;
}