//--------------------------------------------------------------------------- // 函数: FindRow // 功能: 查找行关键字 // 参数: szRow(行关键字) // 返回: int //--------------------------------------------------------------------------- int KTabFile::FindRow(LPSTR szRow) { char szTemp[128]; for (int i = 0; i < m_Height; i++) // 从1开始,跳过第一行的字段行 { GetValue(i, 0, szTemp, g_StrLen(szRow)); if (g_StrCmp(szTemp, szRow)) return i + 1; //改动此处为加一 by Romandou,即返回以1为起点的标号 } return -1; }
//--------------------------------------------------------------------------- // 函数: FindColumn // 功能: 查找列关键字 // 参数: szColumn(行关键字) // 返回: int //--------------------------------------------------------------------------- int KTabFile::FindColumn(LPSTR szColumn) { char szTemp[128]; for (int i = 0; i < m_Width; i++) // 从1开始,跳过第一列的字段行 { GetValue(0, i, szTemp, g_StrLen(szColumn)); if (g_StrCmp(szTemp, szColumn)) return i + 1;//改动此处为加一 by Romandou,即返回以1为起点的标号 } return -1; }
//--------------------------------------------------------------------------- // 函数: Str2Column // 功能: 取得某行某列字符串的值 // 参数: szColumn // 返回: 第几列 //--------------------------------------------------------------------------- int KTabFile::Str2Col(LPSTR szColumn) { int nStrLen = g_StrLen(szColumn); char szTemp[4]; g_StrCpy(szTemp, szColumn); g_StrUpper(szTemp); if (nStrLen == 1) { return (szTemp[0] - 'A'); } return ((szTemp[0] - 'A' + 1) * 26 + szTemp[1] - 'A') + 1; }
bool CIme::SetText(LPSTR pszBuffer) { if(pszBuffer) { m_nStrLen=g_StrLen(pszBuffer); if (m_nStrLen <= MAX_BUFFER) { memcpy(m_pszText,pszBuffer,m_nStrLen); m_nTextCursor=m_nStrLen; return true; } }; return false; }
void KObj::DrawInfo() { // return; if (m_nKind != Obj_Kind_Item)// && m_nKind != Obj_Kind_Money) return; int nMpsX, nMpsY, nHeightOff; DWORD dwColor; GetMpsPos(&nMpsX, &nMpsY); nHeightOff = OBJ_SHOW_NAME_Y_OFF; dwColor = this->m_dwNameColor; g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff); }
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; }
//--------------------------------------------------------------------------- // 函数: 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; }