diff options
3 files changed, 192 insertions, 235 deletions
diff --git a/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java b/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java index 56b21d0..4be257d 100644 --- a/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java +++ b/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; @@ -19,14 +20,14 @@ import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.viewport.FillViewport; import com.ilotterytea.maxoning.MaxonConstants; import com.ilotterytea.maxoning.MaxonGame; +import com.ilotterytea.maxoning.anim.SpriteUtils; import com.ilotterytea.maxoning.player.MaxonSavegame; +import com.ilotterytea.maxoning.player.utils.PetUtils; import com.ilotterytea.maxoning.ui.*; import com.ilotterytea.maxoning.utils.I18N; -import com.ilotterytea.maxoning.utils.formatters.NumberFormatter; import com.ilotterytea.maxoning.utils.serialization.GameDataSystem; import java.awt.*; -import java.io.IOException; import java.util.ArrayList; import java.util.Locale; @@ -36,7 +37,7 @@ public class MenuScreen implements Screen { final Stage stage; final Skin skin; - TextureAtlas brandAtlas; + TextureAtlas brandAtlas, mainAtlas; Image brandLogo; @@ -50,15 +51,27 @@ public class MenuScreen implements Screen { MaxonSavegame sav; + ArrayList<SavegameInfo> savInfos; + ArrayList<Image> savImgs; + + int curSav; + SavegameInfo curSavInfo; + Image curSavImg; + private final MovingChessBackground bg; public MenuScreen(final MaxonGame game) { this.game = game; + savInfos = new ArrayList<>(); + savImgs = new ArrayList<>(); + curSav = -1; + // Stage and skin: this.stage = new Stage(new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.skin = game.assetManager.get("MainSpritesheet.skin", Skin.class); brandAtlas = game.assetManager.get("sprites/gui/brand.atlas", TextureAtlas.class); + mainAtlas = game.assetManager.get("MainSpritesheet.atlas", TextureAtlas.class); sav = GameDataSystem.load("00.maxon"); @@ -99,46 +112,6 @@ public class MenuScreen implements Screen { stage.addActor(menuTable); - // // Press start: - startBtn = new TextButton(game.locale.TranslatableText("menu.pressStart"), skin, "text"); - startBtn.setPosition((stage.getWidth() / 2f) - (startBtn.getWidth() / 2f), 8f); - - startBtn.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - try { - game.setScreen(new GameScreen( - game, - (sav == null) ? new MaxonSavegame() : sav, - 0 - )); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - }); - - startBtn.addAction( - Actions.repeat( - -1, - Actions.sequence( - Actions.fadeIn(1f), - Actions.delay(2f), - Actions.fadeOut(1f), - Actions.delay(2f) - ) - ) - ); - - stage.addActor(startBtn); - - // // Savegame: - savLabel = new Label( - (sav == null) ? game.locale.TranslatableText("menu.last_savegame.empty") : game.locale.FormattedText("menu.last_savegame.found", sav.petName, NumberFormatter.format(sav.points), NumberFormatter.format(sav.multiplier), String.valueOf(sav.inv.size())), skin); - savLabel.setPosition((stage.getWidth() / 2f) - (savLabel.getWidth() / 2f), 8f + startBtn.getY() + startBtn.getHeight()); - - stage.addActor(savLabel); - // // Logo: brandLogo = new Image(brandAtlas.findRegion("brand")); brandLogo.setPosition( @@ -185,6 +158,42 @@ public class MenuScreen implements Screen { skin.getDrawable("tile_01"), skin.getDrawable("tile_02") ); + + generateSaves(); + + updateCurrentVisualSavegame(false); + + // Save control buttons: + ImageButton rArrowBtn = new ImageButton(skin, "right_arrow"); + rArrowBtn.setPosition( + stage.getWidth() - (rArrowBtn.getWidth() + 64f), + (stage.getHeight() / 2f) - (rArrowBtn.getHeight() / 2f) + ); + rArrowBtn.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + Gdx.app.log("TEST", String.format("%s - %s", savImgs.size(), savInfos.size())); + updateCurrentVisualSavegame(false); + } + }); + + stage.addActor(rArrowBtn); + + + // Save control buttons: + ImageButton lArrowBtn = new ImageButton(skin, "left_arrow"); + lArrowBtn.setPosition( + lArrowBtn.getWidth() + 64f, + (stage.getHeight() / 2f) - (lArrowBtn.getHeight() / 2f) + ); + lArrowBtn.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + updateCurrentVisualSavegame(true); + } + }); + + stage.addActor(lArrowBtn); } @Override public void show() { @@ -511,61 +520,72 @@ public class MenuScreen implements Screen { actTable.add(saveBtn).pad(5f); } - /*private void loadSavegamesToTable(Table table) { - for (int i = 0; i < 3; i++) { - if (new File(MaxonConstants.GAME_SAVEGAME_FOLDER + String.format("/0%s.maxon", i)).exists()) { - final MaxonSavegame sav = GameDataSystem.load("0" + i + ".maxon"); - SaveGameWidget widget = new SaveGameWidget( - skin, sav - ); - final int finalI = i; - widget.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - try { - game.setScreen(new GameScreen(game, sav, finalI)); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - dispose(); - } - }); - table.add(widget).width(512f).padBottom(8f).row(); - } else { - - final MaxonSavegame sav = new MaxonSavegame(); - final SaveGameWidget widget = new SaveGameWidget( - skin, widgetSkin, null - ); - final int finalI = i; - widget.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - sav.petId = 0; - sav.inv = new ArrayList<>(); - sav.multiplier = 5; - sav.points = 0; - sav.roomId = 0; - sav.seed = System.currentTimeMillis(); - sav.name = "SAVE " + (finalI + 1); - sav.elapsedTime = 0; - sav.lastTimestamp = System.currentTimeMillis(); - sav.outInv = new ArrayList<>(); - - GameDataSystem.save(sav, "0" + finalI + ".maxon"); - - try { - game.setScreen(new GameScreen(game, sav, finalI)); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - dispose(); - } - }); - table.add(widget).width(512f).padBottom(8f).row(); - } + private void generateSaves() { + ArrayList<MaxonSavegame> saves = GameDataSystem.getSavegames(); + int i = -1; + + for (MaxonSavegame sav : saves) { + i++; + + savInfos.add(new SavegameInfo(game, skin, sav, i)); + savImgs.add(new Image( + PetUtils.animatedImageById(game.assetManager, sav.petId).getDrawable() + ) + ); + } + + savInfos.add(new SavegameInfo(game, skin, null, i + 1)); + savImgs.add(new Image( + mainAtlas.findRegion("unknown") + )); + } + + private void updateCurrentVisualSavegame(boolean indexNegative) { + if (indexNegative) curSav--; + else curSav++; + + if (curSav < 0) { + curSav = savInfos.size() - 1; } - }*/ + + if (savInfos.size() - 1 < curSav || savImgs.size() - 1 < curSav) { + curSav = 0; + } + + // Set the image: + if (curSavImg != null) { + curSavImg.remove(); + curSavImg.setSize( + curSavImg.getWidth() / 2f, + curSavImg.getHeight() / 2f + ); + } + curSavImg = savImgs.get(curSav); + + curSavImg.setSize( + curSavImg.getWidth() * 2f, + curSavImg.getHeight() * 2f + ); + + curSavImg.setPosition( + (stage.getWidth() / 2f) - (curSavImg.getWidth() / 2f), + (stage.getHeight() / 2f) - (curSavImg.getHeight() / 2f) + ); + + stage.addActor(curSavImg); + + // Set the info: + if (curSavInfo != null) curSavInfo.remove(); + + curSavInfo = savInfos.get(curSav); + + curSavInfo.setPosition( + (stage.getWidth() / 2f) - (curSavInfo.getWidth() / 2f), + 6f + ); + + stage.addActor(curSavInfo); + } @Override public void pause() {} @Override public void resume() {} diff --git a/core/src/com/ilotterytea/maxoning/ui/SaveGameWidget.java b/core/src/com/ilotterytea/maxoning/ui/SaveGameWidget.java deleted file mode 100644 index e52d1a3..0000000 --- a/core/src/com/ilotterytea/maxoning/ui/SaveGameWidget.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.ilotterytea.maxoning.ui; - - -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.scenes.scene2d.ui.*; -import com.badlogic.gdx.utils.Align; -import com.badlogic.gdx.utils.Null; -import com.ilotterytea.maxoning.player.MaxonSavegame; -import com.ilotterytea.maxoning.utils.formatters.NumberFormatter; - -public class SaveGameWidget extends Button { - public SaveGameWidget( - Skin skin, - @Null MaxonSavegame sav - ) { - // Setting the stack: - super(skin, "slot"); - - // // // Save slot data: - // // Info row: - Table infoTable = new Table(); - - // Top left label (name): - Label topleftLabel = new Label((sav != null) ? sav.name : "[EMPTY]", skin); - topleftLabel.setAlignment(Align.left); - infoTable.add(topleftLabel).width(256f); - - // Top right label (elapsed time): - String time = "--:--"; - - if (sav != null) { - long h = sav.elapsedTime / 1000 / 60 / 60; - long m = sav.elapsedTime / 1000 / 60; - - time = String.format( - "%s:%s", - ((h < 10) ? "0" : "") + h, - ((m < 10) ? "0" : "") + m - ); - } - - Label toprightLabel = new Label( - time, - skin - ); - toprightLabel.setAlignment(Align.right); - infoTable.add(toprightLabel).width(256f); - - // // Description row: - Table descTable = new Table(); - - // Bottom left label (purchased items): - Label bottomleftLabel = new Label( - String.format( - "%s purchased items", - (sav != null) ? sav.inv.size() : "?" - ), - skin - ); - bottomleftLabel.setAlignment(Align.left); - descTable.add(bottomleftLabel).width(256f); - - // Bottom right label (points/multiplier): - Label pointsLabel = new Label( - String.format( - "%s$/x%s", - (sav != null) ? NumberFormatter.format(sav.points) : "---", - (sav != null) ? NumberFormatter.format(sav.multiplier) : "0" - ), - skin - ); - pointsLabel.setAlignment(Align.right); - descTable.add(pointsLabel).width(256f); - - // Adding the tables to main table: - Table summaryTable = new Table(); - summaryTable.add(infoTable).pad(5f).row(); - summaryTable.add(descTable).pad(5f).row(); - - if (sav == null) { - topleftLabel.setColor(Color.DARK_GRAY); - toprightLabel.setColor(Color.DARK_GRAY); - bottomleftLabel.setColor(Color.DARK_GRAY); - pointsLabel.setColor(Color.DARK_GRAY); - } - - super.add(summaryTable); - } -} diff --git a/core/src/com/ilotterytea/maxoning/ui/SavegameInfo.kt b/core/src/com/ilotterytea/maxoning/ui/SavegameInfo.kt index df4936d..e210ca8 100644 --- a/core/src/com/ilotterytea/maxoning/ui/SavegameInfo.kt +++ b/core/src/com/ilotterytea/maxoning/ui/SavegameInfo.kt @@ -17,7 +17,7 @@ import com.ilotterytea.maxoning.utils.formatters.NumberFormatter class SavegameInfo( game: MaxonGame, skin: Skin, - sav: MaxonSavegame, + sav: MaxonSavegame?, savId: Int ) : Table(skin) { init { @@ -26,64 +26,90 @@ class SavegameInfo( this.height = 324f this.align(Align.top) - val title = Label("Save $savId (${sav.name})", skin, "with_background") + val title = Label(if (sav != null) "Save ${savId + 1}" else "New Game", skin, "with_background") this.add(title).width(506f).pad(6f).row() val content = Table() content.align(Align.top) this.add(content).width(506f).maxWidth(506f).pad(6f).expandY().row() - // - - - P O I N T S - - - : - // Label for points: - val pointsLabel = Label("Points", skin) - content.add(pointsLabel).width(246f).pad(4f) - // Label for points count: - val pointsCLabel = Label(NumberFormatter.format(sav.points.toLong()), skin) - pointsCLabel.setAlignment(Align.right) - content.add(pointsCLabel).width(246f).pad(4f).row() - - // - - - M U L T I P L I E R - - - : - // Label for multiplier: - val mpLabel = Label("Multiplier", skin) - content.add(mpLabel).width(246f).pad(4f) - // Label for multiplier count: - val mpCLabel = Label("+${NumberFormatter.format(sav.multiplier.toLong())}/click", skin) - mpCLabel.setAlignment(Align.right) - content.add(mpCLabel).width(246f).pad(4f).row() - - // - - - P U R C H A S E D I T E M S - - - : - // Label for purchased items: - val piLabel = Label("Inventory size", skin) - content.add(piLabel).width(246f).pad(4f) - // Label for purchased items count: - val piCLabel = Label(sav.inv.size.toString(), skin) - piCLabel.setAlignment(Align.right) - content.add(piCLabel).width(246f).pad(4f).row() - // - - - A C T I O N S - - - : val actions = Table() this.add(actions).width(508f).row() - // Deletion button: - val delButton = ImageButton(skin, "delete") - - delButton.addListener(object : ClickListener() { - override fun clicked(event: InputEvent?, x: Float, y: Float) { - super.clicked(event, x, y) - } - }) - - actions.add(delButton).pad(4f) - // Play button: - val playButton = TextButton("Play!", skin) - - playButton.addListener(object : ClickListener() { - override fun clicked(event: InputEvent, x: Float, y: Float) { - game.screen = GameScreen(game, sav, savId) - } - }) - - actions.add(playButton).width(444f) + if (sav != null) { + // - - - P O I N T S - - - : + // Label for points: + val pointsLabel = Label("Points", skin) + content.add(pointsLabel).width(246f).pad(4f) + // Label for points count: + val pointsCLabel = Label(NumberFormatter.format(sav.points.toLong()), skin) + pointsCLabel.setAlignment(Align.right) + content.add(pointsCLabel).width(246f).pad(4f).row() + + // - - - M U L T I P L I E R - - - : + // Label for multiplier: + val mpLabel = Label("Multiplier", skin) + content.add(mpLabel).width(246f).pad(4f) + // Label for multiplier count: + val mpCLabel = Label("+${NumberFormatter.format(sav.multiplier.toLong())}/click", skin) + mpCLabel.setAlignment(Align.right) + content.add(mpCLabel).width(246f).pad(4f).row() + + // - - - P U R C H A S E D I T E M S - - - : + // Label for purchased items: + val piLabel = Label("Inventory size", skin) + content.add(piLabel).width(246f).pad(4f) + // Label for purchased items count: + val piCLabel = Label(sav.inv.size.toString(), skin) + piCLabel.setAlignment(Align.right) + content.add(piCLabel).width(246f).pad(4f).row() + + // Deletion button: + val delButton = ImageButton(skin, "delete") + + delButton.addListener(object : ClickListener() { + override fun clicked(event: InputEvent?, x: Float, y: Float) { + super.clicked(event, x, y) + } + }) + + actions.add(delButton).pad(4f) + + // Play button: + val playButton = TextButton("Play!", skin) + + playButton.addListener(object : ClickListener() { + override fun clicked(event: InputEvent, x: Float, y: Float) { + game.screen = GameScreen(game, sav, savId) + } + }) + + actions.add(playButton).width(444f) + } else { + // - - - N A M E - - - : + // Label for points: + val nameLabel = Label("Your name", skin) + content.add(nameLabel).width(246f).pad(4f) + // Label for points count: + val nameField = TextField("test", skin) + content.add(nameField).width(246f).pad(4f).row() + + + // Play button: + val playButton = TextButton("START!", skin) + + playButton.addListener(object : ClickListener() { + override fun clicked(event: InputEvent, x: Float, y: Float) { + val _sav = MaxonSavegame() + _sav.name = nameField.messageText + + game.screen = GameScreen(game, _sav, savId) + } + }) + + actions.add(playButton).width(502f) + } } |
