//------------------------------------------------------------------------------------------------------------ TModId CConfiguration::Load( const good::string& sGameDir, const good::string& sModDir ) { m_bModified = false; if ( m_iniFile.load() >= good::IniFileNotFound ) { BLOG_E("Error reading configuration file %s.", m_iniFile.name.c_str()); return EModId_Invalid; } good::string_buffer sbBuffer(szMainBuffer, iMainBufferSize, false); TModId iModId = EModId_Invalid; // Process general section. good::ini_file::const_iterator it = m_iniFile.find("General"); if ( it == m_iniFile.end() ) BLOG_E( "File %s, missing [General] section.", m_iniFile.name.c_str() ); else ProcessGeneralSection(it); if ( (iModId = SearchMod(sGameDir, sModDir)) == EModId_Invalid ) { BLOG_E( "File %s:", m_iniFile.name.c_str() ); BLOG_E( " There is no mod that matches current game (%s) & mod (%s) folders.", sGameDir.c_str(), sModDir.c_str() ); BLOG_E( " Using default mod 'HalfLife2Deathmatch'." ); CMod::sModName = "HalfLife2Deathmatch"; iModId = EModId_HL2DM; } else BLOG_D("Current mod: '%s'.", CMod::sModName.c_str()); // Find section "<mod name>.mod". sbBuffer = CMod::sModName; sbBuffer << ".mod"; it = m_iniFile.find( sbBuffer ); if ( it == m_iniFile.end() ) BLOG_E( "File %s, missing [%s.mod] section.", m_iniFile.name.c_str(), CMod::sModName.c_str() ); else ProcessModSection(it); LoadItemClasses(); // Load weapons. sbBuffer = CMod::sModName; sbBuffer << ".weapons"; it = m_iniFile.find( sbBuffer ); if ( it == m_iniFile.end() ) BLOG_E( "File %s, missing [%s.weapons] section.", m_iniFile.name.c_str(), CMod::sModName.c_str() ); else LoadWeapons(it); #ifdef BOTRIX_CHAT // Load chat: synonims. BLOG_D("Loading chat synonims:"); it = m_iniFile.find( "Chat.replace" ); if ( it != m_iniFile.end() ) { // Iterate throught key values. for ( good::ini_section::const_iterator wordIt = it->begin(); wordIt != it->end(); ++wordIt ) CChat::AddSynonims( wordIt->key, wordIt->value ); } // Load chat: commands. BLOG_D("Loading chat sentences:"); it = m_iniFile.find( "Chat.sentences" ); if ( it != m_iniFile.end() ) { // Iterate throught key values. for ( good::ini_section::const_iterator wordIt = it->begin(); wordIt != it->end(); ++wordIt ) CChat::AddChat( wordIt->key, wordIt->value ); } #endif // BOTRIX_CHAT return iModId; }
void LoadMissions(CArray *missions, json_t *missionsNode, int version) { json_t *child; for (child = missionsNode->child; child; child = child->next) { Mission m; MissionInit(&m); m.Title = GetString(child, "Title"); m.Description = GetString(child, "Description"); JSON_UTILS_LOAD_ENUM(m.Type, child, "Type", StrMapType); LoadInt(&m.Size.x, child, "Width"); LoadInt(&m.Size.y, child, "Height"); if (version <= 10) { int style; LoadInt(&style, child, "WallStyle"); strcpy(m.WallStyle, IntWallStyle(style)); LoadInt(&style, child, "FloorStyle"); strcpy(m.FloorStyle, IntFloorStyle(style)); LoadInt(&style, child, "RoomStyle"); strcpy(m.RoomStyle, IntRoomStyle(style)); } else { char *tmp = GetString(child, "WallStyle"); strcpy(m.WallStyle, tmp); CFREE(tmp); tmp = GetString(child, "FloorStyle"); strcpy(m.FloorStyle, tmp); CFREE(tmp); tmp = GetString(child, "RoomStyle"); strcpy(m.RoomStyle, tmp); CFREE(tmp); } if (version <= 9) { int style; LoadInt(&style, child, "ExitStyle"); strcpy(m.ExitStyle, IntExitStyle(style)); } else { char *tmp = GetString(child, "ExitStyle"); strcpy(m.ExitStyle, tmp); CFREE(tmp); } if (version <= 8) { int keyStyle; LoadInt(&keyStyle, child, "KeyStyle"); strcpy(m.KeyStyle, IntKeyStyle(keyStyle)); } else { char *tmp = GetString(child, "KeyStyle"); strcpy(m.KeyStyle, tmp); CFREE(tmp); } if (version <= 5) { int doorStyle; LoadInt(&doorStyle, child, "DoorStyle"); strcpy(m.DoorStyle, IntDoorStyle(doorStyle)); } else { char *tmp = GetString(child, "DoorStyle"); strcpy(m.DoorStyle, tmp); CFREE(tmp); } LoadMissionObjectives( &m.Objectives, json_find_first_label(child, "Objectives")->child, version); LoadIntArray(&m.Enemies, child, "Enemies"); LoadIntArray(&m.SpecialChars, child, "SpecialChars"); if (version <= 3) { CArray items; CArrayInit(&items, sizeof(int)); LoadIntArray(&items, child, "Items"); CArray densities; CArrayInit(&densities, sizeof(int)); LoadIntArray(&densities, child, "ItemDensities"); for (int i = 0; i < (int)items.size; i++) { MapObjectDensity mod; mod.M = IntMapObject(*(int *)CArrayGet(&items, i)); mod.Density = *(int *)CArrayGet(&densities, i); CArrayPushBack(&m.MapObjectDensities, &mod); } } else { json_t *modsNode = json_find_first_label(child, "MapObjectDensities"); if (modsNode && modsNode->child) { modsNode = modsNode->child; for (json_t *modNode = modsNode->child; modNode; modNode = modNode->next) { MapObjectDensity mod; mod.M = StrMapObject( json_find_first_label(modNode, "MapObject")->child->text); LoadInt(&mod.Density, modNode, "Density"); CArrayPushBack(&m.MapObjectDensities, &mod); } } } LoadInt(&m.EnemyDensity, child, "EnemyDensity"); LoadWeapons( &m.Weapons, json_find_first_label(child, "Weapons")->child); strcpy(m.Song, json_find_first_label(child, "Song")->child->text); if (version <= 4) { // Load colour indices int wc, fc, rc, ac; LoadInt(&wc, child, "WallColor"); LoadInt(&fc, child, "FloorColor"); LoadInt(&rc, child, "RoomColor"); LoadInt(&ac, child, "AltColor"); m.WallMask = RangeToColor(wc); m.FloorMask = RangeToColor(fc); m.RoomMask = RangeToColor(rc); m.AltMask = RangeToColor(ac); } else { LoadColor(&m.WallMask, child, "WallMask"); LoadColor(&m.FloorMask, child, "FloorMask"); LoadColor(&m.RoomMask, child, "RoomMask"); LoadColor(&m.AltMask, child, "AltMask"); } switch (m.Type) { case MAPTYPE_CLASSIC: LoadInt(&m.u.Classic.Walls, child, "Walls"); LoadInt(&m.u.Classic.WallLength, child, "WallLength"); LoadInt(&m.u.Classic.CorridorWidth, child, "CorridorWidth"); LoadClassicRooms( &m, json_find_first_label(child, "Rooms")->child); LoadInt(&m.u.Classic.Squares, child, "Squares"); LoadClassicDoors(&m, child, "Doors"); LoadClassicPillars(&m, child, "Pillars"); break; case MAPTYPE_STATIC: if (!TryLoadStaticMap(&m, child, version)) { continue; } break; case MAPTYPE_CAVE: LoadInt(&m.u.Cave.FillPercent, child, "FillPercent"); LoadInt(&m.u.Cave.Repeat, child, "Repeat"); LoadInt(&m.u.Cave.R1, child, "R1"); LoadInt(&m.u.Cave.R2, child, "R2"); break; default: assert(0 && "unknown map type"); continue; } CArrayPushBack(missions, &m); } }