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; };
//$//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; }
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(); }