?? battle_magic.c
字號:
listidx++; } } } }else if( 20 == toNo ){ // 右下全體 for( i = 0 ; i < 2 ; i++ ){ for( j = 0 ; j < 5 ; j++ ){ if( ATTMAGIC_magic[magicattidx].siField[i][j] && TRUE == BATTLE_TargetCheck( battleindex , CharTable[i + 2][j] ) ){ list[listidx] = CharTable[i + 2][j]; listidx++; } } } }else if( 21 == toNo ){ // 左上全體 for( i = 0 ; i < 2 ; i++ ){ for( j = 0 ; j < 5 ; j++ ){ if( ATTMAGIC_magic[magicattidx].siField[i][j] && TRUE == BATTLE_TargetCheck( battleindex , CharTable[i][j] ) ){ list[listidx] = CharTable[i][j]; listidx++; } } } } // 左上第一列 , 左上第二列 , 右下第一列 , 右下第二列 else if( 23 == toNo || 24 == toNo || 25 == toNo || 26 == toNo ){ basey = toNo - 23; for( i = 0 , j = basey - 1 ; j <= basey + 1 ; i++ , j++ ){ if( ( 25 == toNo || 26 == toNo ) && ( j < 2 || j > 3 ) ) continue; else if( ( 23 == toNo || 24 == toNo ) && ( j < 0 || j > 1 ) ) continue; // 計算那些人需要加入清單 for( k = 0 ; k < 5 ; k++ ){ if( ATTMAGIC_magic[magicattidx].siField[i][k] && TRUE == BATTLE_TargetCheck( battleindex , CharTable[j][k] ) ) { list[listidx] = CharTable[j][k]; listidx++; } } } } qsort( list , listidx , sizeof( list[0] ) , ( FUNC )SortLoc );// 排序位置 // 取得人物的屬性(不論玩家或是寵物) //BATTLE_GetAttr( BATTLE_No2Index( battleindex , attackNo ) , &attattr[2] , &attattr[1] , &attattr[0] , &attattr[3] , &attattr[4] ); // 如果攻擊者是玩家,取得人物的魔法熟練度及魔法抗性 { int attType = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo),CHAR_WHICHTYPE); int Check=0; AttIsPlayer=0; if( attType == CHAR_TYPEPLAYER) { AttIsPlayer = 1; for(i=0;i<4;i++){ // att_magic_lv[i]: i = 0:地 1:水 2:火 3:風 att_magic_lv[i] = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_EXP+i); } }else if( attType == CHAR_TYPEENEMY ) { for(i=0;i<4;i++){ att_magic_lv[i] = (CHAR_getInt(BATTLE_No2Index(battleindex,attackNo), CHAR_LV)*0.9); } }else {#ifdef _FIX_MAGICDAMAGE AttIsPlayer = 1;#endif for(i=0;i<4;i++){#ifdef _FIX_MAGICDAMAGE att_magic_lv[i] = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_EXP+i);#else att_magic_lv[i] = 0;#endif } } Check = rand()%100;#ifdef _FIX_MAGICDAMAGE if( Check > att_magic_lv[ FieldAttr] ) TrueMagic = FALSE; else TrueMagic = TRUE;#endif } pet_att_lv = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo), CHAR_LV); z = 0; for(i=0;i<listidx;i++){ charaidx = BATTLE_No2Index( battleindex , list[i] ); petidx = BATTLE_getRidePet( charaidx ); //BATTLE_GetAttr( charaidx , &defattr[2] , &defattr[1] , &defattr[0] , &defattr[3] , &defattr[4] ); {//andy_fix int defType = CHAR_getInt(charaidx,CHAR_WHICHTYPE); DefIsPlayer = 0; if( defType == CHAR_TYPEPLAYER) { DefIsPlayer = 1; for(j=0;j<DEF_MAGIC_NUM;j++){ // def_magic_resist[i]: i = 0:地 1:水 2:火 3:風 def_magic_resist[j] = CHAR_getInt(charaidx,CHAR_EARTH_RESIST+j);#ifdef _EQUIT_DEFMAGIC def_magic_resist[j] += CHAR_getWorkInt( charaidx, CHAR_EQUITDEFMAGIC_E+j);#endif } }else if( defType == CHAR_TYPEENEMY ) { for(j=0;j<DEF_MAGIC_NUM;j++){ def_magic_resist[j] = (CHAR_getInt(charaidx,CHAR_LV)*0.5); } }else { //PET#ifdef _FIX_MAGICDAMAGE DefIsPlayer = 1;#endif for(j=0;j<DEF_MAGIC_NUM;j++){#ifdef _FIX_MAGICDAMAGE def_magic_resist[j] = CHAR_getInt(charaidx,CHAR_EARTH_RESIST+j); //def_magic_resist[j] += CHAR_getWorkInt( charaidx, CHAR_EQUITDEFMAGIC_E+j);#else def_magic_resist[j] = 0;#endif } }#ifdef _MAGIC_DEFMAGICATT if( CHAR_getWorkInt( charaidx, CHAR_DEFMAGICSTATUS ) > 0 ){ float def = (float)(CHAR_getWorkInt( charaidx, CHAR_OTHERSTATUSNUMS )); def = def/100; for(j=0;j<DEF_MAGIC_NUM;j++){ if( def_magic_resist[j] <= 0 ) continue; def_magic_resist[j] += def_magic_resist[j] * def; } }#endif } pet_def_lv = CHAR_getInt(charaidx,CHAR_LV); if(BATTLE_MagicDodge(charaidx,DefIsPlayer,FieldAttr)){ // 計算閃避率 attvalue = pethp = 0; if( 0 == ATTMAGIC_magic[magicattidx].uiAttackType ) {// 單人攻擊 sprintf( szcommand , "%X|%X|%X|%X|" , toNo , list[i] , attvalue , pethp ); }else{ // 多人攻擊 sprintf( szcommand , "%X|%X|%X|%X|" , list[i] , list[i] , attvalue, pethp ); } BATTLESTR_ADD( szcommand ); continue; }else{ // 沒閃過,計算攻擊力#ifdef _FIX_MAGICDAMAGE float Kmagic = ((float)att_magic_lv[FieldAttr]*1.4 - (float)def_magic_resist[FieldAttr]); float Mmagic = (float)att_magic_lv[FieldAttr]; float Amagic=0.00; int APower=0; if( Kmagic < 0 ) Kmagic = 0; if( Mmagic < 1 ) Mmagic = 1; Amagic = (Kmagic*Kmagic) / (Mmagic*Mmagic); Amagic += ((float)(rand()%20))/100; APower = (int)(Power*(1+(float)MagicLv/10) * Amagic); //MagicLv //andy_log //print("\natt_magic_lv:%d", att_magic_lv[FieldAttr]); //print( "Player:%s\n", CHAR_getUseName( charaidx)); //print( "ANDY Magic Power:%d Amagic:%f APower:%d \n", Power, Amagic, APower); def_be_hit[getexp++] = charaidx; // 記下被打的人的index attvalue = BATTLE_getMagicAdjustInt( BATTLE_No2Index(battleindex,attackNo), charaidx, MagicLv, FieldAttr, APower); //andy_log// print("attvalue:%d \n", attvalue); if( TrueMagic == FALSE ) {//使用失敗 attvalue*=0.7; } if( DefIsPlayer ) { Magic_ComputeDefExp( charaidx, FieldAttr, MagicLv, attvalue); }#else def_be_hit[getexp++] = charaidx; // 記下被打的人的index // 計算屬性相克 attvalue = BATTLE_AttrAdjust(BATTLE_No2Index(battleindex,attackNo),charaidx,Power); if(DefIsPlayer){ // 被打的是玩家 def_is_player[z++] = list[i]; if(AttIsPlayer){ // 如果是玩家用魔法攻擊 temp = ((float)att_magic_lv[FieldAttr] - (float)def_magic_resist[FieldAttr])/(float)def_magic_resist[FieldAttr] / 100; attvalue = Power + Power * temp + attvalue; }else{ temp = ((float)pet_att_lv - (float)def_magic_resist[FieldAttr]) / (float)def_magic_resist[FieldAttr] / 100; attvalue = Power + Power * temp + attvalue; } }else{// 被打的是寵物 if(AttIsPlayer){// 如果是玩家用魔法攻擊 temp = ((float)att_magic_lv[FieldAttr] - (float)pet_def_lv) / (float)pet_def_lv / 100; attvalue = Power + Power * temp + attvalue; }else { temp = ((float)pet_att_lv - (float)pet_def_lv) / (float)pet_def_lv / 100; attvalue = Power + Power * temp + attvalue; } } // 上下取10 attvalue += rand()%2 ? (rand()%10)+1 : -(rand()%10)-1; if( attvalue <= 0 ) attvalue = 1;#endif } charahp = CHAR_getInt( charaidx , CHAR_HP ); // 沒有寵物 if( -1 == petidx || CHAR_getInt( petidx , CHAR_HP ) <= 0 ) { if( ( charahp -= attvalue ) < 0 ) { charahp = 0; //ANDY_ADD //CHAR_setFlg( charaidx, CHAR_ISDIE, TRUE); } CHAR_setInt( charaidx , CHAR_HP , charahp ); pethp = 0; // 單人攻擊 if( 0 == ATTMAGIC_magic[magicattidx].uiAttackType ) sprintf( szcommand , "%X|%X|%X|%X|" , toNo , list[i] , attvalue , pethp ); // 多人攻擊 else sprintf( szcommand , "%X|%X|%X|%X|" , list[i] , list[i] , attvalue, pethp ); } else { pethp = CHAR_getInt( petidx , CHAR_HP ); charahurt = attvalue * BATTLE_CalcCharaRatio( FieldAttr , charaidx ) / 10; charahurt_temp = charahurt; if( ( charahp -= charahurt ) < 0 ) { charahurt = charahp; charahp = 0; //ANDY_ADD //CHAR_setFlg( charaidx, CHAR_ISDIE, TRUE); } attvalue = attvalue - charahurt; if( ( pethp -= attvalue ) < 0 ) { pethp = 0; // 寵物沒血了退出戰場 CHAR_setInt(charaidx,CHAR_RIDEPET,-1); BATTLE_changeRideImage(charaidx); CHAR_setWorkInt(charaidx,CHAR_WORKPETFALL,1); } CHAR_setInt( charaidx , CHAR_HP , charahp ); CHAR_setInt( petidx , CHAR_HP , pethp ); charahurt = charahurt_temp; // 單人攻擊 if( 0 == ATTMAGIC_magic[magicattidx].uiAttackType ) sprintf( szcommand , "%X|%X|%X|%X|" , toNo , list[i] , charahurt , attvalue ); // 多人攻擊 else sprintf( szcommand , "%X|%X|%X|%X|" , list[i] , list[i] , charahurt, attvalue ); } { //Change fix 加上這個先拿到DP值 int aAttackList[BATTLE_ENTRY_MAX*2+1]; aAttackList[0] = attackNo; aAttackList[1] = -1; BATTLE_AddProfit( battleindex, aAttackList); } //change fix 讓替身娃娃可正常運作 if( CHAR_getInt( charaidx , CHAR_HP ) <= 0 && CHAR_getInt( charaidx, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER /*&& !BattleArray[battleindex].dpbattle*/ ) CHAR_setFlg( charaidx, CHAR_ISDIE, 1 ); BATTLESTR_ADD( szcommand ); } sprintf( szcommand , "%X|" , 0x12345678 ); BATTLESTR_ADD( szcommand );#ifdef _FIX_MAGICDAMAGE if( (TrueMagic == FALSE) && AttIsPlayer) { //計算攻擊方經驗值 Magic_ComputeAttExp( BATTLE_No2Index(battleindex,attackNo), FieldAttr, MagicLv, getexp); } for(i=0; i<listidx; i++) { // 如果被攻擊者中了睡眠 if(CHAR_getWorkInt(def_be_hit[i],CHAR_WORKSLEEP) > 0) { CHAR_setWorkInt(def_be_hit[i],CHAR_WORKSLEEP,0); z = BATTLE_Index2No(battleindex,def_be_hit[i]); sprintf(szcommand,"BM|%X|%X|",z,0); BATTLESTR_ADD(szcommand); } }#else //TrueMagic == FALSE // 攻擊方的經驗值----------------------------------------------------------------------------- if(AttIsPlayer){ // 被克的魔法 DefFieldAttr = (FieldAttr+1)%4; // 取得玩家所用的魔法的經驗值 att_magic_exp_add = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_ATTMAGIC_EXP+FieldAttr); // 取得玩家所用的魔法的被克魔法經驗值 att_magic_exp_sub = CHAR_getInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_ATTMAGIC_EXP+DefFieldAttr); // 依所使用的魔法加該屬性的exp,打幾只算幾點exp att_magic_exp_add += getexp; // 依所使用的魔法扣被克屬性的exp,打幾只扣幾點exp att_magic_exp_sub -= getexp; lv_up_exp = Magic_Level_Table[att_magic_lv[FieldAttr]]; while(att_magic_exp_add >= lv_up_exp || att_magic_exp_sub < 0){ // 如果玩家所用的魔法的經驗值現在可以升級了 if(att_magic_exp_add >= lv_up_exp){ // 如果超過了100級 if(att_magic_lv[FieldAttr] + 1 > 100){ att_magic_lv[FieldAttr] = 100; // 經驗值清為0 att_magic_exp_add = 0; }else{ att_magic_lv[FieldAttr]++; // 把現在的經驗值扣掉升了級所用的經驗值 att_magic_exp_add -= lv_up_exp; snprintf(msgbuf,sizeof(msgbuf),"你的 %s 魔法熟練度升級為 %d。",kind[FieldAttr],att_magic_lv[FieldAttr]); CHAR_talkToCli(BATTLE_No2Index(battleindex,attackNo),-1,msgbuf,CHAR_COLORRED); } } // 如果玩家所用的魔法的相克魔法的經驗值現在可以降級了 if(att_magic_exp_sub < 0 ){ // 如果等級已經是1級 if(att_magic_lv[DefFieldAttr] <= 1){ att_magic_lv[DefFieldAttr] = 1; // 經驗值清為0 att_magic_exp_sub = 0; }else{ att_magic_lv[DefFieldAttr]--; // 把下一個等級的經驗值扣掉現在的經驗值 att_magic_exp_sub = Magic_Level_Table[att_magic_lv[DefFieldAttr]] + att_magic_exp_sub; snprintf(msgbuf,sizeof(msgbuf),"你的 %s 魔法熟練度降級為 %d。",kind[DefFieldAttr],att_magic_lv[DefFieldAttr]); CHAR_talkToCli(BATTLE_No2Index(battleindex,attackNo),-1,msgbuf,CHAR_COLORRED); } } lv_up_exp = Magic_Level_Table[att_magic_lv[FieldAttr]]; } CHAR_setInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_EXP+FieldAttr,att_magic_lv[FieldAttr]); CHAR_setInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_ATTMAGIC_EXP+FieldAttr,att_magic_exp_add); CHAR_setInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_EXP+DefFieldAttr,att_magic_lv[DefFieldAttr]); CHAR_setInt(BATTLE_No2Index(battleindex,attackNo),CHAR_EARTH_ATTMAGIC_EXP+DefFieldAttr,att_magic_exp_sub); } // 防守方的經驗值----------------------------------------------------------------------------- for(i=0;i<listidx;i++){ if(def_is_player[i] != -1){ charaidx = BATTLE_No2Index(battleindex,def_is_player[i]); // 取得防守方玩家對此魔法的抗性等級 def_magic_resist[FieldAttr] = CHAR_getInt(charaidx,CHAR_EARTH_RESIST+FieldAttr); // 取得防守方玩家對此魔法的抗性經驗值 def_magic_exp_add = CHAR_getInt(charaidx,CHAR_EARTH_DEFMAGIC_EXP+FieldAttr); // 取得防守方玩家對此魔法被克的抗性等級 def_magic_resist[DefFieldAttr] = CHAR_getInt(charaidx,CHAR_EARTH_RESIST+DefFieldAttr); // 取得防守方玩家對此魔法被克的抗性經驗值 def_magic_exp_sub = CHAR_getInt(charaidx,CHAR_EARTH_DEFMAGIC_EXP+DefFieldAttr); def_magic_exp_add++; def_magic_exp_sub--; lv_up_exp = Magic_Level_Table[def_magic_resist[FieldAttr]]; while(def_magic_exp_add >= lv_up_exp || def_magic_exp_sub < 0){ // 如果防守方玩家對此魔法的抗性的經驗值現在可以升級了 if(def_magic_exp_add >= lv_up_exp){ // 如果超過了100級 if(def_magic_resist[FieldAttr] + 1 > 100) def_magic_resist[FieldAttr] = 100; else { def_magic_resist[FieldAttr]++; snprintf(msgbuf,sizeof(msgbuf),"你的 %s 魔法抗性升級為 %d。",kind[FieldAttr],def_magic_resist[FieldAttr]); CHAR_talkToCli(charaidx,-1,msgbuf,CHAR_COLORRED); } // 經驗值清為0 def_magic_exp_add = 0; } // 如果防守方玩家對此魔法的抗性的相克魔法的經驗值現在可以降級了 if(def_magic_exp_sub < 0 ) { // 如果等級已經是1級 if(def_magic_resist[DefFieldAttr] <= 1) def_magic_exp_sub = 0; // 經驗值清為0 else { def_magic_resist[DefFieldAttr]--; // 經驗值變成下一個等級的經驗值 def_magic_exp_sub = Magic_Level_Table[def_magic_resist[DefFieldAttr]]; snprintf(msgbuf,sizeof(msgbuf),"你的 %s 魔法抗性降級為 %d。",kind[DefFieldAttr],def_magic_resist[DefFieldAttr]); CHAR_talkToCli(charaidx,-1,msgbuf,CHAR_COLORRED); } } lv_up_exp = Magic_Level_Table[def_magic_resist[FieldAttr]]; } CHAR_setInt(charaidx,CHAR_EARTH_RESIST+FieldAttr,def_magic_resist[FieldAttr]); CHAR_setInt(charaidx,CHAR_EARTH_DEFMAGIC_EXP+FieldAttr,def_magic_exp_add); CHAR_setInt(charaidx,CHAR_EARTH_RESIST+DefFieldAttr,def_magic_resist[DefFieldAttr]); CHAR_setInt(charaidx,CHAR_EARTH_DEFMAGIC_EXP+DefFieldAttr,def_magic_exp_sub); } // 如果被攻擊者中了睡眠 if(CHAR_getWorkInt(def_be_hit[i],CHAR_WORKSLEEP) > 0) { CHAR_setWorkInt(def_be_hit[i],CHAR_WORKSLEEP,0); z = BATTLE_Index2No(battleindex,def_be_hit[i]);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -