/* * Pixel Dungeon * Copyright (C) 2012-2015 Oleg Dolya * * Shattered Pixel Dungeon * Copyright (C) 2014-2015 Evan Debenham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ package com.shatteredpixel.shatteredpixeldungeon.scenes; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.GameLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndError; import com.shatteredpixel.shatteredpixeldungeon.windows.WndStory; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; import com.watabou.noosa.RenderedText; import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import java.io.FileNotFoundException; import java.io.IOException; public class InterlevelScene extends PixelScene { private static final float TIME_TO_FADE = 0.3f; public enum Mode { DESCEND, ASCEND, CONTINUE, RESURRECT, RETURN, FALL, RESET, NONE } public static Mode mode; public static int returnDepth; public static int returnPos; public static boolean noStory = false; public static boolean fallIntoPit; private enum Phase { FADE_IN, STATIC, FADE_OUT } private Phase phase; private float timeLeft; private RenderedText message; private Thread thread; private Exception error = null; @Override public void create() { super.create(); String text = Messages.get(Mode.class, mode.name()); message = PixelScene.renderText( text, 9 ); message.x = (Camera.main.width - message.width()) / 2; message.y = (Camera.main.height - message.height()) / 2; add( message ); phase = Phase.FADE_IN; timeLeft = TIME_TO_FADE; thread = new Thread() { @Override public void run() { try { Generator.reset(); switch (mode) { case DESCEND: descend(); break; case ASCEND: ascend(); break; case CONTINUE: restore(); break; case RESURRECT: resurrect(); break; case RETURN: returnTo(); break; case FALL: fall(); break; case RESET: reset(); break; } if ((Dungeon.depth % 5) == 0) { Sample.INSTANCE.load( Assets.SND_BOSS ); } } catch (Exception e) { error = e; } if (phase == Phase.STATIC && error == null) { phase = Phase.FADE_OUT; timeLeft = TIME_TO_FADE; } } }; thread.start(); } @Override public void update() { super.update(); float p = timeLeft / TIME_TO_FADE; switch (phase) { case FADE_IN: message.alpha( 1 - p ); if ((timeLeft -= Game.elapsed) <= 0) { if (!thread.isAlive() && error == null) { phase = Phase.FADE_OUT; timeLeft = TIME_TO_FADE; } else { phase = Phase.STATIC; } } break; case FADE_OUT: message.alpha( p ); if (mode == Mode.CONTINUE || (mode == Mode.DESCEND && Dungeon.depth == 1)) { Music.INSTANCE.volume( p * (ShatteredPixelDungeon.musicVol()/10f)); } if ((timeLeft -= Game.elapsed) <= 0) { Game.switchScene( GameScene.class ); } break; case STATIC: if (error != null) { String errorMsg; if (error instanceof FileNotFoundException) errorMsg = Messages.get(this, "file_not_found"); else if (error instanceof IOException) errorMsg = Messages.get(this, "io_error"); else throw new RuntimeException("fatal error occured while moving between floors", error); add( new WndError( errorMsg ) { public void onBackPressed() { super.onBackPressed(); Game.switchScene( StartScene.class ); } } ); error = null; } break; } } private void descend() throws IOException { Actor.fixTime(); if (Dungeon.hero == null) { Dungeon.init(); if (noStory) { Dungeon.chapters.add( WndStory.ID_SEWERS ); noStory = false; } GameLog.wipe(); } else { Dungeon.saveAll(); } Level level; if (Dungeon.depth >= Statistics.deepestFloor) { level = Dungeon.newLevel(); } else { Dungeon.depth++; level = Dungeon.loadLevel( Dungeon.hero.heroClass ); } Dungeon.switchLevel( level, level.entrance ); } private void fall() throws IOException { Actor.fixTime(); Dungeon.saveAll(); Level level; if (Dungeon.depth >= Statistics.deepestFloor) { level = Dungeon.newLevel(); } else { Dungeon.depth++; level = Dungeon.loadLevel( Dungeon.hero.heroClass ); } Dungeon.switchLevel( level, fallIntoPit ? level.pitCell() : level.randomRespawnCell() ); } private void ascend() throws IOException { Actor.fixTime(); Dungeon.saveAll(); Dungeon.depth--; Level level = Dungeon.loadLevel( Dungeon.hero.heroClass ); Dungeon.switchLevel( level, level.exit ); } private void returnTo() throws IOException { Actor.fixTime(); Dungeon.saveAll(); Dungeon.depth = returnDepth; Level level = Dungeon.loadLevel( Dungeon.hero.heroClass ); Dungeon.switchLevel( level, Level.resizingNeeded ? level.adjustPos( returnPos ) : returnPos ); } private void restore() throws IOException { Actor.fixTime(); GameLog.wipe(); Dungeon.loadGame( StartScene.curClass ); if (Dungeon.depth == -1) { Dungeon.depth = Statistics.deepestFloor; Dungeon.switchLevel( Dungeon.loadLevel( StartScene.curClass ), -1 ); } else { Level level = Dungeon.loadLevel( StartScene.curClass ); Dungeon.switchLevel( level, Level.resizingNeeded ? level.adjustPos( Dungeon.hero.pos ) : Dungeon.hero.pos ); } } private void resurrect() throws IOException { Actor.fixTime(); if (Dungeon.level.locked) { Dungeon.hero.resurrect( Dungeon.depth ); Dungeon.depth--; Level level = Dungeon.newLevel(); Dungeon.switchLevel( level, level.entrance ); } else { Dungeon.hero.resurrect( -1 ); Dungeon.resetLevel(); } } private void reset() throws IOException { Actor.fixTime(); Dungeon.depth--; Level level = Dungeon.newLevel(); Dungeon.switchLevel( level, level.entrance ); } @Override protected void onBackPressed() { //Do nothing } }