?? battle_event.c
字號:
static char *aszCrushTbl[] = { "完好", "受損", "毀壞" , "不堪使用" , "碎片" };#elsestatic char *aszCrushTbl[] = { "受損", "毀壞" };#endif#ifdef _TAKE_ITEMDAMAGEint BATTLE_ItemCrush( int charaindex, int ItemEquip, int Damages, int flg){ int itemindex, breadnums; int crushlevel, crushenum, maxcrushenum; char szBuffer[256]=""; int battleindex, bid; itemindex = CHAR_getItemIndex( charaindex, ItemEquip ); if( ITEM_CHECKINDEX( itemindex ) == FALSE ) return -1; battleindex = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX ); bid = BATTLE_Index2No( battleindex, charaindex ); crushlevel = ITEM_getInt( itemindex, ITEM_CRUSHLEVEL); if( crushlevel < 0 ) crushlevel=0; crushenum = ITEM_getInt( itemindex, ITEM_DAMAGECRUSHE); maxcrushenum = ITEM_getInt( itemindex, ITEM_MAXDAMAGECRUSHE); if( maxcrushenum < 1 ) return -1; if( ItemEquip == CHAR_ARM ) { if( (breadnums = ((Damages-50)/40)) <= 0 ) breadnums = 1; }else { if( Damages >= 200 ) breadnums = 1; if( (breadnums = ((200 - Damages)/20)) < 0 ) breadnums = 1; } crushenum = crushenum - RAND( breadnums, (breadnums*1.4) ); ITEM_setInt( itemindex, ITEM_DAMAGECRUSHE, crushenum); if( crushenum <= 0 ){ //損壞消失 crushenum = 0; sprintf(szBuffer, "%s因過度損壞而消失。\n", ITEM_getChar( itemindex, ITEM_NAME)); CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORYELLOW); LogItem( CHAR_getChar( charaindex, CHAR_NAME ), CHAR_getChar( charaindex, CHAR_CDKEY ),#ifdef _add_item_log_name // WON ADD 在item的log中增加item名稱 itemindex,#else ITEM_getInt( itemindex, ITEM_ID ), #endif "因過度損壞而消失", CHAR_getInt( charaindex,CHAR_FLOOR), CHAR_getInt( charaindex,CHAR_X ), CHAR_getInt( charaindex,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); CHAR_DelItem( charaindex, ItemEquip); crushlevel = 4; }else { //損壞扣值 int defs, level=0; defs = (crushenum*100)/maxcrushenum; if( defs >= 70 ){ level = 0; }else if( defs >= 50 && defs < 70 ) { level = 1; }else if( defs >= 30 && defs < 50 ) { level = 2; }else if( defs < 30 ) { level = 3; } if( level != crushlevel && defs < 70 ) { ITEM_setInt( itemindex, ITEM_CRUSHLEVEL, level);// for( i = 0; i < arraysizeof( ItemBreakPos ); i ++ ){// work = ITEM_getInt( itemindex, ItemBreakPos[i] );// if( work <= 0 )continue;// work *=0.95;// ITEM_setInt( itemindex, ItemBreakPos[i], work );// } sprintf( szBuffer, "%s是%s的。", ITEM_getChar( itemindex, ITEM_NAME ), aszCrushTbl[level] ); CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORRED); //更改道具說明// buf1 = ITEM_getChar( itemindex, ITEM_SECRETNAME);// if( strstr( buf1, "(") != 0 ) {// char buf5[256];// if( getStringFromIndexWithDelim( buf1,"(",1, buf5, sizeof( buf5)) != FALSE ) {// sprintf( buf1, buf5);// }// }// sprintf( buf2, "%s(%s)", buf1, aszCrushTbl[level]);// ITEM_setChar( itemindex, ITEM_SECRETNAME, buf2); } } CHAR_sendItemDataOne( charaindex, ItemEquip ); CHAR_complianceParameter( charaindex ); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_ATK | CHAR_P_STRING_DEF | CHAR_P_STRING_QUICK | CHAR_P_STRING_CHARM ); return TRUE;}#elseint BATTLE_ItemCrush( int charaindex ){ int EquipTbl[CHAR_EQUIPPLACENUM], i, itemindex, rndwork, type; int work, crushlevel, j, ItemEquip; char szBuffer[256]=""; int ItemBreakPos[] = { ITEM_ATTACKNUM_MIN, ITEM_ATTACKNUM_MAX, ITEM_MODIFYATTACK, ITEM_MODIFYDEFENCE, ITEM_MODIFYQUICK, ITEM_MODIFYHP, ITEM_MODIFYMP, ITEM_MODIFYLUCK, ITEM_MODIFYCHARM, ITEM_MODIFYAVOID, }; for( j = 0, i = 0; i < CHAR_EQUIPPLACENUM; i ++ ){ itemindex = CHAR_getItemIndex( charaindex, i ); if( ITEM_CHECKINDEX( itemindex ) == TRUE && ITEM_getInt( itemindex, ITEM_MERGEFLG ) == 1 ){ EquipTbl[j] = i; j ++; } } if( j == 0 )return FALSE; rndwork = RAND( 0, j-1 ); ItemEquip = EquipTbl[rndwork]; itemindex = CHAR_getItemIndex( charaindex, ItemEquip ); if( ITEM_CHECKINDEX( itemindex ) == FALSE )return FALSE; crushlevel = ITEM_getInt( itemindex, ITEM_CRUSHLEVEL ); if( crushlevel > 1 ) return FALSE; { if( crushlevel == 1 ){ sprintf( szBuffer, "CrushLv2(毀壞道具Lv2)" ); }else{ sprintf( szBuffer, "CrushLv1(毀壞道具Lv1)" ); } LogItem( CHAR_getChar( charaindex, CHAR_NAME ), CHAR_getChar( charaindex, CHAR_CDKEY ),#ifdef _add_item_log_name // WON ADD 在item的log中增加item名稱 itemindex,#else ITEM_getInt( itemindex, ITEM_ID ),#endif szBuffer, CHAR_getInt( charaindex,CHAR_FLOOR), CHAR_getInt( charaindex,CHAR_X ), CHAR_getInt( charaindex,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } /*{ int battleindex, bid; //sprintf( szBuffer, "(%s)的(%s)是(%s)\n", // CHAR_getUseName( charaindex ), // ITEM_getChar( itemindex, ITEM_NAME ), // aszCrushTbl[crushlevel] ); battleindex = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX ); bid = BATTLE_Index2No( battleindex, charaindex ); //BATTLE_BroadCast( battleindex, szBuffer, (bid >= 10)? CHAR_COLORGRAY : CHAR_COLORPURPLE ) ; }*/ type = ITEM_getInt( itemindex, ITEM_TYPE ); szBuffer[0] = 0; switch( type ){ case ITEM_FIST: case ITEM_AXE: case ITEM_CLUB: case ITEM_SPEAR: case ITEM_BOW: case ITEM_BOOMERANG: case ITEM_BOUNDTHROW: case ITEM_BREAKTHROW: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NAME_WEPON ); break; case ITEM_HELM: case ITEM_ARMOUR: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NAME_AROMER ); break; case ITEM_BRACELET: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_BRACELET );break; case ITEM_MUSIC: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_MUSIC );break; case ITEM_NECKLACE: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NECKLACE );break; case ITEM_RING: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_RING );break; case ITEM_BELT: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_BELT );break; case ITEM_EARRING: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_EARRING );break; case ITEM_NOSERING: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_NOSERING );break; case ITEM_AMULET: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_AMULET );break; case ITEM_OTHER: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_OTHER );break; default: sprintf( szBuffer, "%s%s", aszCrushTbl[crushlevel], BREAK_OTHER );break; break; } ITEM_setChar( itemindex, ITEM_SECRETNAME, szBuffer ); for( i = 0; i < arraysizeof( ItemBreakPos ); i ++ ){ work = ITEM_getInt( itemindex, ItemBreakPos[i] ); if( work <= 0 )continue; if( crushlevel == 1 ){ work = 1; }else{ work /= 2; if( work < 1 ) work = 1; } ITEM_setInt( itemindex, ItemBreakPos[i], work ); } CHAR_sendItemDataOne( charaindex, ItemEquip ); ITEM_setInt( itemindex, ITEM_CRUSHLEVEL, crushlevel + 1 ); CHAR_complianceParameter( charaindex ); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_ATK | CHAR_P_STRING_DEF | CHAR_P_STRING_QUICK | CHAR_P_STRING_CHARM ); return TRUE;}#endif#ifdef _TAKE_ITEMDAMAGEstatic int BATTLE_ItemCrushSeq( int attackindex, int charaindex, int Damages){ int iRet = FALSE; int crushindex=-1, crushpower; int flg=0;//flg def 1 att 2 flg=1; if( ( crushindex = BATTLE_ItemCrushCheck( charaindex, flg) ) >= 0 ) { if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ crushpower = CHAR_getWorkInt( attackindex, CHAR_WORKATTACKPOWER); BATTLE_ItemCrush( charaindex, crushindex, Damages, flg); } } flg=2; if( ( crushindex = BATTLE_ItemCrushCheck( attackindex, flg) ) >= 0 ) { if( CHAR_getInt( attackindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ crushpower = CHAR_getWorkInt( charaindex, CHAR_WORKDEFENCEPOWER); BATTLE_ItemCrush( attackindex, crushindex, Damages, flg); } } return iRet;}#elsestatic int BATTLE_ItemCrushSeq( int charaindex ){ char szWork[256]; int iRet = FALSE; if( BATTLE_ItemCrushCheck( charaindex ) == TRUE ){ if( BATTLE_ItemCrush( charaindex ) == TRUE ){ sprintf( szWork, "BK|%s的\t裝備受到損傷。", CHAR_getUseName( charaindex ) ); strcat( szBadStatusString, szWork ); iRet = TRUE; } } return iRet;}#endif#ifdef _EQUIT_ARRANGEstatic BOOL BATTLE_ArrangeCheck( int attackindex, int defindex){ int DEF_ARR; if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD ){ return FALSE; } if( BATTLE_GetDamageReact( defindex ) > 0 ){ return FALSE; } if( BATTLE_CanMoveCheck( defindex ) == FALSE ){ return FALSE; } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_NODUCK ){ return FALSE; } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_ABIO ){ return FALSE; } if( (DEF_ARR = CHAR_getWorkInt( defindex, CHAR_WORKARRANGEPOWER )) > 0 ){ int per = (DEF_ARR > 700)?700:DEF_ARR; if( RAND( 1, 1000 ) <= per ){ return TRUE; } } return FALSE;}#endif//回避判定static BOOL BATTLE_DuckCheck( int attackindex, int defindex){ int flg = FALSE; int Df_Dex, At_Dex, Df_Luck = 0; float per, Work, wari, Big, Small; gDuckPer = 0; if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_GUARD ){ return FALSE; } if( BATTLE_GetDamageReact( defindex ) > 0 ){ return FALSE; } if( BATTLE_CanMoveCheck( defindex ) == FALSE ){#ifdef _PROFESSION_ADDSKILL if( CHAR_getWorkInt( defindex, CHAR_DOOMTIME ) <= 0 )//集氣時可閃避(并且沒有處於天羅地網和盾擊的狀態) return FALSE; else{ if( CHAR_getWorkInt( defindex, CHAR_WORKDRAGNET ) == 0 && CHAR_getWorkInt( defindex, CHAR_WORKDIZZY ) == 0 ){ } else{ return FALSE; } }#else return FALSE;#endif } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_NODUCK ){ return FALSE; } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLEFLG ) & CHAR_BATTLEFLG_ABIO ){ return FALSE; }#ifdef _PETSKILL_SETDUCK if( BATTLE_CheckMySkillDuck( defindex ) == TRUE ){ return TRUE; }#endif At_Dex = CHAR_getWorkInt( attackindex, CHAR_WORKFIXDEX ); Df_Dex = CHAR_getWorkInt( defindex, CHAR_WORKFIXDEX ); if( CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ Df_Luck = CHAR_getWorkInt( defindex, CHAR_WORKFIXLUCK ); } if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY && CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ){ At_Dex *= 0.8; }else if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) != CHAR_TYPEENEMY && CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ){ Df_Dex *= 0.8; }else if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER && CHAR_getInt( defindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ At_Dex *= 0.6; }else if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getInt( defindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ Df_Dex *= 0.6; } if( Df_Dex >= At_Dex ){ Big = Df_Dex; Small = At_Dex; wari = 1.0; }else{ Big = At_Dex; Small = Df_Dex; if( Big <= 0 ){ wari = 0.0; }else{ wari = Small / Big; } } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_JYUJYUTU ){ gKawashiPara = 0.027; }else{ gKawashiPara = 0.02; } Work = ( Big - Small ) / gKawashiPara; if( Work <= 0 ) Work = 0; per = (float)( sqrt( (double)Work ) ); per *= wari; per += Df_Luck; per += gBattleDuckModyfy; if( CHAR_getWorkInt( attackindex, CHAR_WORKDRUNK ) > 0 ){ per += RAND( 20, 30 ); } if( gWeponType == ITEM_BOW ){ per += 20; } if( CHAR_getWorkInt( defindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_NOGUARD ){ per += CHAR_GETWORKINT_HIGH( defindex, CHAR_WORKBATTLECOM3 ); } if( gWeponType == ITEM_BOW ){ per += 20; } per *= 100; if( per > KAWASHI_MAX_RATE*100 ) per = KAWASHI_MAX_RATE*100; if( per <= 0 ) per = 1; gDuckPer = per * 0.01;#ifdef _EQUIT_HITRIGHT if( CHAR_getInt( attackindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ int AddHit = CHAR_getWorkInt( attackindex, CHAR_WORKHITRIGHT); per -= RAND( AddHit*0.8, AddHit*1.2); per = ( per < 0 )?0:per; }#endif#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能 per = BATTLE_check_profession_duck( defindex, per );#endif #ifdef _PROFESSION_ADDSKILL if( CHAR_getWorkInt( attackindex, CHAR_WORKBATTLECOM1 ) == BATTLE_COM_S_CHAOS ){ //混亂攻擊時命中降低 per += (per*0.4); }#endif if( RAND( 1, 10000 ) <= per ){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -