├── .gitattributes ├── .gitignore ├── CommonDlgWZ.cpp ├── CommonDlgWZ.h ├── DlgAbout.cpp ├── DlgAbout.h ├── DlgBaseWZ.cpp ├── DlgBaseWZ.h ├── DlgComment.cpp ├── DlgComment.h ├── DlgOption.cpp ├── DlgOption.h ├── FileListWindow.cpp ├── FileListWindow.h ├── FileStatusWZ.cpp ├── FileStatusWZ.h ├── README.md ├── RPYAnalyzer.cpp ├── RPYAnalyzer.h ├── RPYAnalyzer_common.h ├── RPYAnalyzer_formatter.cpp ├── RPYAnalyzer_formatter.h ├── RPYAnalyzer_userblock.cpp ├── RPYAnalyzer_userblock.h ├── SaveRawDlg.cpp ├── SaveRawDlg.h ├── StdAfx.cpp ├── StdAfx.h ├── cfgfile.cpp ├── cfgfile.h ├── docs ├── !COMPILE.txt ├── !FILELIST.txt ├── !THANKS.txt └── oldchangelog.md ├── filepath_utils.cpp ├── filepath_utils.h ├── global.cpp ├── global.h ├── indep ├── OSVer.cpp ├── OSVer.h ├── Registry.cpp ├── Registry.h ├── WindowGluer.cpp ├── WindowGluer.h ├── clipboard.cpp ├── clipboard.h ├── cpconv.cpp ├── cpconv.h ├── globalxp.cpp └── globalxp.h ├── res ├── manifest.xml ├── pldead00.wav ├── thhyl.ico ├── thhyl.rc2 ├── thhylrpy.ico └── yx.ico ├── resource.h ├── sclists ├── th125.sclist ├── th13.sclist ├── th14.sclist ├── th143.sclist ├── th16.sclist ├── th165.sclist ├── th17.sclist └── th95.sclist ├── thdecode ├── thcommon.cpp ├── thcommon.h ├── thdecode1.cpp ├── thdecode1.h ├── thdecode2.cpp ├── thdecode2.h ├── thkeyinfo.h ├── thuserblock.cpp └── thuserblock.h ├── thhyl.cpp ├── thhyl.dsp ├── thhyl.dsw ├── thhyl.h ├── thhyl.rc ├── thhylDlg.cpp └── thhylDlg.h /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | 19 | 20 | # Encoding 21 | 22 | *.cpp encoding=GBK 23 | *.h encoding=GBK 24 | *.rc encoding=GBK 25 | *.rc2 encoding=GBK 26 | *.ds[wp] encoding=GBK 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | 45 | 46 | # VC6 stuffs 47 | *.aps 48 | *.clw 49 | *.ncb 50 | *.opt 51 | *.plg 52 | 53 | # MY CUSTOM 54 | tags 55 | *.cmd 56 | ~~*.* 57 | trash/ 58 | Release/ 59 | Debug/ 60 | 61 | .vscode/ 62 | -------------------------------------------------------------------------------- /CommonDlgWZ.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/CommonDlgWZ.cpp -------------------------------------------------------------------------------- /CommonDlgWZ.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/CommonDlgWZ.h -------------------------------------------------------------------------------- /DlgAbout.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/DlgAbout.cpp -------------------------------------------------------------------------------- /DlgAbout.h: -------------------------------------------------------------------------------- 1 | #if !defined(AFX_DLGABOUT_H__8DC9C31D_EE48_4A7D_BEB7_3ADAD947B23F__INCLUDED_) 2 | #define AFX_DLGABOUT_H__8DC9C31D_EE48_4A7D_BEB7_3ADAD947B23F__INCLUDED_ 3 | 4 | #include "DlgBaseWZ.h" 5 | 6 | #if _MSC_VER > 1000 7 | #pragma once 8 | #endif // _MSC_VER > 1000 9 | // DlgAbout.h : header file 10 | // 11 | 12 | ///////////////////////////////////////////////////////////////////////////// 13 | // CDlgAbout dialog 14 | 15 | class CDlgAbout : public CDlgBaseWZ 16 | { 17 | // Construction 18 | public: 19 | CDlgAbout(CWnd* pParent = NULL); // standard constructor 20 | 21 | // Dialog Data 22 | //{{AFX_DATA(CDlgAbout) 23 | enum { IDD = IDD_ABOUT }; 24 | // NOTE: the ClassWizard will add data members here 25 | //}}AFX_DATA 26 | 27 | 28 | // Overrides 29 | // ClassWizard generated virtual function overrides 30 | //{{AFX_VIRTUAL(CDlgAbout) 31 | protected: 32 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 33 | //}}AFX_VIRTUAL 34 | 35 | // Implementation 36 | protected: 37 | 38 | // Generated message map functions 39 | //{{AFX_MSG(CDlgAbout) 40 | afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 41 | virtual BOOL OnInitDialog(); 42 | afx_msg void OnMouseMove(UINT nFlags, CPoint point); 43 | afx_msg void OnMyemail(); 44 | afx_msg void OnUpdateurl(); 45 | virtual void OnOK(); 46 | virtual void OnCancel(); 47 | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 48 | afx_msg void OnAboutpic(); 49 | //}}AFX_MSG 50 | DECLARE_MESSAGE_MAP() 51 | }; 52 | 53 | //{{AFX_INSERT_LOCATION}} 54 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 55 | 56 | #endif // !defined(AFX_DLGABOUT_H__8DC9C31D_EE48_4A7D_BEB7_3ADAD947B23F__INCLUDED_) 57 | -------------------------------------------------------------------------------- /DlgBaseWZ.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/DlgBaseWZ.cpp -------------------------------------------------------------------------------- /DlgBaseWZ.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/DlgBaseWZ.h -------------------------------------------------------------------------------- /DlgComment.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/DlgComment.cpp -------------------------------------------------------------------------------- /DlgComment.h: -------------------------------------------------------------------------------- 1 | #if !defined(AFX_DLGCOMMENT_H__E61C3AC8_557B_4C4A_AD67_87B3818AEA2B__INCLUDED_) 2 | #define AFX_DLGCOMMENT_H__E61C3AC8_557B_4C4A_AD67_87B3818AEA2B__INCLUDED_ 3 | 4 | #if _MSC_VER > 1000 5 | #pragma once 6 | #endif // _MSC_VER > 1000 7 | // DlgComment.h : header file 8 | // 9 | 10 | #include "DlgBaseWZ.h" 11 | 12 | ///////////////////////////////////////////////////////////////////////////// 13 | // CDlgComment dialog 14 | 15 | class CDlgComment : public CDlgBaseWZ 16 | { 17 | // Construction 18 | public: 19 | CString* m_pCommentData; 20 | CString m_filename; 21 | const BYTE* m_pRpyData; 22 | DWORD m_dwRpySize; 23 | CDlgComment(CWnd* pParent = NULL); // standard constructor 24 | 25 | // Dialog Data 26 | //{{AFX_DATA(CDlgComment) 27 | enum { IDD = IDD_COMMENT }; 28 | CComboBox m_CommentCode; 29 | CEdit m_CommentEdit; 30 | UINT m_CommentCodeEdit; 31 | //}}AFX_DATA 32 | 33 | 34 | // Overrides 35 | // ClassWizard generated virtual function overrides 36 | //{{AFX_VIRTUAL(CDlgComment) 37 | protected: 38 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 39 | //}}AFX_VIRTUAL 40 | 41 | // Implementation 42 | protected: 43 | 44 | // Generated message map functions 45 | //{{AFX_MSG(CDlgComment) 46 | virtual BOOL OnInitDialog(); 47 | afx_msg void OnSize(UINT nType, int cx, int cy); 48 | afx_msg void OnSelchangeCommentcode(); 49 | virtual void OnOK(); 50 | afx_msg void OnSaveas(); 51 | //}}AFX_MSG 52 | DECLARE_MESSAGE_MAP() 53 | private: 54 | BOOL WriteComment(LPCTSTR infile, LPCTSTR outfile); 55 | BOOL UpdateCommentToFile(LPCSTR pComment, size_t dwCommentSize, LPCTSTR newfilename); 56 | }; 57 | 58 | //{{AFX_INSERT_LOCATION}} 59 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 60 | 61 | #endif // !defined(AFX_DLGCOMMENT_H__E61C3AC8_557B_4C4A_AD67_87B3818AEA2B__INCLUDED_) 62 | -------------------------------------------------------------------------------- /DlgOption.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/DlgOption.cpp -------------------------------------------------------------------------------- /DlgOption.h: -------------------------------------------------------------------------------- 1 | #if !defined(AFX_DLGOPTION_H__689C42C1_C013_4844_8AA1_D2E0280CDA7F__INCLUDED_) 2 | #define AFX_DLGOPTION_H__689C42C1_C013_4844_8AA1_D2E0280CDA7F__INCLUDED_ 3 | 4 | #if _MSC_VER > 1000 5 | #pragma once 6 | #endif // _MSC_VER > 1000 7 | // DlgOption.h : header file 8 | // 9 | 10 | #include "DlgBaseWZ.h" 11 | 12 | ///////////////////////////////////////////////////////////////////////////// 13 | // CDlgOption dialog 14 | 15 | class CDlgOption : public CDlgBaseWZ 16 | { 17 | // Construction 18 | public: 19 | CDlgOption(CWnd* pParent = NULL); // standard constructor 20 | 21 | // Dialog Data 22 | //{{AFX_DATA(CDlgOption) 23 | enum { IDD = IDD_OPTION }; 24 | CComboBox m_InfoCode; 25 | CComboBox m_CommentCode; 26 | UINT m_CommentCodeEdit; 27 | UINT m_InfoCodeEdit; 28 | BOOL m_chkDblClk; 29 | BOOL m_chkMBtn; 30 | BOOL m_chkConfirm; 31 | BOOL m_chkPlayTime; 32 | BOOL m_chkSlowRate; 33 | BOOL m_chk9; 34 | BOOL m_chkCopyOpenDest; 35 | BOOL m_chkAnyDrag; 36 | BOOL m_chkAutoExit; 37 | BOOL m_chkNoBTooltip; 38 | //}}AFX_DATA 39 | 40 | 41 | // Overrides 42 | // ClassWizard generated virtual function overrides 43 | //{{AFX_VIRTUAL(CDlgOption) 44 | protected: 45 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 46 | //}}AFX_VIRTUAL 47 | 48 | // Implementation 49 | protected: 50 | 51 | // Generated message map functions 52 | //{{AFX_MSG(CDlgOption) 53 | virtual BOOL OnInitDialog(); 54 | afx_msg void OnSelchangeCommentcode(); 55 | virtual void OnOK(); 56 | afx_msg void OnSelchangeInfocode(); 57 | //}}AFX_MSG 58 | DECLARE_MESSAGE_MAP() 59 | 60 | }; 61 | 62 | //{{AFX_INSERT_LOCATION}} 63 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 64 | 65 | #endif // !defined(AFX_DLGOPTION_H__689C42C1_C013_4844_8AA1_D2E0280CDA7F__INCLUDED_) 66 | -------------------------------------------------------------------------------- /FileListWindow.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/FileListWindow.cpp -------------------------------------------------------------------------------- /FileListWindow.h: -------------------------------------------------------------------------------- 1 | #if !defined(AFX_FILELISTWINDOW_H__7D5483BC_99EA_447E_A51F_22D4B7A818B2__INCLUDED_) 2 | #define AFX_FILELISTWINDOW_H__7D5483BC_99EA_447E_A51F_22D4B7A818B2__INCLUDED_ 3 | 4 | #if _MSC_VER > 1000 5 | #pragma once 6 | #endif // _MSC_VER > 1000 7 | // FileListWindow.h : header file 8 | // 9 | 10 | // forward declarations are needed to deal with errors because the headers files are being included each other 11 | class CFileListWindow; 12 | class CThhylDlg; 13 | 14 | #include "thhylDlg.h" 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // CFileListWindow dialog 18 | 19 | class CFileListWindow : public CDialog 20 | { 21 | // Construction 22 | public: 23 | void ChangeFilePath(const CString& strFilePath, BOOL bMustRefresh=FALSE); 24 | void Refresh(); 25 | void ChangeDir(const CString& szNewDir, BOOL bMustRefresh=FALSE); 26 | CString GetFirstFilePath() const; 27 | CString GetPreviousFilePath() const; 28 | CString GetNextFilePath() const; 29 | CString GetLastFilePath() const; 30 | CString GetFilePath() const; // get filepath from the selected item text, returns empty string if nothing is selected 31 | // return a filepath that is suggested to be selected after deleting the current file 32 | CString PrepareForDeleteFile(); 33 | void Clear(); 34 | CFileListWindow(CWnd* pParent = NULL); // standard constructor 35 | 36 | 37 | // Dialog Data 38 | //{{AFX_DATA(CFileListWindow) 39 | enum { IDD = IDD_FILELIST }; 40 | CTreeCtrl m_filetree; 41 | //}}AFX_DATA 42 | 43 | 44 | // Overrides 45 | // ClassWizard generated virtual function overrides 46 | //{{AFX_VIRTUAL(CFileListWindow) 47 | public: 48 | virtual BOOL DestroyWindow(); 49 | virtual BOOL PreTranslateMessage(MSG* pMsg); 50 | protected: 51 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 52 | virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); 53 | virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); 54 | //}}AFX_VIRTUAL 55 | 56 | // Implementation 57 | protected: 58 | 59 | // Generated message map functions 60 | //{{AFX_MSG(CFileListWindow) 61 | afx_msg void OnSize(UINT nType, int cx, int cy); 62 | virtual BOOL OnInitDialog(); 63 | virtual void OnOK(); 64 | afx_msg void OnTimer(UINT nIDEvent); 65 | //}}AFX_MSG 66 | DECLARE_MESSAGE_MAP() 67 | private: 68 | CString m_strDir; 69 | 70 | bool SelectFileItemByText(const CString& text); // return true if the item is successfully selected, false otherwise 71 | HTREEITEM FindFileItemByText(const CString& text) const; 72 | CString GetFileItemText() const; // return emtpy string if nothing or the root node is selected. 73 | HTREEITEM TV_GetLastFileItem() const; 74 | CThhylDlg* m_pWndMain; 75 | HACCEL m_hAccel; 76 | }; 77 | 78 | //{{AFX_INSERT_LOCATION}} 79 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 80 | 81 | #endif // !defined(AFX_FILELISTWINDOW_H__7D5483BC_99EA_447E_A51F_22D4B7A818B2__INCLUDED_) 82 | -------------------------------------------------------------------------------- /FileStatusWZ.cpp: -------------------------------------------------------------------------------- 1 | // written by wz520. need MFC 2 | 3 | #include "stdafx.h" 4 | #include "FileStatusWZ.h" 5 | 6 | #ifdef _DEBUG 7 | #define new DEBUG_NEW 8 | #undef THIS_FILE 9 | static char THIS_FILE[] = __FILE__; 10 | #endif 11 | 12 | CFileStatusWZ::CFileStatusWZ() 13 | { 14 | Clear(); 15 | } 16 | 17 | void CFileStatusWZ::Update(const CFileStatus& other) 18 | { 19 | ASSERT(sizeof(CFileStatus) == sizeof(*this)); 20 | 21 | memcpy(this, &other, sizeof(*this)); 22 | } 23 | 24 | void CFileStatusWZ::Clear() 25 | { 26 | memset(this, 0, sizeof(*this)); 27 | } 28 | 29 | BOOL CFileStatusWZ::IsSameDateAndSize(const CFileStatus& other) const 30 | { 31 | return (this->m_mtime == other.m_mtime && this->m_size == other.m_size) ? TRUE : FALSE; 32 | } -------------------------------------------------------------------------------- /FileStatusWZ.h: -------------------------------------------------------------------------------- 1 | #ifndef __CFILESTATUSWZ_H_51A572A9_ 2 | # define __CFILESTATUSWZ_H_51A572A9_ 3 | 4 | // written by wz520. need MFC 5 | 6 | struct CFileStatusWZ : public CFileStatus 7 | { 8 | CFileStatusWZ(); 9 | 10 | void Update(const CFileStatus& other); 11 | BOOL IsValid() const { return (BOOL)(this->m_szFullName[0] != 0); } 12 | void Clear(); 13 | BOOL IsSameDateAndSize(const CFileStatus& other) const; 14 | }; 15 | 16 | #endif // __CFILESTATUSWZ_H_51A572A9_ 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/README.md -------------------------------------------------------------------------------- /RPYAnalyzer.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer.cpp -------------------------------------------------------------------------------- /RPYAnalyzer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer.h -------------------------------------------------------------------------------- /RPYAnalyzer_common.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer_common.h -------------------------------------------------------------------------------- /RPYAnalyzer_formatter.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer_formatter.cpp -------------------------------------------------------------------------------- /RPYAnalyzer_formatter.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer_formatter.h -------------------------------------------------------------------------------- /RPYAnalyzer_userblock.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer_userblock.cpp -------------------------------------------------------------------------------- /RPYAnalyzer_userblock.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/RPYAnalyzer_userblock.h -------------------------------------------------------------------------------- /SaveRawDlg.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/SaveRawDlg.cpp -------------------------------------------------------------------------------- /SaveRawDlg.h: -------------------------------------------------------------------------------- 1 | #if !defined(AFX_SAVERAWDLG_H__ADEE1FB7_CA37_467B_8E18_2A7D332A0AC8__INCLUDED_) 2 | #define AFX_SAVERAWDLG_H__ADEE1FB7_CA37_467B_8E18_2A7D332A0AC8__INCLUDED_ 3 | 4 | #include "thdecode/thcommon.h" // Added by ClassView 5 | #include "RPYAnalyzer_common.h" 6 | #include "DlgBaseWZ.h" 7 | 8 | #if _MSC_VER > 1000 9 | #pragma once 10 | #endif // _MSC_VER > 1000 11 | // SaveRawDlg.h : header file 12 | // 13 | 14 | ///////////////////////////////////////////////////////////////////////////// 15 | // CSaveRawDlg dialog 16 | 17 | class CSaveRawDlg : public CDlgBaseWZ 18 | { 19 | // Construction 20 | public: 21 | CString m_strFileName; 22 | DWORD m_dwRpySize; 23 | const RPYINFO_POINTERS* m_pRpyInfoPointers; 24 | const THRPYINFO_BASE* m_pRpyInfoBase; 25 | CSaveRawDlg(CWnd* pParent = NULL); // standard constructor 26 | 27 | // Dialog Data 28 | //{{AFX_DATA(CSaveRawDlg) 29 | enum { IDD = IDD_SAVERAWPART }; 30 | CListCtrl m_list; 31 | BOOL m_chkExit; 32 | BOOL m_chkOverwrite; 33 | BOOL m_chkInv; 34 | //}}AFX_DATA 35 | 36 | 37 | // Overrides 38 | // ClassWizard generated virtual function overrides 39 | //{{AFX_VIRTUAL(CSaveRawDlg) 40 | public: 41 | virtual BOOL DestroyWindow(); 42 | protected: 43 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 44 | //}}AFX_VIRTUAL 45 | 46 | // Implementation 47 | protected: 48 | 49 | // Generated message map functions 50 | //{{AFX_MSG(CSaveRawDlg) 51 | virtual BOOL OnInitDialog(); 52 | afx_msg void OnSaverawSelall(); 53 | virtual void OnOK(); 54 | afx_msg void OnSaverawSelhi(); 55 | afx_msg void OnSaverawChkexit(); 56 | //}}AFX_MSG 57 | DECLARE_MESSAGE_MAP() 58 | private: 59 | bool SaveCheckedFiles(LPCTSTR szDir); 60 | void AutoSetColumnWidth(); 61 | }; 62 | 63 | //{{AFX_INSERT_LOCATION}} 64 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 65 | 66 | #endif // !defined(AFX_SAVERAWDLG_H__ADEE1FB7_CA37_467B_8E18_2A7D332A0AC8__INCLUDED_) 67 | -------------------------------------------------------------------------------- /StdAfx.cpp: -------------------------------------------------------------------------------- 1 | // stdafx.cpp : source file that includes just the standard includes 2 | // thhyl.pch will be the pre-compiled header 3 | // stdafx.obj will contain the pre-compiled type information 4 | 5 | #include "stdafx.h" 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /StdAfx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | // 5 | 6 | #if !defined(AFX_STDAFX_H__E25733E9_3730_4B90_BEB2_0959AB02C139__INCLUDED_) 7 | #define AFX_STDAFX_H__E25733E9_3730_4B90_BEB2_0959AB02C139__INCLUDED_ 8 | 9 | #if _MSC_VER > 1000 10 | #pragma once 11 | #endif // _MSC_VER > 1000 12 | 13 | #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers 14 | 15 | #include // MFC core and standard components 16 | #include // MFC extensions 17 | #include // MFC Automation classes 18 | #include // MFC support for Internet Explorer 4 Common Controls 19 | #ifndef _AFX_NO_AFXCMN_SUPPORT 20 | #include // MFC support for Windows Common Controls 21 | #endif // _AFX_NO_AFXCMN_SUPPORT 22 | 23 | 24 | //{{AFX_INSERT_LOCATION}} 25 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 26 | 27 | #endif // !defined(AFX_STDAFX_H__E25733E9_3730_4B90_BEB2_0959AB02C139__INCLUDED_) 28 | -------------------------------------------------------------------------------- /cfgfile.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/cfgfile.cpp -------------------------------------------------------------------------------- /cfgfile.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/cfgfile.h -------------------------------------------------------------------------------- /docs/!COMPILE.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/docs/!COMPILE.txt -------------------------------------------------------------------------------- /docs/!FILELIST.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/docs/!FILELIST.txt -------------------------------------------------------------------------------- /docs/!THANKS.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/docs/!THANKS.txt -------------------------------------------------------------------------------- /docs/oldchangelog.md: -------------------------------------------------------------------------------- 1 | ## 较旧的更新历史 2 | 3 | 1.70(2014-06-03): 4 | 5 | - 增加:支持 `弹幕天邪鬼`。可显示主道具、副道具的名称及可用次数,还有主道具的能力值,以及 BOSS 名、 SC 名(需要 th143sc.lst)。 6 | - 增加:`文花帖` 增加 BOSS 名及 SC 名显示,需要 th95sc.lst 。 7 | - 增加:`文花帖DS` 增加 BOSS 名及 SC 名显示,需要 th125sc.lst 。 8 | - 增加:`风神录`、`地灵殿`、`星莲船`、`妖精大战争`、`神灵庙`、`辉针城` 增加各关自机初始坐标显示。 9 | - 增加:在主窗口中按住Ctrl键的同时滚动鼠标滚轮可以快速调整录像信息框的字体大小。 10 | - 增加:在主窗口中,当输入焦点不位于“录像信息”框时,按住鼠标左键的同时滚动鼠标滚轮可以调整主窗口的不透明度。 11 | - 增加:`文花帖` 也可显示 [※ ShotSlow] 和 [※ NoDirectInput] 。 12 | - 增加:本来 [PlayTime](#PlayTime) 和 [SlowRateByFPS](#SlowRateByFPS) 的显示只支持 `红魔乡` ~ `花映冢`,现支持全作。 13 | - BUG修正:使用“重命名/移动”功能后,切换到别的程序再切换回来,文件会被自动关闭。如果在选项中勾选“文件不存在时自动退出”,则程序会自动退出。 14 | - 其他细节的修正。 15 | 16 | 1.66(2013-09-09): 17 | 18 | - 增加:辉针城各关数据中增加 [Non2.0Bonus] 项,非 2.0 道具回收奖励的次数。详见帮助说明。 19 | - 更改:右上角“关闭文件”按钮的图案(原来的“X”不大好,像是删除文件),并将快捷键从 F9 改为 CTRL+L(本版开始F9另有他用) 20 | - 增加:“选项”中增加“文件不存在时自动退出”:若打开的录像不再有效,则自动退出回映录。 21 | - 增加:“打开文件”快捷键增加 CTRL+O。 22 | - 增加:"剪切"、"复制"按钮和菜单项。类似资源管理器的剪切/复制功能,配合“粘贴”功能可以进行移动/复制打开的录像文件。快捷键分别为 F9,F10。 23 | - 增加:快捷键 F11 可以 最大化/还原 主窗口和注释编辑窗口。 24 | - 其他细节的修正。 25 | 26 | 1.65(2013-08-18): 27 | 28 | - 增加:支持 辉针城正式版 的各关数据显示及 raw 数据保存。 29 | - 增加:软件包中加入 th14sc.lst 文件,作用类似 th13sc.lst,用以显示 辉针城正式版 SpellCard Practice 录像的符卡名称,参见帮助中关于 th13sc.lst 的条目。 30 | - 增加:主界面中增加“关闭文件”按钮,快捷键 F9。 31 | 32 | 1.62(2013-07-04): 33 | 34 | - 辉针城体验版各关数据增加 [1UPCount] 项,累计的奖命次数。详见帮助。 35 | - 原来在 Vista/Win7 下设置文件关联需要管理员权限,现在不需要了。 36 | - 现在若不勾选“选项”对话框中的“双击鼠标左键退出程序”,双击时会最大化/还原窗口。 37 | - “选项”对话框中增加选项“位于非标题栏也可拖动”。 38 | - 把主窗口的按钮调大了,在大字体环境下看起来能舒服点。 39 | - 其他细节的修正。 40 | 41 | 1.61(2013-05-30): 42 | 43 | - BUG修正:(1.60版起)拖入大于32M的文件会导致无限询问是否打开。 44 | - BUG修正:(1.60版起)从别的窗口切换回主窗口时录像信息框都会滚到开头几行,导致查看信息不便。 45 | - 添加: 选项中增加“打开复制后的目标文件”。 46 | - 添加: 为“选项”对话框的一些选项添加了帮助信息(鼠标移动到选项上可见。其实 1.60 版中主窗口的部分控件已经有帮助信息了)。 47 | - 其他细节的修正。 48 | 49 | 1.60(2013-05-27): 50 | 51 | - 增加:支持 辉针城体验版 的各关数据显示及 raw 数据保存。 52 | - 增加:支持 黄昏酒场 的各关数据显示(也就只有“Clear Score”一项而已)及 raw 数据保存。 53 | - 增加:风神录 增加 連擊槽 项。详见帮助说明。 54 | - 增加:监视录像文件变化。每当从别的窗口切换回主窗口后会尝试重新载入录像文件。 55 | - 增加:“打开录像” 菜单项增加快捷键 CTRL+B 。 56 | - 调整了主界面部分控件的外观和位置。 57 | - 其他细节的修正。 58 | 59 | 1.50(2012-02-21): 60 | 61 | - 增加/改进:[PlayTime] 和 [TotalPlayTime] 使用按键状态数据来计算(本来使用 FPS 数据),这样更精确(精确到帧),并且会显示每一关的总帧数,更重要的是可以支持没有 FPS 数据的红魔乡。 62 | - 增加:红魔乡 显示蓝点数 [Point] 。和游戏中显示的不同,是从游戏开始累计的,类似后续作品。 63 | - 增加:显示录像玩家在游戏前开启的部分游戏选项,详见 “※ 其他信息”。 64 | - 增加:花映囧显示两个玩家的 [Charge Type] 。 65 | - 增加:花映囧显示 Match 模式的对战场所 [Place] 。非 Match 模式不会显示。 66 | - 增加:主窗口标题中显示打开的录像文件名(像 “文件名 - 东方回映录” 这样) 67 | - 增加:“选项”窗口中增加一选项用于将花映冢各关信息中的“Cirno”显示成“⑨”。 68 | - BUG修正: 地灵殿 魔理沙A(魔爱组) [Power] 显示错误。 69 | - 其他细节的修正。 70 | 71 | 1.40(2011-09-27): 72 | 73 | - YoooooYooooo梦 录像可显示是否是中文版。 74 | - 对于 呻吟喵 Spell Practice(符卡练习)录像,会显示 SpellCard 名称和编号。(不过显示名称需要 th13sc.lst ) 75 | - 支持将 .rpy 解码后的原始数据另存(右键菜单->保存 raw 数据,或者按快捷键 Ctrl+R)。不过目前还不支持黄昏酒场。 76 | - 为一些菜单项添加了快捷键。 77 | - 记忆窗口位置和大小。 78 | - 现在使用快捷键 F1~F4 或 右键菜单->编码 可以快速更改 录像信息 和 注释 的 编码,不需要进 选项 对话框了(不过用这种方法只能将 录像信息编码 和 注释编码 改成同一种编码)。 79 | - Bug修正:手动在“录像文件”编辑框中随意输入一个文件路径,即使不按回车,之后的一些操作也会错误地针对这个刚输入的路径。由于未作检查,如果路径不合法,会引起各种错误。 80 | - 其他各种乱涂乱改 =v= 81 | 82 | 1.34(2011-08-18): 83 | 84 | - Bug修正:神灵庙正式版“最大得点”小数部分显示错误。 85 | 86 | 1.33(2011-08-14): 87 | 88 | - 支持 神灵喵 1.00a 正式版的各关数据显示。 89 | - 神灵庙的各关数据中新增显示 Player碎片 和 Bomb碎片 的定额(下次 奖命/奖B 所需碎片数)。 90 | - 原来主界面的“帮助”按钮现在用于显示右键菜单,打开帮助文件功能被移到了右键菜单中。 91 | - 其他细节的修正。 92 | 93 | 1.32(2011-07-02): 94 | 95 | - 风神录、地灵殿、星莲船的各关信息中,“分数”的个位会显示续关次数(最大 9 次),这样就与游戏中的显示完全一致了。 96 | - 主窗口可以改变大小。 97 | - 打开录像对话框可以一次打开多个文件。与拖入操作一样,除第一个文件外,其他文件用新进程打开。 98 | - Bug修正:星莲船的各关信息中如果某一关的初始 Bomb数 是 9 并且带一个以上 Bomb碎片,会显示为 "error" 。 99 | - 其他细节的修正。 100 | 101 | 1.31(2011-04-16): 102 | 103 | - 增加 神灵喵 体验版 各关数据的显示(可能未来的正式版也照样可以用)。关于灵界槽的显示值请参看各关数据的说明。 104 | - 再次调整了一下各关数据的显示格式。 105 | - 修正了一个BUG:拖入 TH08+ 的录像后,再拖入一个无法打开的文件,会允许编辑注释。 106 | - 其他细节的修正。 107 | 108 | 1.30(2011-04-01): 109 | 110 | - 增加 TH10, TH11, TH12, TH128 各关数据的显示。 111 | - 略微调整了一下各关数据的显示。 112 | - 其他细节的修正。 113 | 114 | 1.20(2011-03-19): 115 | 116 | - 增加 SlowRateByFPS 项。详见 SlowRateByFPS 的说明。 117 | - TH07, TH08 增加 SCB Count 项。Spell Card Bonus 取得次数。 118 | - TH08 增加 时刻 项。游戏中的时刻。 119 | - 支持显示 花映囧 的各关信息,包括各关的使用角色和分数。 120 | - 可以自定义是否显示 PlayTime 和 SlowRateByFPS,不过默认不显示,详见说明。 121 | - 为了方便显示花映囧的信息,主窗口变胖了。 122 | - 以前版本的主窗口中的“复制到剪贴板”按钮,无论录像信息框是否有选中的文字,都只会复制全部信息。现在如果没有选区,则复制全部信息;有则只复制选中的。 123 | - 完善了说明文件。 124 | - 修正各种潜在的BUG,比如如果在命令提示符下敲 thhyl 启动程序,cfg 文件名会变成 thcfg 而非 thhyl.cfg …… 125 | - 其他细节的修正。 126 | 127 | 1.11(2010-08-15): 128 | 129 | - Add support for TH128. 130 | 131 | 1.1(2010-08-04): 132 | 133 | - Add 1upPoint, PlayTime for TH06-TH08, 妖率 for TH08. 134 | 135 | 1.0(2010-04): 136 | 137 | - Initial version. 138 | -------------------------------------------------------------------------------- /filepath_utils.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/filepath_utils.cpp -------------------------------------------------------------------------------- /filepath_utils.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/filepath_utils.h -------------------------------------------------------------------------------- /global.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/global.cpp -------------------------------------------------------------------------------- /global.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/global.h -------------------------------------------------------------------------------- /indep/OSVer.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/OSVer.cpp -------------------------------------------------------------------------------- /indep/OSVer.h: -------------------------------------------------------------------------------- 1 | #ifndef __OSVER_H_522BFEBA_ 2 | # define __OSVER_H_522BFEBA_ 3 | 4 | // NOTE: OSVerInit() must be called before using other functions 5 | 6 | void OSVerInit(); 7 | BOOL OSVerAboveXP_SP2(); 8 | 9 | // NOTE: returns static string, "Windows" is not included 10 | LPCTSTR OSVerGetOSString(); 11 | 12 | // NOTE: returns static string 13 | LPCTSTR OSVerGetCSDVersion(); 14 | 15 | #endif /* __OSVER_H_522BFEBA_ */ 16 | -------------------------------------------------------------------------------- /indep/Registry.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/Registry.cpp -------------------------------------------------------------------------------- /indep/Registry.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/Registry.h -------------------------------------------------------------------------------- /indep/WindowGluer.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/WindowGluer.cpp -------------------------------------------------------------------------------- /indep/WindowGluer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/WindowGluer.h -------------------------------------------------------------------------------- /indep/clipboard.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "clipboard.h" 5 | 6 | BOOL SetClipTextW(LPCWSTR unitext) 7 | { 8 | size_t len = wcslen(unitext); 9 | BOOL ret = FALSE; 10 | 11 | if (OpenClipboard(NULL)) { 12 | HGLOBAL hMem; 13 | 14 | EmptyClipboard(); 15 | 16 | hMem = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * 2 ); 17 | if (hMem) { 18 | LPWSTR pBuf = (LPWSTR)GlobalLock(hMem); 19 | if (pBuf) { 20 | wcscpy(pBuf, unitext); 21 | GlobalUnlock(hMem); 22 | SetClipboardData(CF_UNICODETEXT, hMem); 23 | ret = TRUE; 24 | } 25 | } 26 | 27 | CloseClipboard(); 28 | } 29 | 30 | return ret; 31 | } 32 | 33 | BOOL CopyFileToClipboardW(LPCWSTR szFileName, BOOL bCopy) 34 | { 35 | DROPFILES stDrop; 36 | 37 | HGLOBAL hGblFiles = NULL; 38 | LPWSTR lpwData = NULL; 39 | UINT uDropEffect = RegisterClipboardFormat(_T("Preferred DropEffect")); 40 | HGLOBAL hGblEffect = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(DWORD)); 41 | LPDWORD lpdDropEffect = (LPDWORD)GlobalLock(hGblEffect); 42 | if (lpdDropEffect) { 43 | *lpdDropEffect = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE; 44 | GlobalUnlock(hGblEffect); 45 | } 46 | 47 | stDrop.pFiles = sizeof(DROPFILES); 48 | stDrop.pt.x = 0; 49 | stDrop.pt.y = 0; 50 | stDrop.fNC = FALSE; 51 | stDrop.fWide = TRUE; 52 | 53 | hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, 54 | sizeof(DROPFILES) + (wcslen(szFileName)+2) * sizeof(WCHAR)); 55 | lpwData = (LPWSTR)GlobalLock(hGblFiles); 56 | if (lpwData) { 57 | memcpy(lpwData, &stDrop, sizeof(DROPFILES)); 58 | wcscpy( (LPWSTR)((LPSTR)lpwData + sizeof(DROPFILES)), szFileName); 59 | GlobalUnlock(hGblFiles); 60 | } 61 | 62 | if (lpdDropEffect && lpwData && OpenClipboard(NULL)) { 63 | EmptyClipboard(); 64 | SetClipboardData(CF_HDROP, hGblFiles); 65 | SetClipboardData(uDropEffect, hGblEffect); 66 | CloseClipboard(); 67 | return TRUE; 68 | } 69 | else { 70 | if (hGblFiles) GlobalFree(hGblFiles); 71 | if (hGblEffect) GlobalFree(hGblEffect); 72 | return FALSE; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /indep/clipboard.h: -------------------------------------------------------------------------------- 1 | #ifndef __CLIPBOARD_H_5227B41E_ 2 | # define __CLIPBOARD_H_5227B41E_ 3 | 4 | BOOL SetClipTextW(LPCWSTR unitext); 5 | 6 | // BCopy==TRUE: Copy 7 | // BCopy==FALSE: Cut 8 | BOOL CopyFileToClipboardW(LPCWSTR szFileName, BOOL bCopy); 9 | 10 | #endif /* __CLIPBOARD_H_5227B41E_ */ 11 | -------------------------------------------------------------------------------- /indep/cpconv.cpp: -------------------------------------------------------------------------------- 1 | #include "cpconv.h" 2 | 3 | LPWSTR Ansi2Unicode(LPCSTR lpszSrc, UINT CodePage, int* outSizeW, int cbMultiByte) 4 | { 5 | const int nSize = MultiByteToWideChar(CodePage, 0, lpszSrc, cbMultiByte, NULL, 0); 6 | if (nSize == 0) 7 | return NULL; 8 | 9 | LPWSTR lpszSrcw = new WCHAR[nSize+1]; 10 | 11 | MultiByteToWideChar(CodePage, 0, lpszSrc, cbMultiByte, lpszSrcw, nSize*2); 12 | 13 | if (outSizeW != NULL) 14 | *outSizeW = nSize; 15 | 16 | if (cbMultiByte != -1) // Not null terminated 17 | lpszSrcw[nSize] = 0; // add NULL 18 | 19 | return lpszSrcw; 20 | } 21 | 22 | LPSTR Unicode2Ansi(LPCWSTR lpszSrcW, UINT CodePage, size_t *outSize, BOOL* bUsedDefaultChar) 23 | { 24 | const int nSize = WideCharToMultiByte(CodePage, 0, lpszSrcW, -1, NULL, 0, NULL, NULL); 25 | if (nSize == 0) 26 | return NULL; 27 | 28 | LPSTR lpszSrc = new CHAR[nSize + 1]; 29 | WideCharToMultiByte(CodePage, 0, lpszSrcW, -1, lpszSrc, nSize, NULL, 30 | (CodePage==CP_UTF8 || CodePage==CP_UTF7) 31 | ? NULL 32 | : bUsedDefaultChar 33 | ); 34 | 35 | if (outSize != NULL) 36 | *outSize = nSize; 37 | 38 | return lpszSrc; 39 | } 40 | -------------------------------------------------------------------------------- /indep/cpconv.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/indep/cpconv.h -------------------------------------------------------------------------------- /indep/globalxp.cpp: -------------------------------------------------------------------------------- 1 | #define _WIN32_IE 0x0501 2 | #define WINVER 0x0501 3 | #define _WIN32_WINNT 0x0501 4 | 5 | #include 6 | #include 7 | #include 8 | #include "globalxp.h" 9 | #include "OSVer.h" 10 | 11 | BOOL ShowBalloonMsg(HWND hEdit, LPCWSTR pszText, LPCWSTR pszTitle, 12 | INT ttiIcon, BOOL bShowMsgBox/*=TRUE*/, 13 | HICON userIcon/*=NULL*/) 14 | { 15 | EDITBALLOONTIP balloonTip; 16 | 17 | balloonTip.cbStruct = sizeof(EDITBALLOONTIP); 18 | balloonTip.pszText = pszText; 19 | balloonTip.pszTitle = pszTitle; 20 | balloonTip.ttiIcon = userIcon && OSVerAboveXP_SP2() ? (INT)userIcon : ttiIcon; 21 | 22 | if (SendMessage(hEdit, EM_SHOWBALLOONTIP, 0, (LPARAM)&balloonTip)) 23 | return TRUE; 24 | else if (!bShowMsgBox) 25 | return FALSE; 26 | else { 27 | UINT uType = 0; 28 | switch (ttiIcon) 29 | { 30 | case TTI_INFO: uType = MB_ICONINFORMATION; break; 31 | case TTI_WARNING: uType = MB_ICONWARNING; break; 32 | case TTI_ERROR: uType = MB_ICONERROR; break; 33 | } 34 | 35 | if (uType != 0) 36 | ::MessageBoxW(::GetParent(hEdit), pszText, pszTitle, uType); 37 | else 38 | MessageBeep(0); 39 | 40 | return FALSE; 41 | } 42 | } 43 | 44 | void SetWindowAlpha(HWND hWnd, BYTE alpha) 45 | { 46 | if (alpha == (BYTE)255) { 47 | SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA); 48 | SetWindowLong(hWnd, GWL_EXSTYLE, 49 | GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); 50 | } 51 | else { 52 | SetWindowLong(hWnd, GWL_EXSTYLE, 53 | GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); 54 | SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA); 55 | } 56 | } 57 | 58 | BYTE GetWindowAlpha(HWND hWnd) 59 | { 60 | BYTE alpha = 255; 61 | 62 | if ( GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_LAYERED ) { 63 | DWORD dwFlags = 0; 64 | if ( !GetLayeredWindowAttributes(hWnd, NULL, &alpha, &dwFlags) || !(dwFlags & LWA_ALPHA) ) 65 | alpha = 255; 66 | } 67 | 68 | return alpha; 69 | } 70 | 71 | void IncreaseWindowAlpha(HWND hWnd, int inc) 72 | { 73 | int nAlpha = (int)GetWindowAlpha(hWnd) + inc; 74 | if ( nAlpha > 255 ) 75 | nAlpha = 255; 76 | else if ( nAlpha < 5 ) 77 | nAlpha = 5; 78 | 79 | SetWindowAlpha(hWnd, (BYTE)nAlpha); 80 | } 81 | -------------------------------------------------------------------------------- /indep/globalxp.h: -------------------------------------------------------------------------------- 1 | #ifndef __GLOBALXP_H_5227E4D4_ 2 | # define __GLOBALXP_H_5227E4D4_ 3 | 4 | // show messagebox if balloon not supported and bShowMsgBox is not FALSE. 5 | // But if ttiIcon is neither TTI_INFO, nor TTI_WARNING, nor TTI_ERROR, 6 | // play a messsagebeep instead of showing a messagebox 7 | // 8 | // if userIcon is not NULL, and the running Windows version >= XP SP2, 9 | // then use userIcon as the title icon. ttiIcon will be ignored. 10 | // 11 | // return FALSE if balloon not supported, TRUE otherwise. 12 | BOOL ShowBalloonMsg(HWND hEdit, LPCWSTR pszText, LPCWSTR pszTitle, 13 | INT ttiIcon, BOOL bShowMsgBox=TRUE, 14 | HICON userIcon=NULL); 15 | 16 | void SetWindowAlpha(HWND hWnd, BYTE alpha); 17 | BYTE GetWindowAlpha(HWND hWnd); 18 | void IncreaseWindowAlpha(HWND hWnd, int inc); 19 | 20 | #endif /* __GLOBALXP_H_5227E4D4_ */ 21 | -------------------------------------------------------------------------------- /res/manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | thhyl 9 | 10 | 11 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /res/pldead00.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/res/pldead00.wav -------------------------------------------------------------------------------- /res/thhyl.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/res/thhyl.ico -------------------------------------------------------------------------------- /res/thhyl.rc2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/res/thhyl.rc2 -------------------------------------------------------------------------------- /res/thhylrpy.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/res/thhylrpy.ico -------------------------------------------------------------------------------- /res/yx.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/res/yx.ico -------------------------------------------------------------------------------- /resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Developer Studio generated include file. 3 | // Used by thhyl.rc 4 | // 5 | #define IDS_DLGFILTER 1 6 | #define IDS_RMA 3 7 | #define IDS_RMB 4 8 | #define IDS_MRSA 5 9 | #define IDS_MRSB 6 10 | #define IDS_EASY 7 11 | #define IDS_NORMAL 8 12 | #define IDS_HARD 9 13 | #define IDS_LUNATIC 10 14 | #define IDS_EXTRA 11 15 | #define IDS_HINTNOFILE 12 16 | #define IDS_SKYA 13 17 | #define IDS_SKYB 14 18 | #define IDS_PH 15 19 | #define IDS_TH67DECERROR 16 20 | #define IDS_ISNOTRPY 18 21 | #define IDS_HINTSTART 20 22 | #define IDS_CONVCODEERROR 22 23 | #define IDS_CONVTOANSIERROR 23 24 | #define IDS_DLGFILTERALL 24 25 | #define IDD_THHYL_DIALOG 102 26 | #define IDR_MAINFRAME 128 27 | #define IDR_ACCEL_FILELIST 129 28 | #define IDI_REIMU 130 29 | #define IDR_POPMENU 131 30 | #define IDD_OPTION 134 31 | #define IDD_COMMENT 136 32 | #define IDR_ACCEL 138 33 | #define IDI_YINSMILE 139 34 | #define IDD_ABOUT 140 35 | #define IDR_PLDEAD00 141 36 | #define IDD_SAVERAWPART 142 37 | #define IDD_FILELIST 143 38 | #define IDC_RPYFILE 1000 39 | #define IDC_BROWSE 1001 40 | #define IDC_RPYINFO 1002 41 | #define IDC_ONTOP 1003 42 | #define IDC_OK 1004 43 | #define IDC_COPY 1005 44 | #define IDC_COMMENTCODEPAGE 1006 45 | #define IDC_CLOSEFILE 1007 46 | #define IDC_COMMENTCODE 1010 47 | #define IDC_COMMENTCODEEDIT 1011 48 | #define IDC_OPTION 1012 49 | #define IDC_INFOCODE 1013 50 | #define IDC_INFOCODEEDIT 1014 51 | #define IDC_CHGFONT 1015 52 | #define IDC_SAVEAS 1016 53 | #define IDC_COMMENTEDIT 1017 54 | #define IDC_EDITCOMMENT 1018 55 | #define IDC_OPEN_SH_ALICE 1019 56 | #define IDC_CHK_MBTN 1025 57 | #define IDC_CHK_DBLCLK 1027 58 | #define IDC_CHK_CONFIRM 1029 59 | #define IDC_CHK_PLAYTIME 1030 60 | #define IDC_CHK_SLOWRATE 1031 61 | #define IDC_HELPHTML 1032 62 | #define IDC_STATIC_RPYFILE 1033 63 | #define IDC_STATIC_RPYINFO 1034 64 | #define IDC_CHK_9 1035 65 | #define IDC_CHK_COPYOPENDEST 1036 66 | #define IDC_CHK_ANYDRAG 1037 67 | #define IDC_COPYFILE 1038 68 | #define IDC_CUTFILE 1039 69 | #define IDC_CHK_AUTOEXIT 1040 70 | #define IDC_EDITABOUT 1041 71 | #define IDC_CHK_NOBTOOLTIP 1041 72 | #define IDC_MYEMAIL 1042 73 | #define IDC_UPDATEURL 1043 74 | #define IDC_SAVERAW_LIST 1044 75 | #define IDC_SAVERAWSIZE 1045 76 | #define IDC_SAVERAW_SELALL 1046 77 | #define IDC_SAVERAW_INVSEL 1047 78 | #define IDC_SAVERAW_SELHI 1048 79 | #define IDC_AUTOCOMP 1049 80 | #define IDC_SAVERAW_CHKEXIT 1050 81 | #define IDC_SAVERAW_OVERWRITE 1051 82 | #define IDC_SAVERAW_INV 1052 83 | #define IDC_ABOUTPIC 1053 84 | #define IDC_FILELISTTREE 1054 85 | #define IDC_OPENFILELIST 1055 86 | #define IDC_PREVRPYFILE 1056 87 | #define IDC_NEXTRPYFILE 1057 88 | #define IDC_RELOADFILELIST 1058 89 | #define IDC_FIRSTRPYFILE 1059 90 | #define IDC_LASTRPYFILE 1060 91 | #define IDM_OPEN 32771 92 | #define IDM_MENUCOPY 32772 93 | #define IDM_SETASSOC 32773 94 | #define IDM_DELASSOC 32774 95 | #define IDM_EXIT 32775 96 | #define IDM_OPENFOLDER 32776 97 | #define IDM_FILECOPYTO 32777 98 | #define IDM_FILEMOVETO 32778 99 | #define IDM_FILEDELETE 32779 100 | #define IDM_OPENPROP 32780 101 | #define IDM_MENUHELP 32781 102 | #define IDM_SAVERAW 32782 103 | #define IDM_ABOUT 32783 104 | #define IDM_SAVERAWPART 32784 105 | #define IDM_RESETFILELISTPOS 32785 106 | #define IDM_CHANGEENCODESTART 33000 107 | 108 | // Next default values for new objects 109 | // 110 | #ifdef APSTUDIO_INVOKED 111 | #ifndef APSTUDIO_READONLY_SYMBOLS 112 | #define _APS_NEXT_RESOURCE_VALUE 144 113 | #define _APS_NEXT_COMMAND_VALUE 32786 114 | #define _APS_NEXT_CONTROL_VALUE 1059 115 | #define _APS_NEXT_SYMED_VALUE 101 116 | #endif 117 | #endif 118 | -------------------------------------------------------------------------------- /sclists/th125.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th125.sclist -------------------------------------------------------------------------------- /sclists/th13.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th13.sclist -------------------------------------------------------------------------------- /sclists/th14.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th14.sclist -------------------------------------------------------------------------------- /sclists/th143.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th143.sclist -------------------------------------------------------------------------------- /sclists/th16.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th16.sclist -------------------------------------------------------------------------------- /sclists/th165.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th165.sclist -------------------------------------------------------------------------------- /sclists/th17.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th17.sclist -------------------------------------------------------------------------------- /sclists/th95.sclist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/sclists/th95.sclist -------------------------------------------------------------------------------- /thdecode/thcommon.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thcommon.cpp -------------------------------------------------------------------------------- /thdecode/thcommon.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thcommon.h -------------------------------------------------------------------------------- /thdecode/thdecode1.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thdecode1.cpp -------------------------------------------------------------------------------- /thdecode/thdecode1.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thdecode1.h -------------------------------------------------------------------------------- /thdecode/thdecode2.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thdecode2.cpp -------------------------------------------------------------------------------- /thdecode/thdecode2.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thdecode2.h -------------------------------------------------------------------------------- /thdecode/thkeyinfo.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thkeyinfo.h -------------------------------------------------------------------------------- /thdecode/thuserblock.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "thuserblock.h" 4 | 5 | #define USERBLOCKMARKER ((DWORD)'RESU') 6 | #define SIZEOF_UBHEADER (sizeof(RPYUBHeader)) 7 | 8 | #define delete_then_null(v) ((delete (v)), (v)=NULL) 9 | #define free_then_null(v) (free(v), (v)=NULL) 10 | 11 | RPYUserBlock::RPYUserBlock(const BYTE* pData, size_t datasize, RPYUBID id) 12 | { 13 | init(pData, datasize, id); 14 | } 15 | 16 | RPYUserBlock::RPYUserBlock(const RPYUBHeader* pHeader) 17 | { 18 | if ( pHeader->marker == USERBLOCKMARKER ) { 19 | init( reinterpret_cast(pHeader) + SIZEOF_UBHEADER, 20 | pHeader->length - SIZEOF_UBHEADER, pHeader->id); 21 | } 22 | else { 23 | m_pHeader->marker = 0; 24 | m_pHeader->length = 0; 25 | m_pHeader->id = ubid_info; 26 | } 27 | } 28 | 29 | RPYUserBlock::~RPYUserBlock() 30 | { 31 | free_then_null(m_pHeader); 32 | } 33 | 34 | void RPYUserBlock::init(const BYTE* pData, size_t datasize, RPYUBID id) 35 | { 36 | const DWORD blocksize = SIZEOF_UBHEADER + datasize; 37 | 38 | // Allocate additional 1 byte. 39 | // We will fill this byte with '\0' to ensure that the block data 40 | // can be safely copied by strcpy() 41 | m_pHeader = static_cast(malloc(blocksize+1)); 42 | m_pHeader->marker = USERBLOCKMARKER; 43 | m_pHeader->length = blocksize; 44 | m_pHeader->id = id; 45 | 46 | BYTE* const pHeaderAsByte = (BYTE*)m_pHeader; 47 | memcpy(pHeaderAsByte + SIZEOF_UBHEADER, pData, datasize); 48 | pHeaderAsByte[blocksize] = '\0'; // fill '\0', as mentioned above 49 | } 50 | 51 | 52 | ///////////////////////////////////////////////////////////////// 53 | 54 | 55 | // Get pointer to first user block from rpy data 56 | static const BYTE* getBegin(const BYTE* pData, size_t sz) 57 | { 58 | const DWORD offset = *(DWORD*)(pData + 0x0C); // offset of the first user block 59 | const BYTE* pBegin = NULL; 60 | if ( offset <= (DWORD)sz ) { 61 | pBegin = pData + offset; 62 | 63 | if ( offset == (DWORD)sz ) 64 | ; // offset == sz, no user blocks, permitted. 65 | else if ( reinterpret_cast(pBegin)->marker != USERBLOCKMARKER ) { 66 | pBegin = NULL; // offset != sz, there must be at least 1 user block. 67 | } 68 | } 69 | return pBegin; 70 | } 71 | 72 | RPYUserBlock* RPYUserBlockMgr::newuserblock(int i, const RPYUBHeader* pHeader) 73 | { 74 | m_pUserBlocks[i] = new RPYUserBlock(pHeader); 75 | 76 | if ( !m_pUserBlocks[i]->isValid() ) { // not a valid user block 77 | delete_then_null(m_pUserBlocks[i]); 78 | } 79 | 80 | return m_pUserBlocks[i]; 81 | } 82 | 83 | RPYUserBlockMgr::RPYUserBlockMgr() 84 | { 85 | for (int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 86 | m_pUserBlocks[i] = NULL; 87 | } 88 | } 89 | 90 | RPYUserBlockMgr::RPYUserBlockMgr(const BYTE* const pRPYData, size_t sz) 91 | { 92 | const BYTE* const pEnd = pRPYData + sz; 93 | const BYTE* pCurrBlock = getBegin(pRPYData, sz); 94 | if ( pCurrBlock == NULL ) { 95 | // this lets all user block pointers will be initialized to NULL 96 | pCurrBlock = pEnd; 97 | } 98 | 99 | for (int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 100 | const RPYUBHeader* pHeader = reinterpret_cast(pCurrBlock); 101 | if ( pCurrBlock < pEnd ) { 102 | if ( !newuserblock(i, pHeader) ) { // not a valid user block 103 | pCurrBlock = pEnd; // to prevent from constructing more RPYUserBlock objects 104 | continue; 105 | } 106 | 107 | // move pointer to the next header 108 | pCurrBlock += pHeader->length; 109 | } 110 | else 111 | m_pUserBlocks[i] = NULL; 112 | } 113 | } 114 | 115 | RPYUserBlockMgr::RPYUserBlockMgr(const RPYUserBlockMgr &other) 116 | { 117 | for (int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 118 | this->m_pUserBlocks[i] = NULL; 119 | 120 | const RPYUserBlock* const ub = other.get(i); 121 | if (ub != NULL) 122 | this->set( i, ub ); 123 | } 124 | } 125 | 126 | RPYUserBlockMgr::~RPYUserBlockMgr() 127 | { 128 | for (int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 129 | delete_then_null(m_pUserBlocks[i]); 130 | } 131 | } 132 | 133 | DWORD RPYUserBlockMgr::count() const 134 | { 135 | int i; 136 | for (i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 137 | if ( m_pUserBlocks[i] == NULL ) 138 | break; 139 | } 140 | return i; 141 | } 142 | 143 | bool RPYUserBlockMgr::append(const RPYUserBlock* pBlock) 144 | { 145 | const DWORD i = count(); 146 | if ( i >= MAXUSERBLOCKCOUNT ) return false; 147 | 148 | return newuserblock(i, pBlock->getHeader()) != NULL; 149 | } 150 | 151 | bool RPYUserBlockMgr::remove(int index) 152 | { 153 | const DWORD i = static_cast(index); 154 | if ( i >= MAXUSERBLOCKCOUNT ) return false; 155 | 156 | delete_then_null(m_pUserBlocks[i]); 157 | return true; 158 | } 159 | 160 | const RPYUserBlock* RPYUserBlockMgr::get(int index) const 161 | { 162 | const DWORD i = static_cast(index); 163 | if ( i >= MAXUSERBLOCKCOUNT || m_pUserBlocks[i] == NULL ) return NULL; 164 | 165 | return m_pUserBlocks[i]; 166 | } 167 | 168 | bool RPYUserBlockMgr::set(int index, const RPYUserBlock* pBlock) 169 | { 170 | const DWORD i = static_cast(index); 171 | if ( i >= MAXUSERBLOCKCOUNT) return false; 172 | 173 | if ( m_pUserBlocks[i] != NULL ) { 174 | remove(index); 175 | } 176 | 177 | return newuserblock(i, pBlock->getHeader()) != NULL; 178 | } 179 | 180 | const RPYUserBlock* RPYUserBlockMgr::getFirstBlockByID(RPYUBID id) const 181 | { 182 | for ( int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 183 | const RPYUserBlock* pBlock = this->get(i); 184 | if ( pBlock && pBlock->getHeader()->id == id ) { 185 | return pBlock; 186 | } 187 | } 188 | return NULL; 189 | } 190 | 191 | 192 | 193 | 194 | int RPYUserBlockMgr::getFirstIndexByID(RPYUBID id) const 195 | { 196 | for ( int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 197 | const RPYUserBlock* pBlock = this->get(i); 198 | if ( pBlock && pBlock->getHeader()->id == id ) { 199 | return i; 200 | } 201 | } 202 | return -1; 203 | } 204 | 205 | 206 | 207 | size_t RPYUserBlockMgr::size() const 208 | { 209 | DWORD allsize = 0; 210 | for ( int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 211 | const RPYUserBlock* pBlock = this->get(i); 212 | if ( pBlock ) { 213 | allsize += pBlock->getHeader()->length; 214 | } 215 | } 216 | 217 | return allsize; 218 | } 219 | 220 | BYTE* RPYUserBlockMgr::saveToRPY(const BYTE* pRPYData, size_t sz, size_t* pNewSize) 221 | { 222 | const BYTE* pCurrBlockRaw = getBegin(pRPYData, sz); 223 | if (pCurrBlockRaw == NULL) 224 | return NULL; 225 | 226 | const size_t szWithoutUB = (size_t)(pCurrBlockRaw - pRPYData); 227 | *pNewSize = szWithoutUB + this->size(); 228 | BYTE* pNewRPYData = (BYTE*)malloc(*pNewSize); 229 | 230 | // copy all data before user blocks 231 | memcpy(pNewRPYData, pRPYData, szWithoutUB); 232 | 233 | BYTE* pCurrOutBlockRaw = pNewRPYData + szWithoutUB; 234 | for ( int i = 0; i < MAXUSERBLOCKCOUNT; ++i ) { 235 | const RPYUserBlock* pCurrBlock = this->get(i); 236 | if (pCurrBlock != NULL) { 237 | const DWORD length = pCurrBlock->getHeader()->length; 238 | memcpy(pCurrOutBlockRaw, pCurrBlock->getRaw(), length); 239 | // move the pointer to the next position where the next user block would be stored 240 | pCurrOutBlockRaw += length; 241 | } 242 | } 243 | 244 | return pNewRPYData; 245 | } 246 | -------------------------------------------------------------------------------- /thdecode/thuserblock.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thdecode/thuserblock.h -------------------------------------------------------------------------------- /thhyl.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thhyl.cpp -------------------------------------------------------------------------------- /thhyl.dsp: -------------------------------------------------------------------------------- 1 | # Microsoft Developer Studio Project File - Name="thhyl" - Package Owner=<4> 2 | # Microsoft Developer Studio Generated Build File, Format Version 6.00 3 | # ** DO NOT EDIT ** 4 | 5 | # TARGTYPE "Win32 (x86) Application" 0x0101 6 | 7 | CFG=thhyl - Win32 Debug 8 | !MESSAGE This is not a valid makefile. To build this project using NMAKE, 9 | !MESSAGE use the Export Makefile command and run 10 | !MESSAGE 11 | !MESSAGE NMAKE /f "thhyl.mak". 12 | !MESSAGE 13 | !MESSAGE You can specify a configuration when running NMAKE 14 | !MESSAGE by defining the macro CFG on the command line. For example: 15 | !MESSAGE 16 | !MESSAGE NMAKE /f "thhyl.mak" CFG="thhyl - Win32 Debug" 17 | !MESSAGE 18 | !MESSAGE Possible choices for configuration are: 19 | !MESSAGE 20 | !MESSAGE "thhyl - Win32 Release" (based on "Win32 (x86) Application") 21 | !MESSAGE "thhyl - Win32 Debug" (based on "Win32 (x86) Application") 22 | !MESSAGE 23 | 24 | # Begin Project 25 | # PROP AllowPerConfigDependencies 0 26 | # PROP Scc_ProjName "" 27 | # PROP Scc_LocalPath "" 28 | CPP=cl.exe 29 | MTL=midl.exe 30 | RSC=rc.exe 31 | 32 | !IF "$(CFG)" == "thhyl - Win32 Release" 33 | 34 | # PROP BASE Use_MFC 6 35 | # PROP BASE Use_Debug_Libraries 0 36 | # PROP BASE Output_Dir "Release" 37 | # PROP BASE Intermediate_Dir "Release" 38 | # PROP BASE Target_Dir "" 39 | # PROP Use_MFC 6 40 | # PROP Use_Debug_Libraries 0 41 | # PROP Output_Dir "Release" 42 | # PROP Intermediate_Dir "Release" 43 | # PROP Ignore_Export_Lib 0 44 | # PROP Target_Dir "" 45 | # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c 46 | # ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Yu"stdafx.h" /FD /c 47 | # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 48 | # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 49 | # ADD BASE RSC /l 0x804 /d "NDEBUG" /d "_AFXDLL" 50 | # ADD RSC /l 0x804 /d "NDEBUG" /d "_AFXDLL" 51 | BSC32=bscmake.exe 52 | # ADD BASE BSC32 /nologo 53 | # ADD BSC32 /nologo 54 | LINK32=link.exe 55 | # ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 56 | # ADD LINK32 shlwapi.lib /nologo /entry:"wWinMainCRTStartup" /subsystem:windows /machine:I386 /OPT:NOWIN98 57 | # SUBTRACT LINK32 /pdb:none 58 | 59 | !ELSEIF "$(CFG)" == "thhyl - Win32 Debug" 60 | 61 | # PROP BASE Use_MFC 6 62 | # PROP BASE Use_Debug_Libraries 1 63 | # PROP BASE Output_Dir "Debug" 64 | # PROP BASE Intermediate_Dir "Debug" 65 | # PROP BASE Target_Dir "" 66 | # PROP Use_MFC 6 67 | # PROP Use_Debug_Libraries 1 68 | # PROP Output_Dir "Debug" 69 | # PROP Intermediate_Dir "Debug" 70 | # PROP Ignore_Export_Lib 0 71 | # PROP Target_Dir "" 72 | # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c 73 | # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "UNICODE" /D "_UNICODE" /FR /Yu"stdafx.h" /FD /GZ /c 74 | # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 75 | # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 76 | # ADD BASE RSC /l 0x804 /d "_DEBUG" /d "_AFXDLL" 77 | # ADD RSC /l 0x804 /d "_DEBUG" /d "_AFXDLL" 78 | BSC32=bscmake.exe 79 | # ADD BASE BSC32 /nologo 80 | # ADD BSC32 /nologo 81 | LINK32=link.exe 82 | # ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept 83 | # ADD LINK32 Shlwapi.lib /nologo /entry:"wWinMainCRTStartup" /subsystem:windows /debug /machine:I386 /pdbtype:sept 84 | 85 | !ENDIF 86 | 87 | # Begin Target 88 | 89 | # Name "thhyl - Win32 Release" 90 | # Name "thhyl - Win32 Debug" 91 | # Begin Group "Source Files" 92 | 93 | # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" 94 | # Begin Source File 95 | 96 | SOURCE=.\cfgfile.cpp 97 | # End Source File 98 | # Begin Source File 99 | 100 | SOURCE=.\indep\clipboard.cpp 101 | # SUBTRACT CPP /YX /Yc /Yu 102 | # End Source File 103 | # Begin Source File 104 | 105 | SOURCE=.\CommonDlgWZ.cpp 106 | # End Source File 107 | # Begin Source File 108 | 109 | SOURCE=.\indep\cpconv.cpp 110 | # SUBTRACT CPP /YX /Yc /Yu 111 | # End Source File 112 | # Begin Source File 113 | 114 | SOURCE=.\DlgAbout.cpp 115 | # End Source File 116 | # Begin Source File 117 | 118 | SOURCE=.\DlgBaseWZ.cpp 119 | # End Source File 120 | # Begin Source File 121 | 122 | SOURCE=.\DlgComment.cpp 123 | # End Source File 124 | # Begin Source File 125 | 126 | SOURCE=.\DlgOption.cpp 127 | # End Source File 128 | # Begin Source File 129 | 130 | SOURCE=.\FileListWindow.cpp 131 | # End Source File 132 | # Begin Source File 133 | 134 | SOURCE=.\filepath_utils.cpp 135 | # End Source File 136 | # Begin Source File 137 | 138 | SOURCE=.\FileStatusWZ.cpp 139 | # End Source File 140 | # Begin Source File 141 | 142 | SOURCE=.\global.cpp 143 | # End Source File 144 | # Begin Source File 145 | 146 | SOURCE=.\indep\globalxp.cpp 147 | # SUBTRACT CPP /YX /Yc /Yu 148 | # End Source File 149 | # Begin Source File 150 | 151 | SOURCE=.\indep\OSVer.cpp 152 | # SUBTRACT CPP /YX /Yc /Yu 153 | # End Source File 154 | # Begin Source File 155 | 156 | SOURCE=.\indep\Registry.cpp 157 | # SUBTRACT CPP /YX /Yc /Yu 158 | # End Source File 159 | # Begin Source File 160 | 161 | SOURCE=.\RPYAnalyzer.cpp 162 | # End Source File 163 | # Begin Source File 164 | 165 | SOURCE=.\RPYAnalyzer_formatter.cpp 166 | # End Source File 167 | # Begin Source File 168 | 169 | SOURCE=.\RPYAnalyzer_userblock.cpp 170 | # End Source File 171 | # Begin Source File 172 | 173 | SOURCE=.\SaveRawDlg.cpp 174 | # End Source File 175 | # Begin Source File 176 | 177 | SOURCE=.\StdAfx.cpp 178 | # ADD CPP /Yc"stdafx.h" 179 | # End Source File 180 | # Begin Source File 181 | 182 | SOURCE=.\thdecode\thcommon.cpp 183 | # SUBTRACT CPP /YX /Yc /Yu 184 | # End Source File 185 | # Begin Source File 186 | 187 | SOURCE=.\thdecode\thdecode1.cpp 188 | # SUBTRACT CPP /YX /Yc /Yu 189 | # End Source File 190 | # Begin Source File 191 | 192 | SOURCE=.\thdecode\thdecode2.cpp 193 | # SUBTRACT CPP /YX /Yc /Yu 194 | # End Source File 195 | # Begin Source File 196 | 197 | SOURCE=.\thhyl.cpp 198 | # End Source File 199 | # Begin Source File 200 | 201 | SOURCE=.\thhyl.rc 202 | # End Source File 203 | # Begin Source File 204 | 205 | SOURCE=.\thhylDlg.cpp 206 | # End Source File 207 | # Begin Source File 208 | 209 | SOURCE=.\thdecode\thuserblock.cpp 210 | # SUBTRACT CPP /YX /Yc /Yu 211 | # End Source File 212 | # Begin Source File 213 | 214 | SOURCE=.\indep\WindowGluer.cpp 215 | # SUBTRACT CPP /YX /Yc /Yu 216 | # End Source File 217 | # End Group 218 | # Begin Group "Header Files" 219 | 220 | # PROP Default_Filter "h;hpp;hxx;hm;inl" 221 | # Begin Source File 222 | 223 | SOURCE=.\cfgfile.h 224 | # End Source File 225 | # Begin Source File 226 | 227 | SOURCE=.\indep\clipboard.h 228 | # End Source File 229 | # Begin Source File 230 | 231 | SOURCE=.\CommonDlgWZ.h 232 | # End Source File 233 | # Begin Source File 234 | 235 | SOURCE=.\indep\cpconv.h 236 | # End Source File 237 | # Begin Source File 238 | 239 | SOURCE=.\DlgAbout.h 240 | # End Source File 241 | # Begin Source File 242 | 243 | SOURCE=.\DlgBaseWZ.h 244 | # End Source File 245 | # Begin Source File 246 | 247 | SOURCE=.\DlgComment.h 248 | # End Source File 249 | # Begin Source File 250 | 251 | SOURCE=.\DlgOption.h 252 | # End Source File 253 | # Begin Source File 254 | 255 | SOURCE=.\FileListWindow.h 256 | # End Source File 257 | # Begin Source File 258 | 259 | SOURCE=.\filepath_utils.h 260 | # End Source File 261 | # Begin Source File 262 | 263 | SOURCE=.\FileStatusWZ.h 264 | # End Source File 265 | # Begin Source File 266 | 267 | SOURCE=.\global.h 268 | # End Source File 269 | # Begin Source File 270 | 271 | SOURCE=.\indep\globalxp.h 272 | # End Source File 273 | # Begin Source File 274 | 275 | SOURCE=.\indep\OSVer.h 276 | # End Source File 277 | # Begin Source File 278 | 279 | SOURCE=.\indep\Registry.h 280 | # End Source File 281 | # Begin Source File 282 | 283 | SOURCE=.\Resource.h 284 | # End Source File 285 | # Begin Source File 286 | 287 | SOURCE=.\RPYAnalyzer.h 288 | # End Source File 289 | # Begin Source File 290 | 291 | SOURCE=.\RPYAnalyzer_common.h 292 | # End Source File 293 | # Begin Source File 294 | 295 | SOURCE=.\RPYAnalyzer_formatter.h 296 | # End Source File 297 | # Begin Source File 298 | 299 | SOURCE=.\RPYAnalyzer_userblock.h 300 | # End Source File 301 | # Begin Source File 302 | 303 | SOURCE=.\SaveRawDlg.h 304 | # End Source File 305 | # Begin Source File 306 | 307 | SOURCE=.\StdAfx.h 308 | # End Source File 309 | # Begin Source File 310 | 311 | SOURCE=.\thdecode\thcommon.h 312 | # End Source File 313 | # Begin Source File 314 | 315 | SOURCE=.\thdecode\thdecode1.h 316 | # End Source File 317 | # Begin Source File 318 | 319 | SOURCE=.\thdecode\thdecode2.h 320 | # End Source File 321 | # Begin Source File 322 | 323 | SOURCE=.\thhyl.h 324 | # End Source File 325 | # Begin Source File 326 | 327 | SOURCE=.\thhylDlg.h 328 | # End Source File 329 | # Begin Source File 330 | 331 | SOURCE=.\thdecode\thuserblock.h 332 | # End Source File 333 | # Begin Source File 334 | 335 | SOURCE=.\indep\WindowGluer.h 336 | # End Source File 337 | # End Group 338 | # Begin Group "Resource Files" 339 | 340 | # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" 341 | # Begin Source File 342 | 343 | SOURCE=.\res\manifest.bin 344 | # End Source File 345 | # Begin Source File 346 | 347 | SOURCE=.\res\thhyl.ico 348 | # End Source File 349 | # Begin Source File 350 | 351 | SOURCE=.\res\thhyl.rc2 352 | # End Source File 353 | # Begin Source File 354 | 355 | SOURCE=.\res\thhylrpy.ico 356 | # End Source File 357 | # Begin Source File 358 | 359 | SOURCE=.\res\yx.ico 360 | # End Source File 361 | # End Group 362 | # Begin Source File 363 | 364 | SOURCE=".\docs\!COMPILE.txt" 365 | # End Source File 366 | # Begin Source File 367 | 368 | SOURCE=".\docs\!FILELIST.txt" 369 | # End Source File 370 | # Begin Source File 371 | 372 | SOURCE=".\docs\!THANKS.txt" 373 | # End Source File 374 | # Begin Source File 375 | 376 | SOURCE=.\res\pldead00.wav 377 | # End Source File 378 | # End Target 379 | # End Project 380 | -------------------------------------------------------------------------------- /thhyl.dsw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thhyl.dsw -------------------------------------------------------------------------------- /thhyl.h: -------------------------------------------------------------------------------- 1 | // thhyl.h : main header file for the THHYL application 2 | // 3 | 4 | #if !defined(AFX_THHYL_H__88A11EBE_6591_4DF3_B9B8_C5F0AED75194__INCLUDED_) 5 | #define AFX_THHYL_H__88A11EBE_6591_4DF3_B9B8_C5F0AED75194__INCLUDED_ 6 | 7 | #if _MSC_VER > 1000 8 | #pragma once 9 | #endif // _MSC_VER > 1000 10 | 11 | #ifndef __AFXWIN_H__ 12 | #error include 'stdafx.h' before including this file for PCH 13 | #endif 14 | 15 | #include "resource.h" // main symbols 16 | 17 | ///////////////////////////////////////////////////////////////////////////// 18 | // CThhylApp: 19 | // See thhyl.cpp for the implementation of this class 20 | // 21 | 22 | class CThhylApp : public CWinApp 23 | { 24 | public: 25 | CThhylApp(); 26 | 27 | BOOL m_bOnTop; 28 | CString m_rpyfile; 29 | 30 | // Overrides 31 | // ClassWizard generated virtual function overrides 32 | //{{AFX_VIRTUAL(CThhylApp) 33 | public: 34 | virtual BOOL InitInstance(); 35 | //}}AFX_VIRTUAL 36 | 37 | // Implementation 38 | 39 | //{{AFX_MSG(CThhylApp) 40 | // NOTE - the ClassWizard will add and remove member functions here. 41 | // DO NOT EDIT what you see in these blocks of generated code ! 42 | //}}AFX_MSG 43 | DECLARE_MESSAGE_MAP() 44 | private: 45 | void AnalyzeAndCopy(LPCTSTR szFileName); 46 | void ParseArguments(); 47 | }; 48 | 49 | BYTE* ReadRPYFile(LPCTSTR szFileName, CString& strErrorInfo, HWND hWnd, CFileStatus* pFileStatus, DWORD& dwFileSize); 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | 53 | //{{AFX_INSERT_LOCATION}} 54 | // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 55 | 56 | #endif // !defined(AFX_THHYL_H__88A11EBE_6591_4DF3_B9B8_C5F0AED75194__INCLUDED_) 57 | -------------------------------------------------------------------------------- /thhyl.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thhyl.rc -------------------------------------------------------------------------------- /thhylDlg.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thhylDlg.cpp -------------------------------------------------------------------------------- /thhylDlg.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wz520/thhyl/43722200fb794d1e040485c60cc1ca51c6a3af0d/thhylDlg.h --------------------------------------------------------------------------------