[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]
<li>TECが上がれば船、糸巻き機、織り機、棚なども作れるようになる。</li></ul> <li>自分で作成できないアイテムは他の職業の人から買うか闇市で買う。</li> ↓ <li>TECが上がれば船、糸巻き機、織り機、棚なども作れるようになる。</li> <li>自分で作成できないアイテムは他の職業の人から買うか闇市で買う。</li> </ul>
パン粉
<td>小麦+イースト菌+火</td>
↓
<td>小麦粉+イースト菌+火</td>
対人の購入で、アイテムを購入するとペットのデータも更新(保存)される不具合を修正します。
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タグが閉じられていない不具合を修正します。
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>
変だなーと思いつつどこが変なのか今まで分からなかったというね…
インフォメーション作成で文字実体参照が使えるように(問題が起こりそうなのでやらないほうがいいかも)
sub edit_information:
$t1 =~ s/<br>/\n/g;
↓
$t1 =~ s/<br>/\n/g;
$t1 =~ s/&/&/g;
sub make_information:
$F{in} =~ s/</</g;
$F{in} =~ s/>/>/g;
↓
$F{in} =~ s/</</g;
$F{in} =~ s/>/>/g;
$F{in} =~ s/&/&/g;
sub decode:
$V =~ s/</</g;
$V =~ s/>/>/g;
↓
$V =~ s/&/&/g;
$V =~ s/</</g;
$V =~ s/>/>/g;
sub rights:
print qq|<a href="#" onClick="GetView('creators')">$creators_label</a>\n| if !$set::stv;
↓
print qq|<a href="#" onClick="GetView('creators');return false">$creators_label</a>\n| if !$set::stv;
sub login_check: my $T = shift; # true -> return true, false -> error ↓ my $T = shift; # mode -> say, true -> return true, false -> error
sub login_check:
if ($T) { return 1 }
↓
if ($T =~ /\D/) { &say("$S->{nm}は現在ログイン中です",$T) }
if ($T) { return 1 }
sub bounty_after:
&login_check($U);
↓
&login_check($U,'bounty_before');
sub buy_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub buy_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub contact_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub cure_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub cure_after:
&login_check($U);
↓
&login_check($U,'contact_before');
sub destone:
&login_check($U);
↓
&login_check($U,'contact_before');
sub fight_player:
&login_check($U);
↓
&login_check($U,'contact_before');
sub trade_before:
&login_check($U);
↓
&login_check($U,'contact_before');
sub trade_after:
&login_check($U);
↓
&login_check($U,'contact_before');
モンスターの出る地域でお金を拾えるようにしてみます。
探索ごとに入手する・戦闘後の入手額に追加する2パターンやってみました。
「探索ごとに入手する」では毎回必ず入手できます。
「戦闘後の入手額に追加する」ではモンスターを倒さないと入手できません。
まずは共通部分。
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;
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};
# 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);
# 合成 Compose ####################################### # $dex = 2; # ダブルロールに成功したときは獲得経験値をn倍にする
sub compose_after:
&double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} =~ /(Fd|Mt)/;
↓
&double_roll($I,$Ui->{dt}) if $Ui->{dt}{cl} =~ /(Fd|Mt)/;
$Ui->{ex} = int($Ui->{ex} * $set::dex) if $I->{DB};
sub double_roll:
$Si->{qn} *= $set::ddu;
↓
$Si->{qn} *= $set::ddu;
$S->{DB} = 1;
応用でエクセレントロールのときも出来ますね。
経験値は手に入らない場合はメッセージは表示されないので、勝利金も同じようにしてみました。
sub fight_money:
$V = 0 if $V < 0;
↓
$V = 0 if $V < 0;
return if $V < 1;
闇市で売られている品物を種類ごとに表示・非表示の切り替えが出来るようにしてみる。
闇市で売られている商品をグループ分けして、必要なものだけ表示できるような機能を取り付けます。これにより闇市が多少スッキリするかもしれません。
クラスごとにグループ分けされ、食品やインゴットなどの分類が書かれたラベルをクリックすることでそのグループの表示・非表示を切り替えます。
※闇市のアイテムデータがソートされていることを前提にした改造なので、sub sell_afterのsort_itemは消さないでね
いつからか書いてた変なギミックとはこれのことです。
クッキーを大量に作ってしまう気持ち悪い仕様だったのですが、クッキー一個に纏めたので公開します。
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>
小窓を共有しているアクションに(ほぼ)一発で飛ぶフォームをページの下に表示します。
かなり強引です。
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 の下あたりに追加。