Subversion Repositories spk

Rev

Rev 1 | Rev 68 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 36
Line 21... Line 21...
21
	///          resources associated with this form.
21
	///          resources associated with this form.
22
	/// </summary>
22
	/// </summary>
23
	public ref class LoadText : public System::Windows::Forms::Form
23
	public ref class LoadText : public System::Windows::Forms::Form
24
	{
24
	{
25
	public:
25
	public:
26
		LoadText(CLinkList<SGameDir> *dirs, CPackages *p, Collections::Hashtable ^text)
26
		LoadText(CLinkList<SGameDir> *dirs, CPackages *p)
27
		{
27
		{
28
			InitializeComponent();
28
			InitializeComponent();
29
 
29
 
30
			m_pTextList = text;
-
 
31
			m_pCurrentDir = NULL;
30
			m_pCurrentDir = NULL;
32
			m_pPackages = p;
31
			m_pPackages = p;
33
			m_lDirs = dirs;
32
			m_lDirs = dirs;
34
		}
33
		}
35
 
34
 
Line 40... Line 39...
40
		}
39
		}
41
 
40
 
42
		void DoWork()
41
		void DoWork()
43
		{
42
		{
44
			if ( !m_pCurrentDir ) return;
43
			if ( !m_pCurrentDir ) return;
45
 
-
 
46
			int game = m_pCurrentDir->sGame.GetToken(" ", 1, 1).ToInt();
-
 
47
			int flags = m_pPackages->GetGameExe()->GetGameFlags(game);
-
 
48
 
-
 
49
			CyString textFile = SPK::FormatTextName(1, m_pPackages->GetLanguage(), (flags & EXEFLAG_TCTEXT)) + ".pck";
-
 
50
 
-
 
51
			// find the latest text file
-
 
52
			if ( m_pPackages->ExtractGameFile(CyString("t/") + textFile, m_pPackages->GetTempDirectory() + "/text.xml", m_pCurrentDir->sDir) )
-
 
53
				this->ReadTextFromFile(SystemStringFromCyString(m_pPackages->GetTempDirectory() + "/text.xml"), game);
-
 
54
 
-
 
55
			if ( !m_pCurrentDir->bLoad ) return;
44
			m_pCurrentDir->pVfs->updateTexts(0);
56
 
-
 
57
			// extract any text files in the t directory
-
 
58
			cli::array<String ^> ^files = IO::Directory::GetFiles(SystemStringFromCyString(m_pCurrentDir->sDir.FindReplace("/", "\\") + "\\t"), "*.xml");
-
 
59
			for ( int i = 0; i < files->Length; i++ )
-
 
60
				this->ReadTextFromFile(files[i], game);
-
 
61
 
-
 
62
			cli::array<String ^> ^filespck = IO::Directory::GetFiles(SystemStringFromCyString(m_pCurrentDir->sDir.FindReplace("/", "\\") + "\\t"), "*.pck");
-
 
63
			for ( int i = 0; i < filespck->Length; i++ )
-
 
64
			{
-
 
65
				// extract the t file
-
 
66
				C_File F(CyStringFromSystemString(filespck[i]));
-
 
67
				if ( F.UnPCKFile() )
-
 
68
				{
-
 
69
					if ( F.WriteToFile(m_pPackages->GetTempDirectory() + "/text.xml") )
-
 
70
						this->ReadTextFromFile(SystemStringFromCyString(m_pPackages->GetTempDirectory() + "/text.xml"), game);
-
 
71
				}
-
 
72
			}
-
 
73
		}
45
		}
74
 
46
 
75
		void Next()
47
		void Next()
76
		{
48
		{
77
			m_pCurrentDir = m_lDirs->Next();
49
			m_pCurrentDir = m_lDirs->Next();
78
			if ( m_pCurrentDir )
50
			if ( m_pCurrentDir )
79
				this->Start();
51
				this->Start();
80
			else
52
			else
81
				this->Close();
53
				this->Close();
82
		}
54
		}
83
 
-
 
84
		void ReadTextFromFile(String ^file, int game)
-
 
85
		{
-
 
86
 
-
 
87
			XmlTextReader ^reader = gcnew XmlTextReader(file);
-
 
88
			int inPage = -1;
-
 
89
			int inID = -1;
-
 
90
			while ( reader->Read() )
-
 
91
			{
-
 
92
				switch(reader->NodeType)
-
 
93
				{
-
 
94
					case XmlNodeType::Element:
-
 
95
						if ( String::Compare(reader->Name, "page") == 0 )
-
 
96
						{
-
 
97
							while (reader->MoveToNextAttribute())
-
 
98
							{
-
 
99
								if ( String::Compare(reader->Name, "id") == 0 )
-
 
100
								{
-
 
101
									inPage = Convert::ToInt32(reader->Value);
-
 
102
									if ( inPage >= 10000 )
-
 
103
										inPage %= 10000;
-
 
104
								}
-
 
105
							}
-
 
106
						}
-
 
107
						else if ( inPage > 0 && String::Compare(reader->Name, "t") == 0 )
-
 
108
						{
-
 
109
							while (reader->MoveToNextAttribute())
-
 
110
							{
-
 
111
								if ( String::Compare(reader->Name, "id") == 0 )
-
 
112
									inID = Convert::ToInt32(reader->Value);
-
 
113
							}
-
 
114
						}
-
 
115
						break;
-
 
116
					case XmlNodeType::Text:
-
 
117
						if ( inID > 0 )
-
 
118
						{
-
 
119
							String ^key = Convert::ToString(game) + "," + Convert::ToString(inPage) + "," + Convert::ToString(inID);
-
 
120
							String ^t = reader->Value;
-
 
121
							while ( t->IndexOf('(') != -1 && t->IndexOf(')') != -1 )
-
 
122
							{
-
 
123
								int s = t->IndexOf('(');
-
 
124
								t = t->Remove(s, t->IndexOf(')') - s + 1);
-
 
125
							}
-
 
126
 
-
 
127
							if ( m_pTextList->ContainsKey(key) )
-
 
128
								m_pTextList[key] = t;
-
 
129
							else
-
 
130
								m_pTextList->Add(key, t);
-
 
131
						}
-
 
132
						break;
-
 
133
					case XmlNodeType::EndElement:
-
 
134
						if ( String::Compare(reader->Name, "page") == 0 )
-
 
135
							inPage = -1;
-
 
136
						else if ( String::Compare(reader->Name, "t") == 0 )
-
 
137
							inID = -1;
-
 
138
						break;
-
 
139
 
-
 
140
				}
-
 
141
			}
-
 
142
			return;
-
 
143
		}
-
 
144
 
-
 
145
 
55
 
146
	protected:
56
	protected:
147
		/// <summary>
57
		/// <summary>
148
		/// Clean up any resources being used.
58
		/// Clean up any resources being used.
149
		/// </summary>
59
		/// </summary>