示例#1
0
void LeaderBoard::update(float dt)
{
	if(scoreLabel){
		/*char buff2[256];
		*buff2 = 0;
		sprintf(buff2,"%d %s",getUserRank(), getNickname());*/
		scoreLabel->setString(getNickname());
	}
}
示例#2
0
文件: nick.cpp 项目: jasuarez/minbif
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;
}
示例#3
0
/*
 * 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;
}
示例#4
0
/*
 * 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;
}
示例#5
0
文件: nick.cpp 项目: jasuarez/minbif
string Nick::getLongName() const
{
	return getNickname()  + "!" +
	       getIdentname() + "@" +
	       getHostname();
}
示例#6
0
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;
}
示例#7
0
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;
	}
}
示例#8
0
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;
	}
}
示例#9
0
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;
	}
}