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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CGameState
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    None
  10. //
  11. // Derived:    CMainMenuState
  12. //            COptionsMenuState
  13. //            CPlayGameState
  14. //            CScoreEntryState
  15. //            CScoreTableState
  16. //
  17. //-------------------------------------------------------------
  18.  
  19. #include "game.h"
  20.  
  21. //-------------------------------------------------------------
  22.  
  23. gsCScreen        CGameState::m_screen;
  24. gsCKeyboard        CGameState::m_keyboard;
  25. gsCJoystick        CGameState::m_joystick;
  26. gsCSoundSystem    CGameState::m_sound_system;
  27.  
  28. gsCFont            CGameState::m_small_font;
  29. gsCFont            CGameState::m_medium_font;
  30. gsCStarfield    CGameState::m_starfield;
  31. gsCScoreTable    CGameState::m_score_table;
  32. gsCImage        CGameState::m_backdrop;
  33.  
  34. char            CGameState::m_level_filename[MAX_FILENAME_SIZE];
  35.  
  36. CLevel            CGameState::m_level;
  37. CScene            CGameState::m_scene;
  38. CXenon *        CGameState::m_xenon = 0;
  39.  
  40. int                CGameState::m_number_of_players = 1;
  41.  
  42. CDemoRecorder    CGameState::m_demo_recorder;
  43. DemoMode        CGameState::m_demo_mode = DEMO_OFF;
  44.  
  45. //-------------------------------------------------------------
  46.  
  47. CGameState::CGameState()
  48. {
  49. }
  50.  
  51. //-------------------------------------------------------------
  52.  
  53. CGameState::~CGameState()
  54. {
  55. }
  56.  
  57. //-------------------------------------------------------------
  58.  
  59. bool CGameState::initialize(CXenon *xenon)
  60. {
  61.     m_xenon = xenon;
  62.  
  63.     gsCFile::setDirectory(DIRECTORY_ROOT);
  64.  
  65.     Options.load(OPTIONS_FILENAME);
  66.  
  67.     if (!ActorInfoList.load(ACTORINFO_FILENAME))
  68.         return false;
  69.  
  70.     if (!m_sound_system.create())
  71.         return false;
  72.  
  73.     updateVolume();
  74.  
  75.     if (!m_keyboard.create())
  76.         return false;
  77.  
  78.     // joystick is optional
  79.  
  80.     if (Options.getOption(OPTION_JOYSTICK)) {
  81.         if (!m_joystick.create())
  82.             m_joystick.destroy();
  83.         }
  84.  
  85.     if (Options.getOption(OPTION_WINDOWED)) {
  86.         if (!m_screen.createWindowed(m_xenon->getWindow()))
  87.             return false;
  88.         }
  89.     else {
  90.         int colour_depth = Options.getOption(OPTION_COLOURDEPTH);
  91.  
  92.         gsCPoint res;
  93.  
  94. //        if (Options.getOption(OPTION_HIRES))
  95.             res = gsCPoint(640,480);
  96. //        else
  97. //            res = gsCPoint(320,240);
  98.  
  99.         if (!m_screen.createFullScreen(m_xenon->getWindow(),res,colour_depth))
  100.             return false;
  101.         }
  102.  
  103.     if (m_screen.getBytesPerPixel() == 1) {
  104.         gsCFile::setDirectory(DIRECTORY_GRAPHICS8);
  105.         m_screen.loadPalette("xenon.pal");
  106.         }
  107.  
  108.     // pre-load music/soundfx
  109.  
  110.     gsCFile::setDirectory(DIRECTORY_MUSIC);
  111.  
  112.     if (!loadMusic())
  113.         return false;
  114.  
  115.     gsCFile::setDirectory(DIRECTORY_SOUNDS);
  116.  
  117.     if (!loadSoundEffects())
  118.         return false;
  119.  
  120.     // pre-load graphics
  121.  
  122.     if (m_screen.getBytesPerPixel() == 1)
  123.         gsCFile::setDirectory(DIRECTORY_GRAPHICS8);
  124.     else
  125.         gsCFile::setDirectory(DIRECTORY_GRAPHICS24);
  126.  
  127.     if (!loadGraphics())
  128.         return false;
  129.  
  130.     m_starfield.initialize(8);
  131.  
  132.     loadScoreTable();
  133.  
  134. #ifdef _PROFILING
  135.     strcpy(m_level_filename,"test.fmp");
  136.     m_xenon->changeState(CPlayGameState::instance());
  137. #else
  138.     m_xenon->changeState(CMainMenuState::instance());
  139. #endif
  140.  
  141.     return true;
  142. }
  143.  
  144. //-------------------------------------------------------------
  145.  
  146. bool CGameState::shutdown()
  147. {
  148.     saveScoreTable();
  149.  
  150.     m_level.m_image.destroy();
  151.  
  152. //    m_backdrop_tiles.destroy();
  153.     m_backdrop.destroy();
  154.  
  155.     m_medium_font.destroy();
  156.     m_small_font.destroy();
  157.  
  158.     m_scene.destroyAll();
  159.  
  160.     m_screen.destroy();
  161.  
  162.     m_joystick.destroy();
  163.     m_keyboard.destroy();
  164.  
  165.     m_sound_system.destroy();
  166.  
  167.     return true;
  168. }
  169.  
  170. //-------------------------------------------------------------
  171.  
  172. bool CGameState::changeState(CGameState *new_game_state)
  173. {
  174.     if (m_xenon)
  175.         return m_xenon->changeState(new_game_state);
  176.  
  177.     return false;
  178. }
  179.  
  180. //-------------------------------------------------------------
  181.  
  182. bool CGameState::create()
  183. {
  184.     return true;
  185. }
  186.  
  187. //-------------------------------------------------------------
  188.  
  189. bool CGameState::update()
  190. {
  191.     return true;
  192. }
  193.  
  194. //-------------------------------------------------------------
  195.  
  196. bool CGameState::destroy()
  197. {
  198.     return true;
  199. }
  200.  
  201. //-------------------------------------------------------------
  202.  
  203. bool CGameState::loadGraphics()
  204. {
  205.     if (!m_scene.loadImages())
  206.         return false;
  207.  
  208.     if (!m_small_font.load("font8x8.bmp"))
  209.         return false;
  210.  
  211.     m_small_font.setTileSize(gsCPoint(8,8));
  212.     m_small_font.enableColourKey(gsCColour(gsMAGENTA));
  213.  
  214.     if (!m_medium_font.load("font16x16.bmp"))
  215.         return false;
  216.  
  217.     m_medium_font.setTileSize(gsCPoint(16,16));
  218.     m_medium_font.enableColourKey(gsCColour(gsMAGENTA));
  219.  
  220.     CLabel::setFont(&m_small_font);
  221.  
  222.     if (!m_backdrop.load("galaxy2.bmp"))
  223.         return false;
  224.     
  225.     return true;
  226. }
  227.  
  228. //-------------------------------------------------------------
  229.  
  230. bool CGameState::loadMusic()
  231. {
  232.     m_sound_system.addMusic("title.mp3");
  233.     m_sound_system.addMusic("intro.mp3");
  234.     m_sound_system.addMusic("game.mp3");
  235.     m_sound_system.addMusic("hiscore.mp3");
  236.     m_sound_system.addMusic("boss.mp3");
  237.     m_sound_system.addMusic("outro.mp3");
  238.  
  239.     return true;
  240. }
  241.  
  242. //-------------------------------------------------------------
  243.  
  244. bool CGameState::loadSoundEffects()
  245. {
  246.     m_sound_system.addSample("menu_selection.wav");
  247.     m_sound_system.addSample("menu_option.wav");
  248.     m_sound_system.addSample("menu_click.wav");
  249.     m_sound_system.addSample("menu_back.wav");
  250.  
  251.     m_sound_system.addSample("player_created.wav");
  252.     m_sound_system.addSample("player_destroyed.wav");
  253.     m_sound_system.addSample("fire_missile.wav");
  254.     m_sound_system.addSample("fire_homing_missile.wav");
  255.     m_sound_system.addSample("fire_laser.wav");
  256.     m_sound_system.addSample("small_explosion.wav");
  257.     m_sound_system.addSample("medium_explosion.wav");
  258.     m_sound_system.addSample("big_explosion.wav");
  259.     m_sound_system.addSample("asteroid_breakup.wav");
  260.     m_sound_system.addSample("pickup.wav");
  261.     m_sound_system.addSample("bonus.wav");
  262.     m_sound_system.addSample("dive_down.wav");
  263.     m_sound_system.addSample("dive_up.wav");
  264.     m_sound_system.addSample("hit_background.wav");
  265.  
  266.     m_sound_system.addSample("roar.wav");
  267.     m_sound_system.addSample("snort.wav");
  268.  
  269.     m_sound_system.addSample("checkpoint.wav");
  270.  
  271.     return true;
  272. }
  273.  
  274. //-------------------------------------------------------------
  275.  
  276. void CGameState::updateVolume()
  277. {
  278.     m_sound_system.setVolume(Options.getOption(OPTION_MUSIC) * 10,
  279.                              Options.getOption(OPTION_SOUNDFX) * 10);
  280. }
  281.  
  282. //-------------------------------------------------------------
  283.  
  284. bool CGameState::addNewScore(int score)
  285. {
  286.     int pos = m_score_table.insertScore(score,"A");
  287.  
  288.     if (pos == -1)
  289.         return false;
  290.  
  291.     m_score_table.setCurrentItem(pos);
  292.     m_score_table.setCurrentLetter(0);
  293.  
  294.     return true;
  295. }
  296.  
  297. //-------------------------------------------------------------
  298.  
  299. gsCApplication *CGameState::getApplication()
  300. {
  301.     return m_xenon;
  302. }
  303.  
  304. //-------------------------------------------------------------
  305.  
  306. void CGameState::playSample(GameSampleType sample)
  307. {
  308.     if (Options.getOption(OPTION_SOUNDFX))
  309.         m_sound_system.playSample((int) sample);
  310. }
  311.  
  312. //-------------------------------------------------------------
  313. // play sample with stereo position based on screen x coordinate
  314.  
  315. void CGameState::playSample(GameSampleType sample,float x)
  316. {
  317.     if (Options.getOption(OPTION_SOUNDFX)) {
  318.         int w2 = gsCApplication::getScreen()->getSize().getX() / 2;
  319.         m_sound_system.playSample((int) sample,100 * ((int) x - w2) / w2);
  320.         }
  321. }
  322.  
  323. //-------------------------------------------------------------
  324.  
  325. void CGameState::playMusic(GameMusicType music)
  326. {
  327.     if (Options.getOption(OPTION_MUSIC))
  328.         m_sound_system.playMusic((int) music);
  329. };
  330.  
  331. //-------------------------------------------------------------
  332.  
  333. void CGameState::stopSamples()
  334. {
  335.     m_sound_system.stopSamples();
  336. }
  337.  
  338. //-------------------------------------------------------------
  339.  
  340. void CGameState::stopMusic()
  341. {
  342.     m_sound_system.stopMusic();
  343. }
  344.  
  345. //-------------------------------------------------------------
  346.  
  347. gsKeyCode CGameState::getKey()
  348. {
  349.     gsKeyCode key = m_keyboard.getKey();
  350.  
  351.     if (key == gsKEY_NONE && Options.getOption(OPTION_JOYSTICK) == 1) {
  352.         if (m_joystick.getNumSticks() > 0) {
  353.             gsJoystickCode code = m_joystick.getEmulatedKey();
  354.  
  355.             switch (code) {
  356.                 case gsJOY_LEFT:    key = gsKEY_LEFT;        break;
  357.                 case gsJOY_RIGHT:    key = gsKEY_RIGHT;        break;
  358.                 case gsJOY_UP:        key = gsKEY_UP;            break;
  359.                 case gsJOY_DOWN:    key = gsKEY_DOWN;        break;
  360.                 case gsJOY_BUTTON0:    key = gsKEY_LCONTROL;    break;
  361.                 }
  362.             }
  363.         }
  364.  
  365.     return key;
  366. }
  367.  
  368. //-------------------------------------------------------------
  369.  
  370. void CGameState::getControl(Controls& controls,int player)
  371. {
  372.     ControllerType type;
  373.  
  374.     if (player == 0)
  375.         type = (ControllerType) Options.getOption(OPTION_CONTROL1);
  376.     else
  377.         type = (ControllerType) Options.getOption(OPTION_CONTROL2);
  378.  
  379.     // safety
  380.  
  381.     switch (type) {
  382.         case JOYSTICK_1:
  383.             if (m_joystick.getNumSticks() < 1)
  384.                 type = KEYBOARD_LAYOUT_1;
  385.             break;
  386.         case JOYSTICK_2:
  387.             if (m_joystick.getNumSticks() < 2)
  388.                 type = KEYBOARD_LAYOUT_1;
  389.             break;
  390.         }
  391.  
  392.     switch (type) {
  393.         case KEYBOARD_LAYOUT_1:
  394.             controls.left = m_keyboard.testKey(gsKEY_LEFT);
  395.             controls.right = m_keyboard.testKey(gsKEY_RIGHT);
  396.             controls.up = m_keyboard.testKey(gsKEY_UP);
  397.             controls.down = m_keyboard.testKey(gsKEY_DOWN);
  398.             controls.fire = m_keyboard.testKey(gsKEY_LCONTROL,gsKEY_STATE);
  399.             controls.firePressed = m_keyboard.testKey(gsKEY_LCONTROL,gsKEY_PRESSED);
  400.             controls.divePressed = m_keyboard.testKey(gsKEY_LSHIFT,gsKEY_PRESSED);
  401.             controls.reversePressed = m_keyboard.testKey(gsKEY_ALT,gsKEY_PRESSED);
  402.             break;
  403.         
  404.         case KEYBOARD_LAYOUT_2:
  405.             controls.left = m_keyboard.testKey(gsKEY_LEFT);
  406.             controls.right = m_keyboard.testKey(gsKEY_RIGHT);
  407.             controls.up = m_keyboard.testKey(gsKEY_UP);
  408.             controls.down = m_keyboard.testKey(gsKEY_DOWN);
  409.             controls.fire = m_keyboard.testKey(gsKEY_A,gsKEY_STATE);
  410.             controls.firePressed = m_keyboard.testKey(gsKEY_A,gsKEY_PRESSED);
  411.             controls.divePressed = m_keyboard.testKey(gsKEY_D,gsKEY_PRESSED);
  412.             controls.reversePressed = m_keyboard.testKey(gsKEY_S,gsKEY_PRESSED);
  413.             break;
  414.  
  415.         case JOYSTICK_1:
  416.             controls.left = m_joystick.testButton(gsJOY_LEFT);
  417.             controls.right = m_joystick.testButton(gsJOY_RIGHT);
  418.             controls.up = m_joystick.testButton(gsJOY_UP);
  419.             controls.down = m_joystick.testButton(gsJOY_DOWN);
  420.             controls.fire = m_joystick.testButton(gsJOY_BUTTON0);
  421.             controls.firePressed = m_joystick.testButtonPressed(gsJOY_BUTTON0);
  422.             controls.divePressed = m_joystick.testButtonPressed(gsJOY_BUTTON1);
  423.             controls.reversePressed = m_joystick.testButtonPressed(gsJOY_BUTTON2);
  424.             break;
  425.  
  426.         case JOYSTICK_2:
  427.             controls.left = m_joystick.testButton(gsJOY_LEFT,1);
  428.             controls.right = m_joystick.testButton(gsJOY_RIGHT,1);
  429.             controls.up = m_joystick.testButton(gsJOY_UP,1);
  430.             controls.down = m_joystick.testButton(gsJOY_DOWN,1);
  431.             controls.fire = m_joystick.testButton(gsJOY_BUTTON0,1);
  432.             controls.firePressed = m_joystick.testButtonPressed(gsJOY_BUTTON0,1);
  433.             controls.divePressed = m_joystick.testButtonPressed(gsJOY_BUTTON1,1);
  434.             controls.reversePressed = m_joystick.testButtonPressed(gsJOY_BUTTON2,1);
  435.             break;
  436.         }
  437. }
  438.  
  439. //-------------------------------------------------------------
  440.  
  441. void CGameState::setDemoMode(DemoMode mode)
  442. {
  443.     m_demo_mode = mode;
  444.  
  445.     switch (mode) {
  446.         case DEMO_RECORD:
  447.             m_demo_recorder.record();
  448.             break;
  449.         case DEMO_PLAYBACK:
  450.             m_demo_recorder.playback();
  451.             break;
  452.         }
  453. }
  454.  
  455. //-------------------------------------------------------------
  456.  
  457. void CGameState::loadScoreTable()
  458. {
  459.     m_score_table.setSize(NUMBER_OF_SCORE_ENTRIES);
  460.     m_score_table.setPosition(gsCPoint(0,150));
  461.     m_score_table.setSpacing(gsCPoint(0,20));
  462.     m_score_table.setFont(&m_medium_font);
  463.  
  464.     gsCFile::setDirectory(DIRECTORY_ROOT);
  465.  
  466.     if (!gsCFile::exists(HISCORE_FILENAME)) {
  467.         m_score_table.insertScore(5000000,"JMP");
  468.         m_score_table.insertScore(4500000,"EJB");
  469.         m_score_table.insertScore(4000000,"MJM");
  470.         m_score_table.insertScore(3500000,"CM");
  471.         m_score_table.insertScore(3000000,"MC");
  472.         m_score_table.insertScore(2500000,"AH");
  473.         m_score_table.insertScore(2000000,"JB");
  474.         m_score_table.insertScore(1500000,"DC");
  475.         m_score_table.insertScore(1000000,"JK");
  476.         m_score_table.insertScore( 500000,"SW");
  477.         }
  478.     else {
  479.         gsCIniFile file;
  480.     
  481.         file.open(HISCORE_FILENAME);
  482.  
  483.         for (int i = 0; i < NUMBER_OF_SCORE_ENTRIES; i++) {
  484.             char buf[10];
  485.             sprintf(buf,"Entry%i",i);
  486.             int score = file.readInt(buf,"Score",0);
  487.             const char *name = file.readString(buf,"Name","JMP");
  488.             m_score_table.insertScore(score,name);
  489.             }
  490.  
  491.         file.close();
  492.         }
  493. }
  494.  
  495. //-------------------------------------------------------------
  496.  
  497. bool CGameState::saveScoreTable()
  498. {
  499.     gsCFile::setDirectory(DIRECTORY_ROOT);
  500.  
  501.     gsCIniFile file;
  502.  
  503.     if (!file.open(HISCORE_FILENAME))
  504.         return false;
  505.  
  506.     for (int i = 0; i < NUMBER_OF_SCORE_ENTRIES; i++) {
  507.         char buf[10];
  508.         sprintf(buf,"Entry%i",i);
  509.         file.writeInt(buf,"Score",m_score_table.getScore(i));
  510.         char name[gsSCORE_NAME_SIZE + 1];
  511.         memcpy(name,m_score_table.getName(i),gsSCORE_NAME_SIZE);
  512.         name[gsSCORE_NAME_SIZE] = 0;
  513.         file.writeString(buf,"Name",name);
  514.         }
  515.  
  516.     file.close();
  517.  
  518.     return true;
  519. }
  520.  
  521. //-------------------------------------------------------------
  522.