📄 battle.c
字号:
print( "不明(%s)(%d)\n", CHAR_getUseName( charaindex ), CHAR_getInt( charaindex, CHAR_WHICHTYPE ) ); return BATTLE_ERR_TYPE; } pEntry = pBattle->Side[side].Entry; for( i = iEntryFirst; i < iEntryMax; i ++ ){ if( pEntry[i].charaindex == -1 )break; } if( i == iEntryMax ){ return BATTLE_ERR_ENTRYMAX; } EntryInit( &pEntry[i] ); pEntry[i].charaindex = charaindex; pEntry[i].bid = i + side * SIDE_OFFSET; CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEINDEX, battleindex ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_INIT ); // shan 2001/12/27 Begin { int fd; if( CHAR_getInt( charaindex, CHAR_WHICHTYPE)==CHAR_TYPEPLAYER ){ fd = CHAR_getWorkInt( charaindex, CHAR_WORKFD); CONNECT_SetBattleRecvTime( fd, &NowTime); } } // End CHAR_setWorkInt( charaindex, CHAR_WORKBATTLESIDE, side ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEFLG, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, -1 ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM2, -1 ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM3, -1 ); CHAR_setWorkInt( charaindex, CHAR_WORKMODATTACK, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKMODDEFENCE, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKMODQUICK, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKDAMAGEABSROB, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKDAMAGEREFLEC, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKDAMAGEVANISH, 0 ); CHAR_setWorkInt( charaindex, CHAR_WORKMODCAPTURE, 0 ); CHAR_setFlg( charaindex, CHAR_ISATTACKED, 1 ); BATTLE_BadStatusAllClr( charaindex ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEWATCH, 0 );#ifdef _PETSKILL_RETRACE CHAR_setWorkInt( charaindex, CHAR_WORKRETRACE, 0 );//追迹攻击#endif#ifdef _PETSKILL_BECOMEFOX //将媚惑术中招时间清除为-1 CHAR_setWorkInt( charaindex, CHAR_WORKFOXROUND, -1 ); #endif return 0;}INLINE int _BATTLE_Exit( char *file, int line, int charaindex ,int battleindex){ BATTLE_ENTRY *pEntry; int i, j, k; BATTLE *pBattle; char szPet[32]; if( CHAR_CHECKINDEX( charaindex ) == FALSE )return BATTLE_ERR_CHARAINDEX; if( BATTLE_CHECKINDEX( battleindex ) == FALSE ){ return BATTLE_ERR_BATTLEINDEX; }#ifdef _PETSKILL_BECOMEFOX // 离开战斗时将媚惑术造成的变身效果清除 //print("\n检查图号:%s,%d", CHAR_getChar( charaindex, CHAR_NAME), CHAR_getInt( charaindex, CHAR_BASEIMAGENUMBER)); if( CHAR_getInt( charaindex, CHAR_BASEIMAGENUMBER)==101749 || CHAR_getWorkInt( charaindex, CHAR_WORKFOXROUND ) != -1 ){ //变成小狐狸 CHAR_setInt( charaindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( charaindex, CHAR_BASEBASEIMAGENUMBER) ); CHAR_setWorkInt( charaindex, CHAR_WORKFOXROUND, -1); //print("\n变回去:%d",CHAR_getInt( charaindex, CHAR_BASEIMAGENUMBER)); }#endif#ifdef _PETSKILL_BECOMEPIG if( CHAR_getInt( charaindex, CHAR_BECOMEPIG) > -1 && CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ CHAR_setInt( charaindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( charaindex, CHAR_BECOMEPIG_BBI ) ); CHAR_complianceParameter( charaindex ); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); CHAR_send_P_StatusString( charaindex , CHAR_P_STRING_BASEBASEIMAGENUMBER); }#endif#ifdef _MAGIC_NOCAST // 精灵:沉默 // WON ADD if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) lssproto_NC_send( getfdFromCharaIndex( charaindex ), 0);//复原#endif pBattle = &BattleArray[battleindex]; if( pBattle->use == FALSE ) return BATTLE_ERR_NOUSE; for( j = 0; j < 2; j ++ ){ pEntry = pBattle->Side[j].Entry; for( i = 0; i < BATTLE_ENTRY_MAX; i ++ ){ if( pEntry[i].charaindex != charaindex ) continue; pEntry[i].charaindex = -1; pEntry[i].escape = 0; CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_FINAL ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEINDEX, -1 );#ifdef _LOSE_FINCH_ CHAR_setWorkInt( charaindex, CHAR_WORKSPETRELIFE, 0);#endif if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEENEMY ){ CHAR_endCharOneArray( charaindex ); }else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ int petindex = pEntry[i+5].charaindex; if( CHAR_getFlg( charaindex, CHAR_ISDIE ) == TRUE || CHAR_getInt( charaindex, CHAR_HP ) == TRUE ) {#ifdef _FIX_SPEED_UPLEVEL // WON ADD 修正加速 // Robin cancel //if( CHAR_getFlg( charaindex, CHAR_ISDIE ) == TRUE ){ //}else { // Robin cancel //if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLECOM1) != BATTLE_COM_ESCAPE ) { unsigned int Dtimes; unsigned int battletime; int fd = getfdFromCharaIndex( charaindex ); Dtimes = BattleArray[battleindex].CreateTime; battletime = (unsigned int)(BattleArray[battleindex].flgTime/100); //if( CHAR_getWorkInt( charaindex, CHAR_WORKFLG) & WORKFLG_DEBUGMODE ){ //}else { CheckDefBTime( charaindex, fd, Dtimes, battletime, 10);//lowTime延迟时间 } } }#endif CHAR_setFlg( charaindex, CHAR_ISDIE, 0 ); CHAR_setInt( charaindex, CHAR_HP, 1 ); // CoolFish: Faily PK 2001/8/3 CHAR_setWorkInt(charaindex, CHAR_WORKFMPKFLAG, -1); }else {#ifdef _BATTLE_TIMESPEED // Robin cancel //if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLECOM1) != BATTLE_COM_ESCAPE ) { unsigned int Dtimes; unsigned int battletime; int fd = getfdFromCharaIndex( charaindex ); Dtimes = BattleArray[battleindex].CreateTime; battletime = (unsigned int)(BattleArray[battleindex].flgTime/100); //if( CHAR_getWorkInt( charaindex, CHAR_WORKFLG) & WORKFLG_DEBUGMODE ) { //}else { CheckDefBTime( charaindex, fd, Dtimes, battletime, 0);//lowTime延迟时间 } }#endif } if( CHAR_CHECKINDEX( petindex ) == TRUE ){ pEntry[i+5].charaindex = -1; CHAR_setWorkInt( petindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_NONE ); CHAR_setWorkInt( petindex, CHAR_WORKBATTLEINDEX, -1 ); } BATTLE_BadStatusAllClr( charaindex ); CHAR_complianceParameter( charaindex ); CHAR_Skillupsend( charaindex ); // Robin 0730 if( CHAR_getWorkInt( charaindex, CHAR_WORKPETFALL) ) { CHAR_setWorkInt( charaindex, CHAR_WORKPETFALL, 0 ); CHAR_setInt( charaindex, CHAR_RIDEPET, -2 ); } CHAR_send_P_StatusString( charaindex , CHAR_P_STRING_HP|CHAR_P_STRING_EXP| CHAR_P_STRING_MP|CHAR_P_STRING_DUELPOINT| CHAR_P_STRING_CHARM | CHAR_P_STRING_EARTH | CHAR_P_STRING_WATER | CHAR_P_STRING_FIRE | CHAR_P_STRING_WIND | CHAR_P_STRING_RIDEPET ); // Robin 0730 if( CHAR_getInt( charaindex, CHAR_RIDEPET ) == -2 ){ CHAR_setInt( charaindex, CHAR_RIDEPET, -1 ); } for( k = 0; k < CHAR_MAXPETHAVE; k ++ ){ petindex = CHAR_getCharPet( charaindex, k ); if( CHAR_CHECKINDEX( petindex ) == FALSE )continue; if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE ) continue; if( CHAR_getFlg( petindex, CHAR_ISDIE ) == TRUE || CHAR_getInt( petindex, CHAR_HP ) <= 0 ){ CHAR_setFlg( petindex, CHAR_ISDIE, 0 ); CHAR_setInt( petindex, CHAR_HP, 1 ); } CHAR_setWorkInt( petindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_NONE );#ifdef _LOSE_FINCH_ CHAR_setWorkInt( charaindex, CHAR_WORKSPETRELIFE, 0);#endif#ifdef _VARY_WOLF if( CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER) != CHAR_getInt( petindex, CHAR_BASEIMAGENUMBER) ) // Robin fix { CHAR_setInt( petindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER)); sprintf( szPet, "K%d", k); CHAR_sendStatusString( charaindex , szPet); }#endif BATTLE_BadStatusAllClr( petindex ); CHAR_complianceParameter( petindex ); CHAR_send_K_StatusString( charaindex , k, CHAR_K_STRING_HP|CHAR_K_STRING_EXP| CHAR_K_STRING_AI| CHAR_K_STRING_MP | CHAR_K_STRING_ATK | CHAR_K_STRING_DEF | CHAR_K_STRING_QUICK | CHAR_K_STRING_EARTH | CHAR_K_STRING_WATER | CHAR_K_STRING_FIRE | CHAR_K_STRING_WIND ); } if( BattleArray[battleindex].type == BATTLE_TYPE_P_vs_P ){ int flg = 0; CHAR_setFlg( charaindex, CHAR_ISDUEL, 0); if( CHAR_getFlg( charaindex, CHAR_ISPARTY)) flg |= CHAR_FS_PARTY; if( CHAR_getFlg( charaindex, CHAR_ISDUEL)) flg |= CHAR_FS_DUEL; if( CHAR_getFlg( charaindex, CHAR_ISPARTYCHAT)) flg |= CHAR_FS_PARTYCHAT; if( CHAR_getFlg( charaindex, CHAR_ISTRADECARD)) flg |= CHAR_FS_TRADECARD; lssproto_FS_send( getfdFromCharaIndex(charaindex), flg); } lssproto_XYD_send( getfdFromCharaIndex(charaindex), CHAR_getInt( charaindex, CHAR_X ), CHAR_getInt( charaindex, CHAR_Y ), CHAR_getInt( charaindex, CHAR_DIR ) ); } break; } } CHAR_PartyUpdate( charaindex, CHAR_N_STRING_HP );#ifdef _TIME_TICKET { int nowtime = time(NULL); int tickettime = CHAR_getWorkInt( charaindex, CHAR_WORKTICKETTIME); int totaltime; char msg[1024]; if( tickettime > 0 && tickettime < nowtime ) { //int floor, x, y; CHAR_talkToCli( charaindex, -1, "谢谢光顾。", CHAR_COLORYELLOW); if( CHAR_getWorkInt( charaindex, CHAR_WORKTICKETTIMESTART) > 0 ) { totaltime = nowtime - CHAR_getWorkInt( charaindex, CHAR_WORKTICKETTIMESTART); sprintf( msg, "总入场时间%d分%d秒。", totaltime/60, totaltime%60); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORYELLOW); } CHAR_setWorkInt( charaindex, CHAR_WORKTICKETTIME, 0); CHAR_setWorkInt( charaindex, CHAR_WORKTICKETTIMESTART, 0); /*if( CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), &floor, &x, &y ) != TRUE ) { CHAR_warpToSpecificPoint( charaindex, 1006, 15, 15); } else { CHAR_warpToSpecificPoint( charaindex, floor, x, y); }*/ CHAR_warpToSpecificPoint( charaindex, 7001, 41, 6); } }#endif return BATTLE_ERR_NONE;}int BATTLE_PetDefaultExit( int charaindex, int battleindex){ int pno, pindex, iRet; if( CHAR_CHECKINDEX( charaindex ) == FALSE )return BATTLE_ERR_CHARAINDEX; if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER) return 0; pno = CHAR_getInt( charaindex, CHAR_DEFAULTPET ); if( pno < 0 )return 0; pindex = CHAR_getCharPet( charaindex, pno ); iRet = BATTLE_Exit( pindex, battleindex ); if( iRet ){ iRet *= -1; }else{ return 1; } return iRet;}int BATTLE_PetDefaultEntry( int charaindex, int battleindex, int side){ int pindex;#if 1 int pno; int ret = 0; pno = CHAR_getInt( charaindex, CHAR_DEFAULTPET ); if( pno == -1 ) return 0; pindex = CHAR_getCharPet( charaindex, pno ); if( CHAR_CHECKINDEX( pindex ) && !CHAR_getFlg( pindex, CHAR_ISDIE ) && CHAR_getInt( pindex, CHAR_HP ) > 0 ) { if( BATTLE_NewEntry( pindex, battleindex, side ) ){ }else{ ret = 0; } } else { CHAR_setInt( charaindex, CHAR_DEFAULTPET, -1 ); } return ret;#else for( i = 0; i < CHAR_MAXPETHAVE; i ++ ){ pindex = CHAR_getCharPet( charaindex, i ); if( CHAR_CHECKINDEX( pindex ) == FALSE )continue; if( CHAR_getFlg( pindex, CHAR_ISDIE ) == TRUE )continue; if( CHAR_getInt( pindex, CHAR_HP ) <= 0 )continue; if( BATTLE_NewEntry( pindex, battleindex, side ) ){ }else{ CHAR_setInt( charaindex, CHAR_DEFAULTPET, i ); break; } } if( i == CHAR_MAXPETHAVE ){ CHAR_setInt( charaindex, CHAR_DEFAULTPET, -1 ); } return 0;#endif}int BATTLE_RescueEntry( int charaindex, int toindex ){ int iRet = 0, battleindex, fd, pindex; char szBuffer[256]="";#ifdef _BATTLE_TIMESPEED fd = getfdFromCharaIndex( charaindex); if( CONNECT_getBDTime( fd) > time( NULL) ) { return 1; }#endif battleindex = CHAR_getWorkInt( toindex, CHAR_WORKBATTLEINDEX ); if( !BATTLE_CHECKINDEX( battleindex) ) return 1; if( ( fd = getfdFromCharaIndex(charaindex) ) < 0 ) return 1; if( CHAR_getWorkInt( toindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_FINAL || CHAR_getWorkInt( toindex, CHAR_WORKBATTLEINDEX ) == -1 ){ iRet = 1; } if( BattleArray[battleindex].type == BATTLE_TYPE_P_vs_P ){ iRet = 1; }else{ iRet = BATTLE_NewEntry( charaindex, battleindex, CHAR_getWorkInt( toindex, CHAR_WORKBATTLESIDE ) ); } if( iRet == 0 ){ CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_RESCUE ); iRet = BATTLE_PetDefaultEntry( charaindex, battleindex, CHAR_getWorkInt( toindex, CHAR_WORKBATTLESIDE ) ); } if( iRet == 0 ){ int flg; if( CHAR_getInt( charaindex, CHAR_DEFAULTPET ) >= 0 ){ pindex = CHAR_getCharPet( charaindex, CHAR_getInt( charaindex, CHAR_DEFAULTPET ) ); CHAR_setWorkInt( pindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_RESCUE ); } //snprintf( szBuffer, sizeof( szBuffer ), "(%s)加入作战。", // CHAR_getUseName( charaindex ) ); //BATTLE_BroadCast( battleindex, szBuffer, CHAR_COLORYELLOW ); if( ( fd = getfdFromCharaIndex(charaindex) ) != -1 ){ lssproto_EN_send( fd, BattleArray[battleindex].type, BattleArray[battleindex].field_no ); } flg = (BattleArray[battleindex].Side[ CHAR_getWorkInt( toindex, CHAR_WORKBATTLESIDE)].flg & BSIDE_FLG_HELP_OK)? TRUE:FALSE; lssproto_HL_send( fd, flg); sprintf( szBuffer, "BP|%X|%X|%X", BATTLE_Index2No( battleindex, charaindex ), BP_FLG_JOIN, CHAR_getInt(charaindex, CHAR_MP ) ); BATTLE_CommandSend( charaindex, szBuffer ); }else{ snprintf( szBuffer, sizeof( szBuffer ), "无法参战。" ); CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORYELLOW); if( ( fd = getfdFromCharaIndex(charaindex) ) != -1 ){ lssproto_EN_send( fd, FALSE, BattleArray[battleindex].field_no ); } } BATTLE_ClearGetExp( charaindex ); return iRet;}BOOL BATTLE_RescueTry( int charaindex){ int x,y; OBJECT object; int pfound = FALSE; int result = FALSE; int fd; int i; int cnt; fd = getfdFromCharaIndex( charaindex); if( fd == -1 ) return FALSE;#if 1 // 修正利用参战重复加入战斗 Robin if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) { CHAR_talkToCli( charaindex, -1, " 重复加入战斗! ", CHAR_COLORRED); print("\n 改封包!!重复加入战斗!:%s ", CHAR_getChar( charaindex, CHAR_CDKEY) ); //lssproto_EN_send( fd, FALSE, 0 ); return FALSE; }#endif if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { lssproto_EN_send( fd, FALSE, 0 ); return FALSE; }#ifdef _BATTLE_TIMESPEED if( CONNECT_getBDTime( fd) > time( NULL) ) { return FALSE; }#endif for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setBattlecharaindex(fd,i,-1); } CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &x , &y ); cnt = 0; for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int objindex = GET_OBJINDEX(object); if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); if( CHAR_getInt( toindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) continue; pfound = TRUE; if( CHAR_getWorkInt( toindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE ){ continue; } if( BattleArray[ CHAR_getWorkInt( toindex, CHAR_WORKBATTLEINDEX)].type != BATTLE_TYPE_P_vs_E ){ continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -