my $u_mtk = 140; # PC魔攻 my $u_int = 113; # PC INT my $e_int = 6; # 敵 INT my $e_mtd = 100; # 敵の魔防 my $div = 1024; # 系統係数の分母 my $div_x = 5; # 係数の倍数 my $s_mgd = 200; # チェックする領域(スタート) my $e_mgd = 300; # チェックする領域(エンド) my $ck_cnt = 8; # OKとなるカウント数 # 実測ダメージ my @add_str = ( { 'int' => 0 ,'mtk' => 0 ,'dmg' => 908 } , { 'int' => 1 ,'mtk' => 0 ,'dmg' => 912 } , { 'int' => 2 ,'mtk' => 0 ,'dmg' => 918 } , { 'int' => 3 ,'mtk' => 0 ,'dmg' => 924 } , { 'int' => 4 ,'mtk' => 0 ,'dmg' => 931 } , { 'int' => 5 ,'mtk' => 0 ,'dmg' => 934 } , { 'int' => 6 ,'mtk' => 0 ,'dmg' => 940 } , { 'int' => 7 ,'mtk' => 0 ,'dmg' => 944 } , { 'int' => 8 ,'mtk' => 0 ,'dmg' => 953 } , { 'int' => 9 ,'mtk' => 0 ,'dmg' => 956 } , { 'int' => 0 ,'mtk' => 4 ,'dmg' => 934 } , { 'int' => 42 ,'mtk' => 80 ,'dmg' => 1779 } , { 'int' => 42 ,'mtk' => 82 ,'dmg' => 1795 } ); # 変動変数 my $flag = 0; print "メテオ 精霊Dチェック(件数) ".scalar(@add_str)."\n"; print "*****チェック開始*****\n"; # 精霊D for( my $i = $s_mgd; $i < $e_mgd ; $i++ ){ # 進捗チェック print $i."\n" if ($i%100 == 0); # 係数チェック for ( my $j = $div; $j < $div * $div_x ; $j++ ){ # ループ初期化 my @ng_str = (); my $cnt = 0; my $dmg = 0; # enemy 僮NT foreach( @add_str ){ $dmg = int((int(( $u_int - $e_int + $_->{'int'} )*($j / $div ) ) + $i ) * ( $u_mtk + $_->{'mtk'} ) / $e_mtd ); # OKならcnt++ / NGならngリストに追加 ( $dmg == $_->{'dmg'} ) ? $cnt++ : push( @ng_str, $_ ); } # 結果が実ダメージと全て一致したら if( $cnt == scalar(@add_str) ){ print "************************ data hit !!! ******************************\n"; print "精霊D $i\n"; print "係数 $j\n"; print "********************************************************************\n"; $flag = 1; } # 候補があれば表示(サンプル見直し判断の為) elsif( $cnt > $ck_cnt ){ my $m_div = sprintf( "%.3f",( $j / $div ) ); print "候補Hit / 精霊D = $i / 係数 = $j/$div(".$m_div.") / $cnt 件Hit\n" ; print "NG サンプル一覧\n"; foreach( @ng_str ){ my $tmp_int = $_->{'int'} + $u_int; my $tmp_mtk = $_->{'mtk'} + $u_mtk; print "int = ".$tmp_int." / 魔攻 = ".$tmp_mtk." / dmg = ".$_->{'dmg'}."\n"; } print "\n"; } } } print "*****チェック終了*****\n"; print "ヒットなし" unless $flag; exit;