//ブロックのダメージ用
//################操作ブロックダメージ用################
if(Bnum > 24 || Bnum < 0) return;
var to_sum
:Number = Fall_Pool.
Next_Block[0].
BlockSum; var T_FallPoBl:BlockClass = Fall_Pool.Next_Pool[0][Bnum];
if( !(T_FallPoBl.on_flag) ) return;
if( T_FallPoBl.Metal_flg ) return;
if( T_FallPoBl.Crystal_flg ) return;
if(T_FallPoBl.Weight < 100 && Damege < 1000){
if( !(RimitOp) || (T_FallPoBl.HP - ((Damege)|0)) >= (T_FallPoBl.MAXHP * (1 - Sys_Seting.FrictionFallParMax))){
T_FallPoBl.HP -= ((Damege)|0);
}
}else{
T_FallPoBl.HP -= ((Damege)|0);
}
if(T_FallPoBl.HP > 0){
T_FallPoBl.fream_counter = 11 - ((T_FallPoBl.HP < T_FallPoBl.MAXHP) ? (T_FallPoBl.HP/ T_FallPoBl.MAXHP * 10 )|0 : 10);//表示されるフレームを変更
}else{
T_FallPoBl.on_flag = false;//存在フラグ削除
}
}
//################ブロックプールダメージ用################
if(Bx < 0 || Bx >= Main_Pool.PoolMaxX){
return;
}
if(By < 0 || By >= Main_Pool.PoolMaxY){
return;
}
if(Main_Pool.LineFall && temp_line_flg[By]){
return;
}
var T_MainPool:BlockClass = Main_Pool.BlockPool[Bx][By];
if( !(T_MainPool.on_flag) ) return;
if( T_MainPool.Metal_flg && (BreakMode <= 0) ) return;
if( T_MainPool.Crystal_flg && (BreakMode <= 1) ) return;
if( !(RimitOp) || (T_MainPool.HP - Damege) > (T_MainPool.MAXHP * (1 - Sys_Seting.FrictionMainParMax))){
T_MainPool.HP -= Damege;
}
if(T_MainPool.HP > 0){
T_MainPool.fream_counter = 11 - ((T_MainPool.HP < T_MainPool.MAXHP) ? (T_MainPool.HP/ T_MainPool.MAXHP * 10)|0 : 10);//表示されるフレームを変更
}else{
T_MainPool.sys_number = 0;//システム上の連結属性をリセット
T_MainPool.NextBreak_flg = false;//ライン巻き込みフラグ削除
T_MainPool.on_flag = false;//存在フラグ削除
}
}
・・・中略・・・
//################操作ブロック衝突処理用################
function BlockFallHit_fnc
(Break_block
:Array):void{//落下ブロック衝突ダメージ処理 var Damege
:Number = Fall_Pool.
this_speed; var i:uint = 0;
var j:uint = 0;
var k:uint = 0;
var to_sum
:Number = Fall_Pool.
Next_Block[0].
BlockSum;
var BrBcCount:int = Break_block.length;//衝突したブロックの番号リストから長さを取得
var fall_sum:int = 0;
for (i = 0; i < 24; i++){ if( Fall_Pool.Next_Pool[0][i].on_flag ){ fall_sum++; } }
for(i = 0 ; i < to_sum ; i++ ){
if(Fall_Pool.Next_Pool[0][i].on_flag ){
AvWeight += Fall_Pool.Next_Pool[0][i].Weight;
}
}
Damege
= Damege
* Math.
abs(AvWeight
) / BrBcCount
;
for(i = 0 ; i < BrBcCount ; i++ ){//衝突したブロックを順に計算
Fall_block_damege
(Break_block
[i
] ,
Math.
ceil(Damege
/ 1.5)); //操作ブロックダメージ加算 Temp_x = Fall_Pool.this_x + Fall_Pool.Next_Block[0].B_x[ Break_block[i] ]; //衝突したブロックのX座標取得
Temp_y = Fall_Pool.this_y + Fall_Pool.Next_Block[0].B_y[ Break_block[i] ]; //衝突したブロックのY座標取得
for (j = 1; j < Pool_y_delen; j++){ //ブロックプールの下底(Pool_y_delen)までブロックを検索。
if( (j + Temp_y) > Pool_y_delen){ //ブロックプールの下底(Pool_y_delen)に達した場合
Main_block_damege
( Temp_x , Temp_y
+ (j
-1) ,
Math.
ceil(Math.
max(Damege
- j,
0) / 2));//ブロック溜まりダメージ加算 Fall_block_damege
(Break_block
[i
] ,
Math.
ceil(Damege
/ Math.
pow(2 , j
) / 2));//操作ブロックダメージ加算 break;
}
if( Main_Pool.BlockPool[Temp_x][Temp_y + j].on_flag){//ブロックの存在を確認
Main_block_damege
( Temp_x , Temp_y
+ j ,
Math.
ceil(Math.
max(Damege
- j,
0) / 2));//ブロック溜まりダメージ加算
}else{//ブロックの存在がない場合、別処理に移る。
for(k = 1; k <= j + 3; k++ ){
if( Temp_x - k < 0){
break;
}else if( Main_Pool.BlockPool[Temp_x - k][Temp_y + j -1].on_flag ){
Main_block_damege
( Temp_x
- k , Temp_y
+ j
-1,
Math.
ceil(Math.
max(Damege
- j
- k,
0) / (j
+ k
)));//ブロック溜まりダメージ加算 }else{
break;
}
}
for(k = 1; k <= j + 3; k++ ){
if( Temp_x + k > Pool_x_delen){
break;
}else if( Main_Pool.BlockPool[Temp_x + k][Temp_y + j -1].on_flag ){
Main_block_damege
( Temp_x
+ k , Temp_y
+ j
-1,
Math.
ceil(Math.
max(Damege
- j
- k,
0) / (j
+ k
)));//ブロック溜まりダメージ加算 }else{
break;
}
}
break;
}
}
}
for(i = 0 ; i < 24 ; i++ ){
Fall_block_damege(i , (( Damege /10 )|0) , true);//操作ブロックダメージ適用処理
}
for(i = 0; i < Pool_y_len ; i++){
for(j = 0; j < Pool_x_len; j++){
Main_block_damege( j, i, 0, true);//ブロック溜まりダメージ適用処理
}
}
Fall_Pool.StatusChen_flg = true;//操作ブロックの更新通知フラグ
Main_Pool.MainPoolRefresh = true;//ブロック溜まりの更新通知フラグ
ScoreNum_fuc();//スコア計算呼び出し
}
//衝突した後にダメージ適用をすることで、同時に衝突したのと同じ効果を得る。
//各更新フラグは、グラフィック更新に使われる。