Exemple #1
0
int Cnew_tug::on_card_act(sprite_t* p, int type, int pos)
{
	Cplayer* p_player = NULL;
	p_player = get_player(p);
	if (p_player == NULL)
	{
		return 0;
	}

	card_t card_info1 = {};
	card_info1.id = -1;
	card_info1.type = type;
	card_info1.value = 0;

	p_player->act_bout_card(pos);
	int cardid =  p_player->get_bout_cardid();
	card_t card_info2 = (*cards_info)[cardid];

	int result = compare(card_info1, card_info2);
	if (result != WIN)
	{
		p_player->update_life_dec(1);
	}

	notify_act_card(p->id, type, pos);

	process_game_result();

	return 0;

}
Exemple #2
0
int Cnew_tug::on_player_leave(sprite_t* p)
{
 	for (uint32_t i = 0; i < players.size(); i++)
    {
        if (players[i] != NULL)
        {
            if(players[i]->get_sprite() == p)
            {
                players[i]->set_sprite(NULL);

                player_cards_info_t* p_cards_info =  players[i]->get_cards_info();
                delete p_cards_info;
                p_cards_info = NULL;
                delete players[i];
                players[i] = NULL;

                DEBUG_LOG("%lu player leave game %d", p->group->id, p->id);
            }
        }
    }

	process_game_result();

	return  0;

}
Exemple #3
0
//player functions
void * player_f( void *data )
{
	struct playerdata_t *myplayerdata;
	myplayerdata = (struct playerdata_t *) data;
	int retval;
	bool run=true;
  
	struct epoll_event event_setup;

	//Will need to add socket related info at some point.  Will player threads be remote?
	myplayerdata->epfd = epoll_create ( MAX_EVENTS );

	//printf( "NP %d, game %d ip rd %d ip wr %d op rd %d op wr %d epfd %d tid %lu\n", myplayerdata->playerid, myplayerdata->gamenumber, myplayerdata->input[READPIPE], myplayerdata->input[WRITEPIPE], myplayerdata->output[READPIPE], myplayerdata->output[WRITEPIPE], myplayerdata->epfd, pthread_self() );
	printf( "New Player %d game %d\n", myplayerdata->playerid, myplayerdata->gamenumber );

	event_setup.data.fd = myplayerdata->output[READPIPE];
	event_setup.events = EPOLLIN;
	if ( -1 == epoll_ctl( myplayerdata->epfd, EPOLL_CTL_ADD, myplayerdata->output[READPIPE], &event_setup ) ) {
		retval = errno; //we return just a success/failure value
		printf( "Error adding server fd to epoll list\n" );
		pthread_exit( (void *) (long)retval );
	}

	while( run )
	{
		int numevents;
		struct epoll_event event_list[ MAX_EVENTS ];

		// Wait forever for an event from the game or the server
//		printf( "Game %d waiting for event\n", mygamedata->gamenumber );
//		Need to figure out if we can add STDIN so player can quit
//		when they want to.
		numevents = epoll_wait( myplayerdata->epfd, event_list, MAX_EVENTS, -1 );

		// Save a variable by counting down ( currently MAX_EVENTS
		// is 1) , does it matter if we start at the end?
		// actually it is a horrible way to do this, needs to be redone
		// to use int i instead.
		for( numevents--;numevents >= 0; numevents-- ) {
			if( myplayerdata->output[READPIPE] == event_list[numevents].data.fd ) {
				run = process_game_result( myplayerdata );
			}
		}

	}

	player_cleanup( myplayerdata );
	retval = EXIT_SUCCESS;
	pthread_exit( (void *)(long)retval );
}
Exemple #4
0
/**
 * @brief  处理玩家用户游戏通讯
 * @param
 * @return 返回GER_end_of_game结束游戏,返回0游戏继续
 */
int Cnew_tug::handle_data(sprite_t* p, int cmd, const uint8_t body[], int len)
{
	Cplayer* p_player = NULL;
	p_player = get_player(p);
	if (p_player == NULL)
	{
		DEBUG_LOG("%lu player uid=%d aready leave , cmd:%u",m_grp->id, p->id, cmd);
		return 0;
	}

    switch (cmd)
    {
        case NEW_TUG_GET_CARDS:
			{
            	return send_player_cards(p);
			}

		case NEW_TUG_CLIENT_READY:
			{
				p_player->set_game_status(GAME_READY);
				if (is_game_ready())
				{
					notify_client_ready();
					game_start = 1;
					time_start = time(NULL);

					ADD_TIMER_EVENT(p->group, on_game_timer_expire, p_player, now.tv_sec + 60);

				}

				break ;
			}

		case NEW_TUG_ACT_CARD:
			{
				CHECK_BODY_LEN(len, 2);
				int8_t type = 0;
				int8_t pos = 0;
                int i = 0;
                ant::unpack(body, type, i);
                ant::unpack(body, pos, i);
				if (type < 0 || type > 4)
				{
					ERROR_LOG("%lu Cnew_tug: %d error type %d", m_grp->id, p->id, type);
                    return GER_end_of_game;
				}
				int ret = on_card_act(p, type, pos);
				if (ret != 0)
				{
            		return GER_end_of_game;
				}
				break ;
			}

		case NEW_TUG_USER_MISS:
			{
				p_player->update_life_dec(1);
				process_game_result();
				break ;
			}

        case proto_player_leave:
			{
				DEBUG_LOG("%lu  new tug player user:%d leave , cmd:%u",m_grp->id, p->id, cmd);
				return on_player_leave(p);
			}
        default:
			{
            	ERROR_LOG("%lu\tnew tug, undef cmd: %d", m_grp->id, cmd);
            	return GER_end_of_game;
			}
    }

	return 0;

}