home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / gamesystem / source / gs_scoretable.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-10  |  5.1 KB  |  243 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    gsCScoreTable
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    12/03/00
  8. //
  9. // Base:    gsCObject
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "gamesystem.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. gsCScoreTable::gsCScoreTable()
  20. {
  21.     m_position = gsCPoint(0,0);
  22.     m_spacing = gsCPoint(0,0);
  23.     m_font = 0;
  24.     m_current_item = 0;
  25.     m_current_letter = 0;
  26.     m_flash_timer.start();
  27. }
  28.  
  29. //-------------------------------------------------------------
  30.  
  31. gsCScoreTable::~gsCScoreTable()
  32. {
  33.     destroy();
  34. }
  35.  
  36. //-------------------------------------------------------------
  37.  
  38. void gsCScoreTable::destroy()
  39. {
  40.     for (int i = 0; i < m_score_list.getSize(); i++)
  41.         delete m_score_list[i];
  42.  
  43.     m_score_list.clear();
  44. }
  45.  
  46. //-------------------------------------------------------------
  47.  
  48. void gsCScoreTable::setPosition(const gsCPoint& position)
  49. {
  50.     m_position = position;
  51. }
  52.  
  53. //-------------------------------------------------------------
  54.  
  55. void gsCScoreTable::setSpacing(const gsCPoint& spacing)
  56. {
  57.     m_spacing = spacing;
  58. }
  59.  
  60. //-------------------------------------------------------------
  61.  
  62. void gsCScoreTable::setFont(gsCFont *font)
  63. {
  64.     m_font = font;
  65. }
  66.  
  67. //-------------------------------------------------------------
  68.  
  69. void gsCScoreTable::setSize(int size)
  70. {
  71.     destroy();
  72.  
  73.     for (int i = 0; i < size; i++) {
  74.         gsScoreItem *si = new gsScoreItem;
  75.         si->m_score = 0;
  76.         memset(si->m_name,'.',gsSCORE_NAME_SIZE);
  77.         m_score_list.addItem(si);
  78.         }
  79. }
  80.  
  81. //-------------------------------------------------------------
  82.  
  83. int gsCScoreTable::insertScore(int score,const char *name)
  84. {
  85.     for (int i = 0; i < m_score_list.getSize(); i++) {
  86.         if (score > m_score_list[i]->m_score) {
  87.             int last = m_score_list.getSize() - 1;
  88.             gsScoreItem *si = m_score_list[last];
  89.             m_score_list.removeIndex(last);
  90.             si->m_score = score;
  91.             for (unsigned int c = 0; c < gsSCORE_NAME_SIZE; c++) {
  92.                 if (c < strlen(name))
  93.                     si->m_name[c] = name[c];
  94.                 else
  95.                     si->m_name[c] = '.';
  96.                 }
  97.             m_score_list.insertItem(i,si);
  98.             return i;
  99.             }
  100.         }
  101.     return -1;
  102. }
  103.  
  104. //-------------------------------------------------------------
  105.  
  106. bool gsCScoreTable::draw()
  107. {
  108.     if (!m_font)
  109.         return false;
  110.  
  111.     gsCScreen *screen = gsCApplication::getScreen();
  112.  
  113.     if (!screen)
  114.         return false;
  115.  
  116.     bool flash = m_flash_timer.getTime() < 0.1f;
  117.  
  118.     if (m_flash_timer.getTime() > 0.15f)
  119.         m_flash_timer.start();
  120.  
  121.     char buffer[100];
  122.  
  123.     for (int i = 0; i < m_score_list.getSize(); i++) {
  124.  
  125.         gsScoreItem *item = m_score_list[i];
  126.  
  127.         sprintf(buffer,"%8i  ",item->m_score);
  128.         
  129.         int p = strlen(buffer);
  130.  
  131.         for (int c = 0; c < gsSCORE_NAME_SIZE; c++) {
  132.             if (i == m_current_item &&
  133.                 c == m_current_letter &&
  134.                 !flash)
  135.                 buffer[p++] = ' ';
  136.             else
  137.                 buffer[p++] = item->m_name[c];
  138.             }
  139.  
  140.         buffer[p++] = 0;
  141.  
  142.         if (i == m_current_item) {
  143.             gsCPoint size = m_font->getStringSize(buffer);
  144.             int y = m_position.getY() + m_spacing.getY() * i;
  145.             screen->drawSolidRect(gsCRect((screen->getSize().getX() - size.getX()) / 2 - 1,
  146.                                           y - 1,
  147.                                           (screen->getSize().getX() + size.getX()) / 2 + 1,
  148.                                           y + size.getY() + 1),
  149.                                           gsCColour(128,128,128));
  150.             }
  151.  
  152.         m_font->setTextCursor(gsCPoint(0,m_position.getY() + m_spacing.getY() * i));
  153.         m_font->justifyString(buffer);
  154.         }
  155.  
  156.     return true;
  157. }
  158.  
  159. //-------------------------------------------------------------
  160.  
  161. void gsCScoreTable::setCurrentItem(int item)
  162. {
  163.     m_current_item = item;
  164. }
  165.  
  166. //-------------------------------------------------------------
  167.  
  168. int gsCScoreTable::getCurrentItem()
  169. {
  170.     return m_current_item;
  171. }
  172.  
  173. //-------------------------------------------------------------
  174.  
  175. void gsCScoreTable::setCurrentLetter(int letter)
  176. {
  177.     m_current_letter = letter;
  178. }
  179.  
  180. //-------------------------------------------------------------
  181.  
  182. void gsCScoreTable::cycleLetter(int dir)
  183. {
  184.     char& letter = m_score_list[m_current_item]->m_name[m_current_letter];
  185.  
  186.     if (dir > 0) {
  187.         if (letter == '.')
  188.             letter = 'A';
  189.         else {
  190.             letter++;
  191.             if (letter > 'Z')
  192.                 letter = '.';
  193.             }
  194.         }
  195.     if (dir < 0) {
  196.         if (letter == '.')
  197.             letter = 'Z';
  198.         else {
  199.             letter--;
  200.             if (letter < 'A')
  201.                 letter = '.';
  202.             }
  203.         }
  204. }
  205.  
  206. //-------------------------------------------------------------
  207.  
  208. void gsCScoreTable::scrollLetter(int dir)
  209. {
  210.     m_current_letter += dir;
  211.  
  212.     if (m_current_letter < 0)
  213.         m_current_letter = 0;
  214.     if (m_current_letter >= gsSCORE_NAME_SIZE)
  215.         m_current_letter = gsSCORE_NAME_SIZE - 1;
  216. }
  217.  
  218. //-------------------------------------------------------------
  219.  
  220. int gsCScoreTable::getScore(int index)
  221. {
  222.     gsScoreItem *item = m_score_list[index];
  223.  
  224.     if (item)
  225.         return item->m_score;
  226.     else
  227.         return 0;
  228. }
  229.  
  230. //-------------------------------------------------------------
  231.  
  232. const char *gsCScoreTable::getName(int index)
  233. {
  234.     gsScoreItem *item = m_score_list[index];
  235.  
  236.     if (item)
  237.         return item->m_name;
  238.     else
  239.         return 0;
  240. }
  241.  
  242. //-------------------------------------------------------------
  243.