[PR]t^N^ff:{iI

不具合の修正 - Ver b2.1

設置支援ページへ

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

  1. 荷物関連の不具合修正
  2. その他の不具合修正
  3. ちょっとしたこと


  1. 荷物関連の不具合修正
    1. 作成で、燻製を作ることが出来ない
    2. 作成で、不正なデータを送ることで殆ど全てのアイテムを作成できる

    作成で、燻製を作ることが出来ない不具合を修正します。

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

    【リストへ戻る】

    作成で、不正なデータを送ることで殆ど全てのアイテムを作成できる不具合を修正します。

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

    【リストへ戻る】

    【トップへ戻る】



  2. その他の修正
    1. 対人の買い物で、個数指定販売でない場合に重量の表示が正しくない
    2. 地図で、現在地通知設定を「フレンドにのみ通知」にしていても全てのプレイヤーに現在地を知られてしまう

    対人の買い物で、個数指定販売でない場合に重量の表示が正しくない不具合を修正します。

    library/base.cgiを開く
    sub decorate_item:
            $Y *= $W if $F == 1;
    ↓
            $Y *= $W if $F == 1;
            $Z *= $W if $T == 2;
    

    【リストへ戻る】

    地図で、現在地通知設定を「フレンドにのみ通知」にしていても全てのプレイヤーに現在地を知られてしまう不具合を修正します。

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

    相手のフレンドリストに自分がいるかを探さないといけないのに自分のリストから相手を探すというぼけたことをしてました…すみません

    【リストへ戻る】

    【トップへ戻る】



  3. ちょっとしたこと
    1. インフォメーション作成で文字実体参照が使えるように
    2. Spetial Thanksのアンカーを無効に
    3. 接触した相手がログイン中の場合に戻るボタン
    4. モンスターの出る地域でお金を拾えるように
    5. 農場でもAPPによって販売価格が変動するように
    6. 複数オーブトレード
    7. いつもの2倍作成に成功したら獲得経験値も2倍に
    8. グレードを文字で表示
    不具合ではないけどやってみたことです。

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

    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');
    

    【リストへ戻る】

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

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

    【リストへ戻る】

    農場でも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);
    

    【リストへ戻る】

    複数オーブトレードを実装してみる。

    library/trade.cgiを開く
    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}");
    

    【リストへ戻る】

    いつもの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;
    

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

    【リストへ戻る】

    グレードを文字で表示してみる。

    グレード2以上のアイテムを「木の板:G2」のように表示します。
    色分けされていても分かりにくい時にやってみてください。

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

    【リストへ戻る】

    【トップへ戻る】




[PR]eCK:450l麺厩1050~