SMCResult CGameMasterReader::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value) { if (m_IgnoreLevel || m_State != MSTATE_FILE) { return SMCResult_Continue; } if (strcmp(key, "engine") == 0) { m_HadEngine = true; if (DoesEngineMatch(value)) { m_MatchedEngine = true; } } else if (strcmp(key, "game") == 0) { m_HadGame = true; if (DoesGameMatch(value)) { m_MatchedGame = true; } } return SMCResult_Continue; }
SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value) { if (m_IgnoreLevel) { return SMCResult_Continue; } switch (m_ParseState) { case PSTATE_GAMEDEFS_OFFSETS_OFFSET: { if (!strcmp(key, "type")) { auto type = FieldType::FIELD_NONE; if (!strcmp(value, "stringint")) { type = FieldType::FIELD_STRINGINT; } else if (!strcmp(value, "stringptr")) { type = FieldType::FIELD_STRINGPTR; } else if (!strcmp(value, "string")) { type = FieldType::FIELD_STRING; } else if (!strcmp(value, "classptr")) { type = FieldType::FIELD_CLASSPTR; } else if (!strcmp(value, "class")) { type = FieldType::FIELD_CLASS; } else if (!strcmp(value, "ehandle")) { type = FieldType::FIELD_EHANDLE; } else if (!strcmp(value, "edict")) { type = FieldType::FIELD_EDICT; } else if (!strcmp(value, "entvars")) { type = FieldType::FIELD_ENTVARS; } else if (!strcmp(value, "vector")) { type = FieldType::FIELD_VECTOR; } else if (!strcmp(value, "pointer")) { type = FieldType::FIELD_POINTER; } else if (!strcmp(value, "integer")) { type = FieldType::FIELD_INTEGER; } else if (!strcmp(value, "function")) { type = FieldType::FIELD_FUNCTION; } else if (!strcmp(value, "boolean")) { type = FieldType::FIELD_BOOLEAN; } else if (!strcmp(value, "short")) { type = FieldType::FIELD_SHORT; } else if (!strcmp(value, "character")) { type = FieldType::FIELD_CHARACTER; } else if (!strcmp(value, "float")) { type = FieldType::FIELD_FLOAT; } TempType.fieldType = type; } else if (!strcmp(key, "size")) { TempType.fieldSize = ke::Max<int>(0, atoi(value)); } else if (!strcmp(key, "unsigned")) { TempType.fieldUnsigned = !!atoi(value); } else if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform)) { m_FoundOffset = true; TempType.fieldOffset = atoi(value); } break; } case PSTATE_GAMEDEFS_KEYS: { ke::AString vstr(value); m_Keys.replace(key, ke::Move(vstr)); break; } case PSTATE_GAMEDEFS_SUPPORTED: { if (strcmp(key, "game") == 0) { m_HadGame = true; if (DoesGameMatch(value)) { m_MatchedGame = true; } if ((!m_HadEngine && m_MatchedGame) || (m_MatchedEngine && m_MatchedGame)) { m_ShouldBeReadingDefault = true; } } else if (strcmp(key, "engine") == 0) { m_HadEngine = true; if (DoesEngineMatch(value)) { m_MatchedEngine = true; } if ((!m_HadGame && m_MatchedEngine) || (m_MatchedGame && m_MatchedEngine)) { m_ShouldBeReadingDefault = true; } } break; } case PSTATE_GAMEDEFS_SIGNATURES_SIG: { if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform)) { strncopy(TempSig.signature, value, sizeof(TempSig.signature)); } else if (strcmp(key, "library") == 0) { strncopy(TempSig.library, value, sizeof(TempSig.library)); } break; } case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS: case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ: { if (strcmp(key, "read") == 0) { int limit = sizeof(m_AddressRead) / sizeof(m_AddressRead[0]); if (m_AddressReadCount < limit) { m_AddressRead[m_AddressReadCount] = atoi(value); m_AddressReadCount++; } else { AMXXLOG_Error("[SM] Error parsing Address \"%s\", does not support more than %d read offsets (gameconf \"%s\")", m_Address, limit, m_CurrentPath); } } else if (strcmp(key, "signature") == 0) { strncopy(m_AddressSignature, value, sizeof(m_AddressSignature)); } break; } case PSTATE_GAMEDEFS_CUSTOM: { return m_CustomHandler->ReadSMC_KeyValue(states, key, value); } } return SMCResult_Continue; }
SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value) { if (m_IgnoreLevel) { return SMCResult_Continue; } switch (m_ParseState) { case PSTATE_GAMEDEFS_OFFSETS_OFFSET: { if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform)) { if (m_Class[0]) { auto ic = m_OffsetsByClass.findForAdd(m_Class); if (ic.found()) { ic->value->list.replace(m_Offset, atoi(value)); } else if (m_OffsetsByClass.add(ic, m_Class)) { ic->value = new OffsetClass; ic->value->list.insert(m_Offset, atoi(value)); } } else { m_Offsets.replace(m_Offset, atoi(value)); } } break; } case PSTATE_GAMEDEFS_KEYS: { ke::AString vstr(value); m_Keys.replace(key, ke::Move(vstr)); break; } case PSTATE_GAMEDEFS_SUPPORTED: { if (strcmp(key, "game") == 0) { m_HadGame = true; if (DoesGameMatch(value)) { m_MatchedGame = true; } if ((!m_HadEngine && m_MatchedGame) || (m_MatchedEngine && m_MatchedGame)) { m_ShouldBeReadingDefault = true; } } else if (strcmp(key, "engine") == 0) { m_HadEngine = true; if (DoesEngineMatch(value)) { m_MatchedEngine = true; } if ((!m_HadGame && m_MatchedEngine) || (m_MatchedGame && m_MatchedEngine)) { m_ShouldBeReadingDefault = true; } } break; } case PSTATE_GAMEDEFS_SIGNATURES_SIG: { if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform)) { strncopy(TempSig.signature, value, sizeof(TempSig.signature)); } else if (strcmp(key, "library") == 0) { strncopy(TempSig.library, value, sizeof(TempSig.library)); } break; } case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS: case PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ: { if (strcmp(key, "read") == 0) { int limit = sizeof(m_AddressRead) / sizeof(m_AddressRead[0]); if (m_AddressReadCount < limit) { m_AddressRead[m_AddressReadCount] = atoi(value); m_AddressReadCount++; } else { AMXXLOG_Error("[SM] Error parsing Address \"%s\", does not support more than %d read offsets (gameconf \"%s\")", m_Address, limit, m_CurrentPath); } } else if (strcmp(key, "signature") == 0) { strncopy(m_AddressSignature, value, sizeof(m_AddressSignature)); } break; } case PSTATE_GAMEDEFS_CUSTOM: { return m_CustomHandler->ReadSMC_KeyValue(states, key, value); } } return SMCResult_Continue; }