▼スレッド
│
└◇1508:追加スキルの複数発動について [矢神] 04/05 08:13
└◇1509:Re:追加スキルの複数発動について [moon] 04/05 14:29
└◇1510:Re[2]:追加スキルの複数発動について [矢神] 04/05 22:48
└◇1511:追記 [矢神] 04/05 22:58
└◇1512:Re:追記 [moon] 04/05 23:19
└◇1513:Re[2]:追記 [moon] 04/05 23:24
└◇1514:ありがとうございました! [矢神] 04/06 12:42<-last
こんにちは。また詰まってしまったので助言をいただけますでしょうか。スレッド一覧
以前改造の際にお世話になった、戦闘関連強化・特技&魔法による追加スキルなのですが、
複数のスキル発動条件フラグを所持していた場合、どれか一つだけしか発動しない上にスキルの選定条件がよくわからなかったので、
これを通常のスキルのように、所持している発動条件の分だけ全て別個に発動確率のチェックを行い、
チェックに通ったスキルが複数あった場合は全て発動するようにしたいのですが、可能でしょうか?
ちなみに実際に100回程度の動作テストをしてみたところ、
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
スキルの設定ファイルに
1<>S<> 1<>40<> D<>Bp<>スキル1<><>
2<>S<>100<>30<> D<>Up<>スキル2<><>
3<>S<>100<>50<>DA<>Uq<>スキル3<><>
とあった場合、Up(スキル2)のみを所持していればスキル2が100%発動するが、
Bp(スキル1)も同時に所持していた場合はスキル2が50%程度の発動率になり、そうでない時は何も発動しない(スキル1が選定されている?)
また、Up(スキル2)とUq(スキル3)を同時に所持していた場合、スキル2が100%発動しスキル3は全く発動しない。
1、2を同時に所持している時の動作から、まず所持しているスキルフラグの中からどれかが選定され、その後発動率のチェックかなと思ったんですが
2、3を同時に所持していると2しか発動しないのでよくわからなくなってしまいました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
スキル選定部のソースは以下のようになっています。
> 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 $Ws =~ /$sp_sp/; # 特技選定
> }
> 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) }
> こんにちは。また詰まってしまったので助言をいただけますでしょうか。スレッド一覧
> 以前改造の際にお世話になった、戦闘関連強化・特技&魔法による追加スキルなのですが、
> 複数のスキル発動条件フラグを所持していた場合、どれか一つだけしか発動しない上にスキルの選定条件がよくわからなかったので、
> これを通常のスキルのように、所持している発動条件の分だけ全て別個に発動確率のチェックを行い、
> チェックに通ったスキルが複数あった場合は全て発動するようにしたいのですが、可能でしょうか?
>
>
> ちなみに実際に100回程度の動作テストをしてみたところ、
> 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
> スキルの設定ファイルに
> 1<>S<> 1<>40<> D<>Bp<>スキル1<><>
> 2<>S<>100<>30<> D<>Up<>スキル2<><>
> 3<>S<>100<>50<>DA<>Uq<>スキル3<><>
>
> とあった場合、Up(スキル2)のみを所持していればスキル2が100%発動するが、
> Bp(スキル1)も同時に所持していた場合はスキル2が50%程度の発動率になり、そうでない時は何も発動しない(スキル1が選定されている?)
> また、Up(スキル2)とUq(スキル3)を同時に所持していた場合、スキル2が100%発動しスキル3は全く発動しない。
>
> 1、2を同時に所持している時の動作から、まず所持しているスキルフラグの中からどれかが選定され、その後発動率のチェックかなと思ったんですが
> 2、3を同時に所持していると2しか発動しないのでよくわからなくなってしまいました。
> 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
>
> スキル選定部のソースは以下のようになっています。
>
> > 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 $Ws =~ /$sp_sp/; # 特技選定
> > }
> > if (!@castlines) { return($Lh,$Lv,$Wh,$Wt) }
> >
(*1) > > $cast_rnd = int(rand($#castlines)); # 特技確定
(*1) > > ($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = split(/<>/,$castlines[$cast_rnd]);
> >
(*2) > > $sp_rnd = int(rand(100)); # 発動率チェック
(*2) > > if ($sp_rt < $sp_rnd) { return($Lh,$Lv,$Wh,$Wt) }
>
コメントにも書いてありますが(*1)で所持しているスキルから1つのスキルを選択して(*2)で発動確率との判定をしています。
このため、複数のスキルを所持している場合は等確率で1つが選択された後に発動確率が判定されることになります。
また、(*1)の選別は記述ミスだと思われ、これだと@castlinesの最後のスキルが選択されることがありません。
個別に判定する場合は、
my @tmp = ();
foreach(@castlines){
push(@tmp, $_) if(int(rand(100)) < int((split(/<>/, $_))[2])); # 発動確率を判定しリストに追加する
}
@castlines = @tmp; # 発動確率を満たしたものだけになっている(空の場合があるので必要に応じてチェックを行う)
とすると発動確率を満たしたものだけのリストが得られますのでこれを使えば良いと思います。
> @castlines = @tmp; # 発動確率を満たしたものだけになっている(空の場合があるので必要に応じてチェックを行う)スレッド一覧
> とすると発動確率を満たしたものだけのリストが得られますのでこれを使えば良いと思います。
ありがとうございます!
リストの作成まで希望の通りに動作しました。空の場合のチェックは
>if (!@castlines) { return }
と直後に入れておけば大丈夫ですよね?
これで後は@castlinesの行数分だけ残りの処理を繰り返して行えばよいと思うんですが、
>foreach(@castlines){
〜
として、その中で各スカラ変数への代入を行う
>($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = split(/<>/,$castlines[★]);
の処理をする時、★の部分に繰り返した回数(0〜)を代入したいのですが、その方法がわかりませんでした。
foreachにせずに直接0、1、2と指定して10回分くらい繰り返せばどうにかなりましたがあまりに力技なので、何か上手い方法はありますでしょうか?
すみません、書いた直後に少しはマシな手を思いついたのでやってみましたスレッド一覧
>$seri = 0;
>foreach(@castlines){
($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = >split(/<>/,$castlines[$seri]);
>$seri++;
力技には変わりないような気がしますが、一応動作しているようです。
特に問題はありませんでしょうか。
> すみません、書いた直後に少しはマシな手を思いついたのでやってみましたスレッド一覧
>
> >$seri = 0;
> >foreach(@castlines){
> ($sp_no,$sp_tp,$sp_rt,$sp_dg,$sp_ef,$sp_sp,$sp_nm,$sp_mg) = >split(/<>/,$castlines[$seri]);
> >$seri++;
>
> 力技には変わりないような気がしますが、一応動作しているようです。
> 特に問題はありませんでしょうか。
これでも問題無いですが、わざわざ変数を用意しなくても$_には$castlines[???]の値が代入されていますのでsplit(/<>/, $_)でも大丈夫です。
あと、先の返信についての補足ですが、別個のforeachで発動確率の判定をしていましたが最初の「foreach (0 .. $#splines) {}」の中で所持スキルの判定と一緒に行ったほうがソースコードとしてはすっきりするかもしれません。
> リストの作成まで希望の通りに動作しました。空の場合のチェックはスレッド一覧
> >if (!@castlines) { return }
> と直後に入れておけば大丈夫ですよね?
他のreturnと合わせて「if (!@castlines) { return($Lh,$Lv,$Wh,$Wt) }」にしないとまずいのではないかと思います。
全て思った通りの動作にさせる事が出来ました。スレッド一覧
いつもお世話になってしまいすみませんです。