発言者: moon
発言日: 2008 04/05 14:29
> こんにちは。また詰まってしまったので助言をいただけますでしょうか。
> 以前改造の際にお世話になった、戦闘関連強化・特技&魔法による追加スキルなのですが、
> 複数のスキル発動条件フラグを所持していた場合、どれか一つだけしか発動しない上にスキルの選定条件がよくわからなかったので、
> これを通常のスキルのように、所持している発動条件の分だけ全て別個に発動確率のチェックを行い、
> チェックに通ったスキルが複数あった場合は全て発動するようにしたいのですが、可能でしょうか?
>
>
> ちなみに実際に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; # 発動確率を満たしたものだけになっている(空の場合があるので必要に応じてチェックを行う)
とすると発動確率を満たしたものだけのリストが得られますのでこれを使えば良いと思います。
▼関連発言
│
└◆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