void LeaderBoard::update(float dt) { if(scoreLabel){ /*char buff2[256]; *buff2 = 0; sprintf(buff2,"%d %s",getUserRank(), getNickname());*/ scoreLabel->setString(getNickname()); } }
void Nick::kicked(Channel* chan, ChanUser* from, string message) { for(vector<ChanUser*>::iterator it = channels.begin(); it != channels.end();) if((*it)->getChannel() == chan) { ChanUser* cu = *it; it = channels.erase(it); cu->getChannel()->delUser(this, Message(MSG_KICK).setSender(from) .setReceiver(cu->getChannel()) .addArg(getNickname()) .addArg(message)); } else ++it; }
/* * This method checks to see if the two CKIRCProtocols are equal to * one another based on the values they represent and *not* on the * actual pointers themselves. If they are equal, then this method * returns true, otherwise it returns false. */ bool CKIRCProtocol::operator==( const CKIRCProtocol & anOther ) const { bool equal = true; if ((getHostname() != anOther.getHostname()) || (getPort() != anOther.getPort()) || (mCommPort != anOther.mCommPort) || (isLoggedIn() != anOther.isLoggedIn()) || (getPassword() != anOther.getPassword()) || (getNickname() != anOther.getNickname()) || (getUserHost() != anOther.getUserHost()) || (getUserServer() != anOther.getUserServer()) || (getRealName() != anOther.getRealName()) || (mChannelList != anOther.mChannelList) || (mResponders != anOther.mResponders)) { equal = false; } return equal; }
/* * Because there are times when it's useful to have a nice * human-readable form of the contents of this instance. Most of the * time this means that it's used for debugging, but it could be used * for just about anything. In these cases, it's nice not to have to * worry about the ownership of the representation, so this returns * a CKString. */ CKString CKIRCProtocol::toString() const { CKString retval = "< IRC Host="; retval += getHostname(); retval += ", "; retval += " IRC Port="; retval += getPort(); retval += ", "; retval += " CommPort="; retval += mCommPort.toString(); retval += ", "; retval += " isLoggedIn? "; retval += (isLoggedIn() ? "Yes" : "No"); retval += ", "; retval += " Password="******" Nickname="; retval += getNickname(); retval += " UserHost="; retval += getUserHost(); retval += " UserServer="; retval += getUserServer(); retval += " RealName="; retval += getRealName(); retval += " ChannelList: ["; CKStringNode *i = NULL; for (i = mChannelList.getHead(); i != NULL; i = i->getNext()) { if (i->getPrev() != NULL) { retval += ", "; } retval += (*i); } retval += "]>\n"; return retval; }
string Nick::getLongName() const { return getNickname() + "!" + getIdentname() + "@" + getHostname(); }
bool LeaderBoard::init() { if (!CCLayer::init()) return false; //float iMenuWidthOffset = 0.55; SCREEN_WIDTH = CCDirector::sharedDirector()->getWinSize().width; SCREEN_HEIGHT = CCDirector::sharedDirector()->getWinSize().height; CCSprite* bgsprite =ThemeManager::sharedInstance()->spriteWithImageFile("leaderboard.png"); bgsprite->setScaleX(SCREEN_WIDTH/bgsprite->getContentSize().width); bgsprite->setScaleY(SCREEN_HEIGHT/bgsprite->getContentSize().height); bgsprite->setPosition(ccp(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)); this->addChild(bgsprite,1); CCSprite* updateNicknamelb =ThemeManager::sharedInstance()->spriteWithImageFile("btn_update_nickname.png"); CCSprite* updateNicknameSelectedlb =ThemeManager::sharedInstance()->spriteWithImageFile("btn_update_nickname.png"); updateNicknameSelectedlb->setScale(1.1); CCMenuItemSprite* pupdateNicknameItemSpritelb = CCMenuItemSprite::itemWithNormalSprite(updateNicknamelb, updateNicknameSelectedlb, this, menu_selector(LeaderBoard::updateNicknameClick)); pupdateNicknameItemSpritelb->setScale(LL_BUTTON_SCALE_VALUE); CCMenu* pupdateNicknameMenu = CCMenu::menuWithItems(pupdateNicknameItemSpritelb,NULL); pupdateNicknameMenu->setPosition(ccp(SCREEN_WIDTH*0.3, SCREEN_HEIGHT*0.15)); this->addChild(pupdateNicknameMenu, 3); CCSprite* back2menuNormallb =ThemeManager::sharedInstance()->spriteWithImageFile("back2menu.png"); CCSprite* back2menuSelectedlb =ThemeManager::sharedInstance()->spriteWithImageFile("back2menu.png"); back2menuSelectedlb->setScale(1.1); CCMenuItemSprite* pback2menuItemSpritelb = CCMenuItemSprite::itemWithNormalSprite(back2menuNormallb, back2menuSelectedlb, this, menu_selector(LeaderBoard::back2menuClick)); pback2menuItemSpritelb->setScale(LL_BUTTON_SCALE_VALUE); CCMenu* pback2menuMenu = CCMenu::menuWithItems(pback2menuItemSpritelb,NULL); pback2menuMenu->setPosition(ccp(SCREEN_WIDTH*0.7, SCREEN_HEIGHT*0.15)); this->addChild(pback2menuMenu, 3); CCLayer *bg = CCLayer::create(); bg->setContentSize(CCSizeMake(SCREEN_WIDTH,SCREEN_HEIGHT*0.58)); bg->setAnchorPoint(ccp(0,0)); bg->setPosition(ccp(0,0)); char buff[16]; *buff = 0; for(int i=0;i<10;i++){ int offsetHeight = SCREEN_HEIGHT*(0.63125-0.0583*i-0.08); sprintf(buff,"%d ",i+1); scoreLabel=CCLabelTTF::labelWithString(buff,CCSizeMake(300*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentLeft,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.43,offsetHeight)); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); bg->addChild(scoreLabel, 4); scoreLabel=CCLabelTTF::labelWithString(getNicknameByRank(i+1),CCSizeMake(300*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentLeft,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.50,offsetHeight)); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); bg->addChild(scoreLabel, 4); sprintf(buff,"%d ",getScore(i+1)); scoreLabel=CCLabelTTF::labelWithString(buff,CCSizeMake(150*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentRight,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.78,offsetHeight)); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); bg->addChild(scoreLabel, 4); } CCScrollView * view = CCScrollView::create(CCSizeMake(SCREEN_WIDTH,SCREEN_HEIGHT*0.35), bg); view->setDirection(kCCScrollViewDirectionVertical); view->setContentSize( CCSizeMake(SCREEN_WIDTH,SCREEN_HEIGHT*0.58) ); view->setContentOffset(ccp(0,-SCREEN_HEIGHT*0.226)); view->setAnchorPoint(ccp(0,0)); view->setPosition(0,SCREEN_HEIGHT*0.305); this->addChild(view,4); sprintf(buff,"%d ",getBestScore()); scoreLabel=CCLabelTTF::labelWithString(buff,CCSizeMake(150*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentRight,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.78,SCREEN_HEIGHT*(0.62725-0.0583*6))); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); this->addChild(scoreLabel, 4); scoreLabel=CCLabelTTF::labelWithString(getNickname(),CCSizeMake(300*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentLeft,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.51,SCREEN_HEIGHT*(0.62725-0.0583*6))); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); this->addChild(scoreLabel, 4); /*char buff2[256]; *buff2 = 0; sprintf(buff2,"%d %s",getUserRank(), getNickname()); scoreLabel=CCLabelTTF::labelWithString(buff2,CCSizeMake(330*LL_SCREEN_SCALE_VALUE,32), kCCTextAlignmentLeft,kCCVerticalTextAlignmentCenter,ThemeManager::sharedInstance()->getFontName(),36*LL_SCREEN_SCALE_VALUE); scoreLabel->setPosition(ccp(SCREEN_WIDTH*0.43,SCREEN_HEIGHT*(0.63125-0.0583*7))); scoreLabel->setColor(ThemeManager::sharedInstance()->getColor()); this->addChild(scoreLabel, 4);*/ return true; }
void handleServerEvent(Message * mes) { Player * sp = NULL; Game * sg = NULL; char * nick = NULL; Message nmes; if (mes->sndr_t == O_PLAYER) { sp = mes->sndr.player; nick = getNickname(sp); } if (mes->sndr_t == O_GAME) sg = mes->sndr.game; switch(mes->type) { case MEST_PLAYER_JOIN_SERVER: info("%s has joined on the server\n", nick); info("Players on server/in hall: %d/%d\n", srv.nPlayers, srv.hallPlayers); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; mGame * mg; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_JOINS_SERVER], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); /* players in games */ for (mg = srv.games; mg != NULL; mg = mg->next) for (mp = mg->game->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_PLAYER_LEAVE_SERVER: info("%s has leaved the server\n", nick); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; mGame * mg; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_LEAVES_SERVER], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); /* players in games */ for (mg = srv.games; mg != NULL; mg = mg->next) for (mp = mg->game->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } freePlayer(sp, sp->game); info("Players on server/in hall: %d/%d\n", srv.nPlayers, srv.hallPlayers); break; case MEST_PLAYER_CHANGES_NICK: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; mGame * mg; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_CHANGES_NICK], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); i = htonl(strlen(nick)); addnStr(msg, &i, sizeof(i)); i = strlen(nick); addnStr(msg, nick, i); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); /* players in games */ for (mg = srv.games; mg != NULL; mg = mg->next) for (mp = mg->game->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_COMMAND_UNKNOWN: info("%s send unknown command and will be disconnected\n", nick); { char err = 255; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } nmes.sndr_t = O_SERVER; nmes.rcvr_t = O_GAME; nmes.rcvr.game = sp->game; if (sp->game != NULL) nmes.type = MEST_PLAYER_LEAVE_GAME; else nmes.type = MEST_PLAYER_LEAVES_HALL; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); nmes.sndr_t = O_SERVER; nmes.rcvr_t = O_PLAYER; nmes.rcvr.player = sp; nmes.type = MEST_PLAYER_KICKED_FROM_SERVER; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); break; case MEST_COMMAND_NICK: info("%s sets nick into %s\n", nick, mes->data); if (sp->nick != NULL) free(sp->nick); sp->nick = mes->data; write(sp->fd, answrs[ANSWR_OK], 1); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_SERVER; nmes.type = MEST_PLAYER_CHANGES_NICK; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); break; case MEST_COMMAND_ADM: info("%s trying to get Adm privilegies\n", nick); if (strcmp(cfg.passkey, mes->data) == 0) sp->adm = 1; if (sp->adm == 1) { info("%s grants its Adm privilegies\n", nick); write(sp->fd, answrs[ANSWR_OK], 1); } else { char err = 0; info("Attempt was failed\n"); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } free(mes->data); break; case MEST_COMMAND_JOIN: info("%s trying to join into game #%d\n", nick, *(uint32_t *)(mes->data)); if (sp->game == NULL) { Game * g = findGameByGid(*(uint32_t *)(mes->data)); if (g == NULL) { info("Not found game #%d\n", *(uint32_t *)(mes->data)); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { info("%s joins into game #%d\n", nick, *(uint32_t *)(mes->data)); IntoGame(g, sp); write(sp->fd, answrs[ANSWR_OK], 1); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_PLAYER_JOIN_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = NULL; nmes.type = MEST_PLAYER_LEAVES_HALL; nmes.len = sizeof(g); nmes.data = g; sendMessage(&nmes); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_PLAYERS_STAT_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } } else { info("%s already in game #%d\n", sp->game->gid); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } free(mes->data); break; case MEST_COMMAND_GAMES: info("%s trying to get games list\n", nick); { uint32_t i; mGame * mg = srv.games; Buffer * buf = newBuffer(); char * str; i = htonl(srv.nGames); addnStr(buf, &i, sizeof(i)); while (mg != NULL) { i = htonl(mg->game->gid); addnStr(buf, &i, sizeof(i)); i = htonl(mg->game->nPlayers); addnStr(buf, &i, sizeof(i)); mg = mg->next; } write(sp->fd, answrs[ANSWR_GAMES], 1); i = htonl(buf->count); write(sp->fd, &i, sizeof(i)); i = buf->count; str = flushBuffer(buf); write(sp->fd, str, i); free(str); clearBuffer(buf); free(buf); } break; case MEST_COMMAND_PLAYERS: info("%s trying to get players list in game #%d\n", nick, *(uint32_t *)(mes->data)); { int gid = *(uint32_t *)(mes->data); Game * g = NULL; if (gid != 0) { g = findGameByGid(gid); if (g == NULL) { char err = 0; info("Not found game #%d\n", *(uint32_t *)(mes->data)); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } } if (gid == 0 || g != NULL) { uint32_t i; char * n; mPlayer * mp; Buffer * buf = newBuffer(); char * str; if (gid == 0) mp = srv.players; else mp = g->players; i = htonl(gid); addnStr(buf, &i, sizeof(i)); if (gid == 0) i = htonl(srv.hallPlayers); else i = htonl(g->nPlayers); addnStr(buf, &i, sizeof(i)); while (mp != NULL) { i = htonl(mp->player->pid); addnStr(buf, &i, sizeof(i)); n = getNickname(mp->player); i = htonl(strlen(n)); addnStr(buf, &i, sizeof(i)); addnStr(buf, n, strlen(n)); mp = mp->next; } write(sp->fd, answrs[ANSWR_PLAYERS], 1); i = htonl(buf->count); write(sp->fd, &i, sizeof(i)); i = buf->count; str = flushBuffer(buf); write(sp->fd, str, i); free(str); clearBuffer(buf); free(buf); } } break; case MEST_COMMAND_CREATEGAME: info("%s trying to create game\n", nick); if (!sp->adm) { char err = 0; info("%s not granted to create games\n", nick); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { Game * g = newGame(); uint32_t i; g->gid = srv.nextGid++; addGame(g); i = htonl(g->gid); info("%s created game #%d\n", nick, g->gid); write(sp->fd, answrs[ANSWR_STAT], 1); write(sp->fd, &i, sizeof(i)); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = NULL; nmes.type = MEST_NEW_GAME; nmes.len = sizeof(g); nmes.data = g; sendMessage(&nmes); } break; case MEST_COMMAND_DELETEGAME: info("%s trying to delete game #%d\n", nick, *(uint32_t *)(mes->data)); if (!sp->adm) { char err = 0; info("%s not granted to delete games\n", nick); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { Game * g = findGameByGid(*(uint32_t *)(mes->data)); if (g == NULL) { char err = 1; info("Not found game #%d\n", *(uint32_t *)(mes->data)); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { mPlayer * mp; info("%s deleted game #%d\n", nick, g->gid); write(sp->fd, answrs[ANSWR_OK], 1); for (mp = g->players; mp != NULL; mp = mp->next) { nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_PLAYER; nmes.rcvr.player = mp->player; nmes.type = MEST_PLAYER_KICKED_FROM_GAME; nmes.len = sizeof(g); nmes.data = g; sendMessage(&nmes); } nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_GAME_OVER; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } } break; case MEST_COMMAND_PLAYER: info("%s trying to get info about player #%d\n", nick, *(uint32_t *)(mes->data)); { Player * np = findPlayerByPid(*(uint32_t *)(mes->data)); if (np == NULL) { char err = 0; info("Not found player #%d\n", *(uint32_t *)(mes->data)); write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { uint32_t i; Buffer * buf = newBuffer(); char * str; /* #pid */ i = htonl(np->pid); addnStr(buf, &i, sizeof(i)); /* #game */ if (np->game == NULL) i = 0; else i = np->game->gid; i = htonl(i); addnStr(buf, &i, sizeof(i)); /* game characteristics */ if (np->game->started) { i = htonl(1); addnStr(buf, &i, sizeof(i)); i = htonl(np->mat); addnStr(buf, &i, sizeof(i)); i = htonl(np->prod); addnStr(buf, &i, sizeof(i)); i = htonl(np->bf); addnStr(buf, &i, sizeof(i)); i = htonl(countFactories(np)); addnStr(buf, &i, sizeof(i)); i = htonl(np->money); addnStr(buf, &i, sizeof(i)); } else { i = htonl(0); addnStr(buf, &i, sizeof(i)); addnStr(buf, &i, sizeof(i)); addnStr(buf, &i, sizeof(i)); addnStr(buf, &i, sizeof(i)); addnStr(buf, &i, sizeof(i)); addnStr(buf, &i, sizeof(i)); } /* len NICK */ str = getNickname(np); i = htonl(strlen(str)); addnStr(buf, &i, sizeof(i)); addnStr(buf, str, strlen(str)); /* player len MES */ write(sp->fd, answrs[ANSWR_PLAYER], 1); i = htonl(buf->count); write(sp->fd, &i, sizeof(i)); i = buf->count; str = flushBuffer(buf); write(sp->fd, str, i); free(str); clearBuffer(buf); free(buf); } } break; } }
void handlePlayerEvent(Player * p, Message * mes) { Player * sp = NULL; Game * sg = NULL; char * nick = NULL; /*Message nmes;*/ if (mes->sndr_t == O_PLAYER) { sp = mes->sndr.player; nick = getNickname(sp); } if (mes->sndr_t == O_GAME) sg = mes->sndr.game; switch(mes->type) { case MEST_PLAYER_KICKED_FROM_GAME: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_KICKED_FROM_GAME], 1); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); write(p->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } IntoNil(p); break; case MEST_PLAYER_KICKED_FROM_SERVER: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_KICKED_FROM_SERVER], 1); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); write(p->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } freePlayer(p, p->game); break; case MEST_PLAYER_PID: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_PID], 1); i = htonl(p->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); write(p->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; } }
void handleGameEvent(Game * g, Message * mes) { Player * sp = NULL; Game * sg = NULL; char * nick = NULL; Message nmes; if (mes->sndr_t == O_PLAYER) { sp = mes->sndr.player; nick = getNickname(sp); } if (mes->sndr_t == O_GAME) sg = mes->sndr.game; switch(mes->type) { case MEST_PLAYER_JOIN_GAME: info("%s has joined into game\n", nick); info("Players on server/in hall: %d/%d\n", srv.nPlayers, srv.hallPlayers); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_JOINS_GAME], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } if (g->num > 0 && g->num == g->nPlayers) { nmes.sndr_t = O_GAME; nmes.sndr.game = g; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_START_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } break; case MEST_PLAYER_LEAVE_GAME: info("%s has leaved game\n", nick); info("Players on server/in hall: %d/%d\n", srv.nPlayers, srv.hallPlayers); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_LEAVES_GAME], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_PLAYER_JOINS_HALL: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_JOINS_HALL], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_PLAYER_LEAVES_HALL: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_LEAVES_HALL], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_NEW_GAME: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_NEW_GAME], 1); i = htonl(((Game *)(mes->data))->gid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_PLAYERS_STAT_GAME: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYERS_STAT_GAME], 1); i = htonl(g->nPlayers); addnStr(msg, &i, sizeof(i)); i = htonl(g->num); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } break; case MEST_COMMAND_GET: info("%s trying to get something\n", nick); if (g == NULL) { info("%s didn't get anything\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { uint32_t i = g->num; i = htonl(i); info("%s get %d\n", nick, g->num); write(sp->fd, answrs[ANSWR_STAT], 1); write(sp->fd, &i, sizeof(i)); } break; case MEST_COMMAND_SET: info("%s trying to set something into %d\n", nick, *(uint32_t *)(mes->data)); if (g == NULL) { info("%s not in game\n", nick, *(uint32_t *)(mes->data)); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { info("%s successfully sets something into %d\n", nick, *(uint32_t *)(mes->data)); g->num = *(uint32_t *)(mes->data); write(sp->fd, answrs[ANSWR_OK], 1); if (g->num > 0 && g->num <= g->nPlayers) { nmes.sndr_t = O_GAME; nmes.sndr.game = g; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_START_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } } free(mes->data); break; case MEST_COMMAND_LEAVE: info("%s trying to leave us\n", nick); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { info("%s leaves game #%d\n", nick, g->gid); IntoNil(sp); write(sp->fd, answrs[ANSWR_OK], 1); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_PLAYER_LEAVE_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = NULL; nmes.type = MEST_PLAYER_JOINS_HALL; nmes.len = sizeof(g); nmes.data = g; sendMessage(&nmes); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_PLAYERS_STAT_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } break; case MEST_COMMAND_START: info("%s trying to start game\n", nick); if (!sp->adm) { info("%s not granted to start games\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (g == NULL) { info("%s not in game\n", nick); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (g->started) { info("Game #%d is already started\n", g->gid); char err = 3; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (g->nPlayers == 0) { info("No players in game #%d\n", g->gid); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { write(sp->fd, answrs[ANSWR_OK], 1); nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_START_GAME; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } break; case MEST_COMMAND_TURN: info("%s trying to turn in game\n", nick); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (sp->turned) { info("%s already turned\n", nick); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { int ntp = 0; /* not turned players */ mPlayer * mp; write(sp->fd, answrs[ANSWR_OK], 1); /* Semd info message about turned player */ { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_TURNED], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } sp->turned = 1; for (mp = g->players; mp != NULL; mp = mp->next) if (!mp->player->turned) ++ntp; info("Turned players: %d/%d\n", g->nPlayers, ntp); if (ntp > 0) /* Send info message about not turned players */ { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_NOT_TURNED_PLAYERS_LEFT], 1); i = htonl(g->nPlayers); addnStr(msg, &i, sizeof(i)); i = htonl(ntp); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } else { nmes.sndr_t = O_GAME; nmes.sndr.game = g; nmes.rcvr_t = O_GAME; nmes.rcvr.game = g; nmes.type = MEST_TURN_ENDED; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); } } break; case MEST_COMMAND_PROD: info("%s trying to product something in game\n", nick); { uint32_t n = *(uint32_t *)(mes->data); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (sp->turned) { info("%s already turned\n", nick); char err = 3; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 4; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n < 1 || n > sp->bf) { info("Nonavail product value got\n"); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n*(g->prodPrice) > sp->money || n*(g->prodStuff) > sp->mat) { info("Not enough resources to product\n"); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { write(sp->fd, answrs[ANSWR_OK], 1); sp->prodBid.c = n; } } free(mes->data); break; case MEST_COMMAND_MARKET: info("%s trying to take market information in game\n", nick); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { uint32_t i; char * str; Buffer * buf = newBuffer(); i = htonl(g->nPlayers); addnStr(buf, &i, sizeof(i)); i = htonl(g->turn); addnStr(buf, &i, sizeof(i)); i = htonl(g->state.sellC); addnStr(buf, &i, sizeof(i)); i = htonl(g->state.sellMinP); addnStr(buf, &i, sizeof(i)); i = htonl(g->state.buyC); addnStr(buf, &i, sizeof(i)); i = htonl(g->state.buyMaxP); addnStr(buf, &i, sizeof(i)); write(sp->fd, answrs[ANSWR_MARKET], 1); i = buf->count; str = flushBuffer(buf); write(sp->fd, str, i); free(str); clearBuffer(buf); free(buf); } break; case MEST_COMMAND_BUILD: info("%s trying to build something in game\n", nick); { uint32_t n = *(uint32_t *)(mes->data); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 4; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (sp->turned) { info("%s already turned\n", nick); char err = 3; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n < 1) { info("Nonavail build value got\n"); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if ((g->bFacPrice/2) > sp->money) { info("Not enough resources to build\n"); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { write(sp->fd, answrs[ANSWR_OK], 1); for (; n > 0; n--) addFactory(sp); } } free(mes->data); break; case MEST_COMMAND_SELL: info("%s trying to sell something in game\n", nick); { uint32_t n = *(uint32_t *)(mes->data); uint32_t p = *(uint32_t *)(mes->data + 4); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 5; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (sp->turned) { info("%s already turned\n", nick); char err = 4; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n != 0 && p > g->state.buyMaxP) { info("Price that is offered by %s is too high\n", nick); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n > sp->prod) { info("%s don't have enough product\n", nick); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n > g->state.buyC) { info("%s offered too many product to sell\n", nick); char err = 3; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { write(sp->fd, answrs[ANSWR_OK], 1); sp->sellBid.c = n; sp->sellBid.p = p; } } free(mes->data); break; case MEST_COMMAND_BUY: info("%s trying to buy something in game\n", nick); { uint32_t n = *(uint32_t *)(mes->data); uint32_t p = *(uint32_t *)(mes->data + 4); if (g == NULL) { info("%s not in game\n", nick); char err = 0; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (!g->started) { info("Game #%d isn't started\n", g->gid); char err = 5; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (sp->turned) { info("%s already turned\n", nick); char err = 4; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n != 0 && p < g->state.sellMinP) { info("Price that is offered by %s is too small\n", nick); char err = 1; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n*p > sp->money) { info("%s don't have enough money\n", nick); char err = 2; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else if (n > g->state.sellC) { info("%s offered too many material to buy\n", nick); char err = 3; write(sp->fd, answrs[ANSWR_ERROR], 1); write(sp->fd, &err, 1); } else { write(sp->fd, answrs[ANSWR_OK], 1); sp->buyBid.c = n; sp->buyBid.p = p; } } free(mes->data); break; case MEST_GAME_OVER: { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_GAME_OVER], 1); i = htonl(g->gid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in hall */ for (mp = srv.players; mp != NULL; mp = mp->next) if (mp->player != sp) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } freeGame(g); break; case MEST_START_GAME: info("Game #%d started with %d players\n", g->gid, g->nPlayers); /* Send info message about game start */ { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_START_GAME], 1); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } startGame(g); break; case MEST_TURN_ENDED: info("New turn in game #%d\n", g->gid); { Turn * t; Buffer * msgshr = newBuffer(); mPlayer * mp; Bid * b; char * strshr; int lenshr; uint32_t i; t = turnGame(g); /* generating shared MES part */ addnStr(msgshr, infos[INFO_TURN_ENDED], 1); i = htonl(t->turn); addnStr(msgshr, &i, sizeof(i)); i = htonl(countBids(t->sell) + countBids(t->buy)); addnStr(msgshr, &i, sizeof(i)); for (b = t->buy->f; b != NULL; b = b->next) { i = htonl(b->type); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->p->pid); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->count); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->price); addnStr(msgshr, &i, sizeof(i)); } for (b = t->sell->f; b != NULL; b = b->next) { i = htonl(b->type); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->p->pid); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->count); addnStr(msgshr, &i, sizeof(i)); i = htonl(b->price); addnStr(msgshr, &i, sizeof(i)); } lenshr = msgshr->count; strshr = flushBuffer(msgshr); for (mp = g->players; mp != NULL; mp = mp->next) { Buffer * info = newBuffer(); Buffer * msg = newBuffer(); char * str; /* generating private MES part */ addnStr(msg, strshr, lenshr); if (countBids(t->prod) == 0) { i = htonl(0); addnStr(msg, &i, sizeof(i)); } else { for (b = t->prod->f; b != NULL && b->p != mp->player; b = b->next); if (b == NULL) i = htonl(0); else i = htonl(b->count); addnStr(msg, &i, sizeof(i)); } if (countBids(t->fac) == 0) { i = htonl(0); addnStr(msg, &i, sizeof(i)); } else { for (b = t->fac->f; b != NULL && b->p != mp->player; b = b->next); if (b == NULL) i = htonl(0); else i = htonl(b->count); addnStr(msg, &i, sizeof(i)); } /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } free(strshr); clearBuffer(msgshr); free(msgshr); remTurn(t); } break; case MEST_PLAYER_BANKRUPT: sp = (Player *)(mes->data); info("%s had bankrupted in game #%d\n", getNickname(sp), g->gid); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_BANKRUPT], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = NULL; nmes.type = MEST_PLAYER_JOINS_HALL; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); IntoNil(sp); break; case MEST_PLAYER_WIN: sp = (Player *)(mes->data); info("%s had win in game #%d\n", getNickname(sp), g->gid); { Buffer * msg = newBuffer(); Buffer * info = newBuffer(); mPlayer * mp; char * str; uint32_t i; /* generating MES part */ addnStr(msg, infos[INFO_PLAYER_WIN], 1); i = htonl(sp->pid); addnStr(msg, &i, sizeof(i)); /* generating INFO part */ addnStr(info, answrs[ANSWR_INFO], 1); i = htonl(msg->count); addnStr(info, &i, sizeof(i)); i = msg->count; str = flushBuffer(msg); addnStr(info, str, i); free(str); /* sending info message */ i = info->count; str = flushBuffer(info); /* players in our game */ for (mp = g->players; mp != NULL; mp = mp->next) write(mp->player->fd, str, i); free(str); clearBuffer(msg); free(msg); clearBuffer(info); free(info); } nmes.sndr_t = O_PLAYER; nmes.sndr.player = sp; nmes.rcvr_t = O_GAME; nmes.rcvr.game = NULL; nmes.type = MEST_PLAYER_JOINS_HALL; nmes.len = 0; nmes.data = NULL; sendMessage(&nmes); IntoNil(sp); break; } }