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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CPlayGameState
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    CGameState
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CPlayGameState *CPlayGameState::m_instance = 0;
  20.  
  21. gsCList<CPlayer *> CPlayGameState::m_player_list;
  22. int CPlayGameState::m_active_player = 0;
  23. bool CPlayGameState::m_fast_forward = false;
  24. bool CPlayGameState::m_reached_boss = false;
  25. int CPlayGameState::m_yscroll = 0;
  26.  
  27. bool CPlayGameState::m_paused = false;
  28.  
  29. //-------------------------------------------------------------
  30.  
  31. CPlayGameState::CPlayGameState()
  32. {
  33.     m_ship = 0;
  34. }
  35.  
  36. //-------------------------------------------------------------
  37.  
  38. CPlayGameState::~CPlayGameState()
  39. {
  40. }
  41.  
  42. //-------------------------------------------------------------
  43.  
  44. CGameState *CPlayGameState::instance()
  45. {
  46.     if (!m_instance)
  47.         m_instance = new CPlayGameState;
  48.  
  49.     return m_instance;
  50. }
  51.  
  52. //-------------------------------------------------------------
  53.  
  54. bool CPlayGameState::create()
  55. {
  56.     if (m_screen.getBytesPerPixel() == 1) {
  57.         if (!m_level.load(m_level_filename,DIRECTORY_GRAPHICS8)) {
  58.             gsREPORT("load level failed");
  59.             return false;
  60.             }
  61.         }
  62.     else {
  63.         if (!m_level.load(m_level_filename,DIRECTORY_GRAPHICS24)) {
  64.             gsREPORT("load level failed");
  65.             return false;
  66.             }
  67.         }
  68.  
  69.     m_scene.setMap(&m_level.m_front_layer);
  70.     m_scene.setCollisionListSize(m_screen.getSize(),gsCPoint(8,6));
  71.  
  72.     m_ship = 0;
  73.  
  74.     m_game_end_timer.reset();
  75.  
  76.     gsCPoint map_size = m_level.m_front_layer.getSizeInPixels();
  77.     gsCVector start_position = gsCVector((float) map_size.getX() / 2.f,
  78.                                          (float) (map_size.getY() - PLAYER_START_OFFSET));
  79.     
  80.     for (int i = 0; i < m_number_of_players; i++) {
  81.         CPlayer *player = new CPlayer;
  82.         player->setCheckpoint(start_position);
  83.         m_player_list.addItem(player);
  84.         }
  85.  
  86.     m_active_player = 0;
  87.  
  88.     m_mode = CREATEPLAYER;
  89.  
  90.     if (m_demo_mode == DEMO_RECORD)
  91.         m_demo_recorder.setLevel(m_level_filename);
  92.  
  93.     m_fast_forward = false;
  94.  
  95.     return true;
  96. }
  97.  
  98. //-------------------------------------------------------------
  99.  
  100. void CPlayGameState::setLayerPositions(int ship_y)
  101. {
  102.     int mh = m_level.m_back_layer.getSizeInPixels().getY();
  103.  
  104.     int by = -(mh - (mh - ship_y) / 2 + PLAYER_START_OFFSET / 2 - m_screen.getSize().getY());
  105.  
  106.     m_level.m_back_layer.setPosition(gsCPoint(0,by));
  107.  
  108.     int fy = -(ship_y + PLAYER_START_OFFSET - m_screen.getSize().getY());
  109.  
  110.     m_level.m_front_layer.setPosition(gsCPoint(0,fy));
  111. }
  112.  
  113. //-------------------------------------------------------------
  114.  
  115. void CPlayGameState::createPlayer()
  116. {
  117.     m_scene.killAllActors();
  118.  
  119.     m_ship = new CShip;
  120.     m_scene.addActor(m_ship);
  121.  
  122.     m_ship->activate();
  123.  
  124.     gsCVector start_position = getPlayer()->getCheckpoint();
  125.  
  126.     m_ship->setPosition(start_position);
  127.  
  128.     m_scene.clearCheckpoint();
  129.  
  130.     setLayerPositions((int) start_position.getY());
  131.  
  132.     m_level.reset();
  133.  
  134.     m_ship->setWeapon(MISSILE_WEAPON);
  135.  
  136. #ifdef _PROFILING
  137.     m_ship->attachClone();
  138.     m_ship->attachClone();
  139.     m_ship->attachWingtip();
  140.     m_ship->attachWingtip();
  141.     m_ship->setWeapon(MISSILE_WEAPON,WEAPON_BEST);
  142.     m_ship->addWeapon(HOMING_MISSILE_WEAPON);
  143.     m_ship->addWeapon(HOMING_MISSILE_WEAPON);
  144.     m_ship->addWeapon(LASER_WEAPON);
  145.     m_ship->addWeapon(LASER_WEAPON);
  146. #endif
  147.  
  148.     playSample(SAMPLE_PLAYER_CREATED,m_ship->getPosition().getX());
  149.  
  150.     getPlayer()->loseLife();
  151.  
  152.     m_reached_boss = false;
  153. }
  154.  
  155. //-------------------------------------------------------------
  156.  
  157. bool CPlayGameState::update()
  158. {
  159.     if (!CGameState::update())
  160.         return false;
  161.  
  162.     gsKeyCode key = m_keyboard.getKey();
  163.  
  164.     if (m_paused) {
  165.         if (key == gsKEY_P) {
  166.             m_paused = false;
  167.             gsCApplication::setPaused(false);
  168.             }
  169.         else
  170.             return true;
  171.         }
  172.     else {
  173.         if (key == gsKEY_P) {
  174.             m_paused = true;
  175.             gsCApplication::setPaused(true);
  176.             return true;
  177.             }
  178.         }
  179.  
  180.     if (m_mode == CREATEPLAYER) {
  181.         playMusic(MUSIC_GAME);
  182.         createPlayer();
  183.         m_game_start_timer.start();
  184.         m_mode = PLAYERACTIVE;
  185.         }
  186.  
  187.     Controls controls;
  188.  
  189.     getControl(controls,m_active_player);
  190.  
  191.     if (m_ship) {
  192.         if (controls.divePressed) {
  193.             if (getPlayer()->hasDive()) {
  194.                 m_ship->dive(3.f);
  195.                 getPlayer()->useDive();
  196.                 }
  197.             }
  198.  
  199.         if (controls.reversePressed)
  200.             m_ship->reverseWeapon();
  201.  
  202.         // disable firing when diving
  203.  
  204.         if (m_ship->getDiveLevel() > 0) {
  205.             controls.fire = false;
  206.             controls.firePressed = false;
  207.             }
  208.         }
  209.  
  210.     switch (m_demo_mode) {
  211.         case DEMO_RECORD:
  212.             m_demo_recorder.addEvent(controls);
  213.             break;
  214.         case DEMO_PLAYBACK:
  215.             if (!m_demo_recorder.getEvent(controls))
  216.                 return changeState(CMainMenuState::instance());
  217.             break;
  218.         }
  219.  
  220.     if (Options.getOption(OPTION_BACKDROP))
  221.         m_backdrop.draw(gsCPoint(0,0));
  222.     else
  223.         m_screen.clear(gsCColour(gsBLACK));
  224.  
  225.     int loop = 1;
  226.  
  227.     if (m_fast_forward)
  228.         loop = 16;
  229.  
  230.     while (loop-- > 0) {
  231.  
  232.         //    m_starfield.move(4);
  233.         //    m_starfield.draw();
  234.  
  235.         if (m_mode == PLAYERACTIVE)
  236.             m_level.scanForNewActors(&m_scene);
  237.  
  238.         static even = true;        //TEMP
  239.  
  240.         even = !even;
  241.  
  242.         if (even && !m_reached_boss)
  243.             m_level.m_back_layer.move(gsCPoint(0,1));
  244.             
  245.         if (m_level.m_back_layer.getPosition().getY() > 0)
  246.             m_level.m_back_layer.setPosition(gsCPoint(0,0));
  247.  
  248.         if (!m_reached_boss) {
  249.             if (CBossControl::isStarted()) {
  250.                 m_reached_boss = true;
  251.                 playMusic(MUSIC_BOSS);
  252.                 }
  253.             }
  254.  
  255.         if (CBossControl::isStarted())
  256.             m_yscroll = CBossControl::getYScroll();
  257.         else
  258.             m_yscroll = 1;
  259.  
  260.         m_level.m_front_layer.move(gsCPoint(0,m_yscroll));
  261.  
  262.         if (m_level.m_front_layer.getPosition().getY() > 0)
  263.             m_level.m_front_layer.setPosition(gsCPoint(0,0));
  264.  
  265.         int sprite_hits = 0;
  266.         int map_hits = 0;
  267.  
  268. //#ifdef _PROFILING
  269. //    controls.firePressed = controls.fire = true;
  270. //#endif
  271.  
  272.         m_scene.updateAllActors(&controls);
  273.         m_level.m_back_layer.draw();
  274.         m_scene.drawAllActors(&m_level.m_front_layer);
  275.         m_scene.checkActorCollisions();
  276.         m_scene.checkMapCollisions(&m_level.m_front_layer);
  277.         m_scene.removeDeadActors();
  278.         }
  279.  
  280.     testDebugKeys(key);
  281.  
  282.     if (key == gsKEY_ESCAPE || (key != gsKEY_NONE && m_demo_mode == DEMO_PLAYBACK)) {
  283.         setDemoMode(DEMO_OFF);
  284.  
  285. #ifdef _PROFILING
  286.         return false;
  287. #else
  288.         return changeState(CMainMenuState::instance());
  289. #endif
  290.         }
  291.  
  292.     displayScores();
  293.     displayLives();
  294.     displayEnergyBar();
  295.  
  296.     if (m_reached_boss)
  297.         displayBossEnergyBar();
  298.  
  299.     printDebugInfo();
  300.  
  301.     if (m_demo_mode == DEMO_PLAYBACK) {
  302.         m_medium_font.setTextCursor(gsCPoint(0,100));
  303.         m_medium_font.justifyString("DEMONSTRATION");
  304.         }
  305.  
  306.     switch (m_mode) {
  307.         case PLAYERACTIVE:
  308.             if (m_game_start_timer.getState() == gsTIMER_ACTIVE) {
  309.                 if (m_game_start_timer.getTime() < 1.f) {
  310.                     m_medium_font.setTextCursor(gsCPoint(0,232));
  311.                     if (m_number_of_players == 1)
  312.                         m_medium_font.justifyString("Get Ready");
  313.                     else {
  314.                         if (m_active_player == 0)
  315.                             m_medium_font.justifyString("Player One");
  316.                         else
  317.                             m_medium_font.justifyString("Player Two");
  318.                         }
  319.                     }
  320.                 else
  321.                     m_game_start_timer.reset();
  322.                 }
  323.  
  324.             if (m_ship->getShield() == 0) {
  325.                 m_game_end_timer.start();
  326.                 playSample(SAMPLE_PLAYER_DESTROYED,m_ship->getPosition().getX());
  327.                 m_ship->explode();
  328.                 m_ship->kill();
  329.                 m_scene.removeDeadActors();
  330.                 m_ship = 0;
  331.                 m_mode = PLAYERDEAD;
  332.                 break;
  333.                 }
  334.             
  335.             if (m_reached_boss && CBoss::getShield() == 0) {
  336.                 playMusic(MUSIC_OUTRO);
  337.                 m_game_end_timer.start();
  338.                 m_mode = GAMEWON;
  339.                 break;
  340.                 }
  341.  
  342.             if (m_scene.hasCheckpoint()) {
  343.                 if (m_ship->getPosition().getY() <= m_scene.getCheckpoint().getY()) {
  344.                     if (getPlayer()->getCheckpoint() != m_scene.getCheckpoint()) {
  345.                         getPlayer()->setCheckpoint(m_scene.getCheckpoint());
  346.                         m_scene.createLabel(m_scene.getCheckpoint(),"CHECKPOINT REACHED");
  347.                         playSample(SAMPLE_CHECKPOINT);
  348.                         }
  349.                     m_scene.clearCheckpoint();
  350.                     }
  351.                 }
  352.  
  353.             break;
  354.  
  355.         case PLAYERDEAD:
  356.  
  357.             stopMusic();
  358.  
  359.             m_fast_forward = false;
  360.  
  361.             if (m_game_end_timer.getTime() >= 1.f) {
  362.                 if (m_demo_mode != DEMO_OFF) {
  363.                     setDemoMode(DEMO_OFF);
  364.                     return changeState(CMainMenuState::instance());
  365.                     }
  366.  
  367.                 swapPlayer();
  368.                 if (getPlayer()->getLives() > 0)
  369.                     m_mode = CREATEPLAYER;
  370.                 else
  371.                     m_mode = GAMEOVER;
  372.                 }
  373.             break;
  374.  
  375.         case GAMEOVER:
  376.             m_medium_font.setTextCursor(gsCPoint(0,232));
  377.             m_medium_font.justifyString("Game Over");
  378.             if (m_game_end_timer.getTime() >= 3.f) {
  379.                 stopSamples();
  380.  
  381. #ifdef _PROFILING
  382.             return false;
  383. #endif
  384.  
  385.                 if (addNewScore(getPlayer()->getScore()))
  386.                     return changeState(CScoreEntryState::instance());
  387.                 else
  388.                     return changeState(CViewScoresState::instance());
  389.                 }
  390.             break;
  391.  
  392.         case GAMEWON:
  393.  
  394.             if (m_game_end_timer.getTime() >= 3.f) {
  395.                 m_medium_font.setTextCursor(gsCPoint(0,232));
  396.                 m_medium_font.justifyString("Congratulations");
  397.                 }
  398.  
  399.             if (m_game_end_timer.getTime() >= 6.f) {
  400.                 stopSamples();
  401.  
  402.                 if (addNewScore(getPlayer()->getScore()))
  403.                     return changeState(CScoreEntryState::instance());
  404.                 else
  405.                     return changeState(CViewScoresState::instance());
  406.                 }
  407.             break;
  408.         }
  409.  
  410.     m_screen.flip();
  411.  
  412.     if (m_sound_system.isMusicFinished() && m_mode != GAMEWON) {
  413.         if (m_reached_boss)
  414.             playMusic(MUSIC_BOSS);
  415.         else
  416.             playMusic(MUSIC_GAME);
  417.         }
  418.  
  419.     return true;
  420. }
  421.  
  422. //-------------------------------------------------------------
  423.  
  424. void CPlayGameState::swapPlayer()
  425. {
  426.     // skip if one player game
  427.  
  428.     if (m_number_of_players == 1)
  429.         return;
  430.  
  431.     // only swap to other player if it has lives left
  432.  
  433.     int other_player = 1 - m_active_player;
  434.  
  435.     if (m_player_list[other_player]->getLives() > 0)
  436.         m_active_player = other_player;
  437. }
  438.  
  439. //-------------------------------------------------------------
  440.  
  441. bool CPlayGameState::destroy()
  442. {
  443.     m_scene.killAllActors();
  444.     m_ship = 0;
  445.  
  446.     for (int i = 0; i < m_player_list.getSize(); i++)
  447.         delete m_player_list[i];
  448.  
  449.     m_player_list.clear();
  450.  
  451.     return true;
  452. }
  453.  
  454. //-------------------------------------------------------------
  455.  
  456. void CPlayGameState::displayScores()
  457. {
  458.     m_small_font.setTextCursor(gsCPoint(320,10));
  459.     m_small_font.justifyString("Hi Score");
  460.  
  461.     m_small_font.setTextCursor(gsCPoint(320,20));
  462.     m_small_font.justifyString("%010i",m_score_table.getScore(0));
  463.  
  464.     if (m_number_of_players == 1) {
  465.         m_small_font.setTextCursor(gsCPoint(10,10));
  466.         m_small_font.printString("Player One");
  467.  
  468.         m_medium_font.setTextCursor(gsCPoint(10,20));
  469.         m_medium_font.printString("%010i",m_player_list[0]->getScore());
  470.         }
  471.     else {
  472.         m_small_font.setTextCursor(gsCPoint(10,10));
  473.         m_small_font.printString("Player One");
  474.  
  475.         m_small_font.setTextCursor(gsCPoint(640 - 10 - 10 * 8,10));
  476.         m_small_font.printString("Player Two");
  477.  
  478.         if (m_active_player == 0) {
  479.             m_medium_font.setTextCursor(gsCPoint(10,20));
  480.             m_medium_font.printString("%010i",m_player_list[0]->getScore());
  481.             m_small_font.setTextCursor(gsCPoint(640 - 10 - 10 * 8,20));
  482.             m_small_font.printString("%010i",m_player_list[1]->getScore());
  483.             }
  484.         else {
  485.             m_small_font.setTextCursor(gsCPoint(10,20));
  486.             m_small_font.printString("%010i",m_player_list[0]->getScore());
  487.             m_medium_font.setTextCursor(gsCPoint(640 - 10 - 10 * 16,20));
  488.             m_medium_font.printString("%010i",m_player_list[1]->getScore());
  489.             }
  490.         }
  491.  
  492. }
  493.  
  494. //-------------------------------------------------------------
  495.  
  496. void CPlayGameState::displayLives()
  497. {
  498.     gsCImage *life_symbol = m_scene.getImage("PULife.bmp");
  499.  
  500.     for (int i = 0; i < getPlayer()->getLives(); i++)
  501.         life_symbol->draw(gsCPoint(10 + i * 32,480 - 64));
  502.  
  503.     if (getPlayer()->hasDive()) {
  504.         gsCTiledImage *dive_symbol = m_scene.getImage("PUDive.bmp");
  505.  
  506.         dive_symbol->draw(0,gsCPoint(10,480 - 104));
  507.         }
  508. }
  509.  
  510. //-------------------------------------------------------------
  511.  
  512. void CPlayGameState::displayEnergyBar()
  513. {
  514.     const int x = 10;
  515.     const int y = 480 - 20;
  516.  
  517.     m_screen.drawRect(gsCRect(x - 1,y - 1,x + ENERGYBAR_WIDTH,y + ENERGYBAR_HEIGHT),gsCColour(gsWHITE));
  518.  
  519.     int shield = 0;
  520.  
  521.     if (m_ship)
  522.         shield =  ENERGYBAR_WIDTH * m_ship->getShield() / m_ship->getActorInfo().m_initial_shield;
  523.  
  524.     if (shield < 0)
  525.         shield = 0;
  526.     if (shield > ENERGYBAR_WIDTH)
  527.         shield = ENERGYBAR_WIDTH;
  528.  
  529.     gsCColour shield_colour;
  530.  
  531.     if (m_ship && m_ship->isCloaked())
  532.         shield_colour = gsCColour(gsBLUE);
  533.     else {
  534.         if (shield < ENERGYBAR_WIDTH / 3)
  535.             shield_colour = gsCColour(gsRED);
  536.         else if (shield < ENERGYBAR_WIDTH * 2 / 3)
  537.             shield_colour = gsCColour(gsYELLOW);
  538.         else
  539.             shield_colour = gsCColour(gsGREEN);
  540.         }
  541.  
  542.     m_screen.drawSolidRect(gsCRect(x,y,x + shield,y + 9),shield_colour);
  543.  
  544.     for (int i = ENERGYBAR_STEP; i < ENERGYBAR_WIDTH; i += ENERGYBAR_STEP) {
  545.         if (i <= shield) {
  546.             m_screen.drawLine(gsCPoint(x + i,y),
  547.                               gsCPoint(x + i,y + ENERGYBAR_HEIGHT - 1),
  548.                               gsCColour(gsBLACK));
  549.             }
  550.         }
  551. }
  552.  
  553. //-------------------------------------------------------------
  554.  
  555. void CPlayGameState::displayBossEnergyBar()
  556. {
  557.     const int x = 320 - 50;
  558.     const int y = 50;
  559.  
  560.     m_small_font.setTextCursor(gsCPoint(x + 6,y - 10));
  561.     m_small_font.printString("BOSS SHIELD");
  562.  
  563.     m_screen.drawRect(gsCRect(x - 1,y - 1,x + 100,y + 9),gsCColour(gsWHITE));
  564.  
  565.     int shield = CBoss::getShield();
  566.  
  567.     if (shield < 0)
  568.         shield = 0;
  569.     if (shield > 100)
  570.         shield = 100;
  571.  
  572.     m_screen.drawSolidRect(gsCRect(x,y,x + shield,y + 9),gsCColour(gsRED));
  573. }
  574.  
  575. //-------------------------------------------------------------
  576.  
  577. void CPlayGameState::testDebugKeys(gsKeyCode key)
  578. {
  579.     if (!Options.getOption(OPTION_CHEATS) ||
  580.         !m_ship)
  581.         return;
  582.  
  583.     switch (key) {
  584.  
  585.         case gsKEY_1:    m_ship->upgradeWeapon();                                    break;
  586.         case gsKEY_2:    m_ship->addWeapon(MISSILE_WEAPON,WEAPON_MEDIUM);            break;
  587.         case gsKEY_3:    m_ship->addWeapon(MISSILE_WEAPON,WEAPON_BEST);                break;
  588.         case gsKEY_4:    m_ship->addWeapon(LASER_WEAPON,WEAPON_STANDARD);            break;
  589.         case gsKEY_5:    m_ship->addWeapon(LASER_WEAPON,WEAPON_MEDIUM);                break;
  590.         case gsKEY_6:    m_ship->addWeapon(LASER_WEAPON,WEAPON_BEST);                break;
  591.         case gsKEY_7:    m_ship->addWeapon(HOMING_MISSILE_WEAPON,WEAPON_STANDARD);    break;
  592.  
  593.         case gsKEY_8:    m_ship->attachClone(0);    break;
  594.         case gsKEY_9:    m_ship->attachWingtip(0);    break;
  595.         case gsKEY_0:    m_ship->removeUpgrades();    break;
  596.  
  597.         case gsKEY_NUMPAD1:    m_ship->setHandling(HANDLING_BAD);    break;
  598.         case gsKEY_NUMPAD2:    m_ship->setHandling(HANDLING_NORMAL);    break;
  599.         case gsKEY_NUMPAD3:    m_ship->setHandling(HANDLING_GOOD);    break;
  600.  
  601.         case gsKEY_ADD:            getPlayer()->scoreBonus(50);    break;
  602.         case gsKEY_MULTIPLY:    getPlayer()->extraLife();        break;
  603.  
  604.         case gsKEY_C:    m_ship->setCloak(5.f);    break;
  605.  
  606.         case gsKEY_B:    Options.toggleOption(OPTION_BACKDROP);        break;
  607.         case gsKEY_I:    Options.toggleOption(OPTION_DEBUGINFO);        break;
  608.  
  609.         case gsKEY_X:
  610.             {
  611.                 m_fast_forward = !m_fast_forward;
  612.                 if (m_fast_forward)
  613.                     m_ship->setCloak(999.f);
  614.                 else
  615.                     m_ship->setCloak(1.f);
  616.                 break;
  617.             }
  618.  
  619.         }
  620. }
  621.  
  622. //-------------------------------------------------------------
  623.  
  624. void CPlayGameState::printDebugInfo()
  625. {
  626.     if (!Options.getOption(OPTION_DEBUGINFO))
  627.         return;
  628.  
  629.     m_small_font.setTextCursor(gsCPoint(640 - 128,60));
  630.     m_small_font.printString("actors %i",m_scene.getNumberOfActors());
  631.     m_small_font.setTextCursor(gsCPoint(640 - 128,70));
  632.     m_small_font.printString("images %i",m_scene.getNumberOfImages());
  633.  
  634.     int totals[ACTOR_TYPE_TOTAL] = { 0 };
  635.  
  636.     for (int i = 0; i < m_scene.getNumberOfActors(); i++) {
  637.         ActorType t = m_scene.getActor(i)->getActorInfo().m_type;
  638.         totals[(int) t]++;
  639.         }
  640.  
  641.     m_small_font.setTextCursor(gsCPoint(640 - 128,90));
  642.     m_small_font.printString("ship  %i",totals[0]);
  643.     m_small_font.setTextCursor(gsCPoint(640 - 128,100));
  644.     m_small_font.printString("bullet  %i",totals[1]);
  645.     m_small_font.setTextCursor(gsCPoint(640 - 128,110));
  646.     m_small_font.printString("upgrade %i",totals[2]);
  647.     m_small_font.setTextCursor(gsCPoint(640 - 128,120));
  648.     m_small_font.printString("engine  %i",totals[3]);
  649.     m_small_font.setTextCursor(gsCPoint(640 - 128,130));
  650.     m_small_font.printString("weapon  %i",totals[4]);
  651.     m_small_font.setTextCursor(gsCPoint(640 - 128,140));
  652.     m_small_font.printString("pickup  %i",totals[5]);
  653.     m_small_font.setTextCursor(gsCPoint(640 - 128,150));
  654.     m_small_font.printString("alien   %i",totals[6]);
  655.     m_small_font.setTextCursor(gsCPoint(640 - 128,160));
  656.     m_small_font.printString("abullet %i",totals[7]);
  657.     m_small_font.setTextCursor(gsCPoint(640 - 128,170));
  658.     m_small_font.printString("label   %i",totals[8]);
  659.     m_small_font.setTextCursor(gsCPoint(640 - 128,180));
  660.     m_small_font.printString("effect  %i",totals[9]);
  661.     
  662.     m_small_font.setTextCursor(gsCPoint(640 - 24,470));
  663.     m_small_font.printString("%i",(int) (getApplication()->getFrameRate() + 0.5f));
  664. }    
  665.  
  666. //-------------------------------------------------------------
  667.  
  668. CPlayer *CPlayGameState::getPlayer()
  669. {
  670.     return m_player_list[m_active_player];
  671. }
  672.  
  673. //-------------------------------------------------------------
  674.  
  675. bool CPlayGameState::reachedBoss()
  676. {
  677.     return m_reached_boss;
  678. }
  679.  
  680. //-------------------------------------------------------------
  681.  
  682. int CPlayGameState::getYScroll()
  683. {
  684.     return m_yscroll;
  685. }
  686.  
  687. //-------------------------------------------------------------
  688.