Example #1
0
// 如果从文件中没有取到对应的Section 和 Key则 pRect里面的值不变
void KIniFile::GetRect(LPCSTR lpSection, LPCSTR lpKeyName, RECT *pRect)
{
	char  Buffer[256];

	if (GetKeyValue(lpSection, lpKeyName, Buffer, sizeof(Buffer)))
	{
        const char *pcszTemp = Buffer;
        
        pRect->left   = KSG_StringGetInt(&pcszTemp, 0);
        KSG_StringSkipSymbol(&pcszTemp, ',');
        pRect->top    = KSG_StringGetInt(&pcszTemp, 0);
        KSG_StringSkipSymbol(&pcszTemp, ',');
        pRect->right  = KSG_StringGetInt(&pcszTemp, 0);
        KSG_StringSkipSymbol(&pcszTemp, ',');
        pRect->bottom = KSG_StringGetInt(&pcszTemp, 0);
		//sscanf(Buffer, "%d,%d,%d,%d", &(pRect->left), &(pRect->top), &(pRect->right), &(pRect->bottom));
	}
}
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;
}