home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / xenon / source / demorecorder.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-23  |  3.5 KB  |  193 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Module:    CDemoRecorder
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    05/05/00
  8. //
  9. // Base:    None
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CDemoRecorder::CDemoRecorder()
  20. {
  21.     m_event_index = 0;
  22.     m_has_level = 0;
  23. }
  24.  
  25. //-------------------------------------------------------------
  26.  
  27. CDemoRecorder::~CDemoRecorder()
  28. {
  29.     destroy();
  30. }
  31.  
  32. //-------------------------------------------------------------
  33.  
  34. void CDemoRecorder::destroy()
  35. {
  36.     for (int i = 0; i < m_event_list.getSize(); i++)
  37.         delete m_event_list[i];
  38.  
  39.     m_event_list.clear();
  40.  
  41.     m_has_level = false;
  42. }
  43.  
  44. //-------------------------------------------------------------
  45.  
  46. bool CDemoRecorder::load(const char *filename)
  47. {
  48.     destroy();
  49.  
  50.     gsCFile file;
  51.  
  52.     gsCFile::setDirectory(DIRECTORY_LEVELS);
  53.  
  54.     if (!file.open(filename,gsFILE_READ))
  55.         return false;
  56.  
  57.     if (file.readString(m_level,_MAX_PATH) == 0) {
  58.         file.close();
  59.         return false;
  60.         }
  61.  
  62.     m_has_level = true;
  63.  
  64.     Controls c;
  65.  
  66.     int v;
  67.  
  68.     while ((v = file.getByte()) != gsFILE_READ_FAILED) {
  69.         c.left = (v & 1) != 0;
  70.         c.right = (v & 2) != 0;
  71.         c.up = (v & 4) != 0;
  72.         c.down = (v & 8) != 0;
  73.         c.fire = (v & 16) != 0;
  74.         c.firePressed = (v & 32) != 0;
  75.  
  76.         addEvent(c);
  77.         }
  78.  
  79.     file.close();    
  80.  
  81.     return true;
  82. }
  83.  
  84. //-------------------------------------------------------------
  85.  
  86. bool CDemoRecorder::save()
  87. {
  88.     if (m_event_list.getSize() == 0 || !m_has_level)
  89.         return false;
  90.  
  91.     gsCFile file;
  92.  
  93.     gsCFile::setDirectory(DIRECTORY_LEVELS);
  94.     
  95.     char demoname[MAX_PATH];
  96.  
  97.     strcpy(demoname,m_level);
  98.  
  99.     char *ext = strchr(demoname,'.');
  100.  
  101.     if (ext == 0)
  102.         return false;
  103.  
  104.     strcpy(ext + 1,"dem");
  105.  
  106.     if (!file.open(demoname,gsFILE_WRITE))
  107.         return false;
  108.  
  109.     file.writeString("%s\n",m_level);
  110.  
  111.     for (int i = 0; i < m_event_list.getSize(); i++) {
  112.         Controls *c = m_event_list[i];
  113.  
  114.         gsUBYTE v = 0;
  115.  
  116.         if (c->left) v += 1;
  117.         if (c->right) v += 2;
  118.         if (c->up) v += 4;
  119.         if (c->down) v += 8;
  120.         if (c->fire) v += 16;
  121.         if (c->firePressed) v += 32;
  122.  
  123.         if (!file.putByte(v))
  124.             break;
  125.         }
  126.  
  127.     file.close();
  128.  
  129.     return true;
  130. }
  131.  
  132. //-------------------------------------------------------------
  133.  
  134. void CDemoRecorder::record()
  135. {
  136.     destroy();
  137. }
  138.  
  139. //-------------------------------------------------------------
  140.  
  141. bool CDemoRecorder::addEvent(const Controls& controls)
  142. {
  143.     Controls *c = new Controls;
  144.     memcpy(c,&controls,sizeof(Controls));
  145.     m_event_list.addItem(c);
  146.  
  147.     return true;
  148. }
  149.  
  150. //-------------------------------------------------------------
  151.     
  152. void CDemoRecorder::playback()
  153. {
  154.     m_event_index = 0;
  155. }
  156.  
  157. //-------------------------------------------------------------
  158.  
  159. bool CDemoRecorder::getEvent(Controls& controls)
  160. {
  161.     if (m_event_index < m_event_list.getSize()) {
  162.         memcpy(&controls,m_event_list[m_event_index++],sizeof(Controls));
  163.         return true;
  164.         }
  165.  
  166.     else
  167.         return false;
  168. }
  169.                 
  170. //-------------------------------------------------------------
  171.  
  172. void CDemoRecorder::setLevel(const char *filename)
  173. {
  174.     if (filename) {
  175.         strcpy(m_level,filename);
  176.         m_has_level = true;
  177.         }
  178.     else
  179.         m_has_level = false;
  180. }
  181.  
  182. //-------------------------------------------------------------
  183.  
  184. const char *CDemoRecorder::getLevel()
  185. {
  186.     if (m_has_level)
  187.         return m_level;
  188.     else
  189.         return 0;
  190. }
  191.  
  192. //-------------------------------------------------------------
  193.