CTC++ Coverage Report - Execution Profile    #7/32

Directory Summary | Files Summary | Functions Summary | Execution Profile
To files: First | Previous | Next | Last | Index | No Index


File: FrozenGame.java
Instrumentation mode: function-decision-multicondition
TER: 94 % (180/192)

Start/ End/    
True False - Line Source

  1 /* 
  2  *                 [[ Frozen-Bubble ]] 
  3  * 
  4  * Copyright (c) 2000-2003 Guillaume Cottenceau. 
  5  * Java sourcecode - Copyright (c) 2003 Glenn Sanson. 
  6  * 
  7  * This code is distributed under the GNU General Public License  
  8  * 
  9  * This program is free software; you can redistribute it and/or 
  10  * modify it under the terms of the GNU General Public License 
  11  * version 2, as published by the Free Software Foundation. 
  12  *  
  13  * This program is distributed in the hope that it will be useful, but 
  14  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  16  * General Public License for more details. 
  17  *  
  18  * You should have received a copy of the GNU General Public License along 
  19  * with this program; if not, write to the Free Software Foundation, Inc., 
  20  * 675 Mass Ave, Cambridge, MA 02139, USA. 
  21  * 
  22  * 
  23  * Artwork: 
  24  *    Alexis Younes <73lab at free.fr> 
  25  *      (everything but the bubbles) 
  26  *    Amaury Amblard-Ladurantie <amaury at linuxfr.org> 
  27  *      (the bubbles) 
  28  * 
  29  * Soundtrack: 
  30  *    Matthias Le Bidan <matthias.le_bidan at caramail.com> 
  31  *      (the three musics and all the sound effects) 
  32  * 
  33  * Design & Programming: 
  34  *    Guillaume Cottenceau <guillaume.cottenceau at free.fr> 
  35  *      (design and manage the project, whole Perl sourcecode) 
  36  * 
  37  * Java version: 
  38  *    Glenn Sanson <glenn.sanson at free.fr> 
  39  *      (whole Java sourcecode, including JIGA classes  
  40  *             http://glenn.sanson.free.fr/jiga/) 
  41  * 
  42  *          [[ http://glenn.sanson.free.fr/fb/ ]] 
  43  *          [[ http://www.frozen-bubble.org/   ]] 
  44  */ 
  45  
  46 import net.library.jiga.*; 
  47  
  48 import java.awt.*; 
  49 import java.util.Vector; 
  50 import java.util.Random; 
  51  
  52 public class FrozenGame extends GameScreen 
  53 
  54    public final static int HORIZONTAL_MOVE = 0; 
  55    public final static int FIRE = 1; 
  56     
  57    public final static int KEY_UP = 38; 
  58    public final static int KEY_LEFT = 37; 
  59    public final static int KEY_RIGHT = 39; 
  60    public final static int KEY_SHIFT = 16; 
  61          
  62     public static String PARAMETER_PLAYER = "player"; 
  63     public static String PARAMETER_OFFLINE = "offline"; 
  64      
  65     // Change mode (normal/colorblind) 
  66     public final static int KEY_M = 77; 
  67     // Toggle sound on/off 
  68     public final static int KEY_S = 83; 
  69  
  70     boolean modeKeyPressed, soundKeyPressed; 
  71          
  72    Image background; 
  73    Image[] bubbles; 
  74     Image[] bubblesBlind; 
  75    Image[] frozenBubbles; 
  76    Image[] targetedBubbles; 
  77    Random random; 
  78     
  79    LaunchBubbleSprite launchBubble; 
  80    int launchBubblePosition; 
  81     
  82    PenguinSprite penguin; 
  83     
  84    Compressor compressor; 
  85     
  86    ImageSprite nextBubble; 
  87    int currentColor, nextColor; 
  88     
  89    BubbleSprite movingBubble; 
  90    BubbleManager bubbleManager; 
  91    LevelManager levelManager; 
  92    LifeManager lifeManager; 
  93    HighscoreManager highscoreManager; 
  94     
  95    Vector jumping; 
  96    Vector falling; 
  97     
  98    BubbleSprite[][] bubblePlay; 
  99     
  100    int fixedBubbles; 
  101    double moveDown; 
  102     
  103    Image gameWon, gameLost; 
  104    int nbBubbles; 
  105     
  106    Image bubbleBlink; 
  107    int blinkDelay; 
  108     
  109    ImageSprite hurrySprite; 
  110    int hurryTime; 
  111     
  112    SoundManager soundManager; 
  113     
  114    boolean readyToFire; 
  115    boolean endOfGame; 
  116    boolean frozenify; 
  117    int frozenifyX, frozenifyY; 
  118     
 
369   119    public FrozenGame(GameApplet gameApplet) 
  120    { 
  121       super(gameApplet); 
  122        
  123       GameMedia media = gameApplet.getGameMedia(); 
  124       random = new Random(System.currentTimeMillis()); 
  125        
  126       background = media.loadImage("background.jpg"); 
  127       bubbles = new Image[8]; 
  128                 bubblesBlind = new Image[8]; 
  129       frozenBubbles = new Image[8]; 
2952 369   130       for (int i=0 ; i<8 ; i++) 
  131       { 
  132          bubbles[i] = media.loadImage("bubble-"+Integer.toString(i+1)+".gif"); 
  133                         bubblesBlind[i] = media.loadImage("bubble-colourblind-"+Integer.toString(i+1)+".gif"); 
  134          frozenBubbles[i] = media.loadImage("frozen-"+Integer.toString(i+1)+".gif"); 
  135       } 
  136       targetedBubbles = new Image[6]; 
2214 369   137       for (int i=0 ; i<6 ; i++) 
  138       { 
  139          targetedBubbles[i] = media.loadImage("fixed-"+Integer.toString(i+1)+".gif"); 
  140       } 
  141       bubbleBlink = media.loadImage("bubble-blink.gif"); 
  142       gameWon = media.loadImage("win_panel.jpg"); 
  143       gameLost = media.loadImage("lose_panel.jpg"); 
  144  
  145       soundManager = (SoundManager)gameApplet.getGameContext().getObject("soundManager"); 
  146        
  147       launchBubblePosition = 40; 
  148              
  149       penguin = new PenguinSprite(media.loadImage("penguins.jpg"), random); 
  150       this.addSprite(penguin); 
  151  
  152       compressor = new Compressor(media, this); 
  153           
  154       hurrySprite = new ImageSprite(new Rectangle(203, 265, 240, 90), media.loadImage("hurry.gif")); 
  155        
  156       jumping = new Vector(); 
  157       falling = new Vector(); 
  158        
  159       bubblePlay = new BubbleSprite[8][13]; 
  160        
  161       bubbleManager = new BubbleManager(bubbles); 
  162       levelManager = (LevelManager)gameApplet.getGameContext().getObject("levelManager"); 
  163       byte[][] currentLevel = levelManager.getCurrentLevel(); 
  164        
369 - 165       if (currentLevel == null) 
  166       { 
  167          System.err.println("Level not available"); 
 - 168          return; 
  169       } 
  170        
4428 369   171       for (int j=0 ; j<12 ; j++) 
  172       { 
33210 4428   173          for (int i=j%2 ; i<8 ; i++) 
  174          { 
9694 23516   175             if (currentLevel[i][j] != -1) 
  176             { 
  177                BubbleSprite newOne = new BubbleSprite(new Rectangle(190+i*32-(j%2)*16, 44+j*28, 32, 32),  
  178                                              bubbles[currentLevel[i][j]], bubblesBlind[currentLevel[i][j]], frozenBubbles[currentLevel[i][j]], 
  179                                              bubbleBlink, bubbleManager, soundManager, this); 
  180                                               
  181                bubblePlay[i][j] = newOne; 
  182                this.addSprite(newOne); 
  183             } 
  184          } 
  185       } 
  186        
  187       currentColor = bubbleManager.nextBubbleIndex(random); 
  188       nextColor = bubbleManager.nextBubbleIndex(random); 
  189        
366   190       if (FrozenBubble.getMode() == FrozenBubble.GAME_NORMAL) { 
  191             nextBubble = new ImageSprite(new Rectangle(302, 440, 32, 32), bubbles[nextColor]); 
  192         } 
    193         else { 
  194             nextBubble = new ImageSprite(new Rectangle(302, 440, 32, 32), bubblesBlind[nextColor]); 
  195         } 
  196       this.addSprite(nextBubble); 
  197        
  198       launchBubble = new LaunchBubbleSprite(gameApplet, currentColor, launchBubblePosition >> 1); 
  199  
  200       this.spriteToBack(launchBubble); 
  201        
  202       BubbleFont bubbleFont = (BubbleFont)gameApplet.getGameContext().getObject("bubbleFont"); 
  203        
  204       TextSprite levelNumber = null; 
  205        
212 157   206       if (levelManager.getLevelIndex() < 10) 
  207       { 
  208          levelNumber = new TextSprite(new Rectangle(175, 433, 21, 22), bubbleFont, String.valueOf(levelManager.getLevelIndex())); 
  209       } 
157 - 210       else if (levelManager.getLevelIndex() < 100) 
  211       { 
  212          levelNumber = new TextSprite(new Rectangle(168, 433, 43, 22), bubbleFont, String.valueOf(levelManager.getLevelIndex())); 
  213       } 
    214       else 
  215       { 
  216          levelNumber = new TextSprite(new Rectangle(163, 433, 65, 22), bubbleFont, String.valueOf(levelManager.getLevelIndex())); 
  217       } 
  218        
  219       this.spriteToBack(levelNumber); 
  220        
  221       lifeManager = (LifeManager)gameApplet.getGameContext().getObject("lifeManager"); 
  222       this.spriteToBack(lifeManager); 
  223        
  224       highscoreManager = (HighscoreManager)gameApplet.getGameContext().getObject("highscoreManager"); 
  225        
  226       nbBubbles = 0;       
  227    } 
  228     
 
71   229    private void initFrozenify() 
  230    { 
  231       ImageSprite freezeLaunchBubble = new ImageSprite(new Rectangle(301, 389, 34, 42), frozenBubbles[currentColor]); 
  232       ImageSprite freezeNextBubble = new ImageSprite(new Rectangle(301, 439, 34, 42), frozenBubbles[nextColor]); 
  233        
  234       this.addSprite(freezeLaunchBubble); 
  235       this.addSprite(freezeNextBubble); 
  236        
  237       frozenifyX = 7; 
  238       frozenifyY = 12; 
  239        
  240       frozenify = true; 
  241    } 
  242  
 
1270   243    private void frozenify() 
  244    {    
  245       frozenifyX--; 
41 1229   246       if (frozenifyX < 0) 
  247       { 
  248          frozenifyX = 7; 
  249          frozenifyY--; 
  250           
16 25   251          if (frozenifyY<0) 
  252          { 
  253             frozenify = false; 
  254             this.addSprite(new ImageSprite(new Rectangle(152, 190, 337, 116), gameLost)); 
  255             lifeManager.decrease(); 
  256             soundManager.playSound(FrozenBubble.SOUND_NOH); 
  257                 
16    258             return; 
  259          }          
  260       } 
  261  
4132 1232   262       while (bubblePlay[frozenifyX][frozenifyY] == null && frozenifyY >=0) 
4132    262   (T && T)
 - 262   (T && F)
 1232   262   (F && _)
  263       { 
  264          frozenifyX--; 
624 3508   265          if (frozenifyX < 0) 
  266          { 
  267             frozenifyX = 7; 
  268             frozenifyY--; 
  269              
22 602   270             if (frozenifyY<0) 
  271             { 
  272                frozenify = false; 
  273                this.addSprite(new ImageSprite(new Rectangle(152, 190, 337, 116), gameLost)); 
  274                lifeManager.decrease(); 
  275                soundManager.playSound(FrozenBubble.SOUND_NOH); 
  276                 
22    277                return; 
  278             }             
  279          }          
  280       } 
  281        
  282       this.spriteToBack(bubblePlay[frozenifyX][frozenifyY]); 
  283       bubblePlay[frozenifyX][frozenifyY].frozenify(); 
  284           
  285       this.spriteToBack(launchBubble); 
  286    }    
  287     
 
319546   288    public BubbleSprite[][] getGrid() 
  289    { 
319546    290       return bubblePlay; 
  291    } 
  292     
 
3814   293    public void addFallingBubble(BubbleSprite sprite) 
  294    { 
  295       spriteToFront(sprite); 
  296       falling.addElement(sprite); 
  297    } 
  298  
 
3432   299    public void deleteFallingBubble(BubbleSprite sprite) 
  300    { 
  301       removeSprite(sprite); 
  302       falling.removeElement(sprite); 
  303    } 
  304     
 
13290   305    public void addJumpingBubble(BubbleSprite sprite) 
  306    { 
  307       spriteToFront(sprite); 
  308       jumping.addElement(sprite); 
  309    }    
  310  
 
12528   311    public void deleteJumpingBubble(BubbleSprite sprite) 
  312    { 
  313       removeSprite(sprite); 
  314       jumping.removeElement(sprite); 
  315    }    
  316     
 
30394   317    public Random getRandom() 
  318    { 
30394    319       return random; 
  320    } 
  321     
 
576730   322    public double getMoveDown() 
  323    { 
576730    324       return moveDown; 
  325    } 
  326     
 
1037   327    private void sendBubblesDown() 
  328    { 
  329       soundManager.playSound(FrozenBubble.SOUND_NEWROOT); 
  330        
8296 1037   331       for (int i=0 ; i<8 ; i++) 
  332       { 
99552 8296   333          for (int j=0 ; j<12 ; j++) 
  334          { 
14398 85154   335             if (bubblePlay[i][j] != null) 
  336             { 
  337                bubblePlay[i][j].moveDown(); 
  338                 
36 14362   339                if (bubblePlay[i][j].getSpritePosition().y>=380) 
  340                { 
  341                   penguin.updateState(PenguinSprite.STATE_GAME_LOST); 
  342                   endOfGame = true; 
  343                   initFrozenify(); 
  344                    
  345                   soundManager.playSound(FrozenBubble.SOUND_LOST); 
  346                } 
  347             } 
  348          } 
  349       } 
  350        
  351       moveDown += 28.; 
  352       compressor.moveDown(); 
  353    } 
  354        
 
98880   355    private void blinkLine(int number) 
  356    { 
  357       int move = number % 2; 
  358       int column = (number+1) >> 1; 
  359        
1239E3 98880   360       for (int i=move ; i<13 ; i++) 
  361       { 
150363 1088E3   362          if (bubblePlay[column][i] != null) 
  363          { 
  364             bubblePlay[column][i].blink(); 
  365          } 
  366       } 
  367    } 
  368     
 
369   369    public void initBackground() 
  370    {       
360   371       if (lifeManager.isDead()) 
  372       { 
  373          if (levelManager.getLevelIndex() == 1) { 
  374                 this.getGameApplet().setCurrentScreen(new SplashScreen(getGameApplet())); 
  375          } 
    376          else { 
- 377                 if (this.getGameApplet().getParameter(PARAMETER_OFFLINE) == null && !this.getGameApplet().isApplication()) { 
 - 377       T && T
 - 377       T && F
   377       F && _
  378                     String playerName = this.getGameApplet().getParameter(PARAMETER_PLAYER); 
  379                      
- 380                     if (playerName == null) { 
  381                         this.getGameApplet().setCurrentScreen(new EnterNameScreen(getGameApplet())); 
  382                     } 
    383                     else { 
- 384                         if (!"".equals(playerName.trim())) { 
  385                             this.getGameApplet().setCurrentScreen(new OnlineScreen(getGameApplet())); 
  386                         } 
    387                         else { 
  388                            // Player name set but null 
  389                            this.getGameApplet().setCurrentScreen(new OfflineScreen(getGameApplet())); 
  390                         } 
  391                     } 
  392                 } 
    393                 else { 
  394                     this.getGameApplet().setCurrentScreen(new OfflineScreen(getGameApplet())); 
  395                 } 
  396          } 
  397       }       
    398       else 
  399       { 
  400          addToBackground(background, new Point(0, 0)); 
  401           
  402          highscoreManager.startLevel(); 
  403       } 
  404    } 
  405     
 
834554   406    public void play(int[] keyCodes, Point mouseCoord, boolean leftButton, boolean rightButton)  
  407    { 
  408       int[] move = new int[2]; 
  409       boolean newModeKeyState = false; 
  410         boolean newSoundKeyState = false; 
  411                  
215746 834554   412       for (int i=0 ; i<keyCodes.length ; i++) 
  413       { 
  414          int current = keyCodes[i]; 
  415  
47 215699   416             if (current == KEY_M) { 
  417                 newModeKeyState = true; 
  418             } 
  419  
15 215731   420             if (current == KEY_S) { 
  421                 newSoundKeyState = true; 
  422             }                         
  423                          
122039 93707   424          if (current == KEY_LEFT || current == KEY_RIGHT) 
60856    424     T || _
61183    424     F || T
 93707   424     F || F
  425          { 
122017 22   426             if (move[HORIZONTAL_MOVE] == 0) 
  427             { 
  428                move[HORIZONTAL_MOVE] = current; 
  429             } 
    430             else 
  431             { 
  432                move[HORIZONTAL_MOVE] = 0; 
  433             } 
  434          } 
  435           
49905 165841   436          if (current == KEY_UP || current == KEY_SHIFT) 
47832    436     T || _
2073    436     F || T
 165841   436     F || F
  437          { 
  438             move[FIRE] = KEY_UP; 
  439          } 
  440       } 
  441        
18 834536   442         if (newModeKeyState != modeKeyPressed) { 
  443             if (newModeKeyState) { 
  444                 FrozenBubble.switchMode(); 
  445                 // Redraw nextBubble 
  446                 if (FrozenBubble.getMode() == FrozenBubble.GAME_NORMAL) { 
  447                     nextBubble.changeImage(bubbles[nextColor]); 
  448                 } 
    449                 else { 
  450                     nextBubble.changeImage(bubblesBlind[nextColor]); 
  451                 }                         
  452             } 
  453              
  454             modeKeyPressed = newModeKeyState; 
  455         } 
  456          
834550   457         if (newSoundKeyState != soundKeyPressed) { 
  458             if (newSoundKeyState) { 
  459                 soundManager.setSoundState(!soundManager.getSoundState()); 
  460             } 
  461              
  462             soundKeyPressed = newSoundKeyState; 
  463         }                 
  464                  
784652 49902   465       if (move[FIRE] == 0) 
  466       { 
  467          readyToFire = true; 
  468       } 
  469        
94009 740545   470       if (endOfGame) 
  471       { 
325 93684   472          if (move[FIRE] == KEY_UP && readyToFire) 
325    472     T && T
 227   472     T && F
 93457   472     F && _
  473          { 
21 304   474             if (frozenify) 
  475             { 
  476                lifeManager.decrease(); 
  477             } 
  478              
325 - 479             if (levelManager.getCurrentLevel() == null) 
  480             { 
  481                getGameApplet().setCurrentScreen(new EnterNameScreen(getGameApplet())); 
  482             } 
    483             else 
  484             { 
  485                getGameApplet().setCurrentScreen(new FrozenGame(getGameApplet())); 
  486             } 
  487          } 
    488          else 
  489          { 
  490             penguin.updateState(PenguinSprite.STATE_VOID); 
  491           
1270 92414   492             if (frozenify) 
  493             { 
  494                frozenify(); 
  495             } 
  496          } 
  497       } 
    498       else 
  499