不具合の修正 - Ver b2.1.2

設置支援ページへ

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

  1. 戦闘関連の不具合修正
  2. 荷物関連の不具合修正
  3. 移動関連の不具合修正
  4. その他の不具合修正
  5. ちょっとしたこと


  1. 戦闘関連の不具合修正
    1. 設定より多くの戦闘履歴が残る

    設定より多くの戦闘履歴が残る不具合を修正します。

    履歴の数の設定を変更前より少なくした場合に設定より多くの戦闘履歴が残る。

    library/fight.cgiを開く
    sub fight_player:
        pop(@Uen) if @Uen >= $set::elx;
    ↓
        @Uen = @Uen[0..$set::elx-1] && pop(@Uen) if @Uen >= $set::elx;
    

    【リストへ戻る】

    【トップへ戻る】



  2. 荷物関連の不具合修正
    1. 作成で、失敗して材料が戻ってくると、装備中の道具を使い切っていた時にその道具が外れる

    作成で、失敗して材料が戻ってくると、装備中の道具を使い切っていた時にその道具が外れる不具合を修正します。

    library/compose.cgiを開く
    sub compose_after:
    my (@CL,@ID,$K,$V);
    ↓
    my (@CL,@ID,@EQ,$K,$V);
    
    sub compose_after:
            next if !$F{$i} && $Ii->{eq} ne 'rh' && $Ii->{eq} ne 'sb';
    ↓
            next if !$F{$i} && $Ii->{eq} ne 'rh' && $Ii->{eq} ne 'sb';
            push(@EQ,{%$Ii}) if $Ii->{eq} eq 'rh' || $Ii->{eq} eq 'sb';
    
    sub compose_after:
                &M("作成に使用した材料は無事でした。");
                $Ui->{ex} = 0;
                $I->{DS} = 1;
    ↓
                &M("作成に使用した材料は無事でした。");
                $Ui->{ex} = 0;
                $I->{DS} = 1;
                foreach (@EQ) {
                    &set_equipment($I,$_);
                    &get_effect($_);
                    &reload_data($_->{eq},"$_->{nm}$_->{Ef}",$_->{im});
                }
    

    【リストへ戻る】

    【トップへ戻る】



  3. アイテムデータの設定の不具合修正
    1. 設定ミスと思われる箇所を修正

    設定ミスと思われる箇所を修正します。

    item/woodwork.cgiを開く
    三節棍:
              ki => 'Chain',
    ↓
              ki => 'Squaredlumber',
    
    ジャヴェリン:
              ki => 'Thinboard',
    ↓
              ki => 'Woodenstick',
    

    【リストへ戻る】

    【トップへ戻る】



  4. 移動関連の不具合修正修正
    1. 協会で、怪我の治療をして貰うとHAPの表示がおかしくなる。
    2. 市場で、職人街で買い物をした時にエラーになると市場へ戻る。

    協会で、怪我の治療をして貰うとHAPの表示がおかしくなる不具合を修正します。

    library/church.cgiを開く
    sub church_after:
            &reload_data('hy');
    ↓
            &reload_gage('hy','V');
    

    【リストへ戻る】

    市場で、職人街で買い物をした時にエラーになると市場へ戻る不具合を修正します。

    library/shopping.cgiを開く
    sub shopping_after:
        if (&purchase_item($IC{$I->{pl}},\%FI,'Mk','shopping_before')) {
    ↓
        if (&purchase_item($IC{$I->{pl}},\%FI,'Mk','shopping_before','','cu')) {
    
    library/purchase.cgiを開く
    sub purchase_item:
    my  $R = shift; # return mode
    ↓
    my  @R = @_; # return mode
    
    sub purchase_item:
        $R ||= $I->{Sp}{$P}{md};
    ↓
        $R[0] ||= $I->{Sp}{$P}{md};
    
    sub purchase_item:
                &say("$Ui->{nm}:数値以外は使用出来ません",$R);
    ↓
                &say("$Ui->{nm}:数値以外は使用出来ません",@R);
    
    sub purchase_item:
                &say("$Ui->{nm}は他の人に予\約されています",$R);
    ↓
                &say("$Ui->{nm}は他の人に予\約されています",@R);
    
    sub purchase_item:
                &say('これ以上は重くて持てません',$R);
    ↓
                &say('これ以上は重くて持てません',@R);
    
    sub purchase_item:
                &say('お金が足りません',$R);
    ↓
                &say('お金が足りません',@R);
    
    sub purchase_item:
                &say("荷物スロットが一杯です",$R);
    ↓
                &say("荷物スロットが一杯です",@R);
    
    sub purchase_pet:
    my  $R = shift; # return mode
    ↓
    my  @R = @_; # return mode
    
    sub purchase_pet:
        $R ||= $I->{Sp}{$P}{md};
    ↓
        $R[0] ||= $I->{Sp}{$P}{md};
    
    sub purchase_pet:
                &say("$Ui->{nm}:数値以外は使用出来ません",$R);
    ↓
                &say("$Ui->{nm}:数値以外は使用出来ません",@R);
    
    sub purchase_pet:
                &say("$Ui->{nm}は他の人に予\約されています",$R);
    ↓
                &say("$Ui->{nm}は他の人に予\約されています",@R);
    
    sub purchase_item:
                &say("スロットの空きが足りません",$R);
    ↓
                &say("スロットの空きが足りません",@R);
    
    sub purchase_pet:
                &say('お金が足りません',$R);
    ↓
                &say('お金が足りません',@R);
    

    【リストへ戻る】

    【トップへ戻る】



  5. その他の修正
    1. イメージ画像の変更で、変更前の画像が表示されない
    2. 転職で、費用が足りなくても転職できる、また費用がイメージ画像の変更費になっている
    3. 不正なデータを送られるとCGIプログラムエラーになる
    4. OpenWindowでリクエストが二重に送られる

    イメージ画像の変更で、変更前の画像が表示されない不具合を修正します。

    library/face.cgiを開く
    sub face_before:
        <th nowrap class=padding><img src=$set::mim_dir/$F{sx}$F{im} name=image class=image></th>
    ↓
        <th nowrap class=padding><img src=$set::mim_dir/$I->{im} name=image class=image></th>
    

    【リストへ戻る】

    転職で、費用が足りなくても転職できる、また費用がイメージ画像の変更費になっている不具合を修正します。

    library/jobchange.cgiを開く
    sub jobchange_after:
        $I = &get_user('I');
    ↓
        $I = &get_user('I');
    
        &say("お金が足りません",'CLOSE') if $I->{gl} < $set::jcm;
    
    sub jobchange_after:
        &change_status($I,'gl',-$set::fcp);
    ↓
        &change_status($I,'gl',-$set::jcm);
    

    【リストへ戻る】

    不正なデータを送られるとCGIプログラムエラーになる不具合を修正します。

    library/compose.cgiを開く
    sub compose_after:
        &error('Compose File Error') if !$F{fi} || $F{fi} =~ /[^a-z_]/;
    ↓
        &error('Compose File Error') if !$F{fi} || $F{fi} =~ /[^a-z_]/ || ! -e "$set::itm_dir/$F{fi}.cgi";
    

    直したつもりだったんだけど載せ忘れてた…

    library/fishing.cgiを開く
    sub fishing:
    my  $backto;
    ↓
    my  $backto;
    
        &error('Fishing File Error') if !$F{fl} || $F{fl} =~ /[^a-z_]/ || ! -e "$set::dat_dir/$F{fl}.cgi";
    

    【リストへ戻る】

    OpenWindowでリクエストが二重に送られる不具合を修正します。
    ついでに全画面表示をスクリーンの有効範囲から判断するようにします。

    javascriptとformで1回ずつリクエストが投げられているので、jsのほうは空のページを開くようにします。
    追記:既に小窓が開かれている場合は空のページを開かずにそのまま表示するように、
    また、javascriptオンのときはjavascriptのみで動作するようにしました。
    URLが空の場合にabout:blankを開くようにしました。
    w_size,h_sizeに0を指定するとscreen.availWidth,screen.availHeightが代入されるようにしました。

    library/main.cgiを開く
    sub main:
        print <<"    END_OF_HTML";
        :
        :
        :
        END_OF_HTML
    ↓
        print <<"    END_OF_HTML";
        <table class=basetable cellpadding=5 align=center>
        <tr>
        <td width=50%> 
        <div class=label>場所</div>
        <table class=outertable border=1>
        <tr>
        <td class=padding><img id=I1 src=$set::mim_dir/$I->{Pl}{im}></td>
        <td class=padding width=100%>
        王国:<span id=kg>$I->{Kg}{nm}</span><br>
        現在地:<span id=pl>$I->{Pl}{nm}</span><br>
        <span id=pl2>$I->{Pl}{nm}</span>にいる人数:<span id=pp>$I->{Pp}</span>人 <br>
        特徴:<span id=pr>$I->{Pl}{pr}</span>
        </td>
        </tr>
        <tr><td class=padding colspan=2>
        <span id=ev>$environment</span><img src=$set::mim_dir/envCh.gif title="教会">
        <div class=r><input type=button class=button onClick="return OpenWindow('$set::htm_dir/environment.html','myrecord',400,600)" value="環境リスト"></div>
        </td></tr>
        </table>
        <br> 
        <div class=label>コマンド</div>
        <table class=outertable>
        <tr>
        <form method=post action=$set::cgi_url target=myrecord>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','myrecord',600,600,this.form)" value="My Record">
        <input type=hidden name=md value="myrecord">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form name=mapform method=post action=$set::cgi_url target=map>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','map',500,400,this.form)" value="地図">
        <input type=hidden name=md value="map">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=bag>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','bag',350,500,this.form)" value="荷物">
        <input type=hidden name=md value="bag">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=bag>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','bag',350,500,this.form)" value="作成">
        <input type=hidden name=md value="compose">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=pet>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','pet',350,600,this.form)" value="$set::lab{pt}">
        <input type=hidden name=md value="pet">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=guild>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','guild',350,600,this.form)" value="$set::lab{gu}">
        <input type=hidden name=md value="guild">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=quest>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','quest',350,600,this.form)" value="$set::lab{qs}">
        <input type=hidden name=md value="quest_before">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url>
        <td width=100% class=r>
        <input type=submit class=button value="ログアウト">
        <input type=hidden name=md value="logout">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        </tr>
        </table>
    
        <table class=outertable border=1>
        <tr><th>アクション</th><th>プレイヤーリスト</th><th>移動</th><th>探索</th></tr>
        <tr>
        <form action=$set::cgi_url method=post target=action>
        <td nowrap>
        <select name=md size=8 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="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 onClick="return OpenWindow('','action',400,550,this.form)" value="$set::okb">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form name=playerlistform method=post action=$set::cgi_url target=playerlist>
        <td nowrap>
        <select name=or size=8 class=select>
        <option value="Ft" selected>戦闘系</option>
        <option value="Cz">生産系</option>
        <option value="Bt">賞金首</option>
        <option value="Ps">人口統計</option>
        <option value="Si">販売情報</option>
        <option value="Rk">ランキング</option>
        </select>
        <input type=submit class=button onClick="return OpenWindow('','playerlist',0,0,this.form)" value="$set::okb">
        <input type=hidden name=md value="playerlist">
        <input type=hidden name=pl value="$I->{pl}">
        </td>
        </form>
        <form name=spotform method=post action=$set::cgi_url target=spot>
        <td nowrap>
        <select name=md size=8 class=select>$spotoption<option value=church_before>教会へ行く</option></select>
        <input type=submit class=button onClick="return OpenWindow('','spot',400,500,this.form)" value="$set::okb">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form name=findform method=post action=$set::cgi_url target=find>
        <td nowrap width=100% class=r>
        <select name=do class=select>$do</select>
        <input type=submit class=button onClick="return OpenWindow('','find',400,500,this.form)" value="$set::okb">
        <input type=hidden name=md value="find">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        </tr>
        </table>
    
        <table class=outertable>
        <tr>
        <form method=post action=$set::cgi_url target=mailbox>
        <td width=100% class=r>
        <input type=submit class=button onClick="return OpenWindow('','mailbox',600,600,this.form)" value="手紙を読む">
        <input type=hidden name=md value="mail_box">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        <form method=post action=$set::cgi_url target=mail>
        <td>
        <input type=submit class=button onClick="return OpenWindow('','mail',400,500,this.form)" value="手紙を書く">
        <input type=hidden name=md value="mail_before">
        <input type=hidden name=id value="$F{id}">
        <input type=hidden name=ps value="$F{ps}">
        </td>
        </form>
        </tr>
        </table>
    
        </td>
    
        <td width=50%>
        <div class=label>ステータス</div>
        <table class=outertable border=1>
        <tr>
        <th nowrap class=padding><img name=I2 src=$set::mim_dir/$I->{im} class=image><br><span id=nm>$I->{nm}</span></th>
        <td width=100% rowspan=2>
    
        <table width=100%>
        <tr>
        <td class=padding width=40%>
        $set::lab{sx}:<img src=$set::mim_dir/$I->{sx}.gif><br>
        $set::lab{kg}:<img src=$set::mim_dir/flag$I->{kg}.gif title=$I->{Kg}{nm}><br>
        $set::lab{jb}:<span id=jb>$I->{jb}</span><br>
        $set::lab{lv}:<span id=lv>$I->{lv}</span><br>
        $set::lab{ex}:<span id=ex>$I->{ex}</span><br>
        $set::lab{gl}:<span id=gl>$I->{gl}</span> $set::mny<br>
        $set::lab{rw}:<span id=rw>$I->{rw}</span> $set::mny<br>
        $set::lab{da}:<span id=da>$I->{Da}</span><br>
        $set::lab{ij}:<span id=ij>$I->{Ij}</span><br>
        $set::lab{cd}:<span id=cd>$I->{Cd}{in}</span><br>
        </td>
        <td class=padding>
        $set::eqp{rh}:<span id=rh>$I->{Rh}{Im}$I->{Rh}{nm}$I->{Rh}{Ef}</span><br>
        $set::eqp{lh}:<span id=lh>$I->{Lh}{Im}$I->{Lh}{nm}$I->{Lh}{Ef}</span><br>
        $set::eqp{sb}:<span id=sb>$I->{Sb}{Im}$I->{Sb}{nm}$I->{Sb}{Ef}</span><br>
        $set::eqp{hd}:<span id=hd>$I->{Hd}{Im}$I->{Hd}{nm}$I->{Hd}{Ef}</span><br>
        $set::eqp{bd}:<span id=bd>$I->{Bd}{Im}$I->{Bd}{nm}$I->{Bd}{Ef}</span><br>
        $set::eqp{lg}:<span id=lg>$I->{Lg}{Im}$I->{Lg}{nm}$I->{Lg}{Ef}</span><br>
        $set::eqp{nk}:<span id=nk>$I->{Nk}{Im}$I->{Nk}{nm}$I->{Nk}{Ef}</span><br>
        $set::eqp{fg}:<span id=fg>$I->{Fg}{Im}$I->{Fg}{nm}$I->{Fg}{Ef}</span><br>
        </td>
        </tr>
        </table>
        </td>
        </tr>
        <tr>
        <th><span id=pim>$I->{Co}{Im}</span><br><span id=pnm>$I->{Co}{nm}</span></th>
        </tr>
        </table>
    
        <table class=outertable border=1>
        <tr>
        <td width=100>
        <table>
        <tr>
        <td nowrap class=monospace>$set::lab{tc}</td>
        <td nowrap class=r><span id=tc>$I->{tc}</span></td>
        <td width=100%><span id=Gtc>$I->{Gtc}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{st}</td>
        <td nowrap class=r><span id=st>$I->{st}</span></td>
        <td width=100%><span id=Gst>$I->{Gst}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{dx}</td>
        <td nowrap class=r><span id=dx>$I->{dx}</span></td>
        <td width=100%><span id=Gdx>$I->{Gdx}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{in}</td>
        <td nowrap class=r><span id=in>$I->{in}</span></td>
        <td width=100%><span id=Gin>$I->{Gin}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{cn}</td>
        <td nowrap class=r><span id=cn>$I->{cn}</span></td>
        <td width=100%><span id=Gcn>$I->{Gcn}</span></td>
        </tr>
        </table>
        </td>
        <td>
        <table>
        <tr>
        <td nowrap class=monospace>$set::lab{lf}</td>
        <td nowrap class=r><span id=lf>$I->{lf}</span></td>
        <td width=100%><span id=Glf class=gage>$I->{Glf}$I->{Xlf}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{vt}</td>
        <td nowrap class=r><span id=vt>$I->{Vt}/$I->{Mvt}</span></td>
        <td width=100%><span id=Gvt class=gage>$I->{Gvt}$I->{Xvt}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{hl}</td>
        <td nowrap class=r><span id=hl>$I->{hl}</span></td>
        <td width=100%><span id=Ghl class=gage>$I->{Ghl}$I->{Xhl}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{ap}</td>
        <td nowrap class=r><span id=ap>$I->{ap}</span></td>
        <td width=100%><span id=Gap class=gage>$I->{Gap}$I->{Xap}</span></td>
        </tr>
        <tr> 
        <td nowrap class=monospace>$set::lab{hy}</td>
        <td nowrap class=r><span id=hy>$I->{hy}</span></td>
        <td width=100%><span id=Ghy class=gage>$I->{Ghy}$I->{Xhy}</span></td>
        </tr>
        </table>
        </td>
        </tr>
        </table>
    
        <table class=outertable>
        <tr> 
        <td width=33%>
        <a class=back href=$set::htm_dir/manual/ target=_blank>マニュアル</a><br>
        <a class=back href=$set::htm_dir/kingdom.html target=_blank>国一覧表\</a><br>
        </td>
        <td width=33%>
        </td>
        <td width=33%>
        </td>
        </tr>
        </table>
        </td>
        </tr>
        </table>
        <div class=inform><div id=newmail></div><div id=newrecord></div><div id=revive></div></div>
        END_OF_HTML
    

    OpenWindowをいじっただけなんですが、修正がややこしいので置き換えで。

    library/church.cgiを開く
    sub church_before:
        <input type=button class=button onClick="OpenWindow('$set::cem_htm','cemetery',1024,768)" value="$set::lab{pt}墓地">
    ↓
        <input type=button class=button onClick="return OpenWindow('$set::cem_htm','cemetery',0,0)" value="$set::lab{pt}墓地">
    
    library/partner.cgiを開く
    sub partner_talk:
        <input type=submit class=button onClick="OpenWindow('$set::cgi_url','partner',300,500)" value="$U->{nm}のステータス">
    ↓
        <input type=submit class=button onClick="return OpenWindow('','partner',300,500,this.form)" value="$U->{nm}のステータス">
    
    javascript/OpenWindow.jsを開く
    function OpenWindow(url,name,w_size,h_size,self){
    
       if (typeof sos3 == "undefined")
          sos3 = opener && typeof opener.sos3 != "undefined" ? opener.sos3 : { window:{} };
    
       if (!self || !sos3.window[name] || sos3.window[name].closed) {
          if (!url) url = "about:blank";
          if (!w_size) w_size = screen.availWidth;
          if (!h_size) h_size = screen.availHeight;
    
          option = "scrollbars=yes,resizable=yes,width=" + w_size + ",height=" + h_size;
          sos3.window[name] = window.open(url,name,option);
    
          if (opener) opener.sos3 = sos3;
       }
    
       if (self) self.submit();
       return false;
    }
    

    上記に置き換え。
    selfがない・小窓が開かれたことがない・小窓が閉じられている場合に小窓を開きます。
    selfにはフォーム自身が入り、selfがある場合にはsubmitされます。
    OpenWindowが実行されたときはHTMLのsubmitボタンは動作しません。

    【リストへ戻る】

    【トップへ戻る】



  6. ちょっとしたこと
    1. インフォメーション作成で文字実体参照が使えるように
    2. Spetial Thanksのアンカーを無効に
    3. 接触した相手がログイン中の場合に戻るボタン
    4. モンスターの出る地域でお金を拾えるように
    5. 農場でもAPPによって販売価格が変動するように
    6. 複数オーブトレード
    7. いつもの2倍作成に成功したら獲得経験値も2倍に
    8. グレードを文字で表示
    9. 灯りを補助として装備出来るように
    10. 一定期間対人戦を仕掛けていないプレイヤーは賞金首でもガードに守られるように
    11. 両手装備のアイテムを補助に装備しているときでも左手にアイテムを装備出来るように
    12. 権利書販売表示の順序を変更
    13. 移動コマンドのプルダウンの順序を変更
    14. ペットにえさを与えるとき、個数指定できるように
    15. オーブ設定の「一個ずつ残してそれ以外はトレード」で個数指定できるように
    16. ペットのおなかの状態がMAXのときに「満腹」の表示になるように
    不具合ではないけどやってみたことです。

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

    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;
    

    【リストへ戻る】

    灯りを補助として装備出来るようにしてみる。

    鉱山やダンジョンで使用する灯りを補助装備として持てるようにします。
    これによりダンジョンで両手装備を主装備として装備できるようになるなど、装備選択の幅が広がります。
    そのかわり、両手装備をはじかれたときはロウソクで戦う羽目に…(ロウソクは素手扱い)

    item/market_sale_item.cgiを開く
        'Candle_mk' => {
                  nm => 'ロウソク',
                  cl => 'Tl',
                  id => 'Candle_mk',
                  ql => 'Lh,Li,Dk,Ns',
    ↓
        'Candle_mk' => {
                  nm => 'ロウソク',
                  cl => 'Tl',
                  id => 'Candle_mk',
                  ql => 'Lh,Sb,Li,Dk,Ns',
    

    カンテラがある場合は同様に'Sb'を追加。

    library/break.cgiを開く
    sub break_check:
        $e = 'sb' if $F && !$S->{Rh}{ql}{$F};
    
        $E = ucfirst $e;
    ↓
        $E = ucfirst $e;
    
        ($e,$E) = ('sb','Sb') if $F && !$S->{$E}{ql}{$F};
    
    library/dungeon.cgiを開く
    sub enter_check:
            $F = 1 if $I->{$E}{ql}{Li};
    ↓
            ($F = 1) && last if $I->{$E}{ql}{Li};
    
    sub enter_check:
        &set_item($I) if &break_check($I,'lh');
    ↓
        &set_item($I) if &break_check($I,$e);
    
    library/mine.cgiを開く
    sub mine_after:
        &say("明かりを灯すアイテムを装備していません",'CLOSE') if !$I->{Lh}{ql}{Li};
        &say("$I->{Lh}{Im}$I->{Lh}{nm}の耐久力は残り$I->{Lh}{db}です",'mine_before') if $I->{Lh}{db} < $F{do};
    ↓
        $Y = $I->{Lh}{ql}{Li} ? 'Lh' : $I->{Sb}{ql}{Li} ? 'Sb' : 0;
        &say("明かりを灯すアイテムを装備していません",'CLOSE') if !$Y;
        &say("$I->{$Y}{Im}$I->{$Y}{nm}の耐久力は残り$I->{$Y}{db}です",'mine_before') if $I->{$Y}{db} < $F{do};
    
    sub enter_check:
        &break_check($I,'lh',$F{do});
    ↓
        &break_check($I,'lh',$F{do},'Li');
    

    【リストへ戻る】

    一定期間対人戦を仕掛けていないプレイヤーは賞金首でもガードに守られるようにしてみる。

    戦闘の意思のない一般市民に報奨金を懸けることで賞金首にし、街中で虐殺できてしまうので
    その対策として対人戦を仕掛けていないプレイヤーは賞金首でもガードに守られるようにしてみます。

    set.cgiを開く
    # 賞金首 Bounty ###################################### #
    $bod = 7;                    # n日間対人戦を仕掛けていないとガードに守られるようにする(yes=日,no=0)
    
    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} && $U->{rw} < $set::sps;
    ↓
        $U->{en} =~ s/^(\d+),//;
        $U->{FT} = $1 ? $1 : 0;
    
        &partner('',"<img src=$set::mim_dir/envGd.gif><br><br>$I->{Pl}{nm}での戦闘は禁止されています") if $I->{Pl}{ev}{Gd} && !$U->{vp} && ($U->{rw} < $set::sps || time - $U->{FT} > $set::bod * 3600 * 24);
    
    sub fight_player:
        # 自分を最近戦った相手に追加 #
        pop(@Uen) if @Uen >= $set::elx;
        $U->{en} = join(',',"$I->{id}:".time,@Uen);
    ↓
        # 自分の戦闘履歴を作成 #
        $I->{en} = join(',',time,($I->{en} =~ /^[^,]*,(.*)/)[0]);
    
        # 自分を最近戦った相手に追加 #
        pop(@Uen) if @Uen >= $set::elx;
        $U->{en} = join(',',$U->{FT},"$I->{id}:".time,@Uen);
    
    library/contact.cgiを開く
    sub contact_before:
            $U->{Li} = &login_check($U,1) ? '○':
                    $U->{rw} >= $set::sps ? '▼':
    ↓
            $U->{Bo} = $U->{rw} >= $set::sps && (!$I->{Pl}{ev}{Gd} || time - (split /,/,$U->{en})[0] <= $set::bod * 3600 * 24) ? 1 : 0;
            $U->{Li} = &login_check($U,1) ? '○':
                                 $U->{Bo} ? '▼':
    
    library/partner.cgiを開く
    sub partner_status:
        $U->{rw} = "<span class=alert>$U->{rw}</span>" if $U->{rw} >= $set::sps;
    ↓
        $U->{rw} = "<span class=alert>$U->{rw}</span>" if $U->{rw} >= $set::sps && (!$U->{Pl}{ev}{Gd} || time - (split /,/,$U->{en})[0] <= $set::bod * 3600 * 24);
    
    library/playerlist.cgiを開く
    sub playerlist:
        &get_resident($I);
    ↓
        &get_place($I);
        &get_resident($I);
    
    sub playerlist:
            next if $F{or} eq 'Bt' &&  $U->{rw} < $set::sps;
            $U->{Li} = &login_check($U,1) ? '○':
                    $U->{rw} >= $set::sps ? '▼':
    ↓
            next if $F{or} eq 'Bt' &&  $U->{rw} < $set::sps;
            $U->{Bo} = $U->{rw} >= $set::sps && (!$I->{Pl}{ev}{Gd} || time - (split /,/,$U->{en})[0] <= $set::bod * 3600 * 24) ? 1 : 0;
            $U->{Li} = &login_check($U,1) ? '○':
                                 $U->{Bo} ? '▼':
    

    【リストへ戻る】

    両手装備のアイテムを補助に装備しているときでも左手にアイテムを装備出来るようにしてみる。

    左手装備と同時に両手装備を補助に装備できるようにします。
    戦闘中、主装備から補助装備に持ち替える時は怪力スキルがない場合は左手装備をしまうようになります。

    library/equip.cgiを開く
    sub fitting_room:
        elsif ($Si->{Ql}{Dh} && !$I->{Sk}{Hs} && &equip_check('lh','O')) {
    ↓
        elsif (!$F{sb} && $Si->{Ql}{Dh} && !$I->{Sk}{Hs} && &equip_check('lh','O')) {
    
    sub equip_check:
        elsif ($T eq 'D' && ($I->{rh} || $I->{sb})) {
    ↓
        elsif ($T eq 'D' && $I->{$E}) {
    
    sub equip_check:
            &get_equipment($I,'sb');
    と
            elsif ($I->{Sb}{ql}{Dh})  { return 1 }
    を削除
    
    library/fight.cgiを開く
    sub change_weapon:
                $S->{WO} = 5;   # 5 = 副装備ON
                %{$S->{Rh}} = %{$S->{Sb}};
                &M("$S->{Nm}は$S->{Rh}{nm}を取り出した。");
    ↓
                $S->{WO} = 5;   # 5 = 副装備ON
                %{$S->{Rh}} = %{$S->{Sb}};
                if ($S->{Rh}{ql}{Dh} && $S->{Lh}{nm} && !$S->{Sk}{Hs}) {
                    &M("$S->{Nm}は$S->{Lh}{nm}を仕舞い$S->{Rh}{nm}を取り出した。");
                    undef $S->{SH} if $S->{Lh}{cl} eq 'Sh';
                    undef %{$S->{Lh}};
                }
                else {
                    &M("$S->{Nm}は$S->{Rh}{nm}を取り出した。");
                }
    

    【リストへ戻る】

    権利書販売表示の順序を変更してみる。

    全てのプレイヤーに需要のありそうな財産権利書を先頭に持っていき、戦闘職にあまり縁のない販売権利書をその次に移動します。

    library/castle.cgiを開く
    sub castle_before:
        <input type=radio class=radio name=tp value=Dd1 checked> 販売権利書を購入する・・・$V1 $set::mny<br>
        <input type=radio class=radio name=tp value=Dd2> 財産権利書を購入する・・・$V2 $set::mny<br>
    ↓
        <input type=radio class=radio name=tp value=Dd2 checked> 財産権利書を購入する・・・$V2 $set::mny<br>
        <input type=radio class=radio name=tp value=Dd1> 販売権利書を購入する・・・$V1 $set::mny<br>
    

    【リストへ戻る】

    移動コマンドのプルダウンの順序を変更してみる。

    使いやすい並びを模索。

    data/place.cgiを開く

    全ての街の 'ev' を

    1. 'Mk' -> 市場
    2. 'Bk' -> 銀行
    3. 'Ct' -> 城
    4. 'Hb' -> 港
    5. 'Fm' -> 農場
    6. 'Fr' -> 森
    7. 'Rv' -> 川
    8. 'Mn' -> 鉱山
    9. 'Dg' -> ダンジョン
    10. 'Pb' -> 公衆浴場
    11. 'Gd' -> ガード
    12. 'Ms' -> モンスター
    13. 'Dr' -> ドラゴン

    の順に並べ替え

    【リストへ戻る】

    ペットにえさを与えるとき、個数指定できるようにしてみる。

    library/feed.cgiを開く
    sub feed_before:
            $t1 .= "<input type=checkbox name=$i class=checkbox> ";
            $t1 .= &decorate_item($Ii);
    ↓
            $t1 .= qq|<tr>\n<td>\n|;
            $t1 .= qq|<input type=checkbox name=$i class=checkbox> |;
            $t1 .= &decorate_item($Ii);
            $t1 .= qq|</td>\n<td class=r>|;
            $t1 .= qq|<input type=textbox name=t$i class=textbox size=5 value=$Ii->{qn}>|;
            $t1 .= qq|</td>\n</tr>\n|;
    
    sub feed_before:
        $t2 = &item_image($Ip)."$Ip->{Nm}<br>\n<br>\n";
    ↓
        $t2 = &item_image($Ip)."$Ip->{Nm}<br>\n";
    
    sub feed_before:
        $t2
        $t1
    ↓
        $t2
        <table class=item>
        <tr class=first>
        <td colspan=2 class=r>与える個数</td>
        </tr>
        $t1
        </table>
    
    sub feed_after:
    		next if !$F{$i};
            &say('Item Select Error','CLOSE') if !&favorite_check($Ip,$Ii);
    ↓
    		next if !$F{$i};
            next if $F{"t$i"} <= 0;
            &say('Item Select Error','CLOSE') if !&favorite_check($Ip,$Ii);
            &say("$Ii->{nm}:数値以外は使用出来ません。",'pet') if $F{"t$i"} =~ /\D/;
            $F{"t$i"} = $Ii->{qn} if $F{"t$i"} > $Ii->{qn};
    
    sub feed_after:
                $energy += int($Ii->{Ef} * $Ii->{qn});
    ↓
                $energy += int($Ii->{Ef} * $F{"t$i"});
    
    sub feed_after:
            &M("$Ip->{Nm}に$Ii->{nm}をあげました。");
            &change_status($Ip,'lf',$Ii->{Ef},1,$Ip->{lx}) if $Ip->{lf} < $Ip->{lx};
            &change_status($I,'bg',-($Ii->{wt} * $Ii->{qn}));
            $Ii->{qn} = 0;
    ↓
            &M("$Ip->{Nm}に$Ii->{nm}を".$F{"t$i"}."個あげました。");
            &change_status($Ip,'lf',$Ii->{Ef},1,$Ip->{lx}) if $Ip->{lf} < $Ip->{lx};
            &change_status($I,'bg',-($Ii->{wt} * $F{"t$i"}));
            &change_status($Ii,'qn',-$F{"t$i"});
    

    【リストへ戻る】

    オーブ設定の「一個ずつ残してそれ以外はトレード」で個数指定できるようにしてみる。

    library/orb.cgiを開く
    sub orb_before:
        <input type=checkbox name=ta> 一個ずつ残してそれ以外はトレード<br>
    ↓
        <input type=checkbox name=ta> <input type=text size=2 name=tb class=textbox value=1> 個ずつ残してそれ以外はトレード<br>
    
    sub orb_after:
    my  %unique;
    ↓
    my  %unique;
    
        &say("数値以外使用できません",'orb_before') if $F{ta} && $F{tb} =~ /[^\d]/;
    
    sub orb_after:
            $F{$_} = 0 if $F{ta} && !$unique{$_}++;
    ↓
            $F{$_} = 0 if $F{ta} && $unique{$_}++ < $F{tb};
    

    【リストへ戻る】

    ペットのおなかの状態がMAXのときに「満腹」の表示になるようにしてみる。

    おなかの状態が80%以上で満腹の表示だったのを、100%で満腹の表示になるようにします。
    これにより、80〜100%の区分の表示が「充分」になります。

    data/petdata.cgiを開く
    # Pet's Stomach #
    @PS = ('餓死',
           '飢餓',
           '空腹',
           '普通',
           '八分',
           '満腹',
           '不要',
    );
    ↓
    # Pet's Stomach #
    @PS = ('餓死',
           '飢餓',
           '空腹',
           '普通',
           '八分',
           '充分',
           '満腹',
           '不要',
    );
    
    library/pet.cgiを開く
    sub pet:
                    $stomach = int(($Ip->{hg} - 1) / $Ip->{hx} * 5) + 1;
    ↓
                    $stomach = int($Ip->{hg} / $Ip->{hx} * 5) + 1;
    

    【リストへ戻る】

    【トップへ戻る】




[PR]p:K掘{i