| 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 | 0 | 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 | ||||
| 0 | 369 | - | 165 | if (currentLevel == null) |
| 166 | { | |||
| 167 | System.err.println("Level not available"); | |||
| 0 | - | 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 | 3 | 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 | 0 | - | 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 | 0 | 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 | 0 | 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) | ||
| 0 | - | 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 | 0 | 288 | public BubbleSprite[][] getGrid() | |
| 289 | { | |||
| 319546 | 290 | return bubblePlay; | ||
| 291 | } | |||
| 292 | ||||
| 3814 | 0 | 293 | public void addFallingBubble(BubbleSprite sprite) | |
| 294 | { | |||
| 295 | spriteToFront(sprite); | |||
| 296 | falling.addElement(sprite); | |||
| 297 | } | |||
| 298 | ||||
| 3432 | 0 | 299 | public void deleteFallingBubble(BubbleSprite sprite) | |
| 300 | { | |||
| 301 | removeSprite(sprite); | |||
| 302 | falling.removeElement(sprite); | |||
| 303 | } | |||
| 304 | ||||
| 13290 | 0 | 305 | public void addJumpingBubble(BubbleSprite sprite) | |
| 306 | { | |||
| 307 | spriteToFront(sprite); | |||
| 308 | jumping.addElement(sprite); | |||
| 309 | } | |||
| 310 | ||||
| 12528 | 0 | 311 | public void deleteJumpingBubble(BubbleSprite sprite) | |
| 312 | { | |||
| 313 | removeSprite(sprite); | |||
| 314 | jumping.removeElement(sprite); | |||
| 315 | } | |||
| 316 | ||||
| 30394 | 0 | 317 | public Random getRandom() | |
| 318 | { | |||
| 30394 | 319 | return random; | ||
| 320 | } | |||
| 321 | ||||
| 576730 | 0 | 322 | public double getMoveDown() | |
| 323 | { | |||
| 576730 | 324 | return moveDown; | ||
| 325 | } | |||
| 326 | ||||
| 1037 | 0 | 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 | 0 | 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 | 0 | 369 | public void initBackground() | |
| 370 | { | |||
| 9 | 360 | 371 | if (lifeManager.isDead()) | |
| 372 | { | |||
| 1 | 8 | 373 | if (levelManager.getLevelIndex() == 1) { | |
| 374 | this.getGameApplet().setCurrentScreen(new SplashScreen(getGameApplet())); | |||
| 375 | } | |||
| 376 | else { | |||
| 0 | 8 | - | 377 | if (this.getGameApplet().getParameter(PARAMETER_OFFLINE) == null && !this.getGameApplet().isApplication()) { |
| 0 | - | 377 | T && T | |
| 0 | - | 377 | T && F | |
| 8 | 377 | F && _ | ||
| 378 | String playerName = this.getGameApplet().getParameter(PARAMETER_PLAYER); | |||
| 379 | ||||
| 0 | 0 | - | 380 | if (playerName == null) { |
| 381 | this.getGameApplet().setCurrentScreen(new EnterNameScreen(getGameApplet())); | |||
| 382 | } | |||
| 383 | else { | |||
| 0 | 0 | - | 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 | 0 | 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) { | |
| 9 | 9 | 443 | if (newModeKeyState) { | |
| 444 | FrozenBubble.switchMode(); | |||
| 445 | // Redraw nextBubble | |||
| 4 | 5 | 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 | ||||
| 4 | 834550 | 457 | if (newSoundKeyState != soundKeyPressed) { | |
| 2 | 2 | 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 | ||||
| 0 | 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 | ||||