⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deathcontend.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 4 页
字号:
			sprintf(szMsg,"你的队里 %s 转生数 %d 转,未达比赛标准喔!",CHAR_getChar(pindex,CHAR_NAME),CHAR_getInt(pindex,CHAR_TRANSMIGRATION));
			CHAR_talkToCli(charaindex,-1,szMsg,CHAR_COLORYELLOW);
			return FALSE;
		}
	}
	return TRUE;
}


BOOL PKLIST_CheckPKReapetTeam( int menum, int tonum)
{
	int meti, k, toti;
	if( (meti=PKLIST_GetPkTeamListArrayFromNum( menum )) == -1 ){
		return FALSE;
	}
	for( k=0; k<MAXBATTLENUM; k++){
		if( PkTeamList[meti].BHistory[k].use == 0 ) continue;
		if( PkTeamList[meti].BHistory[k].teamnum == tonum ){
			return FALSE;
		}
	}
	if( (toti=PKLIST_GetPkTeamListArrayFromNum( tonum )) == -1 ){
		return FALSE;
	}
	for( k=0; k<MAXBATTLENUM; k++){
		if( PkTeamList[toti].BHistory[k].use == 0 ) continue;
		if( PkTeamList[toti].BHistory[k].teamnum == menum ){
			return FALSE;
		}
	}

	return TRUE;
}


BOOL PKLIST_JoinPKProcedures( int charaindex )
{
	int i, j, teamnum, side=-1;
	BOOL Finds = FALSE;

	//andy_log
	print("JoinPKProcedures( %d) \n", charaindex);
	if( PKLIST_CheckPKSameTeam( charaindex) == FALSE ){
		print("CheckPKSameTeam() err !!!\n");
		return FALSE;
	}
	if( (teamnum = CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM)) < 0 ) return FALSE;
	if( PKLIST_CheckLOCKTeam( teamnum) == FALSE ){
		CHAR_talkToCli( charaindex, -1, "系统忙碌中,请稍後!", CHAR_COLORYELLOW);
		return FALSE;
	}

	for( i=0; i<MAXJOINTEAM; i++ ){
		if( PKProcedure[i].type == PKTYPE_STANDBY ){
			if( PKProcedure[i].time + (5*60) < (int)time(NULL) ){
				print( "太久未战斗\n");
				if( PKProcedure[i].Team[0].use != 0 &&
					PKLIST_CheckPklistInServerMap( i, 0) == TRUE &&
					PKProcedure[i].Team[1].use != 0 &&
					PKLIST_CheckPklistInServerMap( i, 0) == TRUE ){

					if( CHAR_getWorkInt( PKProcedure[i].Team[0].toindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE ){
						//andy_log
						print("强制战斗!!\n");
						BATTLE_CreateVsPlayer( PKProcedure[i].Team[0].toindex,
							PKProcedure[i].Team[1].toindex );
					}
				}else{
					PKLIST_warp( i, 0, 8250, 20, 20);
					PKLIST_warp( i, 1, 8250, 22, 20);
					PKLIST_DelPKProcedures( i, side, PKTYPE_WAIT);
					PKLIST_DelPKProcedures( i, side, PKTYPE_WAIT);
					PKProcedure[i].type = PKTYPE_WAIT;
				}
			}
			continue;
		}

		for( j=0; j<2; j++ ){
			if( PKProcedure[i].Team[j].use != 0 ){
				if( PKLIST_CheckPklistInServerMap( i, j) == FALSE){
					PKLIST_DelPKProcedures( i, j, PKTYPE_WAIT);
				}
				if( PKLIST_CheckPKReapetTeam( PKProcedure[i].Team[j].teamnum, teamnum ) == FALSE )
					break;
				continue;
			}
			side=(j+1)%2;
			if( PKProcedure[i].Team[side].use != 0 ){
				if( PKLIST_CheckPklistInServerMap( i, side) == FALSE){
					PKLIST_DelPKProcedures( i, side, PKTYPE_WAIT);
					continue;
				}
				if( PKLIST_CheckPKReapetTeam( PKProcedure[i].Team[side].teamnum,
						teamnum ) == FALSE )
					continue;

				PKProcedure[i].type = PKTYPE_STANDBY;
				PKProcedure[i].time = (int)time( NULL);
			}else{
				PKProcedure[i].type = PKTYPE_WAIT;
			}
//-----------------------------------------------------------------------------
			//载入队伍资料
			PKProcedure[i].Team[j].teamnum = teamnum;
			snprintf( PKProcedure[i].Team[j].cdkey, sizeof(PKProcedure[i].Team[j].cdkey),"%s",
				CHAR_getChar( charaindex, CHAR_CDKEY) );
			snprintf( PKProcedure[i].Team[j].name, sizeof(PKProcedure[i].Team[j].name),"%s",
				CHAR_getChar( charaindex, CHAR_NAME) );
			PKProcedure[i].Team[j].toindex = charaindex;
			PKProcedure[i].Team[j].fd = getfdFromCharaIndex( charaindex);
			PKProcedure[i].Team[j].use = 1;
//------------------------------------------------------------------------------
			PKLIST_warp( i, j, PK_BATTLEMAP[i].floor, PK_BATTLEMAP[i].x-j, PK_BATTLEMAP[i].y );

			Finds = TRUE;
			break;
		}
		if( Finds == TRUE ) break;
	}

	if( Finds == FALSE ){
		CHAR_talkToCli( charaindex, -1, "目前赛程中之队伍已满请稍後再试!", CHAR_COLORYELLOW);
		return FALSE;
	}
	return TRUE;
}

void PKLIST_CheckTeamBeEnable( void)
{
	int i, j;
	for( i=0; i<MAXJOINTEAM; i++ ){
		for( j=0; j<2; j++ ){
			if( PKProcedure[i].Team[j].use == 0 ) continue;
			PKLIST_CheckPklistInServerMap( i, j);//确认队伍是否成立
		}
	}
}

void PKLIST_warpOne( int charaindex, int fl, int x, int y )
{
	int k;
	if( !CHAR_CHECKINDEX( charaindex) ) return;
	CHAR_warpToSpecificPoint( charaindex, fl, x, y);
	if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ){
		for( k = 1; k < CHAR_PARTYMAX; k ++ ){
			int subindex = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1+k );
			if( !CHAR_CHECKINDEX( subindex ) )continue;
			CHAR_warpToSpecificPoint( subindex, fl, x, y);
		}
	}
}

void PKLIST_warp( int ti, int side, int fl, int x, int y )
{
	int k;
	if( !CHAR_CHECKINDEX(PKProcedure[ti].Team[side].toindex) );
	if( CHAR_getWorkInt( PKProcedure[ti].Team[side].toindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_LEADER ){
		CHAR_warpToSpecificPoint( PKProcedure[ti].Team[side].toindex, fl, x, y);
		CHAR_talkToCli( PKProcedure[ti].Team[side].toindex, -1, "请在此等待对战队伍!", CHAR_COLORYELLOW);
	}else{
		for( k = 0; k < CHAR_PARTYMAX; k ++ ){
			int subindex = CHAR_getWorkInt( PKProcedure[ti].Team[side].toindex,
				CHAR_WORKPARTYINDEX1+k );

			if( !CHAR_CHECKINDEX( subindex ) )continue;
			CHAR_talkToCli( subindex, -1, "请在此等待对战队伍!如时间超过10分後未有对战队伍,建议玩家可重原登後重新加入赛程。", CHAR_COLORYELLOW);
			CHAR_warpToSpecificPoint( subindex, fl, x, y);
		}
	}
}

int PKLIST_GetPKProcedureArray( int menum )
{
	int i, j;
	for( i=0; i<MAXJOINTEAM; i++ ){
		for( j=0; j<2; j++ ){
			if( PKProcedure[i].Team[j].use == 0 ) continue;
			if( PKProcedure[i].Team[j].teamnum == menum ) return i;
		}
	}
	return -1;
}

BOOL PKLIST_CheckLOCKTeam( int menum)
{
	int meti=-1;
	if( (meti=PKLIST_GetPkTeamListArrayFromNum( menum )) == -1 ){
		return FALSE;
	}

	if(  PkTeamList[meti].read > (int)time(NULL) ){
		return FALSE;
	}
	return TRUE;

}

void PKLIST_LOCKTeam( int menum)
{
	int meti=-1;
	if( (meti=PKLIST_GetPkTeamListArrayFromNum( menum )) == -1 ){
		return;
	}
	PkTeamList[meti].read = (int)time(NULL)+60;
}

void PKLIST_UNLOCKTeam( int menum)
{
	int meti=-1;
	if( (meti=PKLIST_GetPkTeamListArrayFromNum( menum )) == -1 ){
		return;
	}
	PkTeamList[meti].read = 0;
}

void PKLIST_Sort_PKListSort( void)
{
	int i, j, k, last=-1;
	char data[65535*3], buf[512];
	for( i=0; i<MAXTEAMNUM; i++){
		last = -1;
		for( k=549; k>=0; k-- ){
			if( PkTeamList[i].score <= 0 ) continue;
			if( PKListSort[k] == -1 ){
				last = k;
				continue;
			}
			if(	PkTeamList[i].score > PkTeamList[PKListSort[k]].score ){
				last = k;
				continue;
			}
			break;
		}
		if( last == -1 ) continue;
		for( j=548; j>=last; j-- ){
			PKListSort[j+1] = PKListSort[j];
		}
		PKListSort[last]=i;
	}
	memset(data,0,sizeof(data));
	for(i=0;i<550;i++){
		if(PKListSort[i] == -1) continue;
			
		sprintf(buf, "%s|%d|%d|%d|%d ",
			PkTeamList[PKListSort[i]].teamname,
			PkTeamList[PKListSort[i]].win, PkTeamList[PKListSort[i]].lost,
			PkTeamList[PKListSort[i]].battleplay, PkTeamList[PKListSort[i]].score );
		strcat(data,buf);
	}
	PKLIST_HandleChartsMess(0,data,2,0);
}

//正式赛

void ABATTLE_InitABattle( int maxnums )
{
	int i,j,k;
	if( maxnums<1 || maxnums >= MAXBAFLOOR) return;
	memset( ABLevelup, 0, sizeof(ABLevelup));
	for( k=0; k<MAXBAHEAD; k++ ){
		ABFloor[k]=(maxnums);
		for( i=0; i<MAXBAFLOOR; i++){
			for( j=0; j<MAXNOWBATTLE; j++)
				NowABattle[k][i][j]=NULL;
		}
	}

	for( i=0; i<MAXBATTLEPAGE; i++){
		InBattle[i]=NULL;
	}

	for( i=0; i<MAXBAHEAD; i++){
		if( (headABattle[i] = ArrangeBattleC_getNew()) == NULL ){
			print("err can't get headABattle NULL \n");
			return;
		}
		headABattle[i]->top = NULL;
		for( j=0; j<MAXNOWBATTLE; j++){
			if( NowABattle[i][0][j] != NULL )continue;
			NowABattle[i][0][j] = headABattle[i];
			headABattle[i]->fl = 0;
			headABattle[i]->code = j;
			break;
		}
		if( j >= MAXNOWBATTLE ) return;
		ABATTLE_CreateNet( headABattle[i], i, 0, maxnums);
	}
	{
		FILE *fp=NULL;
		int count=0;
		char buf[256], buf1[256], buf2[256], filename[256];
		
		for( i=0; i<MAXBAHEAD; i++ ){
			sprintf( filename, "abattle_%d.txt", i);
			if( (fp=fopen( filename, "r")) == NULL ) continue;
			count=0;
			while( fgets( buf, sizeof(buf)-1, fp) ){
				if( getStringFromIndexWithDelim( buf , "|", 1, buf1, sizeof( buf1)) == FALSE ) continue;
				if( getStringFromIndexWithDelim( buf , "|", 2, buf2, sizeof( buf2)) == FALSE ) continue;

				//andy_log
				print("ti:%d", i);

				NowABattle[i][maxnums][count]->teamnum = atoi( buf1);
				snprintf( NowABattle[i][maxnums][count]->teamname,
					sizeof( NowABattle[i][maxnums][count]->teamname),"%s", buf2);
				if( NowABattle[i][maxnums][count]->teamnum >= 0 )
					NowABattle[i][maxnums][count]->use = 1;

				//andy_log
				print("NowABattle[%d][%d][%d].  %x[%d,%d,%s]\n",
					i, maxnums, count,
					NowABattle[i][maxnums][count],
					NowABattle[i][maxnums][count]->use, 
					NowABattle[i][maxnums][count]->teamnum,
					NowABattle[i][maxnums][count]->teamname );

				count++;
			}
			fclose( fp);
			//remove( filename);
		}
	}

	maxbati = MAXBAHEAD;
	maxfloor = maxnums;
}

int ABATTLE_CreateNet( ArrangeBattleC *now, int ti, int fl, int maxfl)
{
	int i,j;
	ArrangeBattleC *news=NULL;
	//andy_log
	print( "CreateNet( %d,%d)\n", ti, fl);

	if( fl != 0 ){
		for( j=0; j<MAXNOWBATTLE; j++){
			if( NowABattle[ti][fl][j] != NULL )continue;
			//andy_log
			print(" create -> NowABattle[%d][%d][%d]\n", ti, fl, j);
			NowABattle[ti][fl][j] = now;
			now->fl = fl;
			now->code = j;
			break;
		}
		if( j >= MAXNOWBATTLE ) return 0;
	}
	if( fl < maxfl ){
		for( i=0; i<2; i++){
		
			news=NULL;
			if( (news = ArrangeBattleC_getNew()) == NULL ){
				//andy_log
				print("err can't get news NULL\n");
				return 0;
			}
			now->next[i] = news;
			news->top = now;
			if( ABATTLE_CreateNet( news, ti, fl+1, maxfl) == 0 ){
				//andy_log
				print("err net free %x \n", news);
				free( news );
				now->next[i] = NULL;
				return 0;
			}
		}
	}

	return 1;
}

void ABATTLE_ShowNet( ArrangeBattleC *now, int fl)
{
	int i;
	if( now == NULL ) return;

	if( now->fl == fl ){
		print(" [%d,%d,%s] %x,top:%x\n", now->use, now->teamnum, now->teamname, now,
			now->top );
	}

	for( i=0; i<2; i++){
		if( now->next[i] == NULL )continue;
		ABATTLE_ShowNet( now->next[i], fl);
	}
}

void ABATTLE_ShowBattlefromFl( int ti, int fl)
{
	int j, total=0;
	if( fl<0 ) return;
	if( ti<0 || ti >= MAXBAHEAD ) return;
	print("headABattle:%x\n", headABattle);
	ABATTLE_ShowNet( headABattle[ti], fl);
	print("\nNOWBATTLE:\n");
	if( fl<0 || fl >= MAXBAFLOOR) return;


	for( j=0; j<MAXNOWBATTLE; j++){
		if( NowABattle[ti][fl][j] == NULL )continue;
		if( j!=0 && j%8==0) print("\n");
		print(" [%d,%d,%s] %x, top:%x",
			NowABattle[ti][fl][j]->use, NowABattle[ti][fl][j]->teamnum, 
			NowABattle[ti][fl][j]->teamname, NowABattle[ti][fl][j],
			NowABattle[ti][fl][j]->top );
		total++;
	}
	print("\ntotal:%d\n", total);
}

BOOL ABATTLE_InsertBattle( ArrangeBattleC *aB)
{
	ArrangeBattleC *aBo=NULL;
	int i;
	if( aB == NULL ) return FALSE;
	for( i=0; i<MAXBATTLEPAGE; i++){
		if( InBattle[i] != NULL ) continue;
		if( (aBo=aB->next[0])==NULL || aBo->use == 0 || aBo->type > 0 ) return FALSE;
		if( (aBo=aB->next[1])==NULL || aBo->use == 0 || aBo->type > 0 ) return FALSE;
		InBattle[i] = aB;
		InBattle[i]->next[0]->type =1;
		InBattle[i]->next[1]->type =1;

		print("InsertBattle[%d,%s vs %d,%s]\n",
			InBattle[i]->next[0]->teamnum, InBattle[i]->next[0]->teamname,
			InBattle[i]->next[1]->teamnum, InBattle[i]->next[1]->teamname );
#ifdef _DEATH_CONTENDTEST
		aB->time = (int)time(NULL)+30;	//战斗时间
#else
		aB->time = (int)time(NULL)+(5*60);	//战斗时间
#endif
		aB->type = 1; // 战斗旗标
		return TRUE;
	}
	return FALSE;
}

void ABATTLE_EnterBattle( ArrangeBattleC *aB)
{
	ArrangeBattleC *aBtop=NULL;
	ArrangeBattleC *aBo=NULL;

	if( (aBtop=aB->top) == NULL ){
		//andy_log
		print("del (aBtop=aB->top) NULL !\n");
		return;
	}

	aBtop->teamnum = aB->teamnum;
	snprintf( aBtop->teamname, sizeof(aBtop->teamname),"%s", aB->teamname);
	aBtop->type = 0;
	aBtop->use = 1;

	if( (aBo=aBtop->next[0]) != NULL ){
		aBo->use=0;
		aBo->teamnum=-1;
	}
	if( (aBo=aBtop->next[1]) != NULL ){
		aBo->use=0;
		aBo->teamnum=-1;
	}
}

void ABATTLE_EliminateBattlefromFl( ArrangeBattleC *aB)
{
	ArrangeBattleC *aBtop=NULL;
	if( aB == NULL ) return;
	aB->use=0;
	aB->type = 0;
	aB->teamnum = -1;
	free( aB);
}

int ABATTLE_FindBattlefromFl( int ti, int fl)
{
	int i, j, side=0, count=0;
	ArrangeBattleC *aBo=NULL;
	ArrangeBattleC *aB1=NULL;
	ArrangeBattleC *aB2=NULL;

	//andy_log
	print( "FindBattlefromFl(%d,%d)\n", ti, fl);
	for( i=0; i<MAXNOWBATTLE; i++){
		if( NowABattle[ti][fl][i] == NULL )continue;
		aBo = NowABattle[ti][fl][i];

		for( j=0; j<2; j++){
			if( (aB1=aBo->next[j]) == NULL || aB1->use == 0 || aB1->type > 0 )continue;

			side = (j+1)%2;
			aB2=aBo->next[side];

			if( aB2 == NULL || aB2->use == 0 || aB2->teamnum == -1 ){ //没有对手
			}else{
				if( ABATTLE_InsertBattle( aBo) == FALSE ){
					return -1;
				}else{
					char token[256];
					int playernum = CHAR_getPlayerMaxNum();
					sprintf( token, "%s队 VS %s队 5分钟後决斗。", aB1->teamname, aB2->teamname );
					PKLIST_shoutToAll( token, -1, -1);
					count++;
					// 把排入赛程的人员传入地图 8250
					for(i=0;i<playernum;i++){
						if(CHAR_getCharUse(i) == FALSE) continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -