「ホワイトペーパー」(2008/03/20 (木) 16:32:40) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
SoS3に施した改造をまとめておきます。
>&bold(){&color(red){以下の記述はまずいスパゲティです。ご注意下さい。}}
>&bold(){&color(red){説明が面倒な所については何も書かれてないことがあります。}}
>&bold(){&color(red){「ソースが汚い。まずい。」等の質問には答えられません。}}
[[http://sos3.sakura.ne.jp/custom/index.html]]
*装飾
装飾品がなくてさびしいので戦闘補助として機能させます。
fight.cgiにも戦闘補助用のルーチンが結構冬眠してる状態なので呼び覚まします。
別に戦闘補助として用意されている'Op'因子を持たせてしまえばいいのですが
これだとたった1回で消えてしまいます。
>戦闘補助は専用のデータベース(useroption/[id].cgi)に格納され
>スタックされていく感じ(1番上に来ているデータを取り出す→順番をずらす→保存)
>だから ○○○x5 のようにパックしてても 1回で消費される。
>(耐久消費にもしたいが面倒なんだよね)
そこで戦闘補助機能を有効活用するのと
宝石職人を助ける意味を込めてちょっとfight.cgiをいじります。
# Sub Get Option #
sub get_option {
//下のelsifを追加
elsif ($S->{Nk}{cl} eq 'FOp') {
&M("$S->{Nm}は$S->{Nk}{nm}を使用した。");
$S->{Op}{nm} = $S->{Nk}{nm};
foreach (split(/,/,$S->{Nk}{ef})) {
($K,$V) = split(/=/);
$V ||= 1;
$S->{Op}{$K} = $V;
}
}
&M(”~”)は必毎回表示されるのは結構うざったいかも(適宜削除を)
:FOp|装飾品で戦闘補助としてあつかう為につけた仮のクラス
date/itemdictionaryにも併せて追加しておきましょう
自分で好きな用に決めた方がわかりやすくていいかもね
装飾品のアイテムデータ
(省略)
dt => { nm => '戦闘の心得',
cl => 'FOp',
ql => 'Nk',
id => 'Nothajiki',
im => 'greenring.gif',
qn => 1,
ef => 'Nk=8',
bp => 90,
db => 50,
wt => 0.1 } },
-'cl'因子は「FOp」にしてますが自由に(3文字だとプログラムが汚く見える箇所が…)
-'ql'因子は装飾品のためのクラス「Nk」(別に右手とか左手とかでもいいけど'装飾'で)
-'ef'は「(引き出す効果)=(数値)」の形で指定します。
> itemdictionaryより
> Ad => '直接死(必殺,道連れ,首狩り等)を100%回避します。',
> At => '基本攻撃力が上がります。',
> Df => '基本防御力が上がります。',
> Nd => '直接死以外での死を100%回避します。',
> Nk => '武器が弾き飛ばされなくなります。',
> Sc => '盗難を100%防止します。',
> Ub => '武具破壊を100%防ぎます。',
「○=×」の形で指定できるのは「At」「Df」(ここで指定した値が基本○○力に追加される)
よってそれ以外は 'ef' => 'Ad'などでも可
***半歩先へ
「調べる」コマンドを実行すると表示される説明が何ともアレなので
look.cgiを改造しておきましょう。
fight.cgi内を「->{Op}」で検索してみましょう
上に書いてある効果以外にも隠された機能が見つかるかもしれません。
***最後に
書いてて気づきましたが
実は1行書き換えるだけでいいような気がします
アイテムデータの 'cl'に'Op'、'ql'に'Nk'として
装備する
> elsif ($S->{Op}{cl} eq 'Op') {
の部分に $S->{Nk}{cl} も見に行き「'cl'は'Op'か?」ようにすれば
同じ効果を得られるような…
(論理演算式考えるの面倒なのでまぁいいか)
*使い魔
魔法攻撃ができるペット
やたら強いです なんか持ち主よりも強いです。
調整できるまでしばらく実装にはかかりそうです。
pet.cgi
# 使い魔
if($Ip->{mg}){
require "$set::dat_dir/magic.cgi";
$t2 .= "<tt>魔法:$PMG[$Ip->{mg}]{nm}</tt><br>\n";
}
$past = $Ip->{hg} ? '' : 'だった';
$j = $i - 1;
$t1 .= "<tt>年齢:$age</tt><br>\n";
$t1 .= "<tt>$set::lab{lv}:$Ip->{lv}</tt><br>\n";
$t1 .= "<tt>$set::lab{ex}:$Ip->{ex}</tt><br>\n";
$t1 .= "<tt>LIF:$Ip->{lf}/$Ip->{lx}</tt><br>\n";
追加? $t1 .= "<tt>攻/守:$Ip->{of}</tt><br>\n";
追加 $t1 .= $t2;
$t1 .= "<tt>性格:$PN[$Ip->{ch}]$past</tt><br>\n";
$t1 .= "<tt>信頼度:$PC[$confidence]</tt><br>\n";
$t1 .= "<tt>空腹度:$PS[$stomach]</tt><br>\n";
date/magic.cgi に @PMGデータを追加(元からある@MGを使うようにしてもいい)
fight.cgi
prepare_companion
# 馬は戦力外(自身DEXに馬の攻撃力が付く) #
if ($S->{Co}{cl} eq 'Hr') {
$S->{DX} = $S->{Co}{of};
undef $S->{Co};
return;
}
# 使い魔は魔法を使うので別ルーチン
if ($S->{Co}{cl} eq 'Sp') {
$S->{PSp} = 1;
}
concrete_battle
# ペット攻撃 #
if (&companion_action($A->{Co},'A')) {
if ($A->{PSp}) {
$PMG[$A->{Co}{mg}]{Im} = &item_image($PMG[$A->{Co}{mg}]);
$pt1 = "$PMG[$A->{Co}{mg}]{Im} $A->{Co}{nm}の攻撃!$PMG[$A->{Co}{mg}]{nm}!";
&pet_magic_effect($A,$D,$A->{Co}{of},$PMG[$A->{Co}{mg}]{ef});
$CADM = $A->{Co}{of};
$CADM = int( $CADM * ($PMG[$A->{Co}{mg}]{dm})/10 );
$CDDM = $D->{PMe}{qk} ? int($CADM * 0.1): 0;
$CADM = $A->{PMe}{hl} ? 0:
$D->{PMe}{dt} ? int($D->{lf} / 2):
$D->{PMe}{qk} ? int($CADM * 1.5):
$D->{PMe}{gd} ? int($CADM * 0.5): $CADM;
&pet_experience($A->{Co},$CADM);
$MSG = 9;
}else{
$CADM = $A->{Co}{of};
&pet_experience($A->{Co},$CADM);
$MSG = 4;
}
}
(中略)
&M($M) if $M;
&M("$A->{Nm}の$A->{Co}{Nm}が$D->{Nm}に襲い掛かり、<span class=alert>$CADM</span>のダメージを与えた。") if $MSG == 4 && $CADM;
if($MSG == 9){
&M("$pt1");
&pet_magic_effect($A,$D,$A->{Co}{of},$PMG[$A->{Co}{mg}]{ef});
$M = "<span class=alert>$CADM</span>";
$M = $A->{PMe}{hl} ? "":
$D->{PMe}{dt} ? "$D->{Nm}の$set::lab{lf}が半減した!":
$D->{PMe}{qk} ? "大地が揺れ、$D->{Nm}は$Mのダメージ、$A->{Nm}は$CDDMのダメージを受けた!":
$D->{PMe}{sk} ? "$A->{Nm}は感電して動けない!":
$D->{PMe}{gd} ? "$D->{Nm}は$A->{Nm}の攻撃を吸収!ダメージを$Mに抑えた。":
"$D->{Nm}は$Mのダメージを受けた!";
&M($M) if $M;
}
&M("$D->{Co}{Nm}は$set::lab{lf}が0になり気絶した。") if $MSG == 5 && !$D->{Co}{lf};
これだけじゃあ 一部しか機能しないから
適宜改造していきましょう
適当な箇所で require "$set::dat_dir/magic.cgi";
をしないとペットの攻撃が0になってしまうので注意
今のところ 火 水 土 風 ぐらいしか使い魔がいないからまあいいけど
追加(追加しなくても十分機能するから いらないかもね)
# Sub Magic Effect #
sub pet_magic_effect {
my $A = shift; #攻撃者(飼い主)
my $D = shift; #攻撃対象
my $C = shift; #ペットのもつ能力 of
my $V = shift; #その他のフラグ
return if !$V;
if ($V eq 'hl') {
&change_status($A,'lf',$A->{in});
&M("$A->{Nm}のLIFが$A->{in}回復した!");
$A->{PMe}{hl} = 1;
}
elsif ($V eq 'gd') {
&M("$A->{Nm}を一陣の風が包み込む。");
$A->{PMe}{gd} = 1;
}
elsif ($V eq 'ps') {
return if &roll_dice(10) < $A->{in} - $D->{in};
&change_condition($I,'cd','Ps',1);
&M("$D->{Nm}は$D->{Cd}{Ps}した!");
}
elsif ($V eq 'sk') {
return if &roll_dice(10) < $A->{in} - $D->{in};
&M("激しい雷光が$D->{Nm}を直撃!");
$A->{PMe}{sk} = 1;
}
elsif ($V eq 'fz') {
return if &roll_dice(10) < $A->{in} - $D->{in};
&M("$D->{Nm}は氷に覆われた!");
$A->{Fz} = 1;
}
elsif ($V eq 'qk') {
$D->{PMe}{qk} = 1;
}
elsif ($V eq 'dt') {
return if &roll_dice(10) < $A->{in} - $D->{in};
&M("$D->{Nm}の背後に死神が現れる・・・。");
$D->{PMe}{dt} = 1;
}
}
*追い剥ぎ
移動中に戦いを仕掛けられます。
sub transfer_after
if(#############){
$R = &oihagi();
if($R==1){
&M("<br>追い剥ぎに遭い移動に失敗しました。");
&say($I->{M},'CLOSE');
}
&reload_gage(['lf','hl','ap','hy'],'V');
}
発生条件はどうしましょうかねぇ
# Sub 追い剥ぎ #
sub oihagi {
my $Ui;
my $W;
require "$set::lib_dir/fight.cgi";
require "$set::itm_dir/oihagi.cgi";
@FI = sort { $a <=> $b } keys %FI;
$Ui = $FI{1};
$U = {%$Ui};
&get_item($I);
$W=&fight_creature($set::mbx);
&sort_item($I);
&set_item($I);
return $W;
}
*アクセシビリティ
**ラベル付け
大抵の選択肢は文字列やブロックをクリックするだけで選択可能な状態にしてあります。
もともと私が他のSoSなどのブラウザゲームをしているときから気になっていたもので
マウス操作がほとんどのゲームなのにクリックポイントが狭いのが気になっていました。
そこで後述のサイトを参考にいくつかのファイルに変更を施しました。
>:参考|[[フォームとアクセシビリティ>http://www.kanzaki.com/docs/html/htminfo33.html]]
>label要素を使うと、グラフィカルブラウザでも、
>ラベル文字列をクリックすることでコントロールが反応する
>(ラジオボタンが選択されたり、テキストボックスが入力状態になる)というメリットがあります。
>小さなラジオボタンをクリックするのは、環境や利用者の条件によっては難しいこともあるため、
>クリックできる範囲が広がることで操作が容易になるわけです。
>変更するcgi
> aboard bag bank blackmarket buy capture castle church
> compose cure farm feed (guild) (guildbank) harbor
> mail market pet quest sell shopping transfer
>例
> foreach $Ii (@{$I->{Bg}}) {
> $i++;
> next if !$Ii;
> $t1 .= "<label for=¥"$i¥"><input type=checkbox name=$i id=¥"$i¥" class=checkbox> ";
> $t1 .= &decorate_item($Ii,'',1);
> $t1 .= "</label>";
> }
クオーテーションはいらないかもしれませんが気分的に
また明示的なラベル付けを行った方が無難です。
**その他
ゲームが進行するにつれて荷物整理が大変になりますので
まとめてチェックボックスにcheckをいれたい時がでてきます。
[[http://re-move.hp.infoseek.co.jp/misc/multiclick.html]]
上記のサイトを参考に設置してみてください。
&counter()
SoS3に施した改造をまとめておきます。
>&bold(){&color(red){以下の記述はまずいスパゲティです。ご注意下さい。}}
>&bold(){&color(red){説明が面倒な所については何も書かれてないことがあります。}}
>&bold(){&color(red){「ソースが汚い。まずい。」等の質問には答えられません。}}
[[http://sos3.sakura.ne.jp/custom/index.html]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: