- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!{{category SOS2改造}}戦闘関連強化・特技&魔法
あー、何か問題がありましたらご報告お願いします;-;
:01/14/2008 - Version 1.10:
**バグフィクス ---- 特技が正しく選定されないバグを修正しました
**フィクス ---- 特技選定、死亡処理を最適化しました
:09/02/2007 - Version 1.00:
公開。
**公開
!!概要
戦闘関連の強化です。
戦闘勝利時、一定の確率と所持スキルにより、特技・魔法が発動するようになります。
ごくごくシンプルで導入が簡単、また改造も比較的容易でしょう。
以下、デフォルトで用意した効果、特色など――
:特技・魔法:
表示メッセージが異なるだけでプログラム上は同じものです。
:ダメージ:
特定倍率の追加ダメージを発生させます。
:poison化:
相手を毒化させます。
:dead化:
相手を毒化させます。
相手を死亡させます。
:防御無視:
防御力を無視した特定倍率の追加ダメージを発生させます。
:回復:
自身の体力を回復させます。
:効果の組み合わせ:
これらの効果を任意に組み合わせることが可能です。
追加ダメージを与え、なおかつ与えたダメージを吸収し、さらに相手を毒にする、なんていやらしいことも可能です:p
:任意のダメージ倍率:
追加ダメージは百分率で任意に設定可能です。
200%の設定にすれば2倍の追加ダメージですし、50%であれば1/2の追加ダメージです。
*特技・魔法発生時に発動メッセージを表示させることも可能でしょう、ただしご自身で工夫する必要があります。
*発動メッセージ用のデータだけは用意してあります……
**特技・魔法発生時に発動メッセージを表示させることも可能でしょう、ただしご自身で工夫する必要があります。
**発動メッセージ用のデータだけは用意してあります……
!!改造
!1. ファイルをダウンロードします
*{{ref sp_atk.pl}}
:ファイルの内容:
# Sub Special Attack #
sub sp_atk {
($Wn,$Wh,$Ws,$Wv,$Ln,$Lh,$Lv,$Lt,$Dg,$Dd) = @_;
if ($Lv =~ /dead/) { return($Lh,$Lv,$Wh,$Wt) }
$sp_rnd = int(rand(100)); # 発動率
undef @castlines;
@splines = &opendat('special.cgi'); ### 任意のファイルパスに変更してください
foreach (0 .. $#splines) {
($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = split(/<>/,$splines[$_]);
push (@castlines,$splines[$_]) if $sp =~ /$sp_sp/; # 特技選定
push (@castlines,$splines[$_]) if $Ws =~ /$sp_sp/ && $sp_rt < $sp_rnd; # 特技選定・発動率チェック
}
if (!@castlines) { return($Lh,$Lv,$Wh,$Wt) }
$cast_rnd = int(rand($#castlines)); # 特技確定
($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = split(/<>/,$castlines[$cast_rnd]);
$sp_rnd = int(rand(100)); # 発動率チェック
if ($sp_rt < $sp_rnd) { return($Lh,$Lv,$Wh,$Wt) }
$Dg = $Dd if $sp_ef =~ /A/; # 防御無視
if ($sp_dg) { $damage = int($Dg * $sp_dg / 100) } else { $damage = 0 } # DMG算出
$Wh += $damage if $sp_ef =~ /H/; # 回復
$Lh -= $damage if $sp_ef =~ /D/; # DMG
$Lv = 'poison' if $sp_ef =~ /P/; # 毒化
$Lv = 'dead' if $sp_ef =~ /F/; # 即死
$Lh = 0 if $sp_ef =~ /F/; # 即死
if ($Lh <= 0 || $Lv eq 'dead') { $Lh = 0; $Lv = 'dead'; $Lt ++ } # 調整&死亡カウント
if ($Lh <= 0) { $Lh = 0; $Lv = 'dead'; $Lt ++ } # 調整&死亡カウント
# メッセージ関係
&spmsg("$sp_tp");
&spmsg('D') if $sp_ef =~ /D/ && $damage;
&spmsg('H') if $sp_ef =~ /H/ && $damage;
&spmsg('P') if $sp_ef =~ /P/;
&spmsg('F') if $sp_ef =~ /F/;
&spmsg('死') if !$Lh && $sp_ef !~ /F/;
return($Lh,$Lv,$Wh,$Wt);
}
# Sub Massage #
sub spmsg {
%spmsg = ('S',"$Wnは$sp_nmを行使した!",
'M',"$Wnは$sp_nmを詠唱した!",
'D',"$Lnに$damageポイントの追加ダメージ!",
'H',"$Wnは$damageポイントの体力を取り戻しました。",
'P',"$Lnは毒化しました。",
'F',"$Lnは死亡しました。",
'死',"体力が0になり、$Lnは死亡しました。");
push (@msg,$spmsg{$_[0]});
$fwords .= $spmsg{$_[0]};
}
DL後、アップロードします。
!2. 特技・魔法用の設定ファイルを作成しアップロードします。
デフォルトでは special.cgi というファイル名ですが、任意で構いません。
以下サンプル――
1<>S<>50<>150<> D<>Tf<>チェインストライク<><>
2<>S<>50<>100<>DP<>Tf<>ヴェノムストライク<><>
3<>S<>50<> 0<> F<>Tf<>フェイタルストライク<><>
4<>S<>50<>100<>DA<>Tf<>アーマーイグノアー<><>
5<>M<>50<>150<> D<>Mg<>フレイム<>Solvet In Favilla<>
6<>M<>50<> 0<> P<>Mg<>ポイズン<>Absorbeat Eas Obscurum<>
7<>M<>50<> 0<> F<>Mg<>レクイエム<>Dona Eis Requiem<>
8<>M<>50<>100<> H<>Mg<>ヒール<>Salva Fons Pietatis<>
:ファイル用データ:
,データ,説明,詳細
,$sp_no,番号,便宜上のもので意味はありません
,$sp_tp,行使タイプ,Sは特技、Mは魔法
,$sp_rt,発動率,1〜100で任意に設定します
,$sp_dg,ダメージ倍率,与えたダメージに対する倍率です
,$sp_ef,効果タイプ,別記します、重複可能です
,$sp_sp,必要スキル,発動するために必要なスキルです
,$sp_nm,名称,名前です
,$sp_mg,メッセージ,発動時のメッセージ予約、現状はデッドフラグ
:効果タイプ:
,略字,効果
,D,ダメージ
,P,poison化
,F,dead化
,A,防御無視
,H,回復
*ヒント:必要スキルに「Qk」と設定すれば刀装備時のみ発動という特技が設定できます
**ヒント:必要スキルに「Qk」と設定すれば刀装備時のみ発動という特技が設定できます
**ヒント:必要スキル「Aa」「Bb」のみ発動、とする場合、同じ内容で2つ作成し、必要スキルのみ変更します
!3. # Sub Fight # の修正
発動用のルーチンを埋め込みます。
2行を2箇所に追加するだけです:)
if ($result == 1) {
$dmg = (1,1,$udice - $pdfd) [($udice <=> $pdfd) + 1];
($php,$pav,$pdt,$prw,$hp,$av,$dt)
= &fight_sub($nm,$hp,$sp,$ab,$bp,$ak,$av,$dt,$bn,$pnm,$php,$psp,$pbp,$pav,$pdt,$prw,$pbn);
の下に
require './sp_atk.pl';
($php,$pav,$hp,$dt) = &sp_atk($nm,$hp,$sp,$av,$pnm,$php,$pav,$pdt,$dmg,$udice);
を追加します。
if ($result == -1) {
$dmg = (1,1,$pdice - $udfd) [($pdice <=> $udfd) + 1];
($hp,$av,$dt,$rw,$php,$pav,$pdt)
= &fight_sub($pnm,$php,$psp,$pab,$pbp,$pak,$pav,$pdt,$pbn,$nm,$hp,$sp,$bp,$av,$dt,$rw,$bn);
の下に
require './sp_atk.pl';
($hp,$av,$php,$pdt) = &sp_atk($pnm,$php,$psp,$pav,$nm,$hp,$av,$dt,$dmg,$pdice);
を追加します。
以上で導入は完了です。
次のステップとして、ご自身で色々と工夫しながら改造してみてくださいな。
!!差分
!Version 1.00→Version 1.10
……あ、確認前に古いファイル消しちゃったお;-;
#発動率チェック
のあった2行を削除。
$sp_rnd = int(rand(100)); # 発動率
を6行目に追加。
$Lh = 0 if $sp_ef =~ /F/; # 即死
if ($Lh <= 0) { $Lh = 0; $Lv = 'dead'; $Lt ++ } # 調整&死亡カウント
の2行を修正。
push (@castlines,$splines[$_]) if $Ws =~ /$sp_sp/ && $sp_rt < $sp_rnd; # 特技選定・発動率チェック
の行を修正。
だと思います……
!!おまけ
ラテン語の勉強でもしましょうか:)
*Solvet In Favilla
**灰燼に帰せよ
***Solvet なる
***In 〜に
***Favilla 灰
*Absorbeat Eas Obscurum
**闇に飲まれよ
***Absorbeat 呑込む
***Eas 彼ら
***Obscurum 暗黒
*Dona Eis Requiem
**死を与え給へ
***Dona 与える
***Eis 彼らに
***Requiem 安息
*Salva Fons Pietatis
**救え慈悲の泉よ
***Salva 救う
***Fons 泉
***Pietatis 慈悲の
!!こめんと
*意図があってこうしているのかもしれませんので修正はしませんが、「push (@castlines,$splines[$_]) if $sp =~ /$sp_sp/; # 特技選定」の$spはおそらく$Wsの間違いだと思います。 - moon (2008年01月12日 23時34分42秒)
*ありゃ、本当だ、ありがとうございます、くすん。 - Pse (2008年01月14日 16時32分53秒)
*'悩殺'、'鉄壁'等が発動した場合を全く考慮してない気がしてきた…… - Pse (2008年09月13日 01時10分52秒)