//--------------------------------------------------------------------------- // 函数: GetKeyValue // 功能: 取得Key的Value // 参数: pSection 节名 // pKey 建名 // pValue 建值 // 返回: TRUE-成功 FALSE-失败 //--------------------------------------------------------------------------- BOOL KIniFile::GetKeyValue( LPCSTR pSection, LPCSTR pKey, LPSTR pValue, DWORD dwSize) { DWORD dwID; // setup section name char szSection[32] = "["; if (pSection[0] != '[') { g_StrCat(szSection, pSection); g_StrCat(szSection, "]"); } else { g_StrCpy(szSection, pSection); } // search for the matched section SECNODE* pSecNode = m_Header.pNextNode; dwID = String2Id(szSection); while (pSecNode != NULL) { if (dwID == pSecNode->dwID) { break; } pSecNode = pSecNode->pNextNode; } // if no such section founded if (pSecNode == NULL) { return FALSE; } // search for the same key KEYNODE* pKeyNode = pSecNode->pKeyNode.pNextNode; dwID = String2Id(pKey); while (pKeyNode != NULL) { if (dwID == pKeyNode->dwID) { break; } pKeyNode = pKeyNode->pNextNode; } // if no such key found if (pKeyNode == NULL) { return FALSE; } // copy the value of the key g_StrCpyLen(pValue, pKeyNode->pValue, dwSize); return TRUE; }
BOOL KIniFile::GetNextSection(LPCSTR pSection, LPSTR pNextSection) { if (!pSection[0]) // 传入参数为""时就是取第一个Section { if (!m_Header.pNextNode) return FALSE; else { g_StrCpy(pNextSection, m_Header.pNextNode->pSection); return TRUE; } } else { char szSection[32] = "["; if (pSection[0] != '[') { g_StrCat(szSection, pSection); g_StrCat(szSection, "]"); } else { g_StrCpy(szSection, pSection); } // 查找参数给定的Section SECNODE* pThisSecNode = &m_Header; SECNODE* pNextSecNode = pThisSecNode->pNextNode; DWORD dwID = String2Id(szSection); while (pNextSecNode != NULL) { if (dwID == pNextSecNode->dwID) { break; } pThisSecNode = pNextSecNode; pNextSecNode = pThisSecNode->pNextNode; } // 没有这个Section,无所谓下一个 if (!pNextSecNode) { return FALSE; } else { // 参数给定的Section已经是最后一个了 if (!pNextSecNode->pNextNode) { return FALSE; } else { g_StrCpy(pNextSection, pNextSecNode->pNextNode->pSection); return TRUE; } } } }
BOOL KNpcResNode::Init(char *lpszNpcName, CActionName *cActionName, CActionName *cNpcAction) { if (lpszNpcName == NULL || lpszNpcName[0] == 0) return FALSE; KTabFile KindFile; int i, j, k, nFindNo; char szBuffer[FILE_NAME_LENGTH], szTemp[FILE_NAME_LENGTH], szBuf[FILE_NAME_LENGTH]; const char *pcszTemp = NULL; strcpy(m_szNpcName, lpszNpcName); // 载入文件 人物类型.txt // g_SetFilePath(RES_INI_FILE_PATH); if ( !KindFile.Load(NPC_RES_KIND_FILE_NAME) ) return FALSE; nFindNo = KindFile.FindRow(lpszNpcName); if (nFindNo < 0) return FALSE; KindFile.GetString(nFindNo, KIND_NAME_SECT, "", szBuffer, sizeof(szBuffer)); // 判断npc类型 if (strcmp(szBuffer, KIND_NAME_SPECIAL) == 0) m_nNpcKind = NPC_RES_SPECIAL; else m_nNpcKind = NPC_RES_NORMAL; // 得到资源文件路径 KindFile.GetString(nFindNo, KIND_FILE_SECT5, "", m_szResPath, sizeof(m_szResPath)); // 特殊npc if (m_nNpcKind == NPC_RES_SPECIAL) { KTabFile PartFile, SoundName, ShadowName; // 得到部件说明文件名 KindFile.GetString(nFindNo, KIND_FILE_SECT1, "", szBuffer, sizeof(szBuffer)); if ( !szBuffer[0] ) return FALSE; // g_SetFilePath(RES_INI_FILE_PATH); g_UnitePathAndName(RES_INI_FILE_PATH, szBuffer, szBuf); if ( !PartFile.Load(szBuf) ) return FALSE; // 得到部件组成信息 m_nPartNum = 0; for (i = 0; i < MAX_BODY_PART; i++) { for (j = 0; j < MAX_BODY_PART_SECT; j++) { m_nSectInfo[i * MAX_BODY_PART_SECT + j].Clear(); PartFile.GetString( i + 2, j + 3, "", m_nSectInfo[i * MAX_BODY_PART_SECT + j].szSectName, sizeof(m_nSectInfo[i * MAX_BODY_PART_SECT + j].szSectName)); if ( m_nSectInfo[i * MAX_BODY_PART_SECT + j].szSectName[0] ) { m_nSectInfo[i * MAX_BODY_PART_SECT + j].nFlag = 1; m_nPartNum++; } } } // 得到每个部件的资源说明文件名 for (i = 0; i < MAX_PART; i++) { if (m_nSectInfo[i].nFlag) { KindFile.GetString( nFindNo, m_nSectInfo[i].szSectName, "", m_nSectInfo[i].szSectResName, sizeof(m_nSectInfo[i].szSectResName)); // 资源信息说明文件名是资源说明文件名加上SPR_INFO_NAME(“信息”) if (m_nSectInfo[i].szSectResName[0]) { g_StrCpyLen( m_nSectInfo[i].szSectSprInfoName, m_nSectInfo[i].szSectResName, g_StrLen(m_nSectInfo[i].szSectResName) - 3 ); g_StrCat(m_nSectInfo[i].szSectSprInfoName, SPR_INFO_NAME); g_StrCat(m_nSectInfo[i].szSectSprInfoName, ".txt"); } } } // 得到每个部件的具体的资源文件名 KTabFile SectFile, SectInfoFile; int nGetEquipNo, nActionCount; for (i = 0; i < MAX_PART; i++) { m_cResInfo[i].AutoDelete(); if (m_nSectInfo[i].nFlag) { // g_SetFilePath(RES_INI_FILE_PATH); #ifdef TOOLVERSION g_UnitePathAndName(RES_INI_FILE_PATH, m_nSectInfo[i].szSectResName, szBuf); if (!SectFile.Load(szBuf)) continue; else { g_UnitePathAndName(RES_INI_FILE_PATH, m_nSectInfo[i].szSectSprInfoName, szBuf); SectInfoFile.Load(szBuf); } #else g_UnitePathAndName(RES_INI_FILE_PATH, m_nSectInfo[i].szSectResName, szBuf); if ( !SectFile.Load(szBuf) ) continue; g_UnitePathAndName(RES_INI_FILE_PATH, m_nSectInfo[i].szSectSprInfoName, szBuf); if ( !SectInfoFile.Load(szBuf)) continue; #endif nGetEquipNo = SectFile.GetHeight() - 1; if (nGetEquipNo <= 0) continue; nActionCount = cActionName->GetActionCount(); if (nActionCount <= 0) continue; m_cResInfo[i].AutoNew(nActionCount, nGetEquipNo); for (j = 0; j < nGetEquipNo; j++) { for (k = 0; k < nActionCount; k++) { // 用字符串比较太慢,所以直接用编号,但是表格必须保证不出错 // cActionName->GetActionName(k, szBuffer, sizeof(szBuffer)); // SectFile.GetString( // j + 2, // szBuffer, // "", // szTemp, // 80); SectFile.GetString( j + 2, k + 2, "", szTemp, sizeof(szTemp)); ComposePathAndName(m_cResInfo[i].m_cSprInfo[j * nActionCount + k].szFileName, m_szResPath, szTemp); SectInfoFile.GetString( j + 2, k + 2, "16,16,0", szTemp, sizeof(szTemp) ); pcszTemp = szTemp; m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nTotalFrames = KSG_StringGetInt(&pcszTemp, 16); KSG_StringSkipSymbol(&pcszTemp, ','); m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nTotalDirs = KSG_StringGetInt(&pcszTemp, 16); KSG_StringSkipSymbol(&pcszTemp, ','); m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nInterval = KSG_StringGetInt(&pcszTemp, 0); //sscanf(szTemp, "%d,%d,%d", // &m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nTotalFrames, // &m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nTotalDirs, // &m_cResInfo[i].m_cSprInfo[j * nActionCount + k].nInterval //); } } } } // 得到武器行为关联表文件名 KTabFile NoHorseFile, OnHorseFile; int nTableWidth, nTableHeight, nGetNo; char szNoHorseTableName[80], szOnHorseTableName[80]; KindFile.GetString(nFindNo, KIND_FILE_SECT2, "", szNoHorseTableName, sizeof(szNoHorseTableName)); KindFile.GetString(nFindNo, KIND_FILE_SECT3, "", szOnHorseTableName, sizeof(szOnHorseTableName)); // 未骑马对应表 if (szNoHorseTableName[0]) { // g_SetFilePath(RES_INI_FILE_PATH); g_UnitePathAndName(RES_INI_FILE_PATH, szNoHorseTableName, szBuf); if ( NoHorseFile.Load(szBuf) ) { nTableWidth = NoHorseFile.GetWidth() - 1; nTableHeight = NoHorseFile.GetHeight() - 1; m_NoHorseTable.AutoNew(nTableWidth, nTableHeight); for (i = 0; i < nTableHeight; i++) { for (j = 0; j < nTableWidth; j++) { NoHorseFile.GetString(i + 2, j + 2, "", szBuffer, sizeof(szBuffer)); nGetNo = cActionName->GetActionNo(szBuffer); m_NoHorseTable.SetValue(j, i, nGetNo); } } } } // 骑马对应表 if (szOnHorseTableName[0]) { // g_SetFilePath(RES_INI_FILE_PATH); g_UnitePathAndName(RES_INI_FILE_PATH, szOnHorseTableName, szBuf); if ( OnHorseFile.Load(szBuf) ) { nTableWidth = OnHorseFile.GetWidth() - 1; nTableHeight = OnHorseFile.GetHeight() - 1; m_OnHorseTable.AutoNew(nTableWidth, nTableHeight); for (i = 0; i < nTableHeight; i++) { for (j = 0; j < nTableWidth; j++) { OnHorseFile.GetString(i + 2, j + 2, "", szBuffer, sizeof(szBuffer)); nGetNo = cActionName->GetActionNo(szBuffer); m_OnHorseTable.SetValue(j, i, nGetNo); } } } } // 得到贴图顺序表文件名 if ( KindFile.GetString(nFindNo, KIND_FILE_SECT4, "", szBuffer, sizeof(szBuffer)) ) { strcpy(m_cSortTable.m_sSortTableFileName, szBuffer); m_cSortTable.GetTable(szBuffer, cActionName, m_nPartNum); } // 获得动作阴影文件信息 int nFindNo; // g_SetFilePath(RES_INI_FILE_PATH); nActionCount = cActionName->GetActionCount(); this->m_cShadowInfo.Init(nActionCount); ShadowName.Load(PLAYER_RES_SHADOW_FILE); nFindNo = ShadowName.FindRow(lpszNpcName); if (nFindNo > 0 && nActionCount > 0) { for (i = 0; i < nActionCount; i++) { ShadowName.GetString(nFindNo, 2 + i * 2, "", szTemp, sizeof(szTemp)); if (szTemp[0]) this->ComposePathAndName(m_cShadowInfo.m_psInfo[i].m_szName, m_szResPath, szTemp); ShadowName.GetString(nFindNo, 2 + i * 2 + 1, "16,8,1", szTemp, sizeof(szTemp)); pcszTemp = szTemp; m_cShadowInfo.m_psInfo[i].m_nTotalFrame = KSG_StringGetInt(&pcszTemp, 16); KSG_StringSkipSymbol(&pcszTemp, ','); m_cShadowInfo.m_psInfo[i].m_nTotalDir = KSG_StringGetInt(&pcszTemp, 8); KSG_StringSkipSymbol(&pcszTemp, ','); m_cShadowInfo.m_psInfo[i].m_nInterval = KSG_StringGetInt(&pcszTemp, 1); //sscanf(szTemp, "%d,%d,%d", &m_cShadowInfo.m_psInfo[i].m_nTotalFrame, &m_cShadowInfo.m_psInfo[i].m_nTotalDir, &m_cShadowInfo.m_psInfo[i].m_nInterval); m_cShadowInfo.m_psInfo[i].m_nCgX = SPR_X_OFF; m_cShadowInfo.m_psInfo[i].m_nCgY = SPR_Y_OFF; } } // 获得动作音效文件名 // g_SetFilePath(RES_INI_FILE_PATH); SoundName.Load(PLAYER_SOUND_FILE); nFindNo = SoundName.FindColumn(lpszNpcName); nActionCount = cActionName->GetActionCount(); if (nFindNo > 0 && nActionCount > 0) { for (i = 0; i < nActionCount; i++) { SoundName.GetString(i + 2, nFindNo, "", szTemp, sizeof(szTemp)); if (szTemp[0]) this->ComposePathAndName(this->m_szSoundName[i], RES_SOUND_FILE_PATH, szTemp); } } } // 普通npc else if (m_nNpcKind == NPC_RES_NORMAL) { int nActionCount; KTabFile NormalNpc, NormalNpcSprInfo, SoundName; for (i = 0; i < MAX_PART; i++) m_nSectInfo[i].nFlag = 0; m_nSectInfo[NORMAL_NPC_PART_NO].nFlag = 1; m_nPartNum = 1; for (i = 0; i < MAX_PART; i++) m_cResInfo[i].AutoDelete(); nActionCount = cNpcAction->GetActionCount(); if (nActionCount < 0) nActionCount = 0; m_cResInfo[NORMAL_NPC_PART_NO].AutoNew(nActionCount, 1); this->m_cShadowInfo.Init(nActionCount); // g_SetFilePath(RES_INI_FILE_PATH); if ( !NormalNpc.Load(NPC_NORMAL_RES_FILE)) return FALSE; // 动画信息文件没有没有必要初始化不成功,所以没有If(!) return FALSE; NormalNpcSprInfo.Load(NPC_NORMAL_SPRINFO_FILE); SoundName.Load(NPC_SOUND_FILE); nFindNo = NormalNpc.FindRow(lpszNpcName); if (nFindNo < 0) return FALSE; for (i = 0; i < nActionCount; i++) { cNpcAction->GetActionName(i, szBuffer, sizeof(szBuffer)); NormalNpc.GetString(nFindNo, szBuffer, "", szTemp, sizeof(szTemp)); ComposePathAndName(m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].szFileName, m_szResPath, szTemp); NormalNpcSprInfo.GetString(nFindNo, szBuffer, "16,8,0", szTemp, sizeof(szTemp)); pcszTemp = szTemp; m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalFrames = KSG_StringGetInt(&pcszTemp, 16); KSG_StringSkipSymbol(&pcszTemp, ','); m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalDirs = KSG_StringGetInt(&pcszTemp, 8); KSG_StringSkipSymbol(&pcszTemp, ','); m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nInterval = KSG_StringGetInt(&pcszTemp, 0); //sscanf(szTemp, "%d,%d,%d", // &m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalFrames, // &m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalDirs, // &m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nInterval //); KNpcResNode::GetShadowName(m_cShadowInfo.m_psInfo[i].m_szName, m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].szFileName); m_cShadowInfo.m_psInfo[i].m_nTotalFrame = m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalFrames; m_cShadowInfo.m_psInfo[i].m_nTotalDir = m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nTotalDirs; m_cShadowInfo.m_psInfo[i].m_nInterval = m_cResInfo[NORMAL_NPC_PART_NO].m_cSprInfo[i].nInterval; m_cShadowInfo.m_psInfo[i].m_nCgX = SPR_X_OFF; m_cShadowInfo.m_psInfo[i].m_nCgY = SPR_Y_OFF; SoundName.GetString(nFindNo, szBuffer, "", szTemp, sizeof(szTemp)); if (szTemp[0]) ComposePathAndName(m_szSoundName[i], RES_SOUND_FILE_PATH, szTemp); } } return TRUE; }
BOOL KIniFile::GetNextKey(LPCSTR pSection, LPCSTR pKey, LPSTR pNextKey) { char szSection[32] = "["; if (pSection[0] != '[') { g_StrCat(szSection, pSection); g_StrCat(szSection, "]"); } else { g_StrCpy(szSection, pSection); } // 查找参数给定的Section SECNODE* pThisSecNode = &m_Header; SECNODE* pNextSecNode = pThisSecNode->pNextNode; DWORD dwID = String2Id(szSection); while (pNextSecNode != NULL) { if (dwID == pNextSecNode->dwID) { break; } pThisSecNode = pNextSecNode; pNextSecNode = pThisSecNode->pNextNode; } // 没有这个Section,无所谓取Key if (!pNextSecNode) { return FALSE; } KEYNODE* pThisKeyNode = &pNextSecNode->pKeyNode; KEYNODE* pNextKeyNode = pThisKeyNode->pNextNode; // Key给的参数为""的话,取第一个Key if (!pKey[0]) { // 没有Key,返回失败 if (!pNextKeyNode->pKey) { return FALSE; } else { g_StrCpy(pNextKey, pNextKeyNode->pKey); return TRUE; } } dwID = String2Id(pKey); while(pNextKeyNode != NULL) { if (dwID == pNextKeyNode->dwID) { break; } pThisKeyNode = pNextKeyNode; pNextKeyNode = pThisKeyNode->pNextNode; } // 找不到所给的Key,无所谓下一个 if (!pNextKeyNode) { return FALSE; } // 参数给定的Key已经是最后一个了 if (!pNextKeyNode->pNextNode) { return FALSE; } else { g_StrCpy(pNextKey, pNextKeyNode->pNextNode->pKey); return TRUE; } }
//--------------------------------------------------------------------------- // 函数: SetKeyValue // 功能: 设置Key的Value // 参数: pSection 节名 // pKey 建名 // pValue 建值 // 返回: TRUE-成功 FALSE-失败 //--------------------------------------------------------------------------- BOOL KIniFile::SetKeyValue( LPCSTR pSection, LPCSTR pKey, LPCSTR pValue) { int nLen; DWORD dwID; // setup section name char szSection[32] = "["; if (pSection[0] != '[') { g_StrCat(szSection, pSection); g_StrCat(szSection, "]"); } else { g_StrCpy(szSection, pSection); } // search for the matched section SECNODE* pThisSecNode = &m_Header; SECNODE* pNextSecNode = pThisSecNode->pNextNode; dwID = String2Id(szSection); while (pNextSecNode != NULL) { if (dwID == pNextSecNode->dwID) { break; } pThisSecNode = pNextSecNode; pNextSecNode = pThisSecNode->pNextNode; } // if no such section found create a new section if (pNextSecNode == NULL) { nLen = g_StrLen(szSection) + 1; pNextSecNode = (SECNODE *)m_MemStack.Push(sizeof(SECNODE)); pNextSecNode->pSection = (char *)m_MemStack.Push(nLen); g_MemCopy(pNextSecNode->pSection, szSection, nLen); pNextSecNode->dwID = dwID; pNextSecNode->pKeyNode.pNextNode = NULL; pNextSecNode->pNextNode = NULL; pThisSecNode->pNextNode = pNextSecNode; } // search for the same key KEYNODE* pThisKeyNode = &pNextSecNode->pKeyNode; KEYNODE* pNextKeyNode = pThisKeyNode->pNextNode; dwID = String2Id(pKey); while (pNextKeyNode != NULL) { if (dwID == pNextKeyNode->dwID) { break; } pThisKeyNode = pNextKeyNode; pNextKeyNode = pThisKeyNode->pNextNode; } // if no such key found create a new key if (pNextKeyNode == NULL) { pNextKeyNode = (KEYNODE *)m_MemStack.Push(sizeof(KEYNODE)); nLen = g_StrLen(pKey) + 1; pNextKeyNode->pKey = (char *)m_MemStack.Push(nLen); g_MemCopy(pNextKeyNode->pKey, (void*)pKey, nLen); nLen = g_StrLen(pValue) + 1; pNextKeyNode->pValue = (char *)m_MemStack.Push(nLen); g_MemCopy(pNextKeyNode->pValue, (void*)pValue, nLen); pNextKeyNode->dwID = dwID; pNextKeyNode->pNextNode = NULL; pThisKeyNode->pNextNode = pNextKeyNode; } // replace the old value with new else { m_MemStack.Free(pNextKeyNode->pValue); nLen = g_StrLen(pValue) + 1; pNextKeyNode->pValue = (char *)m_MemStack.Push(nLen); g_MemCopy(pNextKeyNode->pValue, (void*)pValue, nLen); } return TRUE; }