Ejemplo n.º 1
0
//---------------------------------------------------------------------------
// 函数:	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;
}
Ejemplo n.º 2
0
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;
			}
		}
	}
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
	}
}
Ejemplo n.º 5
0
//---------------------------------------------------------------------------
// 函数:	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;
}