Ejemplo n.º 1
0
bool   TRoss::ReadFromStrWithOneSignatura (const char* s, TCortege10& C, BYTE SignatNo)
{
	int CurrItemNo = 0;
	CSignat& Sgn = Fields[C.m_FieldNo].m_Signats[SignatNo];

	vector<TItemStr> ItemStrVec;
	const char* q = s;

	int i =0;
	for (i=0; i<Sgn.DomsWithDelims.size(); i++)
	{
		BYTE DomNo = Sgn.DomsWithDelims[i].m_DomNo;
		bool IsMult = Sgn.DomsWithDelims[i].m_IsMult;
		bool IsDelim = m_Domens[DomNo].IsDelim;
		bool FlagLastItem = (i == Sgn.DomsWithDelims.size() - 1);
		char Delim[10];
		Delim[0] = 0;

		bool FlagNextDelim = false;
		if (!FlagLastItem)
			if (   (i < Sgn.DomsWithDelims.size()-1) 
				&& m_Domens[Sgn.DomsWithDelims[i+1].m_DomNo].IsDelim
				&& !m_Domens[Sgn.DomsWithDelims[i+1].m_DomNo].IsEmpty()
				)
				FlagNextDelim = true;

		if (FlagNextDelim)
			strcat (Delim, m_Domens[Sgn.DomsWithDelims[i+1].m_DomNo].m_Items);

		if  (!FlagLastItem  && !FlagNextDelim)
			strcat (Delim, " ");

		while (isspace ((unsigned  char) q[0])) q++;

		char ItemStr[100];
		size_t ItemStrLen = IsDelim ? 1 : strcspn(q, Delim);
		if (ItemStrLen  > 99)  return false;
		strncpy  (ItemStr, q, ItemStrLen);
		ItemStr[ItemStrLen] = 0;
		if (!IsDelim) rtrim (ItemStr);

		/*
			если есть два формата для одного поля: 
				D_ENGL
				D_RLE  
			и пришло русское слово, тогда не будем добавлять его в 
				в D_ENGL
		*/
		if ( IsRussian (ItemStr) )
			if (!strcmp  (m_Domens[DomNo].DomStr, "D_ENGL"))
				return false;


		/*if (DomNo == ActantsDomNo) 
		{
			if (   (strlen (ItemStr) == 2) 
				&& (ItemStr[0] == (unsigned char)'A') 
				&&  isdigit(ItemStr[1]))
				ItemStr[0] = (unsigned char)'А';

			if  (		(strlen (ItemStr) == 1) 
					&&  (ItemStr[0] == (unsigned char)'C')
				)
				ItemStr[0] = (unsigned char)'С';
		};*/

		// #### Получение в строку q остатка строки для дальнейшей обработки
		q += ItemStrLen;

		//если строка прежедвременно закончилалсь,
		// то выйти из процедуры с неудачей
		if (!FlagLastItem && IsEmptyLine(q))  return false;

		/*
		если данный элемент есть повторение некоторых констант их другого домена
		Например, "D_GRAMMEMS+" означает, что на этом месте стоит перечень элементов
		из домена D_GRAMMEMS, разделенных запятыми.
		Нужно проверить, что перечень синтаксически правилен и записать его в домен 
		D_MULT одной константой.
		*/
		if (IsMult)
		{
			StringTokenizer tok(ItemStr," ,");
			while (tok())
				if (GetItemNoByItemStr (tok.val(), DomNo) == -1)
					return false;

			DomNo = GetDomenNoByDomStr("D_MULT");
		};

		// #### Поиск найденной  строки в домене
		if (   (strlen (ItemStr) == 1)     
			&& ((unsigned char)ItemStr[0] == '*') )
		{
			C.SetItem(CurrItemNo,WildCardDomItemNo);
		}
		else
			C.SetItem(CurrItemNo, GetItemNoByItemStr (ItemStr, DomNo));



		if (   (!m_Domens[DomNo].IsFree)   // Домен константный
			&& (DomNo != LexPlusDomNo)
			&& (C.GetItem(CurrItemNo) == -1))
		// Отрицательный результат
		return false;

		if (!IsDelim)
		{
			ItemStrVec.push_back( ItemStr);
			CurrItemNo++;
		};

	};


	if (!IsEmptyLine(q) ||  (i < Sgn.DomsWithDelims.size())) return false;

	for (i=ItemStrVec.size();  i < m_MaxNumDom; i++)
		C.SetItem(i,-1);



	for (i=0; i < ItemStrVec.size(); i++)
		if (C.GetItem(i) == -1) // не определено значение
		{
			long ItemNo;
			
			if (!InsertDomItem (ItemStrVec[i].ItemStr, Sgn.Doms[i], ItemNo))
				return false;

			C.SetItem(i,ItemNo); 
		};

	return true;
};
Ejemplo n.º 2
0
//$//BOOL RunSimulation(Submarine *submarine, TextFileReader reader,AlreadySeenFriends **already_seen_friends)
BOOL RunSimulation(Submarine *submarine, TextFileReader reader,AlreadySeenFriends *already_seen_friends)
{
	int line_index = 0;
	int word_index = 0;
	BOOL is_new_batch = TRUE;
	Radar *radar = NULL;
	char *signature = 0;
	RadarObjectType type;
	unsigned int direction = 0;
	unsigned int distance = 0;
	BOOL result = FALSE;
	BOOL is_first_line = TRUE;
	BOOL is_empty_line = FALSE;

	for (line_index=0; line_index < reader.NumOfLines; line_index++)
	{
		if (IsEmptyLine(reader, line_index))
		{
			if (is_new_batch)
			{
				LOG_INFO("New batch founded");
				if (!HandleRadarPicture(submarine, radar,already_seen_friends))
				{
					LOG_ERROR("Submarine failed to handle radar picture");
					goto cleanup;
				}
				if (radar != NULL)
				{
					if (!FreeRadar(radar))
					{
						LOG_ERROR("Failed to free radar");
						goto cleanup;
					}
					radar = NULL;
				}
				is_new_batch = FALSE;
			}
			continue;
		}

		is_new_batch = TRUE;
		// If this is not an empty line and is_new_batch == TRUE, then we 
		// should initialize a new Radar
		if (radar == NULL)
		{
			radar = InitializeRadar();
			if (radar == NULL)
			{
				LOG_ERROR("Failed to initialize radar");
				goto cleanup;
			}
		}
		
		if (!HandleInputFileLine(
				reader.WordsArr[line_index], 
				reader.WordsInLine[line_index],
				&signature,
				&type,
				&direction,
				&distance
			)
		) {
			LOG_ERROR("Failed to read line number %d", line_index);
			goto cleanup;
		}

		if (!AddRadarObject(radar, signature, type, direction, distance))
		{
			LOG_ERROR("Failed to add object to radar");
			goto cleanup;
		}

	}

	if (is_new_batch)
	{
		LOG_INFO("Handling final batch");
		if (!HandleRadarPicture(submarine, radar, already_seen_friends))
		{
			LOG_ERROR("Submarine failed to handle radar picture");
			goto cleanup;
		}
	}

	result = TRUE;

cleanup:
	if (radar != NULL)
	{
		FreeRadar(radar);
		radar = NULL;
	}

	return result;

}
Ejemplo n.º 3
0
VOID CSiegeDungeonMgr::LoadInfo()
{
	CMHFile fp;
	char szFile[256] = {0,};
	char szLine[256] = {0,};
	sprintf(szFile, "./System/Resource/SiegeDungeon.bin");
	fp.Init(szFile, "rb");
	int nKind = 0;

	if(!fp.IsInited())
	{
		char szTmp[256];
		sprintf(szTmp, "%s 파일이 존재하지 않습니다.", szFile);
		ASSERTMSG(0, szTmp);
		return;
	}

	while(TRUE)
	{
		if (fp.IsEOF()) break;
		fp.GetLine(szLine, sizeof(szLine));
		if (strstr(szLine, "//") ||
			IsEmptyLine(szLine))
		{
			continue;
		}
		else if (strstr(szLine, "END")) 
		{
			break;
		}

		sscanf(szLine, "%d", &m_dwKindMapList[nKind]);

		nKind++;
		
		if( nKind >= eSiegeDungeonType_Max )
			break;
	}

	nKind = 0;

	sprintf(szFile, "./System/Resource/SiegeDungeonPanaltyInfo.bin");
	fp.Init(szFile, "rb");

	if(!fp.IsInited())
	{
		char szTmp[256];
		sprintf(szTmp, "%s 파일이 존재하지 않습니다.", szFile);
		ASSERTMSG(0, szTmp);
		return;
	}

	while(TRUE)
	{
		if (fp.IsEOF()) break;
		fp.GetLine(szLine, sizeof(szLine));
		if (strstr(szLine, "//") ||
			IsEmptyLine(szLine))
		{
			continue;
		}
		else if (strstr(szLine, "END")) 
		{
			break;
		}

		DWORD mapType = 0, panaltyType = 0, value = 0;
		sscanf(szLine, "%d %d %d", &mapType, &panaltyType, &value);

		switch( panaltyType )
		{
		case eDeathPanalty_DecreaseExp:
			m_stPanalty[mapType].DecreaseExp = value;
			break;
		case eDaathPanalty_CanItemLooting:
			m_stPanalty[mapType].CanItemLooting = (BOOL)value;
			break;
		}
	}

	fp.Release();
}