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; }
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; }
//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 ); }
/** * @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; }