| 41 | } |
| 42 | |
| 43 | void CPatternFunction::vfLoadEF(LPCSTR caFileName) |
| 44 | { |
| 45 | string_path caPath; |
| 46 | if (!FS.exist(caPath, "$game_ai$", caFileName)) |
| 47 | { |
| 48 | Msg("! Evaluation function : File not found \"%s\"", caPath); |
| 49 | R_ASSERT(false); |
| 50 | return; |
| 51 | } |
| 52 | |
| 53 | IReader* F = FS.r_open(caPath); |
| 54 | F->r(&m_tEFHeader, sizeof(SEFHeader)); |
| 55 | |
| 56 | if (EFC_VERSION != m_tEFHeader.dwBuilderVersion) |
| 57 | { |
| 58 | FS.r_close(F); |
| 59 | Msg("! Evaluation function (%s) : Not supported version of the Evaluation Function Contructor", caPath); |
| 60 | R_ASSERT(false); |
| 61 | return; |
| 62 | } |
| 63 | |
| 64 | F->r(&m_dwVariableCount, sizeof(m_dwVariableCount)); |
| 65 | m_dwaAtomicFeatureRange = xr_alloc<u32>(m_dwVariableCount); |
| 66 | ZeroMemory(m_dwaAtomicFeatureRange, m_dwVariableCount * sizeof(u32)); |
| 67 | u32* m_dwaAtomicIndexes = xr_alloc<u32>(m_dwVariableCount); |
| 68 | ZeroMemory(m_dwaAtomicIndexes, m_dwVariableCount * sizeof(u32)); |
| 69 | |
| 70 | for (u32 i = 0; i < m_dwVariableCount; ++i) |
| 71 | { |
| 72 | F->r(m_dwaAtomicFeatureRange + i, sizeof(u32)); |
| 73 | if (i) |
| 74 | m_dwaAtomicIndexes[i] = m_dwaAtomicIndexes[i - 1] + m_dwaAtomicFeatureRange[i - 1]; |
| 75 | } |
| 76 | |
| 77 | m_dwaVariableTypes = xr_alloc<u32>(m_dwVariableCount); |
| 78 | F->r(m_dwaVariableTypes, m_dwVariableCount * sizeof(u32)); |
| 79 | |
| 80 | F->r(&m_dwFunctionType, sizeof(u32)); |
| 81 | |
| 82 | F->r(&m_fMinResultValue, sizeof(float)); |
| 83 | F->r(&m_fMaxResultValue, sizeof(float)); |
| 84 | |
| 85 | F->r(&m_dwPatternCount, sizeof(m_dwPatternCount)); |
| 86 | m_tpPatterns = xr_alloc<SPattern>(m_dwPatternCount); |
| 87 | m_dwaPatternIndexes = xr_alloc<u32>(m_dwPatternCount); |
| 88 | ZeroMemory(m_dwaPatternIndexes, m_dwPatternCount * sizeof(u32)); |
| 89 | m_dwParameterCount = 0; |
| 90 | for (u32 i = 0; i < m_dwPatternCount; ++i) |
| 91 | { |
| 92 | if (i) |
| 93 | m_dwaPatternIndexes[i] = m_dwParameterCount; |
| 94 | F->r(&(m_tpPatterns[i].dwCardinality), sizeof(m_tpPatterns[i].dwCardinality)); |
| 95 | m_tpPatterns[i].dwaVariableIndexes = xr_alloc<u32>(m_tpPatterns[i].dwCardinality); |
| 96 | F->r(m_tpPatterns[i].dwaVariableIndexes, m_tpPatterns[i].dwCardinality * sizeof(u32)); |
| 97 | u32 m_dwComplexity = 1; |
| 98 | for (int j = 0; j < (int)m_tpPatterns[i].dwCardinality; ++j) |
| 99 | m_dwComplexity *= m_dwaAtomicFeatureRange[m_tpPatterns[i].dwaVariableIndexes[j]]; |
| 100 | m_dwParameterCount += m_dwComplexity; |