Advertisement
Guest User

pokemongame.cpp

a guest
May 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.59 KB | None | 0 0
  1. #include "game.h"
  2. #include "..\SDL2_Sources\graphics.h"
  3. #include <ctime>
  4. #include "menu.h"
  5. #include "..\SDL2_Sources\text.h"
  6. #include "audio.h"
  7.  
  8. Graphics ui;
  9. Audio g_sound;
  10. std::vector <CPoke*> m_gameMonsters;
  11. int g_graphicChoice;
  12. int currentMap = -1;
  13. vector2 previousPos = {0,0};
  14.  
  15.  
  16. //Dans un premier temps on créé notre classe jeu qui contiendra tout ce qui est nécessaire à la partie et les méthodes principales
  17. //Veuillez lire les commentaires dans l'ordre car l'explication suit le cours de la page
  18.  
  19. CGame::CGame()
  20. {
  21.     //Initialisation du personnage du joueur
  22.     m_player = new CTrainer("Pseudo");
  23.     //On load tous les monstres possibles dans le jeu pour pouvoir en faire des copies lorsqu'on assigne les pokemons
  24.     m_worldMonsters = new CParsingMonsters("monsters.pkmn");
  25.     //Par défaut on commence sur la map donc on n'est pas en mode combat
  26.     m_isFightMode = false;
  27.    
  28.     //On set la map de départ
  29.     m_currentMap[0] = "bourg-palette.png";
  30.     m_currentMap[1] = "bourg-palette-filter.png";
  31.  
  32.     //Non utilisé, fait en prévision d'une upgrade qui permettrait de sauvegarder une partie
  33.     //Ici on chargerait la partie
  34.     m_player->loadBackup("save.txt");
  35.  
  36.     //Ajout de trois pokemons au player
  37.     m_player->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  38.     m_player->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  39.     m_player->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  40.  
  41.     //On ajoute trois objets au player
  42.     m_player->addObject(new CPotion("Potion", LIFEUP10));
  43.     m_player->addObject(new CPotion("Super Potion", REGEN100));
  44.     m_player->addObject(new CDrug("Burn Heal", BURNHEAL));
  45.  
  46.     //Ajout des sons qui pourrons nous servir plus tard
  47.     g_sound.addSound("victory.mp3");
  48.     g_sound.setChannelVolume(0.5, 0);
  49.     g_sound.addSound("normaldamage.mp3");
  50.     g_sound.setChannelVolume(0.5, 1);
  51.     g_sound.addSound("potion_heal.mp3");
  52.     g_sound.setChannelVolume(0.5, 2);
  53.     g_sound.addSound("clicksound.mp3");
  54.     g_sound.setChannelVolume(0.5, 3);
  55. }
  56.  
  57. //Destructeur de la classe jeu
  58. CGame::~CGame()
  59. {
  60.     if (m_fightScene)
  61.         delete m_fightScene;
  62.     ui.flushMedia();
  63.     if (m_map)
  64.         delete m_map;
  65.     if (m_player)
  66.         delete m_player;
  67.     if (m_worldCapabilities)
  68.         delete m_worldCapabilities;
  69.     if (m_worldMonsters)
  70.         delete m_worldMonsters;
  71. }
  72.  
  73. //Le jeu commence lorsqu'on utilise la méthode On.
  74. //Une fois cette méthode lancée, les fonctions s'auto-appelent et nous n'avons plus rien à lancer manuellement depuis le main.
  75. void CGame::on()
  76. {
  77.     //Initialisation des graphismes et donc de la classe "ui" pour interface utilisateur
  78.     //Tout ce qui s'affiche à l'écran est géré par cette classe (images, sprites etc regroupés sous le nom de media)
  79.     ui.initGraphics(640, 500, "Pokeschtroumpf", false);
  80.     //Une fois la base du jeu créée et la SDL prête à l'emploi on peut faire le rendu du jeu
  81.     render();
  82.    
  83.     return;
  84. }
  85.  
  86. void CGame::render()
  87. {
  88.     //Pour faire le rendu du jeu on lance le mode aventure
  89.     setMapMode();
  90.    
  91.     //On entre ensuite dans le jeu à proprement parler
  92.     //On ne sortira plus de cette boucle infinie tant que l'utilisateur ne quitte pas le programme
  93.     while (1)
  94.     {
  95.         //A chaque tour on commence par récupérer les événements utilisateur et faire tourner le jeu
  96.         if (!pollEvents())
  97.             break;
  98.  
  99.         //Ensuite l'interface utilisateur met à jour les éléments à afficher...
  100.         ui.renderContext();
  101.  
  102.         //...Et les affiche
  103.         ui.updateRender();
  104.  
  105.         //Enfin on laisse resprirer le CPU
  106.         SDL_Delay(50);
  107.     }
  108. }
  109.  
  110. //Comme expliqué plus haut la fonction pollEvents gère le jeu
  111. //Lorsque c'est le tour de l'utilisateur polEvents questionnera l'utilisateur sur son choix d'action
  112. bool CGame::pollEvents()
  113. {
  114.     /*
  115.     *   Lorsque l'on est en mode map (mode aventure) on va directement aller chercher les touches utilisateurs
  116.     *   Lorsque l'on est en mode combat (m_isFightMode == true) on va cependant commencer par voir si on a du texte à aficher
  117.     *   En effet, il se peut que selon la modalité du lancement du combat on affiche quelque chose à l'écran avant même que le combat
  118.     *   à proprement parler commence (dire à l'utilisateur qu'il vient d'être attaqué etc afin qu'il comprenne ce qui lui arrive)
  119.     *   Ci-dessous on voit donc deux conditions :
  120.     *       -Soit l'utilisateur va jouer après et donc on affiche du texte et on quitte pour lui demander son choix d'action
  121.     *       -Soit c'est au tour de l'adversaire et donc on affiche les infos et on le fait jouer.
  122.     */
  123.     if ((m_step == 0) && m_isFightMode && (!m_fightScene->isPlayerTurn()))/*< Si c'est au tour de l'adversaire*/
  124.     {
  125.         if (m_fightScene->getInfoBufferSize() > 0)/*<Je regarde si le buffer de texte contient quelque chose à afficher*/
  126.         {
  127.             m_fightScene->loadNextInfo();
  128.             m_fightScene->showInfo();
  129.             clock_t endwait;
  130.             endwait = clock() + 1 * CLOCKS_PER_SEC;
  131.             while (clock() < endwait) {}
  132.             return 1;
  133.         }
  134.        
  135.         //Ci-dessous nosu voyons que l'on choisit l'action de l'ennemi
  136.         //Par manque de temps nous l'avons simplement programmé pour qu'il attaque
  137.         m_fightScene->setMode(attack_select);
  138.         //On configure l'animation à effectuer en fonction de son action, ici l'attaque
  139.         m_fightScene->setAnimToRun(animPokeAttack);
  140.         //On le fait directement passer à l'étape d'animation avant le calcul des dommages etc
  141.         m_step = 2;
  142.     }
  143.     else{
  144.         if ((m_isFightMode == true) && (m_fightScene->getMode() == main_menu))/*< Si c'est mon tour*/
  145.         {
  146.             if (m_fightScene->getInfoBufferSize() > 0)/*<Je regarde si le buffer de texte contient quelque chose à afficher*/
  147.             {
  148.                 m_fightScene->loadNextInfo();
  149.                 m_fightScene->showInfo();
  150.                 clock_t endwait;
  151.                 endwait = clock() + 1 * CLOCKS_PER_SEC;
  152.                 while (clock() < endwait) {}
  153.                 return 1;/*< Une fois les informations affichées, je quitte*/
  154.             }
  155.         }
  156.         /*
  157.         *   Maintenant si l'on vient de quitter la partie affichage et que l'on est joueur on va atterir ici
  158.         *   Cette partie n'est pas accessible à l'"IA" car elle aura directement été redirigée à l'étape (step) 2
  159.         */
  160.  
  161.         /* Si le suis à l'étape 0 et donc que je n'ai pas fait de choix, j'entre un choix par l'appui sur une touche*/
  162.         while ((m_step == 0) && (SDL_PollEvent(ui.getEvent())))
  163.         {
  164.             switch (ui.getEvent()->type)
  165.             {
  166.             case SDL_QUIT:
  167.                 return false;
  168.                 break;
  169.             case SDL_KEYDOWN:
  170.                 if (m_isFightMode == true)
  171.                 {
  172.                     //On revérifie que c'est bien au joueur de jouer au cas où
  173.                     if (m_fightScene->isPlayerTurn())
  174.                         fightKeyDown();
  175.                 }
  176.                 else
  177.                     mapKeyDown();
  178.                 break;
  179.             }
  180.         }
  181.     }
  182.     if (m_step == 1)/*Si j'ai sélectionné un choix : on commence par changer de menu/l'affichage selon le contexte*/
  183.     {
  184.         switch (m_fightScene->getMode())
  185.         {
  186.         //Si on est dans un choix du menu principal (attaquer/changer pokemon..)
  187.         //On affiche le prochain sous-menu (liste des attaques/obj/pokemons) et on redemande un choix
  188.         case main_menu:
  189.             m_fightScene->flushInfo(); //Les informations sont affichées que lorsqu'on est dans le menu principal (main_menu)
  190.             switch (g_graphicChoice)
  191.             {
  192.             case 0:
  193.                 m_fightScene->setMode(attack_select);
  194.                 m_fightScene->setAtkMenu();
  195.                 break;
  196.             case 1:
  197.                 m_fightScene->setMode(object_select);
  198.                 m_fightScene->setObjectMenu();
  199.                 break;
  200.             case 2:
  201.                 m_fightScene->setMode(poke_select);
  202.                 m_fightScene->setPokeMenu();
  203.                 break;
  204.             case 3:
  205.                 //Le cas 3 correspond, dans le mode combat, au cas où l'on fuit le combat
  206.                 if (currentMap == 4)//Si nous étions dans la map de combat sauvage (on a été attaqué ), on peut quitter
  207.                 {
  208.                     //Lorsque l'on affiche
  209.                     m_fightScene->printInfo("You run away...");
  210.                     setMapMode();
  211.                 }
  212.                 else
  213.                 {
  214.                     //Si nous étions dans un combat de dresseur nous ne pouvons pas quitter
  215.                     m_fightScene->printInfo("You can't run away");
  216.                     m_fightScene->printInfo("of a trainer fight !");
  217.                 }
  218.                 break;
  219.             }
  220.             //On remet le choix à -1 pour que l'utilisateur refasse un choix
  221.             g_graphicChoice = -1;
  222.             //On retourne au choix d'une action (step 0)
  223.             m_step = 0;
  224.             break;
  225.         //Si l'on est dans un des sous-menu on valide l'action et on ré affiche le menu principal pendant le temps de l'animation
  226.         //Qui correspond à notre choix
  227.         //On passe donc à l'étape suivante : animation
  228.         case attack_select:
  229.             m_fightScene->setMainMenu();
  230.             m_step++;
  231.             break;
  232.         case poke_select:
  233.             m_fightScene->setMainMenu();
  234.             m_step++;
  235.             break;
  236.         case object_select:
  237.             m_fightScene->setMainMenu();
  238.             m_step++;
  239.             break;
  240.         }
  241.     }
  242.     //on applique l'animation correspondante à l'action (ex: attaque d'un pokemon)
  243.     else if(m_step == 2)   
  244.     {
  245.         if (m_fightScene->isPlayerTurn())
  246.         {
  247.             //tant que l'animation n'est pas terminée on ne passe pas à la step suivante
  248.             //Il vaut mieux passer à la phase de calcul après l'animation pour que les stats changent après que l'action ai lieu
  249.             //du point de vue utilisateur
  250.             if (animation(true) == false)
  251.             {
  252.                 m_step++;//L'animation est terminée on va donc pouvoir passer à la phase de calcul des dégâts
  253.             }
  254.         }
  255.         else
  256.         {
  257.             //tant que l'animation n'est pas terminée on ne passe pas à la step suivante
  258.             if (animation(false) == false)
  259.             {
  260.                 m_step++;
  261.             }
  262.         }
  263.     }
  264.     else if(m_step == 3)//On fait les calculs relatifs à l'action (mise à jour des HP etc)
  265.     {
  266.         switch (m_fightScene->getMode())
  267.         {
  268.         case attack_select:
  269.             if (m_fightScene->isPlayerTurn())
  270.                 m_fightScene->attackSelected(g_graphicChoice, false);
  271.             else
  272.                 m_fightScene->attackSelected(rand() % m_fightScene->getPoke(1)->getCapabilitiesList()->size(), true);
  273.             g_sound.playChannel(1, 0);
  274.             break;
  275.         case poke_select:
  276.             m_fightScene->pokeSelected(g_graphicChoice);
  277.             break;
  278.         case object_select:
  279.             if (m_fightScene->isPlayerTurn())
  280.             {
  281.                 m_fightScene->objectSelected(true, g_graphicChoice);
  282.                 g_sound.playChannel(2, 0);
  283.             }
  284.             else
  285.                 m_fightScene->objectSelected(false, g_graphicChoice);
  286.             break;
  287.         }
  288.  
  289.         //Une fois les calculs faits, on s'assure à nouveau que le choix est bien réinitialisé en prévision du prochain choix
  290.         g_graphicChoice = -1;
  291.  
  292.         //Mise à jour des points de vie à l'écran
  293.         m_fightScene->updateLifeBars();
  294.         m_fightScene->updatePlayerHp();
  295.  
  296.         //On test si le jeu est terminé
  297.         if (m_fightScene->GameOver())
  298.         {
  299.             if (m_fightScene->getPoke(0)->getStats().m_lifePts <= 0)
  300.                 m_fightScene->printInfo("You lose...");
  301.             else if (m_fightScene->getPoke(1)->getStats().m_lifePts <= 0)
  302.             {
  303.                 g_sound.playChannel(0, 0);
  304.                 m_fightScene->printInfo("Player win !");
  305.             }
  306.             m_fightScene->setMode(main_menu);
  307.             m_step++;
  308.         }
  309.         else
  310.         {
  311.             //Si le jeu n'est pas terminé on retourne au menu principal en mode "pas de choix sélectionné"
  312.             m_fightScene->setMode(main_menu);
  313.             m_step = 0;
  314.         }
  315.     }
  316.     //La dernière étape est seulement utile lorsque le jeu est terminé
  317.     //Il s'agit de remettre les stats en ordre et remettre les objets utilisés à l'utilisateur
  318.     else if (m_step == 4)
  319.     {
  320.         if (m_player->getObjListPtr()->size() < 3)
  321.         {
  322.             m_player->getObjListPtr()->clear();
  323.             m_player->addObject(new CPotion("Potion", LIFEUP10));
  324.             m_player->addObject(new CPotion("Super Potion", REGEN100));
  325.             m_player->addObject(new CDrug("Burn Heal", BURNHEAL));
  326.         }
  327.         m_fightScene->resetStats();
  328.         //On change de mode on se remet en mode aventure
  329.         setMapMode();
  330.         //On retourne en mode "pas de choix" ce qui permettra d'accéder à nouveau aux entrées utilisateur pour le déplacement du personnage
  331.         m_step = 0;
  332.     }
  333.     return 1;
  334. }
  335.  
  336. void CGame::mapKeyDown()
  337. {
  338.     int i = 0;
  339.     if (m_player)
  340.     {
  341.         switch (ui.getKey())
  342.         {
  343.         case SDLK_ESCAPE:
  344.             break;
  345.         case SDLK_DOWN:
  346.             //On change la direction
  347.             m_player->getSprite()->dir(0);
  348.             //On fait avancer le personnage
  349.             m_player->getSprite()->run();
  350.             //on check si le personnage est dans une zone autorisée
  351.             i = m_map->checkFilter(m_player->getSprite()->getRect2());
  352.             if (i == -1) //i correspond à l'entrée dans une zone de téléportation. Il s'agit en fait de l'index d'une zone de téléportation.
  353.                 m_player->getSprite()->restoreBackup(); //Si ce n'est pas le cas on rétablit les anciennes coordonnées
  354.             break;
  355.         case SDLK_UP:
  356.             m_player->getSprite()->dir(3);
  357.             m_player->getSprite()->run();
  358.             i = m_map->checkFilter(m_player->getSprite()->getRect2());
  359.             if (i == -1)
  360.                 m_player->getSprite()->restoreBackup();
  361.             break;
  362.         case SDLK_RIGHT:
  363.             m_player->getSprite()->dir(2);
  364.             m_player->getSprite()->run();
  365.             i = m_map->checkFilter(m_player->getSprite()->getRect2());
  366.             if (i == -1)
  367.                 m_player->getSprite()->restoreBackup();
  368.             break;
  369.         case SDLK_LEFT:
  370.             m_player->getSprite()->dir(1);
  371.             m_player->getSprite()->run();
  372.             i = m_map->checkFilter(m_player->getSprite()->getRect2());
  373.             if (i == -1)
  374.                 m_player->getSprite()->restoreBackup();
  375.             break;
  376.         }
  377.  
  378.         if (i>=1)
  379.         {
  380.             //Si il y a téléportation on change de map
  381.             switchMap(i);
  382.         }
  383.     }
  384.     if (currentMap == 4)
  385.     {
  386.         //Si on se trouve dans la map "sauvage" il y a une probabilité, à chaque pas, d'être attéqué par un pokemon sauvage
  387.         if (rand() % 100 > 98)
  388.         {
  389.             //Si on est attaqué on sauvegarde les coordonnées du personnage pour le remettre à sa place après le combat
  390.             previousPos.x = m_player->getSprite()->getRect2().x;
  391.             previousPos.y = m_player->getSprite()->getRect2().y;
  392.             //On passe en mode combat
  393.             //le paramètre false établit que le combat ne se passe pas contre un dresseur mais contre un pokemon sauvage
  394.             setFightMode(false);
  395.         }
  396.     }
  397. }
  398.  
  399. void CGame::switchMap(int p_i)
  400. {
  401.     if (currentMap == 0)
  402.     {
  403.         switch (p_i)
  404.         {
  405.         case 1:
  406.             if (m_map)
  407.                 delete m_map;
  408.             //Pour chaque map on charge à la fois l'image de fond et le filtre pour la détection de collisions
  409.             m_map = new CMap("bourg-palette-house2.png", "bourg-palette-house2-filter.png", &ui);
  410.             m_map->setGraphics(ui, m_player, { 251, 300 });
  411.             //On place le personnage dans la bonne direction lors de son arrivée sur la map
  412.             m_player->getSprite()->dir(3);
  413.             currentMap = 1;
  414.             break;
  415.         case 2:
  416.             if (m_map)
  417.                 delete m_map;
  418.             m_map = new CMap("bourg-palette-house.png", "bourg-palette-house-filter.png", &ui);
  419.             m_map->setGraphics(ui, m_player, { 254, 300 });
  420.             m_player->getSprite()->dir(3);
  421.             currentMap = 2;
  422.             break;
  423.         case 3://lab
  424.             if (m_map)
  425.                 delete m_map;
  426.             m_map = new CMap("bourg-palette-lab.png", "bourg-palette-lab-filter.png", &ui);
  427.             m_map->setGraphics(ui, m_player, { 306, 318 });
  428.             m_player->getSprite()->dir(3);
  429.             currentMap = 3;
  430.             break;
  431.         case 4://route
  432.             if (m_map)
  433.                 delete m_map;
  434.             m_map = new CMap("route01.png", "route01-filter.png", &ui);
  435.             m_map->setGraphics(ui, m_player, { 345, 445 });
  436.             m_player->getSprite()->dir(3);
  437.             currentMap = 4;
  438.             break;
  439.         }
  440.     }
  441.     else
  442.     {
  443.         switch (p_i)
  444.         {
  445.         case 5:
  446.             if (currentMap == 1)
  447.             {
  448.                 if (m_map)
  449.                     delete m_map;
  450.                 m_map = new CMap("bourg-palette.png", "bourg-palette-filter.png", &ui);
  451.                 m_map->setGraphics(ui, m_player, { 173, 213 });
  452.                 currentMap = 0;
  453.             }
  454.             break;
  455.         case 6:
  456.             if (currentMap == 2)
  457.             {
  458.                 if (m_map)
  459.                     delete m_map;
  460.                 m_map = new CMap("bourg-palette.png", "bourg-palette-filter.png", &ui);
  461.                 m_map->setGraphics(ui, m_player, { 413, 200 });
  462.                 currentMap = 0;
  463.             }
  464.             break;
  465.         case 7:
  466.             if (currentMap == 3)
  467.             {
  468.                 if (m_map)
  469.                     delete m_map;
  470.                 m_map = new CMap("bourg-palette.png", "bourg-palette-filter.png", &ui);
  471.                 m_map->setGraphics(ui, m_player, { 439, 365 });
  472.                 currentMap = 0;
  473.             }
  474.             break;
  475.         case 8:
  476.             if (currentMap == 4)
  477.             {
  478.                 if (m_map)
  479.                     delete m_map;
  480.                 m_map = new CMap("bourg-palette.png", "bourg-palette-filter.png", &ui);
  481.                 m_map->setGraphics(ui, m_player, { 348, 59 });
  482.                 currentMap = 0;
  483.             }
  484.             break;
  485.         case 9:
  486.             if (currentMap == 3)
  487.             {
  488.                 previousPos.x = m_player->getSprite()->getRect2().x;
  489.                 previousPos.y = m_player->getSprite()->getRect2().y +20;
  490.                 setFightMode(true);
  491.             }
  492.             break;
  493.         }
  494.        
  495.     }
  496.     //On afiche la nouvelle map chargée
  497.     m_map->show();
  498. }
  499.  
  500. void CGame::fightKeyDown()
  501. {
  502.         switch (ui.getKey())
  503.         {
  504.         case SDLK_RETURN:
  505.             g_sound.playChannel(3, 0);
  506.             if (m_fightScene->getMode() == attack_select)
  507.             {
  508.                 //On récupère le choix correspondant au menu
  509.                 //En effet, la position du curseur est stockée dans le menu lui-même
  510.                 //Or lorsqu'on a fait un choix on repasse en menu principal avant calcul donc on perdrait l'information
  511.                 g_graphicChoice = m_fightScene->getMenu()->getGraphicChoice();
  512.                 int size = m_fightScene->getPoke(0)->getCapabilitiesList()->size();
  513.  
  514.                 //On regarde si le choix n'est pas supérieur au nombre de possibilités d'ataques
  515.                 //Ici ce n'est pas notrecas mais c'est dans le cas où un pokemon n'aurait pas 4 capacités
  516.                 if (size - 1 < g_graphicChoice)
  517.                     return;
  518.  
  519.                 //On regarde si l'attaque est disponible (assez de PP)
  520.                 if (!m_fightScene->getPoke(0)->getCapabilitiesList()->at(m_fightScene->getMenu()->getGraphicChoice()).isAvailable())
  521.                     return;
  522.                 m_fightScene->setAnimToRun(animPokeAttack);
  523.             }
  524.             //Dans le cas où on choisit un pokemon on ne peut pas choisir le pokemon en cours
  525.             //(echap pour revenir au menu principal)
  526.             //C'est pourquoi on affiche à partir de la position 1 et non 0 dans le buffer de pokemons
  527.             //A chaque changement de pokmeon le pokemon en cours est mis à la position 0 dans le buffer
  528.             else if (m_fightScene->getMode() == poke_select)
  529.                 g_graphicChoice = m_fightScene->getMenu()->getGraphicChoice() + 1;
  530.             else
  531.                 g_graphicChoice = m_fightScene->getMenu()->getGraphicChoice();
  532.             m_step = 1;
  533.             break;
  534.         case SDLK_DOWN:
  535.             g_sound.playChannel(3, 0);
  536.             if (m_fightScene->getMode() == poke_select)
  537.                 m_fightScene->getMenu()->cursorMoveList(down, m_fightScene->getPlayerBuffer().size()-1, true);
  538.             else if(m_fightScene->getMode() == object_select)
  539.                 m_fightScene->getMenu()->cursorMoveList(down, m_fightScene->getNbObjAvailable()-1, false);
  540.             else
  541.                 m_fightScene->getMenu()->cursorMoveQuad(down);
  542.             if (m_fightScene->getMode() == attack_select)
  543.                 m_fightScene->printCurrentCapStats(m_fightScene->getMenu()->getGraphicChoice());
  544.             break;
  545.         case SDLK_UP:
  546.             g_sound.playChannel(3, 0);
  547.             if (m_fightScene->getMode() == poke_select)
  548.                 m_fightScene->getMenu()->cursorMoveList(up, m_fightScene->getPlayerBuffer().size() - 1, true);
  549.             else if (m_fightScene->getMode() == object_select)
  550.                 m_fightScene->getMenu()->cursorMoveList(up, m_fightScene->getNbObjAvailable()-1, false);
  551.             else
  552.                 m_fightScene->getMenu()->cursorMoveQuad(up);
  553.             if (m_fightScene->getMode() == attack_select)
  554.                 m_fightScene->printCurrentCapStats(m_fightScene->getMenu()->getGraphicChoice());
  555.             break;
  556.         case SDLK_RIGHT:
  557.             g_sound.playChannel(3, 0);
  558.             if (m_fightScene->getMode() == poke_select)
  559.                 break;
  560.             else
  561.                 m_fightScene->getMenu()->cursorMoveQuad(right);
  562.             if (m_fightScene->getMode() == attack_select)
  563.                 m_fightScene->printCurrentCapStats(m_fightScene->getMenu()->getGraphicChoice());
  564.             break;
  565.         case SDLK_LEFT:
  566.             g_sound.playChannel(3, 0);
  567.             if (m_fightScene->getMode() == poke_select)
  568.                 break;
  569.             else
  570.                 m_fightScene->getMenu()->cursorMoveQuad(left);
  571.             if (m_fightScene->getMode() == attack_select)
  572.                 m_fightScene->printCurrentCapStats(m_fightScene->getMenu()->getGraphicChoice());
  573.             break;
  574.         case SDLK_ESCAPE:
  575.             g_sound.playChannel(3, 0);
  576.             if (m_fightScene->getMode() != main_menu)
  577.             {
  578.                 m_fightScene->setMainMenu();
  579.                 m_fightScene->setMode(main_menu);
  580.             }
  581.             break;
  582.         }
  583.         if (m_isFightMode == false)        
  584.             setMapMode();
  585. }
  586.  
  587. //Fonction qui permet le passage en mode combat
  588. void CGame::setFightMode(bool p_isTrainer)
  589. {
  590.     m_isFightMode = true;
  591.  
  592.     //On commence par supprimer tous les graphiques en cours
  593.     ui.flushMedia();
  594.  
  595.     //On créé l'adversaire dans le cas où c'est un combat contre dresseur
  596.     //On lui assigne aléatoirement trois pokemons
  597.     CTrainer * trainerSpark = new CTrainer("Spark");
  598.     trainerSpark->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  599.     trainerSpark->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  600.     trainerSpark->addPoke(m_worldMonsters->getRandPoke(), m_gameMonsters);
  601.  
  602.     if (!p_isTrainer)
  603.     {
  604.         m_fightScene = new CFight(m_player, m_worldMonsters->getRandPoke(), ui);
  605.         m_fightScene->setGraphics(false);
  606.     }
  607.     else
  608.     {
  609.         m_fightScene = new CFight(m_player, trainerSpark, ui);
  610.         m_fightScene->setGraphics(true);
  611.     }
  612.     //On lance la musique du combat
  613.     g_sound.switchMainMusic("battle.mp3", 0.5);
  614.     g_sound.playMainMusic();
  615.     m_fightScene->enemyBegin();
  616.  
  617. }
  618.  
  619. void CGame::setMapMode()
  620. {
  621.     m_isFightMode = false;
  622.     delete m_fightScene;
  623.     //We begin with flushing all previous medias
  624.     ui.flushMedia();
  625.     switch (currentMap)
  626.     {
  627.         //Dans les cas ou currentMap vaut 3 ou 4 c'est qu'on sort du mode combat
  628.         //On remet donc les bonnes map où a commencé le combat et on replace le player au bon endroit
  629.     case 3:
  630.         if (m_map)
  631.             delete m_map;
  632.         m_map = new CMap("bourg-palette-lab.png", "bourg-palette-lab-filter.png", &ui);
  633.         m_map->setGraphics(ui, m_player, previousPos);
  634.         break;
  635.     case 4:
  636.         if (m_map)
  637.             delete m_map;
  638.         m_map = new CMap("route01.png", "route01-filter.png", &ui);
  639.         m_map->setGraphics(ui, m_player, previousPos);
  640.         break;
  641.     default://Par défaut on met la map principale
  642.         currentMap = 0;
  643.         m_map = new CMap(m_currentMap[0], m_currentMap[1], &ui);
  644.         m_map->setGraphics(ui, m_player, { 230, 220 });
  645.         break;
  646.     }
  647.     //On affiche la map
  648.     m_map->show();
  649.     //On change de musique
  650.     g_sound.switchMainMusic("map.mp3", 0.5);
  651.     g_sound.playMainMusic();
  652. }
  653.  
  654. bool CGame::animation(bool isPlayer)
  655. {
  656.     if (m_fightScene)
  657.         if (m_fightScene->isInAnimState())
  658.         {
  659.             if (isPlayer == true)
  660.                 m_fightScene->runAnim(true);
  661.             else
  662.                 m_fightScene->runAnim(false);
  663.         }
  664.         else
  665.             return false;
  666.     return true;
  667. }
  668.  
  669. CTrainer* CGame::getTrainer(){ return m_player; }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement