[PR]牝綾
Infoseek 喨涓截

不具合の修正 - Ver b2.2

設置支援ページへ

[Ver b2.0]  [Ver b2.1]  [Ver b2.1.2] 
[Ver b1.4]  [Ver b1.3]  [Ver b1.2.1]  [Ver b1.1]  [Ver b1.0] 

  1. マニュアルの修正
  2. その他の不具合修正
  3. ちょっとしたこと


  1. マニュアルの修正
    1. 初心者ガイドの修正
    2. アイテムデータの修正

    初心者ガイドの修正

    manual/beginner.htmlを開く
    <li>TECが上がれば船、糸巻き機、織り機、棚なども作れるようになる。</li></ul>
    <li>自分で作成できないアイテムは他の職業の人から買うか闇市で買う。</li>
    ↓
    <li>TECが上がれば船、糸巻き機、織り機、棚なども作れるようになる。</li>
    <li>自分で作成できないアイテムは他の職業の人から買うか闇市で買う。</li>
    </ul>
    

    【リストへ戻る】

    アイテムデータの修正

    manual/item02.htmlを開く
    パン粉
        <td>小麦+イースト菌+火</td>
    ↓
        <td>小麦粉+イースト菌+火</td>
    

    【リストへ戻る】

    【トップへ戻る】



  2. その他の修正
    1. 対人の購入で、アイテムを購入するとペットのデータも更新(保存)される
    2. 他の地へ移動で、DIVタグが閉じられていない

    対人の購入で、アイテムを購入するとペットのデータも更新(保存)される不具合を修正します。

    library/buy.cgiを開く
    sub buy_after:
    my  $M;
    ↓
    my ($M,$M1,$M2);
    
    sub buy_after:
        if ($M .= &purchase_item($U->{Bg},'','Xx')) {
    ↓
        if ($M1 = &purchase_item($U->{Bg},'','Xx')) {
    
    sub buy_after:
        if ($M .= &purchase_pet($U->{Pt},'','Xx')) {
    ↓
        if ($M2 = &purchase_pet($U->{Pt},'','Xx')) {
    
    sub buy_after:
        if ($M) {
            $M = "$I->{nm}が買物に来ました。<br>\n" . $M;
    ↓
        if ($M1 || $M2) {
            $M = "$I->{nm}が買物に来ました。<br>\n" . $M1 . $M2;
    

    「$M .= "メッセージ"」は「$M = $M . "メッセージ"」の糖衣構文だった…うかつ。

    【リストへ戻る】

    他の地へ移動で、DIVタグが閉じられていない不具合を修正します。

    library/transfer.cgiを開く
    sub transfer_before:
        <div class=r>
        <tt>旅費は無料ですが、$set::lab{vt}と$set::lab{ap}が倍減ります。</tt>
    ↓
        <div class=r><tt>
        旅費は無料ですが、$set::lab{vt}と$set::lab{ap}が倍減ります。
        </tt></div>
    

    変だなーと思いつつどこが変なのか今まで分からなかったというね…

    【リストへ戻る】

    【トップへ戻る】



  3. ちょっとしたこと
    1. インフォメーション作成で文字実体参照が使えるように
    2. Spetial Thanksのアンカーを無効に
    3. 接触した相手がログイン中の場合に戻るボタン
    4. モンスターの出る地域でお金を拾えるように
    5. 農場でもAPPによって販売価格が変動するように
    6. いつもの2倍作成に成功したら獲得経験値も2倍に
    7. 戦闘金がなければメッセージを表示しないように
    8. 闇市で売られている品物を種類ごとに表示・非表示の切り替えが出来るように
    9. 超戻るボタン
    不具合ではないけどやってみたことです。

    インフォメーション作成で文字実体参照が使えるように(問題が起こりそうなのでやらないほうがいいかも)

    master.cgiを開く
    sub edit_information:
        $t1 =~ s/<br>/\n/g;
    ↓
        $t1 =~ s/<br>/\n/g;
        $t1 =~ s/&/&amp;/g;
    
    sub make_information:
        $F{in} =~ s/&lt;/</g;
        $F{in} =~ s/&gt;/>/g;
    ↓
        $F{in} =~ s/&lt;/</g;
        $F{in} =~ s/&gt;/>/g;
        $F{in} =~ s/&amp;/&/g;
    
    library/base.cgiを開く
    sub decode:
            $V =~ s/</&lt;/g;
            $V =~ s/>/&gt;/g;
    ↓
            $V =~ s/&/&amp;/g;
            $V =~ s/</&lt;/g;
            $V =~ s/>/&gt;/g;
    

    【リストへ戻る】

    Spetial Thanksのアンカーを無効に。

    library/rights.cgiを開く
    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;
    

    【リストへ戻る】

    接触した相手がログイン中の場合に戻るボタンを表示してみる。

    library/base.cgiを開く
    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 }
    
    library/bounty.cgiを開く
    sub bounty_after:
        &login_check($U);
    ↓
        &login_check($U,'bounty_before');
    
    library/buy.cgiを開く
    sub buy_before:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    sub buy_after:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    library/contact.cgiを開く
    sub contact_after:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    library/cure.cgiを開く
    sub cure_before:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    sub cure_after:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    library/destone.cgiを開く
    sub destone:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    library/fight.cgiを開く
    sub fight_player:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    library/trade.cgiを開く
    sub trade_before:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    
    sub trade_after:
        &login_check($U);
    ↓
        &login_check($U,'contact_before');
    

    【リストへ戻る】

    モンスターの出る地域でお金を拾えるようにしてみる。

    モンスターの出る地域でお金を拾えるようにしてみます。
    探索ごとに入手する・戦闘後の入手額に追加する2パターンやってみました。
    「探索ごとに入手する」では毎回必ず入手できます。
    「戦闘後の入手額に追加する」ではモンスターを倒さないと入手できません。

    library/find.cgiを開く

    まずは共通部分。

    sub get_find_data:
            'monster' => {
                    :
                words => 'つ手に入れました' },
    ↓
            'monster' => {
                    :
                money => 1,
                words => 'つ手に入れました' },
    

    続いて修正箇所が違う部分。
    「探索ごとに入手する」「戦闘後の入手額に追加する」のどちらか一方を選んで改造を進めてください。
    どちらも欲しいときは両方やってもだいじょうぶ。

    探索ごとに入手するようにする場合。

    sub encounter:
            &M("<tt>$V{title}$i回目</tt>");
    ↓
            &M("<tt>$V{title}$i回目</tt>");
    
            &found_money($S,0) if $V{money};
    

    戦闘後の入手額に追加するようにする場合。

    sub encounter:
            $U = {%$Ii};
    ↓
            $U = {%$Ii};
    
            &found_money($U,$S->{Pl}{gl},1) if $V{money};
    
    sub found_money:
    my  $S = shift;
    my  $V = shift;
    ↓
    my  $S = shift;
    my  $V = shift;
    my  $T = shift;
    
    sub found_money:
        &M("<img src=$set::mim_dir/g.gif> $V $set::mnyを手に入れました。");
    ↓
        &M("<img src=$set::mim_dir/g.gif> $V $set::mnyを手に入れました。") if !$T;
    
    library/fight.cgiを開く
    sub sub create_creature:
        $S->{gl} = int($S->{lv} * $set::mgl - ($I->{lv} - 1) * 6)    if !$S->{nG};
    ↓
        $S->{gl} += int($S->{lv} * $set::mgl - ($I->{lv} - 1) * 6)   if !$S->{nG};
    

    【リストへ戻る】

    農場でもAPPによって販売価格が変動するようにしてみる。

    library/farm.cgiを開く
    # 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);
    

    【リストへ戻る】

    いつもの2倍作成に成功したら獲得経験値も2倍にしてみる。

    set.cgiを開く
    # 合成 Compose ####################################### #
    $dex = 2;                    # ダブルロールに成功したときは獲得経験値をn倍にする
    
    library/compose.cgiを開く
    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;
    

    応用でエクセレントロールのときも出来ますね。

    【リストへ戻る】

    戦闘金がなければメッセージを表示しないようにしてみる。

    経験値は手に入らない場合はメッセージは表示されないので、勝利金も同じようにしてみました。

    library/fight.cgiを開く
    sub fight_money:
        $V  = 0 if $V < 0;
    ↓
        $V  = 0 if $V < 0;
        return if $V < 1;
    
    

    【リストへ戻る】

    闇市で売られている品物を種類ごとに表示・非表示の切り替えが出来るようにしてみる。

    闇市で売られている商品をグループ分けして、必要なものだけ表示できるような機能を取り付けます。これにより闇市が多少スッキリするかもしれません。
    クラスごとにグループ分けされ、食品やインゴットなどの分類が書かれたラベルをクリックすることでそのグループの表示・非表示を切り替えます。
    ※闇市のアイテムデータがソートされていることを前提にした改造なので、sub sell_afterのsort_itemは消さないでね

    いつからか書いてた変なギミックとはこれのことです。
    クッキーを大量に作ってしまう気持ち悪い仕様だったのですが、クッキー一個に纏めたので公開します。

    library/blackmarket.cgiを開く
    sub blackmarket_before:
    my  $Ui;
    ↓
    my  $Ui;
    my ($A,$B,$C,$D,$M,%M);
    
    sub blackmarket_before:
        foreach $Ui (@{$U->{Bg}}) {
            $Ui->{Sp} = int($Ui->{bp} * $set::mtp + $set::mpp);
            $Ui->{Sp} = $I->{Sk}{Ff} ? $Ui->{bp} : int($Ui->{bp} * $set::mtp + $set::mpp);
            $t1 .= qq|<tr>\n<td>\n|;
            $t1 .= qq|<input type=checkbox name=$Ui->{id}_$Ui->{gd} class=checkbox> |;
            $t1 .= &decorate_item($Ui,1);
    ↓
        # クッキーの値を取得 #
        $A = $ENV{'HTTP_COOKIE'} || $ENV{'COOKIE'};
        $A = (grep { index($_,'SOS3_Bm=') != -1 } split(/; ?/,$A))[0];
        $A = (split(/=/,$A))[1];
    
        # クラス名の設定 #
        # set.cgiにクラスのラベル設定作ってもいいかも #
        %M = (
            Fd => '食品',
            Mt => '素材',
            Ig => '鉱石',
            Pi => '貴金属',
            Wd => '木材',
            Lt => '革',
            Ct => '布',
            Md => '薬品',
            Gm => '宝珠',
            Op => '戦闘補助',
            Tp => '罠',
            Bc => '補強材',
        );
    
        foreach $Ui (@{$U->{Bg}}) {
            $Ui->{Sp} = int($Ui->{bp} * $set::mtp + $set::mpp);
            $Ui->{Sp} = $I->{Sk}{Ff} ? $Ui->{bp} : int($Ui->{bp} * $set::mtp + $set::mpp);
            if ($M ne $Ui->{cl}) {
                $t1 .= qq|</tbody>\n| if $M;
                $t1 .= qq|<tbody>\n|;
                $M = $Ui->{cl};
                $B = index($A,$M) == -1 ? 1 : 0;
                $C = $B ? qq| onclick="openMenu(this,'$M');"| : qq| onclick="closeMenu(this,'$M');"|;
                $D = $B ? qq| style="display: none;"| : '';
                $t1 .= qq|<tr class=first$C><td colspan="2"><div style="padding: 2px;background: #F2F5FB;">$M{$M}</div></td></tr>\n|;
            }
            $t1 .= qq|<tr$D>\n<td>\n|;
            $t1 .= qq|<input type=checkbox name=$Ui->{id}_$Ui->{gd} class=checkbox> |;
            $t1 .= &decorate_item($Ui,1);
    
    sub blackmarket_before:
        $t1 .= qq|<tr><td colspan=2><br><input type=checkbox name=dl class=checkbox> 買わずに削除する</td></tr>\n| if $I->{Sk}{Rm};
    ↓
        $t1 .= qq|</tbody>\n<tbody>\n<tr><td colspan=2><br><input type=checkbox name=dl class=checkbox> 買わずに削除する</td></tr>\n| if $I->{Sk}{Rm};
    
    sub blackmarket_before:
        print <<"    END_OF_HTML";
    ↓
        print <<"    END_OF_HTML";
        <script type="text/javascript">
        <!--
        function openMenu(self,c) {
            var r = self.parentNode.getElementsByTagName('tr');
            for (var i = 1; i < r.length; i++) {
                r.item(i).style.display = '';
            }
    
            self.onclick = function() { closeMenu(this,c) };
            setCookie(c);
        }
        function closeMenu(self,c) {
            var r = self.parentNode.getElementsByTagName('tr');
            for (var i = 1; i < r.length; i++) {
                r.item(i).style.display = 'none';
            }
    
            self.onclick = function() { openMenu(this,c) };
            setCookie(c,1);
        }
        function setCookie(c,d) {
            var cookie_tmp = document.cookie+';';
            var cookie_name = "SOS3_Bm=";
            var offset = cookie_tmp.indexOf(cookie_name);
            var ofs_start;
            var ofs_end;
            var market = [];
    
            if (offset != -1) {
                ofs_start = offset + cookie_name.length;
                ofs_end = cookie_tmp.indexOf(";", ofs_start);
                market = cookie_tmp.substring(ofs_start,ofs_end).split(",");
            }
    
            if (d) {
                for (var i=0; i < market.length; i++) {
                    if (!market[i] || market[i] == c) { market.splice(i,1); i-- }
                }
            }
            else {
                market.push(c);
            }
    
            var period = market.length < 1 ? -1 : 90;
            var nowtime = new Date().getTime();
            var expires = new Date(nowtime + (60 * 60 * 24 * 1000 * period)).toGMTString();
    
            document.cookie = "SOS3_Bm=" + market.join(",") + "; expires=" + expires;
        }
        -->
        </script>
    

    【リストへ戻る】

    超戻るボタンを表示してみる。

    小窓を共有しているアクションに(ほぼ)一発で飛ぶフォームをページの下に表示します。
    かなり強引です。

    library/base.cgiを開く
    sub footer:
        $t1  = qq|</body>\n|;
    ↓
        $t1  = &back_form($F{md}) if $V{GetTag};
        $t1 .= qq|</body>\n|;
    
    # Sub Back Form #
    sub back_form {
    my  $V = shift; # mode
    my (%V,$T,$K);
    my ($do,$option_poem,$option_magic,$selected);
    
        return if $F{fl} eq 'pet';
    
        $V = (split(/_/,$V))[0];
        %V = (
            'bag'     => 'bag',
            'use'     => 'bag',
            'look'    => 'bag',
            'equip'   => 'bag',
            'takeoff' => 'bag',
            'dump'    => 'bag',
            'roast'   => 'bag',
            'dry'     => 'bag',
            'price'   => 'bag',
            'reserve' => 'bag',
            'pack'    => 'bag',
            'unpack'  => 'bag',
            'attune'  => 'bag',
            'repair'  => 'bag',
            'install' => 'bag',
            'compose' => 'bag',
            'contact'   => 'action',
            'transfer'  => 'action',
            'words'     => 'action',
            'friends'   => 'action',
            'orb'       => 'action',
            'bounty'    => 'action',
            'option'    => 'action',
            'poem'      => 'action',
            'magic'     => 'action',
            'color'     => 'action',
            'stance'    => 'action',
            'ornament'  => 'action',
            'reinforce' => 'action',
            'levelup'   => 'action',
            'face'      => 'action',
            'backup'    => 'action',
            'jobchange' => 'action',
            'delete'    => 'action',
            'fight'     => 'action',
            'buy'       => 'action',
            'cure'      => 'action',
            'partner'   => 'action',
            'destone'   => 'action',
            'message'   => 'action',
            'trade'     => 'action',
            'market'        => 'spot',
            'bank'          => 'spot',
            'harbor'        => 'spot',
            'farm'          => 'spot',
            'river'         => 'spot',
            'forest'        => 'spot',
            'mine'          => 'spot',
            'bath'          => 'spot',
            'arena'         => 'spot',
            'auction'       => 'spot',
            'theater'       => 'spot',
            'castle'        => 'spot',
            'dungeon'       => 'spot',
            'blackmarket'   => 'spot',
            'sell'          => 'spot',
            'aboard'        => 'spot',
            'hunting'       => 'spot',
            'capture'       => 'spot',
            'lumberjacking' => 'spot',
            'berry'         => 'spot',
            'herb'          => 'spot',
            'dye'           => 'spot',
            'fishing'       => 'spot',
            'swimming'      => 'spot',
            'water'         => 'spot',
            'church'        => 'spot',
            'find' => 'find',
        );
    
        $V = $V{$V};
    
        return if !$V;
    
        if ($V eq 'bag') {
            $T = <<"        END_OF_HTML";
            <div class=r>
            <select name=md class=select>
            <option value="bag" selected>荷物</option>
            <option value="compose">作成</option>
            </select>
            <input type=submit class=button value="$set::okb">
            </div>
            END_OF_HTML
        }
        elsif ($V eq 'action') {
            $V = $I->{Sk}{Po} ? '詩':
                 $I->{Sk}{Xd} ? '探検日誌': 0;
    
            $option_poem = qq|<option value="poem_before">$Vを書く</option>\n| if $V;
            $option_magic = qq|<option value="magic_before">魔法をセットする</option>\n| if $I->{Sk}{Mg};
    
            $T = <<"        END_OF_HTML";
            <div class=r>
            <select name=md class=select>
            <option value="contact_before" selected>プレイヤーに接触</option>
            <option value="transfer_before">他の地へ移動</option>
            <option value="words_before">自己紹介設定</option>
            <option value="friends_before">フレンド設定</option>
            <option value="orb_before">$set::orb{x}の設定</option>
            <option value="bounty_before">$set::lab{rw}を懸ける</option>
            <option value="option_before">戦闘補助アイテム</option>
            $option_poem
            $option_magic
            <option value="color_before">文字色の設定</option>
            <option value="stance_before">スタンスの設定</option>
            <option value="ornament_before">武具を宝飾する</option>
            <option value="reinforce_before">武具を補強する</option>
            <option value="levelup_before">レベルアップボーナス</option>
            <option value="face_before">イメージ画像の変更</option>
            <option value="backup_before">データのバックアップ</option>
            <option value="jobchange_before">転職する</option>
            <option value="delete_before">キャラクターを削除</option>
            </select>
            <input type=submit class=button value="$set::okb">
            </div>
            END_OF_HTML
        }
        elsif ($V eq 'spot') {
            require "$set::lib_dir/placechange.cgi";
    
            # 移動スポットオプション
            &get_place($I);
            &spot_option($I);
            $selected = ' selected';
            $T = qq|<div class=r>\n<select name=md class=select>\n|;
            foreach (@{$I->{So}}) {
                ($K,$V) = split(/=/);
                $T .=  qq|<option value="$K"$selected>$Vへ行く</option>\n|;
                if ($K eq 'market' && $I->{Pl}{bm}) {
                    $T .=  qq|<option value="blackmarket_before">闇市で買物をする</option>\n|;
                    $T .=  qq|<option value="sell_before">闇市でアイテムを売る</option>\n|;
                }
                $selected = '';
            }
            $T .= qq|<option value="church_before">教会へ行く</option>\n</select>\n<input type=submit class=button value="$set::okb">\n</div>\n|;
        }
        elsif ($V eq 'find') {
            # 探索回数オプション
            for (1..$set::fdo) { $do .= qq|<option value="$_">$_回</option>| }
    
            $T = <<"        END_OF_HTML";
            <div class=r>
            <select name=do class=select>$do</select>
            <input type=submit class=button value="探索">
            </div>
            <input type=hidden name=md value="find">
            END_OF_HTML
        }
    
        return <<"    END_OF_HTML";
        <form method=post action=$set::cgi_url>
        <div class=outbox>
        $T
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </div>
        </form>
        END_OF_HTML
    }
    

    上を、sub back_close の下あたりに追加。

    【リストへ戻る】

    【トップへ戻る】