home *** CD-ROM | disk | FTP | other *** search
/ Igromania 2000 July / Igromania_07.iso / train / d2chedit.exe / diablo2_cheditDlg.cpp < prev    next >
C/C++ Source or Header  |  2000-07-02  |  11KB  |  352 lines

  1. // diablo2_cheditDlg.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "diablo2_chedit.h"
  6. #include "diablo2_cheditDlg.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CDiablo2_cheditDlg dialog
  16.  
  17. CDiablo2_cheditDlg::CDiablo2_cheditDlg(CWnd* pParent /*=NULL*/)
  18.     : CDialog(CDiablo2_cheditDlg::IDD, pParent)
  19. {
  20.     //{{AFX_DATA_INIT(CDiablo2_cheditDlg)
  21.     m_filename = _T("");
  22.     m_name = _T("");
  23.     m_class = _T("");
  24.     m_level = 0;
  25.     m_experience = 0;
  26.     m_strength = 0;
  27.     m_dexterity = 0;
  28.     m_vitality = 0;
  29.     m_energy = 0;
  30.     m_attackRating = 0;
  31.     m_defense = 0;
  32.     m_staminaCurrent = 0;
  33.     m_staminaMax = 0;
  34.     m_lifeCurrent = 0;
  35.     m_lifeMax = 0;
  36.     m_manaCurrent = 0;
  37.     m_manaMax = 0;
  38.     m_goldPerson = 0;
  39.     m_goldStash = 0;
  40.     //}}AFX_DATA_INIT
  41.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  42.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  43. }
  44.  
  45. void CDiablo2_cheditDlg::DoDataExchange(CDataExchange* pDX)
  46. {
  47.     CDialog::DoDataExchange(pDX);
  48.     //{{AFX_DATA_MAP(CDiablo2_cheditDlg)
  49.     DDX_Text(pDX, IDC_FILENAME, m_filename);
  50.     DDX_Text(pDX, IDC_NAME, m_name);
  51.     DDX_Text(pDX, IDC_LEVEL, m_level);
  52.     DDX_Text(pDX, IDC_EXPERIENCE, m_experience);
  53.     DDX_Text(pDX, IDC_STRENGTH, m_strength);
  54.     DDX_Text(pDX, IDC_DEXTERITY, m_dexterity);
  55.     DDX_Text(pDX, IDC_VITALITY, m_vitality);
  56.     DDX_Text(pDX, IDC_ENERGY, m_energy);
  57.     DDX_Text(pDX, IDC_ATTACK_RATING, m_attackRating);
  58.     DDX_Text(pDX, IDC_STAMINA_CURRENT, m_staminaCurrent);
  59.     DDX_Text(pDX, IDC_STAMINA_MAX, m_staminaMax);
  60.     DDX_Text(pDX, IDC_LIFE_CURRENT, m_lifeCurrent);
  61.     DDX_Text(pDX, IDC_LIFE_MAX, m_lifeMax);
  62.     DDX_Text(pDX, IDC_MANA_CURRENT, m_manaCurrent);
  63.     DDX_Text(pDX, IDC_MANA_MAX, m_manaMax);
  64.     DDX_Text(pDX, IDC_GOLD_PERSON, m_goldPerson);
  65.     DDX_Text(pDX, IDC_GOLD_STASH, m_goldStash);
  66.     DDX_Text(pDX, IDC_CLASS, m_class);
  67.     DDX_Text(pDX, IDC_DEFENSE, m_defense);
  68.     //}}AFX_DATA_MAP
  69. }
  70.  
  71. BEGIN_MESSAGE_MAP(CDiablo2_cheditDlg, CDialog)
  72.     //{{AFX_MSG_MAP(CDiablo2_cheditDlg)
  73.     ON_WM_PAINT()
  74.     ON_WM_QUERYDRAGICON()
  75.     ON_BN_CLICKED(IDC_FILE_LOAD, OnFileLoad)
  76.     ON_BN_CLICKED(IDC_FILE_SAVE, OnFileSave)
  77.     //}}AFX_MSG_MAP
  78. END_MESSAGE_MAP()
  79.  
  80. /////////////////////////////////////////////////////////////////////////////
  81. // CDiablo2_cheditDlg message handlers
  82.  
  83. BOOL CDiablo2_cheditDlg::OnInitDialog()
  84. {
  85.     CDialog::OnInitDialog();
  86.  
  87.     // Set the icon for this dialog.  The framework does this automatically
  88.     //  when the application's main window is not a dialog
  89.     SetIcon(m_hIcon, TRUE);            // Set big icon
  90.     SetIcon(m_hIcon, FALSE);        // Set small icon
  91.     
  92.     // TODO: Add extra initialization here
  93.     
  94.     return TRUE;  // return TRUE  unless you set the focus to a control
  95. }
  96.  
  97. // If you add a minimize button to your dialog, you will need the code below
  98. //  to draw the icon.  For MFC applications using the document/view model,
  99. //  this is automatically done for you by the framework.
  100.  
  101. void CDiablo2_cheditDlg::OnPaint() 
  102. {
  103.     if (IsIconic())
  104.     {
  105.         CPaintDC dc(this); // device context for painting
  106.  
  107.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  108.  
  109.         // Center icon in client rectangle
  110.         int cxIcon = GetSystemMetrics(SM_CXICON);
  111.         int cyIcon = GetSystemMetrics(SM_CYICON);
  112.         CRect rect;
  113.         GetClientRect(&rect);
  114.         int x = (rect.Width() - cxIcon + 1) / 2;
  115.         int y = (rect.Height() - cyIcon + 1) / 2;
  116.  
  117.         // Draw the icon
  118.         dc.DrawIcon(x, y, m_hIcon);
  119.     }
  120.     else
  121.     {
  122.         CDialog::OnPaint();
  123.     }
  124. }
  125.  
  126. // The system calls this to obtain the cursor to display while the user drags
  127. //  the minimized window.
  128. HCURSOR CDiablo2_cheditDlg::OnQueryDragIcon()
  129. {
  130.     return (HCURSOR) m_hIcon;
  131. }
  132.  
  133.  
  134. void CDiablo2_cheditDlg::OnFileLoad()
  135. {
  136.     CFileException    cfex;
  137.     CFileDialog        cfdlg(TRUE, "d2s", "", OFN_OVERWRITEPROMPT, "Diablo 2 save games (*.d2s)|*.d2s||", this);
  138.  
  139.     cfdlg.m_ofn.Flags |= OFN_HIDEREADONLY | OFN_LONGNAMES;
  140.     if (cfdlg.DoModal() == IDOK)
  141.     {
  142.         m_filename = cfdlg.GetPathName();
  143.         if (m_CFile.Open(m_filename, CFile::modeRead, &cfex) == FALSE)
  144.         {
  145.             CString        error_str;
  146.             error_str.Format("Can't open file %s for reading!\nexception error = 0x%0X", m_filename, cfex.m_cause);
  147.             MessageBox(error_str, "ERROR", MB_ICONSTOP);
  148.             return;
  149.         }
  150.  
  151.         LoadData();
  152.         m_CFile.Close();
  153.         UpdateData(FALSE);
  154.         EnableControls();
  155.     }
  156. }
  157.  
  158.  
  159. void CDiablo2_cheditDlg::OnFileSave()
  160. {
  161.     CFileException    cfex;
  162.     UpdateData(TRUE);
  163.  
  164.     if (AfxMessageBox("About to save changes.  I hope you made a backup\ncopy of your SAVE directory!  Are you sure?", MB_YESNO) == IDYES)
  165.     {
  166.         if (m_CFile.Open(m_filename, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite, &cfex) == FALSE)
  167.         {
  168.             CString        error_str;
  169.             error_str.Format("Can't open file %s for writing!\nexception error = 0x%0X", m_filename, cfex.m_cause);
  170.             MessageBox(error_str, "ERROR", MB_ICONSTOP);
  171.             return;
  172.         }
  173.  
  174.         SaveData();
  175.         m_CFile.Close();
  176.     }
  177. }
  178.  
  179.  
  180. void CDiablo2_cheditDlg::EnableControls()
  181. {
  182.     GetDlgItem(IDC_FILE_SAVE)->EnableWindow(TRUE);
  183.     GetDlgItem(IDC_FILENAME)->EnableWindow(TRUE);
  184.     GetDlgItem(IDC_NAME)->EnableWindow(TRUE);
  185. //    GetDlgItem(IDC_CLASS)->EnableWindow(TRUE);
  186.     GetDlgItem(IDC_LEVEL)->EnableWindow(TRUE);
  187.     GetDlgItem(IDC_EXPERIENCE)->EnableWindow(TRUE);
  188.     GetDlgItem(IDC_STRENGTH)->EnableWindow(TRUE);
  189.     GetDlgItem(IDC_DEXTERITY)->EnableWindow(TRUE);
  190.     GetDlgItem(IDC_VITALITY)->EnableWindow(TRUE);
  191.     GetDlgItem(IDC_ENERGY)->EnableWindow(TRUE);
  192.     GetDlgItem(IDC_ATTACK_RATING)->EnableWindow(TRUE);
  193.     GetDlgItem(IDC_DEFENSE)->EnableWindow(TRUE);
  194.     GetDlgItem(IDC_STAMINA_CURRENT)->EnableWindow(TRUE);
  195.     GetDlgItem(IDC_STAMINA_MAX)->EnableWindow(TRUE);
  196.     GetDlgItem(IDC_LIFE_CURRENT)->EnableWindow(TRUE);
  197.     GetDlgItem(IDC_LIFE_MAX)->EnableWindow(TRUE);
  198.     GetDlgItem(IDC_MANA_CURRENT)->EnableWindow(TRUE);
  199.     GetDlgItem(IDC_MANA_MAX)->EnableWindow(TRUE);
  200.     GetDlgItem(IDC_GOLD_PERSON)->EnableWindow(TRUE);
  201.     GetDlgItem(IDC_GOLD_STASH)->EnableWindow(TRUE);
  202. }
  203.  
  204.  
  205. void CDiablo2_cheditDlg::DisableControls()
  206. {
  207.     GetDlgItem(IDC_FILE_SAVE)->EnableWindow(FALSE);
  208.     GetDlgItem(IDC_FILENAME)->EnableWindow(FALSE);
  209.     GetDlgItem(IDC_NAME)->EnableWindow(FALSE);
  210. //    GetDlgItem(IDC_CLASS)->EnableWindow(FALSE);
  211.     GetDlgItem(IDC_LEVEL)->EnableWindow(FALSE);
  212.     GetDlgItem(IDC_EXPERIENCE)->EnableWindow(FALSE);
  213.     GetDlgItem(IDC_STRENGTH)->EnableWindow(FALSE);
  214.     GetDlgItem(IDC_DEXTERITY)->EnableWindow(FALSE);
  215.     GetDlgItem(IDC_VITALITY)->EnableWindow(FALSE);
  216.     GetDlgItem(IDC_ENERGY)->EnableWindow(FALSE);
  217.     GetDlgItem(IDC_ATTACK_RATING)->EnableWindow(FALSE);
  218.     GetDlgItem(IDC_DEFENSE)->EnableWindow(FALSE);
  219.     GetDlgItem(IDC_STAMINA_CURRENT)->EnableWindow(FALSE);
  220.     GetDlgItem(IDC_STAMINA_MAX)->EnableWindow(FALSE);
  221.     GetDlgItem(IDC_LIFE_CURRENT)->EnableWindow(FALSE);
  222.     GetDlgItem(IDC_LIFE_MAX)->EnableWindow(FALSE);
  223.     GetDlgItem(IDC_MANA_CURRENT)->EnableWindow(FALSE);
  224.     GetDlgItem(IDC_MANA_MAX)->EnableWindow(FALSE);
  225.     GetDlgItem(IDC_GOLD_PERSON)->EnableWindow(FALSE);
  226.     GetDlgItem(IDC_GOLD_STASH)->EnableWindow(FALSE);
  227. }
  228.  
  229.  
  230. void CDiablo2_cheditDlg::LoadData()
  231. {
  232.     m_CFile.Seek(OFFSET_NAME, CFile::begin);
  233.     char *p = m_name.GetBuffer(LENGTH_NAME + 1);    // Length is 15 in the file, but add 1 for NULL terminator
  234.     m_CFile.Read(p, LENGTH_NAME);
  235.     m_name.ReleaseBuffer();
  236.  
  237. /*
  238.     m_CFile.Seek(OFFSET_CLASS, CFile::begin);
  239.     m_CFile.Read(&m_class, LENGTH_CLASS);
  240. */
  241.  
  242.     m_CFile.Seek(OFFSET_LEVEL, CFile::begin);
  243.     m_CFile.Read(&m_level, LENGTH_LEVEL);
  244.  
  245.     m_CFile.Seek(OFFSET_EXPERIENCE, CFile::begin);
  246.     m_CFile.Read(&m_experience, LENGTH_EXPERIENCE);
  247.  
  248.     m_CFile.Seek(OFFSET_STRENGTH, CFile::begin);
  249.     m_CFile.Read(&m_strength, LENGTH_STRENGTH);
  250.  
  251.     m_CFile.Seek(OFFSET_DEXTERITY, CFile::begin);
  252.     m_CFile.Read(&m_dexterity, LENGTH_DEXTERITY);
  253.  
  254.     m_CFile.Seek(OFFSET_VITALITY, CFile::begin);
  255.     m_CFile.Read(&m_vitality, LENGTH_VITALITY);
  256.  
  257.     m_CFile.Seek(OFFSET_ENERGY, CFile::begin);
  258.     m_CFile.Read(&m_energy, LENGTH_ENERGY);
  259.  
  260.     m_CFile.Seek(OFFSET_ATTACK_RATING, CFile::begin);
  261.     m_CFile.Read(&m_attackRating, LENGTH_ATTACK_RATING);
  262.  
  263.     m_CFile.Seek(OFFSET_DEFENSE, CFile::begin);
  264.     m_CFile.Read(&m_defense, LENGTH_DEFENSE);
  265.  
  266.     m_CFile.Seek(OFFSET_STAMINA_CURRENT, CFile::begin);
  267.     m_CFile.Read(&m_staminaCurrent, LENGTH_STAMINA_CURRENT);
  268.  
  269.     m_CFile.Seek(OFFSET_STAMINA_MAX, CFile::begin);
  270.     m_CFile.Read(&m_staminaMax, LENGTH_STAMINA_MAX);
  271.  
  272.     m_CFile.Seek(OFFSET_LIFE_CURRENT, CFile::begin);
  273.     m_CFile.Read(&m_lifeCurrent, LENGTH_LIFE_CURRENT);
  274.  
  275.     m_CFile.Seek(OFFSET_LIFE_MAX, CFile::begin);
  276.     m_CFile.Read(&m_lifeMax, LENGTH_LIFE_MAX);
  277.  
  278.     m_CFile.Seek(OFFSET_MANA_CURRENT, CFile::begin);
  279.     m_CFile.Read(&m_manaCurrent, LENGTH_MANA_CURRENT);
  280.  
  281.     m_CFile.Seek(OFFSET_MANA_MAX, CFile::begin);
  282.     m_CFile.Read(&m_manaMax, LENGTH_MANA_MAX);
  283.  
  284.     m_CFile.Seek(OFFSET_GOLD_PERSON, CFile::begin);
  285.     m_CFile.Read(&m_goldPerson, LENGTH_GOLD_PERSON);
  286.  
  287.     m_CFile.Seek(OFFSET_GOLD_STASH, CFile::begin);
  288.     m_CFile.Read(&m_goldStash, LENGTH_GOLD_STASH);
  289. }
  290.  
  291.  
  292. void CDiablo2_cheditDlg::SaveData()
  293. {
  294.     m_CFile.Seek(OFFSET_NAME, CFile::begin);
  295.     char *p = m_name.GetBuffer(LENGTH_NAME + 1);    // Length is 15 in the file, but add 1 for NULL terminator
  296.     m_CFile.Write(p, LENGTH_NAME);
  297.     m_name.ReleaseBuffer();
  298.  
  299. /*
  300.     m_CFile.Seek(OFFSET_CLASS, CFile::begin);
  301.     m_CFile.Write(&m_class, LENGTH_CLASS);
  302. */
  303.  
  304.     m_CFile.Seek(OFFSET_LEVEL, CFile::begin);
  305.     m_CFile.Write(&m_level, LENGTH_LEVEL);
  306.  
  307.     m_CFile.Seek(OFFSET_EXPERIENCE, CFile::begin);
  308.     m_CFile.Write(&m_experience, LENGTH_EXPERIENCE);
  309.  
  310.     m_CFile.Seek(OFFSET_STRENGTH, CFile::begin);
  311.     m_CFile.Write(&m_strength, LENGTH_STRENGTH);
  312.  
  313.     m_CFile.Seek(OFFSET_DEXTERITY, CFile::begin);
  314.     m_CFile.Write(&m_dexterity, LENGTH_DEXTERITY);
  315.  
  316.     m_CFile.Seek(OFFSET_VITALITY, CFile::begin);
  317.     m_CFile.Write(&m_vitality, LENGTH_VITALITY);
  318.  
  319.     m_CFile.Seek(OFFSET_ENERGY, CFile::begin);
  320.     m_CFile.Write(&m_energy, LENGTH_ENERGY);
  321.  
  322.     m_CFile.Seek(OFFSET_ATTACK_RATING, CFile::begin);
  323.     m_CFile.Write(&m_attackRating, LENGTH_ATTACK_RATING);
  324.  
  325.     m_CFile.Seek(OFFSET_DEFENSE, CFile::begin);
  326.     m_CFile.Write(&m_defense, LENGTH_DEFENSE);
  327.  
  328.     m_CFile.Seek(OFFSET_STAMINA_CURRENT, CFile::begin);
  329.     m_CFile.Write(&m_staminaCurrent, LENGTH_STAMINA_CURRENT);
  330.  
  331.     m_CFile.Seek(OFFSET_STAMINA_MAX, CFile::begin);
  332.     m_CFile.Write(&m_staminaMax, LENGTH_STAMINA_MAX);
  333.  
  334.     m_CFile.Seek(OFFSET_LIFE_CURRENT, CFile::begin);
  335.     m_CFile.Write(&m_lifeCurrent, LENGTH_LIFE_CURRENT);
  336.  
  337.     m_CFile.Seek(OFFSET_LIFE_MAX, CFile::begin);
  338.     m_CFile.Write(&m_lifeMax, LENGTH_LIFE_MAX);
  339.  
  340.     m_CFile.Seek(OFFSET_MANA_CURRENT, CFile::begin);
  341.     m_CFile.Write(&m_manaCurrent, LENGTH_MANA_CURRENT);
  342.  
  343.     m_CFile.Seek(OFFSET_MANA_MAX, CFile::begin);
  344.     m_CFile.Write(&m_manaMax, LENGTH_MANA_MAX);
  345.  
  346.     m_CFile.Seek(OFFSET_GOLD_PERSON, CFile::begin);
  347.     m_CFile.Write(&m_goldPerson, LENGTH_GOLD_PERSON);
  348.  
  349.     m_CFile.Seek(OFFSET_GOLD_STASH, CFile::begin);
  350.     m_CFile.Write(&m_goldStash, LENGTH_GOLD_STASH);
  351. }
  352.