rtoss - Blame information for rev 345

Subversion Repositories:
Rev:
Rev Author Line No. Line
280 roytam 1 // PokemonRomViewer.cpp : 定义应用程序的类行为。
2 //
3  
4 #include "stdafx.h"
5 #include "PokemonRomViewer.h"
6 #include "MainFrm.h"
7 #include "ConfigDlg.h"
8  
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #endif
12  
345 roytam 13 DWORD   g_dwExtraBreeds = 0;
14  
280 roytam 15 StringEntry * GetEncNameEntry(WORD wAreaId)
16 {
17         static DWORD    dwPreIndex = 0;
18         DWORD                   dwIndex;
19         StringEntry *   pEntry = NULL;
20  
21         if(dwPreIndex + 1 < ENC_COUNT &&
22                 cfg.pEncNameList[dwPreIndex + 1].dwId == wAreaId)
23         {
24                 ++dwPreIndex;
25                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
26         }
27         else if(dwPreIndex > 0 &&
28                 cfg.pEncNameList[dwPreIndex - 1].dwId == wAreaId)
29         {
30                 --dwPreIndex;
31                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
32         }
33         else if(cfg.pEncNameList[dwPreIndex].dwId == wAreaId)
34         {
35                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
36         }
37         else
38         {
39                 for(dwIndex = 0; dwIndex < ENC_COUNT; ++dwIndex)
40                 {
41                         if(wAreaId == cfg.pEncNameList[dwIndex].dwId)
42                         {
43                                 dwPreIndex = dwIndex;
44                                 pEntry = &(cfg.pEncNameList[dwPreIndex]);
45                                 break;
46                         }
47                 }
48         }
49  
50         return pEntry;
51 }
52 /*
53 VOID SetBit(LPVOID pFlags, DWORD_PTR dwBitIndex)
54 {
55         LPBYTE  pb = &((LPBYTE)(pFlags))[dwBitIndex >> 0x3];
56         *pb |= ((BYTE)(1) << (BYTE)(dwBitIndex & 0x7));
57 }
58  
59 VOID ClrBit(LPVOID pFlags, DWORD_PTR dwBitIndex)
60 {
61         LPBYTE  pb = &((LPBYTE)(pFlags))[dwBitIndex >> 0x3];
62         *pb &= ~((BYTE)(1) << (BYTE)(dwBitIndex & 0x7));
63 }
64  
65 BYTE GetBit(LPCVOID pFlags, DWORD_PTR dwBitIndex)
66 {
67         return ((((LPBYTE)(pFlags))[dwBitIndex >> 0x3] >> (BYTE)(dwBitIndex & 0x7)) & 0x1);
68 }
69 */
70 WORD ConvertBreed(WORD wBreed, BOOL b387To412)
71 {
72         WORD    wCvt = wBreed;
73  
74         if(b387To412)   // from PokemonStruct space to Rom space
75         {
76                 if(wCvt > 386)
77                         wCvt = 0;
78                 else if(wCvt >= 252)
79                         wCvt += 25;
80         }
81         else            // from Rom space to PokemonStruct space
82         {
83                 if(wCvt > 411)
84                         wCvt = 0;
85                 else if(wCvt >= 277)
86                         wCvt -= 25;
87                 else if(wCvt >= 252)
88                         wCvt = 0;
89         }
90  
91         return wCvt;
92 }
93  
94 WORD TextToBreed(LPCTSTR szText)
95 {
96         BOOL    bFound = FALSE;
97         DWORD   dwLang, dwLength;
98         WORD    wBreed;
99         LPCTSTR szBreed = NULL;
100  
101         wBreed = (WORD)(_tcstoul(szText, 0, 0));
102         if(wBreed >= BREED_COUNT)
103         {
104                 wBreed = 0;
105         }
106         else if(wBreed == 0)
107         {
108                 dwLength = lstrlen(szText);
109                 for(wBreed = 0; wBreed < BREED_COUNT; ++wBreed)
110                 {
111                         for(dwLang = 0; dwLang < 3; ++dwLang)
112                         {
113                                 if(_tcsnicmp(szText, cfg.pBreedNameList[wBreed].rgszText[dwLang], dwLength) == 0)
114                                 {
115                                         bFound = TRUE;
116                                         break;
117                                 }
118                         }
119                         if(bFound)
120                                 break;
121                 }
122                 if(wBreed >= BREED_COUNT)
123                         wBreed = 0;
124         }
125  
126         return wBreed;
127 }
128  
129 VOID FormatSkillDesc(WORD wSkill, CString &szDesc)
130 {
131         SkillListEntry *pSkill = NULL;
132         DWORD   dwTargetTypeIndex;
133         CString szTemp;
134  
135         szDesc = _T("");
136         pSkill = rom.GetSkillListEntry(wSkill);
137         if(pSkill)
138         {
139                 // type
284 roytam 140                 if(pSkill->bType < dwTypesCount)
141                         szTemp.Format(_T("属性:%s"), szTypes[pSkill->bType]);
142                 else
143                         szTemp.Format(_T("属性:???(0x%02x)"), pSkill->bType);
280 roytam 144                 szDesc = szDesc + szTemp;
145  
146                 // target
147                 dwTargetTypeIndex = GetTargetTypeIndex(pSkill->bTargetType);
148                 if(dwTargetTypeIndex < dwSkillTargetTypesCount)
149                         szTemp.Format(_T("对象:%s"), rgSkillTargetTypes[dwTargetTypeIndex].szName);
150                 else
284 roytam 151                         szTemp.Format(_T("对象:???(0x%02x)"), pSkill->bTargetType);
280 roytam 152                 szDesc = szDesc + _T("\r\n") + szTemp;
153  
154                 // power
155                 if(pSkill->bPower > 1)
156                         szTemp.Format(_T("威力:%lu"), pSkill->bPower);
157                 else
158                         szTemp.Format(_T("威力:"));
159                 szDesc = szDesc + _T("\r\n") + szTemp;
160  
161                 // acc
162                 if(pSkill->bAccuracy > 0)
163                         szTemp.Format(_T("命中:%lu%%"), pSkill->bAccuracy);
164                 else
165                         szTemp.Format(_T("命中:必中"));
166                 szDesc = szDesc + _T("\r\n") + szTemp;
167  
168                 // pp
169                 szTemp.Format(_T("PP:%lu"), pSkill->bPP);
170                 szDesc = szDesc + _T("\r\n") + szTemp;
171  
172                 // priority
173                 szTemp.Format(_T("优先:%li"), (LONG)(pSkill->nPriority));
174                 szDesc = szDesc + _T("\r\n") + szTemp;
175  
176                 // effect ratio
177                 if(pSkill->bPower > 1)
178                         szTemp.Format(_T("效果几率:%lu%%"), pSkill->bEffectRatio);
179                 else
180                         szTemp.Format(_T("效果几率:必然发动"));
181                 szDesc = szDesc + _T("\r\n") + szTemp;
182  
183                 // effect
184                 szTemp.Format(_T("效果:%s"), cfg.pSkillEffList[pSkill->bEffect].rgszText[cfg.dwLang]);
185                 szDesc = szDesc + _T("\r\n") + szTemp;
186  
187                 // special
188                 szTemp.Format(_T("\n特殊:%s"), cfg.pSkillSpecList[wSkill].rgszText[cfg.dwLang]);
189                 szDesc = szDesc + _T("\r\n") + szTemp;
190         }
191 }
192  
193 VOID GetPositionInBox(WORD wIndex, WORD &wPage, WORD &wRow, WORD &wColumn)
194 {
195         if(wIndex > 0 && wIndex < 387)
196         {
197                 wPage = wIndex / 30 + 1;
198                 wRow = (wIndex % 30) / 6 + 1;
199                 wColumn = wIndex % 6 + 1;
200         }
201         else
202         {
203                 wPage = 0;
204                 wRow = 0;
205                 wColumn = 0;
206         }
207 }
208  
209 // CPokemonRomViewerApp
210  
211 BEGIN_MESSAGE_MAP(CPokemonRomViewerApp, CWinApp)
212         ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
213         ON_COMMAND(ID_CONFIG, OnConfig)
214         ON_COMMAND(ID_SHOW_BREED, OnShowBreed)
215         ON_UPDATE_COMMAND_UI(ID_SHOW_BREED, OnUpdateShowBreed)
216         ON_COMMAND(ID_SHOW_EVO, OnShowEvo)
217         ON_UPDATE_COMMAND_UI(ID_SHOW_EVO, OnUpdateShowEvo)
218         ON_COMMAND(ID_SHOW_ITEM, OnShowItem)
219         ON_UPDATE_COMMAND_UI(ID_SHOW_ITEM, OnUpdateShowItem)
220         ON_COMMAND(ID_SHOW_SKILL, OnShowSkill)
221         ON_UPDATE_COMMAND_UI(ID_SHOW_SKILL, OnUpdateShowSkill)
222         ON_COMMAND(ID_SHOW_ENC, OnShowEnc)
223         ON_UPDATE_COMMAND_UI(ID_SHOW_ENC, OnUpdateShowEnc)
224         ON_COMMAND(ID_SHOW_BERRY, OnShowBerry)
225         ON_UPDATE_COMMAND_UI(ID_SHOW_BERRY, OnUpdateShowBerry)
226 END_MESSAGE_MAP()
227  
228  
229 // CPokemonRomViewerApp 构造
230  
231 CPokemonRomViewerApp::CPokemonRomViewerApp()
232 {
233         m_bFirstInstance = TRUE;
234         m_hMutex = NULL;
235  
236         cfg.dwLang = ui_lang_cn;
237         cfg.dwCount = ui_count_none;
238         cfg.pBreedNameList = NULL;
239         cfg.pSkillNameList = NULL;
240         cfg.pSkillEffList = NULL;
241         cfg.pSkillSpecList = NULL;
242         cfg.pItemNameList = NULL;
243         cfg.pItemDescList = NULL;
244         cfg.pSpecNameList = NULL;
245         cfg.pSpecDescList = NULL;
246         cfg.pEncNameList = NULL;
247  
248         m_rgpDlgs[0] = &m_dlgSkill;
249         m_rgpDlgs[1] = &m_dlgEnc;
250         m_rgpDlgs[2] = &m_dlgBreed;
251         m_rgpDlgs[3] = &m_dlgEvo;
252         m_rgpDlgs[4] = &m_dlgItem;
253         m_rgpDlgs[5] = &m_dlgBerry;
254 }
255  
256 CPokemonRomViewerApp::~CPokemonRomViewerApp()
257 {
258         DestroyStringLists();
259         if(m_hMutex)
260                 CloseHandle(m_hMutex);
261 }
262  
263 // 唯一的一个 CPokemonRomViewerApp 对象
264 CPokemonRomViewerApp theApp;
265 ConfigStruct    cfg;
266 CPokemonRom             rom;
267  
268 #define REG_KEY_NAME    _T("PokemonRomViewer")
269 #define SECTION_NAME    _T("Configurations")
270 #define VAL_ROM_PATH    _T("Rom Path")
271 #define VAL_UI_LANG             _T("UI Language")
272 #define VAL_UI_COUNT    _T("UI Count")
345 roytam 273 #define VAL_EXTRABREEDS _T("ExtraBreeds")
280 roytam 274  
275 // CPokemonRomViewerApp 初始化
276 BOOL CPokemonRomViewerApp::InitInstance()
277 {
278         BOOL    bResult = TRUE;
279         INITCOMMONCONTROLSEX    icc;
280         DWORD   cchPathLength;
281         LPTSTR  szPath;
282  
283         icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
284         icc.dwICC = ICC_BAR_CLASSES |
285                                 ICC_LISTVIEW_CLASSES |
286                                 ICC_PROGRESS_CLASS |
287                                 ICC_STANDARD_CLASSES |
288                                 ICC_TAB_CLASSES;
289         InitCommonControlsEx(&icc);
290  
291         CWinApp::InitInstance();
292  
293         if (!AfxOleInit())
294         {
295                 AfxMessageBox(IDP_OLE_INIT_FAILED);
296                 return FALSE;
297         }
298         AfxEnableControlContainer();
299  
300         m_hMutex = CreateMutex(NULL, FALSE, _T("PokemonRomViewer"));
301         if(m_hMutex)
302         {
303                 if(GetLastError() == ERROR_ALREADY_EXISTS)
304                 {
305                         m_bFirstInstance = FALSE;
306                 }
307         }
308         else
309         {
310                 AfxMessageBox(IDS_ERR_INIT);
311                 return FALSE;
312         }
313  
314         szPath = m_szInitialPath.GetBufferSetLength(MAX_PATH);
315         if(szPath)
316         {
317                 cchPathLength = GetCurrentDirectory(MAX_PATH, szPath);
318                 m_szInitialPath.ReleaseBuffer(cchPathLength);
319         }
320  
321         // read config
322         SetRegistryKey(REG_KEY_NAME);
323         ReadConfig();
324         WriteConfig();
325  
326         // create frame
327         CMainFrame* pFrame = new CMainFrame;
328         if (!pFrame)
329                 return FALSE;
330         m_pMainWnd = pFrame;
331         pFrame->LoadFrame(IDR_MAINFRAME,
332                 WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
333                 NULL);
334  
335         // initialize
336         if(bResult)
281 roytam 337         {
302 roytam 338 #if 0
292 roytam 339 OutputDebugString(_T("1\n"));
302 roytam 340 #endif
280 roytam 341                 bResult = CreateDialogs();
281 roytam 342         }
280 roytam 343  
344         #ifndef _DEBUG
345         if(bResult)
281 roytam 346         {
280 roytam 347                 bResult = ReadStringLists();
281 roytam 348         }
280 roytam 349         #endif
350  
351         if(bResult)
352         {
302 roytam 353 #if 0
292 roytam 354 OutputDebugString(_T("2\n"));
302 roytam 355 #endif
280 roytam 356                 pFrame->ShowWindow(SW_SHOW);
357                 pFrame->UpdateWindow();
358         }
359  
360         #ifdef _DEBUG
361         if(bResult)
281 roytam 362         {
302 roytam 363 #if 0
292 roytam 364 OutputDebugString(_T("3\n"));
302 roytam 365 #endif
280 roytam 366                 bResult = ReadStringLists();
281 roytam 367         }
280 roytam 368         #endif
369  
370         if(bResult)
281 roytam 371         {
302 roytam 372 #if 0
292 roytam 373 OutputDebugString(_T("4\n"));
302 roytam 374 #endif
280 roytam 375                 ApplyConfig(TRUE, TRUE);
281 roytam 376         }
280 roytam 377  
378         if(!bResult)
281 roytam 379         {
280 roytam 380                 AfxMessageBox(IDS_ERR_INIT);
281 roytam 381         }
280 roytam 382  
383         return bResult;
384 }
385  
386  
387 // CPokemonRomViewerApp 消息处理程序
388  
389  
390  
391 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
392  
393 class CAboutDlg : public CDialog
394 {
395 public:
396         CAboutDlg();
397  
398 // 对话框数据
399         enum { IDD = IDD_ABOUTBOX };
400  
401 protected:
402         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
403  
404 // 实现
405 protected:
406         DECLARE_MESSAGE_MAP()
407 };
408  
409 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
410 {
411 }
412  
413 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
414 {
415         CDialog::DoDataExchange(pDX);
416 }
417  
418 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
419 END_MESSAGE_MAP()
420  
421 // 用于运行对话框的应用程序命令
422 void CPokemonRomViewerApp::OnAppAbout()
423 {
424         CAboutDlg aboutDlg;
425         aboutDlg.DoModal();
426 }
427  
428 // CPokemonRomViewerApp 消息处理程序
429 BOOL CPokemonRomViewerApp::ReadStringLists()
430 {
431         BOOL                    bResult;
432         CStringReader   sr;
433  
434         try
435         {
436                 #ifdef _DEBUG
437                 m_dlgWait.BeginWait(TEXT_FILE_COUNT);
438                 #endif
439  
440                 /////////////////////////////////////////
441                 cfg.pBreedNameList = new StringEntry[BREED_COUNT];
442                 if(!cfg.pBreedNameList)
281 roytam 443                 {
280 roytam 444                         throw 0;
281 roytam 445                 }
280 roytam 446  
447                 bResult = sr.BatchReadString(_T("BreedNameList.txt"), cfg.pBreedNameList, BREED_COUNT);
448                 if(!bResult)
281 roytam 449                 {
280 roytam 450                         throw 0;
281 roytam 451                 }
280 roytam 452  
453                 #ifdef _DEBUG
454                 m_dlgWait.IncStep();
455                 #endif
456  
457                 /////////////////////////////////////////
458                 cfg.pSkillNameList = new StringEntry[SKILL_COUNT];
459                 if(!cfg.pSkillNameList)
281 roytam 460                 {
280 roytam 461                         throw 0;
281 roytam 462                 }
280 roytam 463  
464                 bResult = sr.BatchReadString(_T("SkillNameList.txt"), cfg.pSkillNameList, SKILL_COUNT);
465                 if(!bResult)
281 roytam 466                 {
280 roytam 467                         throw 0;
281 roytam 468                 }
280 roytam 469  
470                 #ifdef _DEBUG
471                 m_dlgWait.IncStep();
472                 #endif
473  
474                 /////////////////////////////////////////
475                 cfg.pSkillEffList = new StringEntry[SKILL_EFFECT_COUNT];
476                 if(!cfg.pSkillEffList)
281 roytam 477                 {
280 roytam 478                         throw 0;
281 roytam 479                 }
280 roytam 480  
481                 bResult = sr.BatchReadString(_T("SkillEffList.txt"), cfg.pSkillEffList, SKILL_EFFECT_COUNT);
482                 if(!bResult)
281 roytam 483                 {
280 roytam 484                         throw 0;
281 roytam 485                 }
280 roytam 486  
487                 #ifdef _DEBUG
488                 m_dlgWait.IncStep();
489                 #endif
490  
491                 /////////////////////////////////////////
492                 cfg.pSkillSpecList = new StringEntry[SKILL_COUNT];
493                 if(!cfg.pSkillSpecList)
281 roytam 494                 {
280 roytam 495                         throw 0;
281 roytam 496                 }
280 roytam 497  
498                 bResult = sr.BatchReadString(_T("SkillSpecList.txt"), cfg.pSkillSpecList, SKILL_COUNT);
499                 if(!bResult)
281 roytam 500                 {
280 roytam 501                         throw 0;
281 roytam 502                 }
280 roytam 503  
504                 #ifdef _DEBUG
505                 m_dlgWait.IncStep();
506                 #endif
507  
508                 /////////////////////////////////////////
509                 cfg.pItemNameList = new StringEntry[ITEM_COUNT];
510                 if(!cfg.pItemNameList)
281 roytam 511                 {
280 roytam 512                         throw 0;
281 roytam 513                 }
280 roytam 514  
515                 bResult = sr.BatchReadString(_T("ItemNameList.txt"), cfg.pItemNameList, ITEM_COUNT);
516                 if(!bResult)
281 roytam 517                 {
280 roytam 518                         throw 0;
281 roytam 519                 }
280 roytam 520  
521                 #ifdef _DEBUG
522                 m_dlgWait.IncStep();
523                 #endif
524  
525                 /////////////////////////////////////////
526                 cfg.pItemDescList = new StringEntry[ITEM_COUNT];
527                 if(!cfg.pItemDescList)
281 roytam 528                 {
280 roytam 529                         throw 0;
281 roytam 530                 }
280 roytam 531  
532                 bResult = sr.BatchReadString(_T("ItemDescList.txt"), cfg.pItemDescList, ITEM_COUNT);
533                 if(!bResult)
281 roytam 534                 {
280 roytam 535                         throw 0;
281 roytam 536                 }
280 roytam 537  
538                 #ifdef _DEBUG
539                 m_dlgWait.IncStep();
540                 #endif
541  
542                 /////////////////////////////////////////
543                 cfg.pSpecNameList = new StringEntry[SPEC_COUNT];
544                 if(!cfg.pSpecNameList)
281 roytam 545                 {
280 roytam 546                         throw 0;
281 roytam 547                 }
280 roytam 548  
549                 bResult = sr.BatchReadString(_T("SpecNameList.txt"), cfg.pSpecNameList, SPEC_COUNT);
550                 if(!bResult)
281 roytam 551                 {
280 roytam 552                         throw 0;
281 roytam 553                 }
280 roytam 554  
555                 #ifdef _DEBUG
556                 m_dlgWait.IncStep();
557                 #endif
558  
559                 /////////////////////////////////////////
560                 cfg.pSpecDescList = new StringEntry[SPEC_COUNT];
561                 if(!cfg.pSpecDescList)
281 roytam 562                 {
280 roytam 563                         throw 0;
281 roytam 564                 }
280 roytam 565  
566                 bResult = sr.BatchReadString(_T("SpecDescList.txt"), cfg.pSpecDescList, SPEC_COUNT);
567                 if(!bResult)
281 roytam 568                 {
280 roytam 569                         throw 0;
281 roytam 570                 }
280 roytam 571  
572                 #ifdef _DEBUG
573                 m_dlgWait.IncStep();
574                 #endif
575  
576                 /////////////////////////////////////////
577                 cfg.pEncNameList = new StringEntry[ENC_COUNT];
578                 if(!cfg.pEncNameList)
281 roytam 579                 {
280 roytam 580                         throw 0;
281 roytam 581                 }
280 roytam 582  
583                 bResult = sr.BatchReadString(_T("EncNameList.txt"), cfg.pEncNameList, ENC_COUNT);
584                 if(!bResult)
281 roytam 585                 {
280 roytam 586                         throw 0;
281 roytam 587                 }
280 roytam 588  
589                 #ifdef _DEBUG
590                 m_dlgWait.IncStep();
591                 #endif
592         }
593         catch(int)
594         {
595                 bResult = FALSE;
596         }
597  
598         if(!bResult)
599         {
600                 #ifdef _DEBUG
601                 m_dlgWait.ShowWindow(SW_HIDE);
602                 #endif
603  
604                 DestroyStringLists();
605         }
606  
607         return bResult;
608 }
609  
610 VOID CPokemonRomViewerApp::DestroyStringLists()
611 {
612         if(cfg.pBreedNameList)
613         {
614                 delete [](cfg.pBreedNameList);
615                 cfg.pBreedNameList = NULL;
616         }
617         if(cfg.pSkillNameList)
618         {
619                 delete [](cfg.pSkillNameList);
620                 cfg.pSkillNameList = NULL;
621         }
622         if(cfg.pSkillEffList)
623         {
624                 delete [](cfg.pSkillEffList);
625                 cfg.pSkillEffList = NULL;
626         }
627         if(cfg.pSkillSpecList)
628         {
629                 delete [](cfg.pSkillSpecList);
630                 cfg.pSkillSpecList = NULL;
631         }
632         if(cfg.pItemNameList)
633         {
634                 delete [](cfg.pItemNameList);
635                 cfg.pItemNameList = NULL;
636         }
637         if(cfg.pItemDescList)
638         {
639                 delete [](cfg.pItemDescList);
640                 cfg.pItemDescList = NULL;
641         }
642         if(cfg.pSpecNameList)
643         {
644                 delete [](cfg.pSpecNameList);
645                 cfg.pSpecNameList = NULL;
646         }
647         if(cfg.pSpecDescList)
648         {
649                 delete [](cfg.pSpecDescList);
650                 cfg.pSpecDescList = NULL;
651         }
652         if(cfg.pEncNameList)
653         {
654                 delete [](cfg.pEncNameList);
655                 cfg.pEncNameList = NULL;
656         }
657 }
658  
659  
660 VOID CPokemonRomViewerApp::ReadConfig()
661 {
662         cfg.szRomPath = GetProfileString(SECTION_NAME, VAL_ROM_PATH, NULL);
663         cfg.dwCount = GetProfileInt(SECTION_NAME, VAL_UI_COUNT, ui_count_none);
664         cfg.dwLang = GetProfileInt(SECTION_NAME, VAL_UI_LANG, ui_lang_jp);
345 roytam 665         g_dwExtraBreeds = GetProfileInt(SECTION_NAME, VAL_EXTRABREEDS, 0);
280 roytam 666 }
667  
668 VOID CPokemonRomViewerApp::WriteConfig()
669 {
670         if(m_bFirstInstance)
671         {
672                 WriteProfileString(SECTION_NAME, VAL_ROM_PATH, cfg.szRomPath);
673                 WriteProfileInt(SECTION_NAME, VAL_UI_COUNT, cfg.dwCount);
674                 WriteProfileInt(SECTION_NAME, VAL_UI_LANG, cfg.dwLang);
675         }
676 }
677  
678 BOOL CPokemonRomViewerApp::CreateDialogs()
679 {
680         BOOL    bResult;
681         DWORD   dwIndex;
682  
683         for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
684         {
685                 bResult = m_rgpDlgs[dwIndex]->Create(m_rgpDlgs[dwIndex]->m_uTemplateId, m_pMainWnd);
686                 if(!bResult)
687                         break;
688  
689                 //m_rgpDlgs[dwIndex]->ShowWindow(SW_HIDE);
690         }
691  
692         if(bResult)
693         {
694                 bResult = m_dlgWait.Create(CWaitDlg::IDD, m_pMainWnd);
695                 //if(bResult)
696                 //      m_dlgWait.ShowWindow(SW_HIDE);
697         }
698  
699         return bResult;
700 }
701  
702 BOOL CPokemonRomViewerApp::ApplyConfig(BOOL bRomChanged, BOOL bUILangChanged)
703 {
704         BOOL    bResult = TRUE;
705         DWORD   dwIndex;
706         CString szCaption;
707         CString szRomName;
708  
709         if(bRomChanged)
710         {
711                 // open rom
712                 bResult = rom.OpenRom(cfg.szRomPath);
713                 if(bResult)
714                 {
715                         if(rom.m_bIsFileReadOnly)
716                         {
717                                 AfxMessageBox(IDS_WRN_ROM_READONLY);
718                         }
719                 }
720  
721                 // refresh the caption of the main window
722                 szCaption = AfxGetAppName();
723                 szRomName = rom.GetRomName();
724                 if(szRomName.GetLength() > 0)
725                         szCaption = szCaption + _T(" - ") + rom.GetRomName();
726  
727                 m_pMainWnd->SetWindowText(szCaption);
728         }
729  
730         if(bResult)
731         {
732                 // update each dialog
733                 m_dlgWait.BeginWait(APP_DLG_COUNT);
734                 for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
735                 {
736                         m_rgpDlgs[dwIndex]->OnConfigChanged(bRomChanged, bUILangChanged);
737                         m_dlgWait.IncStep();
738                 }
739         }
740         else
741         {
742                 // hide each dialog, and report error
743                 for(dwIndex = 0; dwIndex < APP_DLG_COUNT; ++dwIndex)
744                 {
745                         m_rgpDlgs[dwIndex]->ShowWindow(SW_HIDE);
746                 }
747  
748                 AfxMessageBox(IDS_ERR_ROM_READ);
749         }
750  
751         return bResult;
752 }
753  
754 void CPokemonRomViewerApp::OnConfig()
755 {
756         // TODO: 在此添加命令处理程序代码
757         CConfigDlg      cd;
758         BOOL    bRomChanged = FALSE;
759         BOOL    bUILangChanged = FALSE;
760  
761         if(cd.DoModal() == IDOK)
762         {
763                 if(cfg.szRomPath.CompareNoCase(cd.m_szRomPath) != 0)
764                 {
765                         cfg.szRomPath = cd.m_szRomPath;
766                         bRomChanged = TRUE;
767                 }
768  
769                 if(cfg.dwLang != cd.m_dwLang ||
770                         cfg.dwCount != cd.m_dwCount)
771                 {
772                         bUILangChanged = TRUE;
773                         cfg.dwLang = cd.m_dwLang;
774                         cfg.dwCount = cd.m_dwCount;
775                 }
776  
777                 ApplyConfig(bRomChanged, bUILangChanged);
778         }
779  
780         if(bRomChanged || bUILangChanged)
781                 WriteConfig();
782 }
783  
784 void CPokemonRomViewerApp::OnShowBreed()
785 {
786         // TODO: 在此添加命令处理程序代码
787         m_dlgBreed.ShowWindow(SW_SHOWDEFAULT);
788         m_dlgBreed.SetForegroundWindow();
789 }
790  
791 void CPokemonRomViewerApp::OnUpdateShowBreed(CCmdUI *pCmdUI)
792 {
793         // TODO: 在此添加命令更新用户界面处理程序代码
794         pCmdUI->Enable(rom.m_bOpened);
795 }
796  
797 void CPokemonRomViewerApp::OnShowEvo()
798 {
799         // TODO: 在此添加命令处理程序代码
800         m_dlgEvo.ShowWindow(SW_SHOWDEFAULT);
801         m_dlgEvo.SetForegroundWindow();
802 }
803  
804 void CPokemonRomViewerApp::OnUpdateShowEvo(CCmdUI *pCmdUI)
805 {
806         // TODO: 在此添加命令更新用户界面处理程序代码
807         pCmdUI->Enable(rom.m_bOpened);
808 }
809  
810 void CPokemonRomViewerApp::OnShowItem()
811 {
812         // TODO: 在此添加命令处理程序代码
813         m_dlgItem.ShowWindow(SW_SHOWDEFAULT);
814         m_dlgItem.SetForegroundWindow();
815 }
816  
817 void CPokemonRomViewerApp::OnUpdateShowItem(CCmdUI *pCmdUI)
818 {
819         // TODO: 在此添加命令更新用户界面处理程序代码
820         pCmdUI->Enable(rom.m_bOpened);
821 }
822  
823 void CPokemonRomViewerApp::OnShowSkill()
824 {
825         // TODO: 在此添加命令处理程序代码
826         m_dlgSkill.ShowWindow(SW_SHOWDEFAULT);
827         m_dlgSkill.SetForegroundWindow();
828 }
829  
830 void CPokemonRomViewerApp::OnUpdateShowSkill(CCmdUI *pCmdUI)
831 {
832         // TODO: 在此添加命令更新用户界面处理程序代码
833         pCmdUI->Enable(rom.m_bOpened);
834 }
835  
836 void CPokemonRomViewerApp::OnShowEnc()
837 {
838         // TODO: 在此添加命令处理程序代码
839         m_dlgEnc.ShowWindow(SW_SHOWDEFAULT);
840         m_dlgEnc.SetForegroundWindow();
841 }
842  
843 void CPokemonRomViewerApp::OnUpdateShowEnc(CCmdUI *pCmdUI)
844 {
845         // TODO: 在此添加命令更新用户界面处理程序代码
846         pCmdUI->Enable(rom.m_bOpened);
847 }
848  
849 void CPokemonRomViewerApp::OnShowBerry()
850 {
851         // TODO: 在此添加命令处理程序代码
852         m_dlgBerry.ShowWindow(SW_SHOWDEFAULT);
853         m_dlgBerry.SetForegroundWindow();
854 }
855  
856 void CPokemonRomViewerApp::OnUpdateShowBerry(CCmdUI *pCmdUI)
857 {
858         // TODO: 在此添加命令更新用户界面处理程序代码
859         pCmdUI->Enable(rom.m_bOpened);
860 }