diff options
| author | ilotterytea <iltsu@alright.party> | 2022-10-19 22:06:16 +0600 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2022-10-19 22:06:16 +0600 |
| commit | bac4182ef9d1df55b3e2daad8be82f966a92b0dd (patch) | |
| tree | e08143c54939c527a931fd23690f8fd6e73fc2b4 /core/src/com/ilotterytea/maxoning/screens | |
| parent | 2434fafcdb07521c0db76037483d0c36c4280c2e (diff) | |
| parent | c792b675e340ade7e4fd6bd4e67265ba2b4cb1b5 (diff) | |
Resolved merge conflict
Diffstat (limited to 'core/src/com/ilotterytea/maxoning/screens')
4 files changed, 365 insertions, 546 deletions
diff --git a/core/src/com/ilotterytea/maxoning/screens/AssetLoadingScreen.java b/core/src/com/ilotterytea/maxoning/screens/AssetLoadingScreen.java deleted file mode 100644 index e61dc90..0000000 --- a/core/src/com/ilotterytea/maxoning/screens/AssetLoadingScreen.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.ilotterytea.maxoning.screens; - -import com.badlogic.gdx.*; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.scenes.scene2d.Stage; -import com.badlogic.gdx.scenes.scene2d.ui.Label; -import com.badlogic.gdx.scenes.scene2d.ui.Skin; -import com.badlogic.gdx.utils.viewport.ScreenViewport; -import com.ilotterytea.maxoning.MaxonGame; -import com.ilotterytea.maxoning.ui.AnimatedImage; -import com.ilotterytea.maxoning.anim.SpriteUtils; -import com.ilotterytea.maxoning.utils.AssetLoading; - -public class AssetLoadingScreen implements Screen { - final MaxonGame game; - - final Stage stage; - final Skin skin; - final AnimatedImage animatedMaxon; - final Label loadingLabel; - - final Texture M4x0nnes; - - public AssetLoadingScreen(MaxonGame game) { - this.game = game; - - this.M4x0nnes = new Texture("sprites/sheet/loadingCircle.png"); - - this.skin = new Skin(Gdx.files.internal("main.skin")); - this.stage = new Stage(new ScreenViewport()); - - this.loadingLabel = new Label("Loading...", skin); - - TextureRegion[] txrr = SpriteUtils.splitToTextureRegions(M4x0nnes, 112, 112, 10, 5); - this.animatedMaxon = new AnimatedImage(txrr); - - animatedMaxon.setPosition(8, 8); - animatedMaxon.setScale(0.25f); - - loadingLabel.setPosition(animatedMaxon.getWidth() * 0.25f + loadingLabel.getX() + 16, 8); - - stage.addActor(animatedMaxon); - //stage.addActor(loadingLabel); - - AssetLoading.queue(game.assetManager); - } - - @Override public void show() { render(Gdx.graphics.getDeltaTime()); } - - private void update() { - if (game.assetManager.update()) { - AssetLoading.registerItems(game.assetManager, game.locale); - game.setScreen(new SplashScreen(game)); - dispose(); - } - } - - @Override - public void render(float delta) { - Gdx.gl.glClearColor(0, 0, 0, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - - loadingLabel.setText(String.format("%s%% (Loaded %s assets)", MathUtils.floor(game.assetManager.getProgress() * 100), game.assetManager.getLoadedAssets())); - - stage.draw(); - stage.act(delta); - - update(); - } - - @Override - public void resize(int width, int height) { - stage.getViewport().update(width, height, true); - } - @Override public void pause() {} - @Override public void resume() {} - @Override public void hide() { dispose(); } - @Override public void dispose() {} -} diff --git a/core/src/com/ilotterytea/maxoning/screens/GameScreen.java b/core/src/com/ilotterytea/maxoning/screens/GameScreen.java index 263f282..8e4538d 100644 --- a/core/src/com/ilotterytea/maxoning/screens/GameScreen.java +++ b/core/src/com/ilotterytea/maxoning/screens/GameScreen.java @@ -3,24 +3,24 @@ package com.ilotterytea.maxoning.screens; import com.badlogic.gdx.*; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Timer; 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.inputprocessors.CrossProcessor; import com.ilotterytea.maxoning.player.MaxonItem; import com.ilotterytea.maxoning.player.MaxonItemRegister; -import com.ilotterytea.maxoning.player.MaxonPlayer; +import com.ilotterytea.maxoning.player.MaxonSavegame; import com.ilotterytea.maxoning.ui.*; import com.ilotterytea.maxoning.utils.serialization.GameDataSystem; import com.rafaskoberg.gdx.typinglabel.TypingLabel; @@ -32,11 +32,15 @@ import java.util.Map; public class GameScreen implements Screen, InputProcessor { final MaxonGame game; + final int slotId; + final long playTimestamp; - MaxonPlayer player; + MaxonSavegame player; Stage stage; - Skin skin; + Skin skin, widgetSkin; + + TextureAtlas widgetAtlas, environmentAtlas; Label pointsLabel; Image blackBg, inventoryBg, shopBg, pointsBg; @@ -46,48 +50,40 @@ public class GameScreen implements Screen, InputProcessor { Table petTable, inventoryTable, mainTable; ScrollPane petScroll; - NinePatch btnUp, btnDown, btnOver, btnDisabled; - - Texture bgTile, bgTileAlt; - ArrayList<MaxonItem> items; Map<Integer, Integer> invItems; - boolean isShopping = true; - ArrayList<ArrayList<Sprite>> bgTiles; - public GameScreen(MaxonGame game) throws IOException, ClassNotFoundException { + public GameScreen(MaxonGame game, MaxonSavegame sav, int slotId) throws IOException, ClassNotFoundException { this.game = game; + this.slotId = slotId; + this.playTimestamp = System.currentTimeMillis(); - player = new MaxonPlayer(); - player.load(GameDataSystem.LoadData()); + player = sav; // Initializing the stage and skin: stage = new Stage(new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); skin = new Skin(Gdx.files.internal("main.skin")); + widgetSkin = new Skin(Gdx.files.internal("sprites/gui/widgets.skin")); - // Ninepatch textures for buttons: - btnUp = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton.png", Texture.class), 8, 8, 8, 8); - btnDown = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_down.png", Texture.class), 8, 8, 8, 8); - btnOver = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_over.png", Texture.class), 8, 8, 8, 8); - btnDisabled = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_disabled.png", Texture.class), 8, 8, 8, 8); - + widgetAtlas = game.assetManager.get("sprites/gui/widgets.atlas", TextureAtlas.class); + environmentAtlas = game.assetManager.get("sprites/env/environment.atlas", TextureAtlas.class); items = new ArrayList<>(); - for (int id : player.purchasedItems) { + for (int id : player.inv) { items.add(MaxonItemRegister.get(id)); } - // Make the background a little dimmed: - blackBg = new Image(game.assetManager.get("sprites/black.png", Texture.class)); + // Make the background a little darker: + blackBg = new Image(environmentAtlas.findRegion("tile")); + blackBg.setColor(0f, 0f, 0f, 0.5f); blackBg.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - blackBg.addAction(Actions.parallel(Actions.alpha(0.25f))); stage.addActor(blackBg); // Setting the background for inventory: - inventoryBg = new Image(btnDisabled); + inventoryBg = new Image(widgetSkin, "down"); inventoryBg.setSize((Gdx.graphics.getWidth() / 2.0f) - 512f, (Gdx.graphics.getHeight() / 2.0f) - 8f); inventoryBg.setPosition(8, 4); stage.addActor(inventoryBg); @@ -104,15 +100,9 @@ public class GameScreen implements Screen, InputProcessor { inventoryTable.setSize(inventoryBg.getWidth(), inventoryBg.getHeight() - inventoryLabel.getHeight()); inventoryTable.setPosition(inventoryBg.getX(), inventoryBg.getY()); - TextTooltip.TextTooltipStyle textTooltipStyle = new TextTooltip.TextTooltipStyle(); - textTooltipStyle.label = new Label.LabelStyle(); - textTooltipStyle.label.font = skin.getFont("default"); - textTooltipStyle.label.fontColor = skin.getColor("white"); - textTooltipStyle.background = new NinePatchDrawable(btnUp); - invItems = new HashMap<>(); - for (Integer id : player.purchasedItems) { + for (Integer id : player.inv) { if (invItems.containsKey(id)) { invItems.put(id, invItems.get(id) + 1); } else { @@ -121,21 +111,14 @@ public class GameScreen implements Screen, InputProcessor { } // Put the items in the inventory table: - for (Integer id : invItems.keySet()) { - MaxonItem item = MaxonItemRegister.get(id); - - if (item != null) { - InventoryAnimatedItem invItem = new InventoryAnimatedItem(item, skin, invItems.get(id)); - inventoryTable.add(invItem).size(64, 64).pad(5f); - } - } + reorderInvItems(); inventoryTable.align(Align.left|Align.top); stage.addActor(inventoryTable); // Setting the background for pet shop: - shopBg = new Image(btnDisabled); + shopBg = new Image(widgetSkin, "down"); shopBg.setSize((Gdx.graphics.getWidth() / 2.0f) - 512f, (Gdx.graphics.getHeight() / 2.0f) - 8f); shopBg.setPosition(8, inventoryBg.getY() + inventoryBg.getHeight() + 8f); stage.addActor(shopBg); @@ -153,7 +136,7 @@ public class GameScreen implements Screen, InputProcessor { // Adding the pet items in pet table: for (final MaxonItem item : MaxonItemRegister.getItems()) { PurchaseItem purchaseItem = new PurchaseItem( - skin, btnUp, item.icon, item.name, item.desc, item.price + skin, widgetSkin, item.icon, item.name, item.desc, MaxonConstants.DECIMAL_FORMAT2.format(item.price) ); purchaseItem.addListener(new ClickListener() { @@ -162,13 +145,13 @@ public class GameScreen implements Screen, InputProcessor { if (player.points > item.price) { player.points -= item.price; player.multiplier += item.multiplier; - player.purchasedItems.add(item.id); + player.inv.add(item.id); items.add(item); invItems.clear(); inventoryTable.clear(); - for (Integer id : player.purchasedItems) { + for (Integer id : player.inv) { if (invItems.containsKey(id)) { invItems.put(id, invItems.get(id) + 1); } else { @@ -177,14 +160,7 @@ public class GameScreen implements Screen, InputProcessor { } // Put the items in the inventory table: - for (Integer id : invItems.keySet()) { - MaxonItem item = MaxonItemRegister.get(id); - - if (item != null) { - InventoryAnimatedItem invItem = new InventoryAnimatedItem(item, skin, invItems.get(id)); - inventoryTable.add(invItem).size(64, 64).pad(5f); - } - } + reorderInvItems(); } } }); @@ -202,7 +178,7 @@ public class GameScreen implements Screen, InputProcessor { stage.addActor(petScroll); // Background for points label: - pointsBg = new Image(btnDisabled); + pointsBg = new Image(widgetSkin, "down"); pointsBg.setSize((Gdx.graphics.getWidth() - (shopBg.getX() + shopBg.getWidth()) - 8f), 64f); pointsBg.setPosition(shopBg.getX() + shopBg.getWidth() + 4f, Gdx.graphics.getHeight() - pointsBg.getHeight() - 4f); @@ -220,30 +196,10 @@ public class GameScreen implements Screen, InputProcessor { stage.addActor(pointsLabel); - bgTile = game.assetManager.get("sprites/menu/tile_1.png", Texture.class); - bgTileAlt = game.assetManager.get("sprites/menu/tile_2.png", Texture.class); - // Generate the background: bgTiles = new ArrayList<>(); - for (int i = 0; i < Gdx.graphics.getHeight() / bgTile.getHeight() + 1; i++) { - bgTiles.add(i, new ArrayList<Sprite>()); - - for (int j = -1; j < Gdx.graphics.getWidth() / bgTile.getWidth(); j++) { - Sprite spr = new Sprite(); - - if ((j + i) % 2 == 0) { - spr.setTexture(bgTile); - } else { - spr.setTexture(bgTileAlt); - } - - spr.setSize(bgTile.getWidth(), bgTile.getHeight()); - - spr.setPosition(bgTile.getWidth() * j, bgTile.getHeight() * i); - bgTiles.get(i).add(spr); - } - } + genNewBgTiles((int) stage.getWidth(), (int) stage.getHeight()); // Table for Maxon cat: mainTable = new Table(); @@ -294,7 +250,7 @@ public class GameScreen implements Screen, InputProcessor { player.points += multiplier; - final TypingLabel label = new TypingLabel(game.locale.FormattedText("game.newPoint", String.valueOf(1 * player.multiplier)), skin, "default"); + final TypingLabel label = new TypingLabel(game.locale.FormattedText("game.newPoint", MaxonConstants.DECIMAL_FORMAT.format(player.multiplier)), skin, "default"); label.setPosition( mainTable.getX() + actor.getActorX(), @@ -362,8 +318,8 @@ public class GameScreen implements Screen, InputProcessor { // Update the points label: pointsLabel.setText(game.locale.FormattedText("game.points", - String.valueOf(player.points), - String.valueOf(player.multiplier) + MaxonConstants.DECIMAL_FORMAT.format(player.points), + MaxonConstants.DECIMAL_FORMAT.format(player.multiplier) )); stage.draw(); @@ -374,26 +330,46 @@ public class GameScreen implements Screen, InputProcessor { public void resize(int width, int height) { bgTiles.clear(); - for (int i = 0; i < Gdx.graphics.getHeight() / bgTile.getHeight() + 1; i++) { - bgTiles.add(i, new ArrayList<Sprite>()); + genNewBgTiles(width, height); + + stage.getViewport().update(width, height, true); + } + + private void reorderInvItems() { + inventoryTable.clear(); + + for (int i = 0; i < invItems.keySet().size(); i++) { + MaxonItem item = MaxonItemRegister.get(i); - for (int j = -1; j < Gdx.graphics.getWidth() / bgTile.getWidth(); j++) { - Sprite spr = new Sprite(); + if (item != null) { + InventoryAnimatedItem invItem = new InventoryAnimatedItem(item, skin, invItems.get(i)); + Cell<InventoryAnimatedItem> cell = inventoryTable.add(invItem).size(64, 64).pad(5f); + + if (i != 0 && i % 5 == 0) { + cell.row(); + } + } + } + } + + private void genNewBgTiles(int width, int height) { + for (int i = 0; i < height / environmentAtlas.findRegion("tile").getRegionHeight() + 1; i++) { + bgTiles.add(i, new ArrayList<Sprite>()); + for (int j = -1; j < width / environmentAtlas.findRegion("tile").getRegionWidth(); j++) { + Sprite spr = new Sprite(environmentAtlas.findRegion("tile")); if ((j + i) % 2 == 0) { - spr.setTexture(bgTile); + spr.setColor(0.98f, 0.71f, 0.22f, 1f); } else { - spr.setTexture(bgTileAlt); + spr.setColor(0.84f, 0.61f, 0.20f, 1f); } - spr.setSize(bgTile.getWidth(), bgTile.getHeight()); + spr.setSize(64, 64); - spr.setPosition(bgTile.getWidth() * j, bgTile.getHeight() * i); + spr.setPosition(spr.getWidth() * j, spr.getHeight() * i); bgTiles.get(i).add(spr); } } - - stage.getViewport().update(width, height, true); } @Override public void pause() {} @@ -411,11 +387,9 @@ public class GameScreen implements Screen, InputProcessor { @Override public boolean keyDown(int keycode) { if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)) { - try { - GameDataSystem.SaveData(player); - } catch (IOException e) { - throw new RuntimeException(e); - } + player.lastTimestamp = System.currentTimeMillis(); + player.elapsedTime = (System.currentTimeMillis() - playTimestamp) + player.elapsedTime; + GameDataSystem.save(player, String.format("0%s.maxon", (slotId >= 0) ? slotId : "latest")); game.setScreen(new MenuScreen(game)); dispose(); @@ -432,9 +406,9 @@ public class GameScreen implements Screen, InputProcessor { cat.nextFrame(); maxon.setDrawable(cat.getDrawable()); - player.points += 1 * player.multiplier; + player.points += player.multiplier; - final TypingLabel label = new TypingLabel(game.locale.FormattedText("game.newPoint", String.valueOf(1 * player.multiplier)), skin, "default"); + final TypingLabel label = new TypingLabel(game.locale.FormattedText("game.newPoint", MaxonConstants.DECIMAL_FORMAT.format(player.multiplier)), skin, "default"); label.setPosition( mainTable.getX() + actor.getActorX(), diff --git a/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java b/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java index 7acdf66..c796d22 100644 --- a/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java +++ b/core/src/com/ilotterytea/maxoning/screens/MenuScreen.java @@ -3,8 +3,8 @@ package com.ilotterytea.maxoning.screens; import com.badlogic.gdx.*; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.*; -import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; @@ -14,109 +14,91 @@ import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; 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.inputprocessors.CrossProcessor; +import com.ilotterytea.maxoning.player.MaxonSavegame; import com.ilotterytea.maxoning.ui.*; +import com.ilotterytea.maxoning.utils.math.Math; +import com.ilotterytea.maxoning.utils.serialization.GameDataSystem; +import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Calendar; -public class MenuScreen implements Screen, InputProcessor { +public class MenuScreen implements Screen { final MaxonGame game; final Stage stage; - final Skin skin; + final Skin skin, widgetSkin; - Image brandLogo, blackBg; - Label startLabel, infoLabel; + Image brandLogo, blackBg, menuBg; - NinepatchButton singlePlayerButton, optionsButton, quitButton; final Music menuMusic; - Table menuTable, optionsTable; + Table menuTable, savegameTable; - final Texture bgTile1, bgTile2; - - NinePatch buttonUp, buttonDown, buttonOver, buttonDisabled; + // Atlases: + TextureAtlas environmentAtlas, brandAtlas; private ArrayList<ArrayList<Sprite>> bgMenuTiles; + private ArrayList<LeafParticle> leafTiles, delLeafTiles; - private boolean anyKeyPressed = false, brandActionsSet = false; + private final boolean isAutumn = + // Autumn. + ((Calendar.getInstance().get(Calendar.MONTH) + 1 > 8) && (Calendar.getInstance().get(Calendar.MONTH) + 1 < 12)) || + // Spring. + ((Calendar.getInstance().get(Calendar.MONTH) + 1 < 6) && (Calendar.getInstance().get(Calendar.MONTH) + 1 > 2)); + private final boolean isSummer = (Calendar.getInstance().get(Calendar.MONTH) + 1 > 5 && Calendar.getInstance().get(Calendar.MONTH) + 1 < 9); public MenuScreen(final MaxonGame game) { this.game = game; - buttonUp = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton.png", Texture.class), 8, 8, 8, 8); - buttonDown = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_down.png", Texture.class), 8, 8, 8, 8); - buttonOver = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_over.png", Texture.class), 8, 8, 8, 8); - buttonDisabled = new NinePatch(game.assetManager.get("sprites/ui/sqrbutton_disabled.png", Texture.class), 8, 8, 8, 8); - - bgTile1 = game.assetManager.get("sprites/menu/tile_1.png", Texture.class); - bgTile2 = game.assetManager.get("sprites/menu/tile_2.png", Texture.class); - - bgMenuTiles = new ArrayList<>(); + // Environment atlas for leafs, snowflakes and background tiles: + environmentAtlas = game.assetManager.get("sprites/env/environment.atlas", TextureAtlas.class); - for (int i = 0; i < Gdx.graphics.getHeight() / bgTile1.getHeight() + 1; i++) { - bgMenuTiles.add(i, new ArrayList<Sprite>()); - for (int j = -1; j < Gdx.graphics.getWidth() / bgTile1.getWidth(); j++) { - Sprite spr = new Sprite((j + i % 2 == 0) ? bgTile1 : bgTile2); - - spr.setPosition(bgTile1.getWidth() * j, bgTile1.getHeight() * i); - bgMenuTiles.get(i).add(spr); - } - } + // Brand atlas: + brandAtlas = game.assetManager.get("sprites/gui/brand.atlas", TextureAtlas.class); + // Stage and skin: this.stage = new Stage(new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.skin = new Skin(Gdx.files.internal("main.skin")); + this.widgetSkin = new Skin(Gdx.files.internal("sprites/gui/widgets.skin")); + // Main Menu music: this.menuMusic = game.assetManager.get("mus/menu/mus_menu_loop.ogg", Music.class); - brandLogo = new Image(game.assetManager.get("sprites/brand.png", Texture.class)); - blackBg = new Image(game.assetManager.get("sprites/black.png", Texture.class)); + // Make the background a little darker: + brandLogo = new Image(brandAtlas.findRegion("brand")); + blackBg = new Image(environmentAtlas.findRegion("tile")); - this.startLabel = new Label(game.locale.TranslatableText("menu.pressStart"), skin, "press"); - this.infoLabel = new DebugLabel(skin); + blackBg.setColor(0f, 0f, 0f, 0.25f); + blackBg.setSize(stage.getWidth(), stage.getHeight()); - // Menu Buttons: - menuTable = new Table(); + stage.addActor(blackBg); - singlePlayerButton = new NinepatchButton(buttonUp, buttonDown, buttonOver, game.locale.TranslatableText("menu.playGame"), skin, "default"); - optionsButton = new NinepatchButton(buttonUp, buttonDown, buttonOver, game.locale.TranslatableText("menu.options"), skin, "default"); - quitButton = new NinepatchButton(buttonUp, buttonDown, buttonOver, game.locale.TranslatableText("menu.quit"), skin, "default"); + // Save game table: + savegameTable = new Table(); + loadSavegamesToTable(savegameTable); - singlePlayerButton.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - try { - game.setScreen(new GameScreen(game)); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - dispose(); - } - }); + // Quick buttons: + Table quickTable = new Table(); + quickTable.align(Align.right); - // Options: + // Options button: + TextButton optionsButton = new TextButton("Options", widgetSkin, "default"); optionsButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { - menuTable.clearActions(); - menuTable.addAction(Actions.moveTo(-Gdx.graphics.getWidth(), menuTable.getY(), 0.75f, Interpolation.sine)); - - optionsTable.clearActions(); - optionsTable.addAction(Actions.moveTo(0, optionsTable.getY(), 0.75f, Interpolation.sine)); - - blackBg.clearActions(); - blackBg.addAction(Actions.alpha(0.5f)); - - brandLogo.addAction( - Actions.moveTo(brandLogo.getX(), brandLogo.getY() + 512f, 0.5f, Interpolation.sine) - ); + super.clicked(event, x, y); } }); - // Exit the game when "quit button" is pressed: + quickTable.add(optionsButton).height(48f).minWidth(90f).pad(4f); + + // Quit button: + TextButton quitButton = new TextButton("Quit", widgetSkin, "default"); quitButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { @@ -124,99 +106,71 @@ public class MenuScreen implements Screen, InputProcessor { } }); - // Set the width and position for menu table: - menuTable.setPosition(0, Gdx.graphics.getHeight()); - menuTable.setWidth(Gdx.graphics.getWidth()); - menuTable.align(Align.center); + quickTable.add(quitButton).height(48f).minWidth(90f).pad(4f); - menuTable.add(singlePlayerButton).width(512f).height(81f).padBottom(10f).row(); - menuTable.add(optionsButton).width(512f).height(81f).padBottom(91f).row(); - menuTable.add(quitButton).width(512f).height(81f).row(); + // Menu table: + menuTable = new Table(); + menuTable.setPosition(0, 0); + menuTable.setSize(stage.getWidth(), stage.getHeight()); + menuTable.align(Align.center); - blackBg.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - blackBg.addAction(Actions.alpha(0.25f)); + Label menuTitle = new Label("Please select a save slot", skin, "default"); + menuTitle.setAlignment(Align.left); - // Options table: - optionsTable = new OptionsTable(game, skin, buttonUp, buttonDown, buttonOver, menuMusic, menuTable, blackBg, brandLogo); + menuTable.add(menuTitle).width(512f).row(); + menuTable.add(savegameTable).width(512f).maxWidth(640f).row(); + menuTable.add(quickTable).width(512f); - stage.addActor(blackBg); - stage.addActor(infoLabel); - stage.addActor(brandLogo); - stage.addActor(startLabel); stage.addActor(menuTable); - stage.addActor(optionsTable); - - menuTable.addAction(Actions.sequence(Actions.alpha(0f), Actions.moveTo(0f, -Gdx.graphics.getHeight() - Gdx.graphics.getHeight(), 0f))); - optionsTable.addAction(Actions.moveTo(Gdx.graphics.getWidth(), 0, 0f)); - - Gdx.input.setInputProcessor(new InputMultiplexer(this, new CrossProcessor(), stage)); - - // Setting the music: - if (game.prefs.getBoolean("music", true)) { - menuMusic.setLooping(true); - menuMusic.setVolume((game.prefs.getBoolean("music", true)) ? 1f : 0f); - menuMusic.play(); - } - } - - @Override public void show() { - brandLogo.setScale(100f); + // // Logo: + brandLogo = new Image(brandAtlas.findRegion("brand")); brandLogo.setPosition( - (Gdx.graphics.getWidth() / 2.0f) - (brandLogo.getWidth() / 2.0f), - (Gdx.graphics.getHeight() / 2.0f) - (brandLogo.getHeight() / 2.0f) + (stage.getWidth() / 2f) - (brandLogo.getWidth() / 2f), + stage.getHeight() - brandLogo.getHeight() * 1.5f ); brandLogo.setOrigin( - brandLogo.getWidth() / 2.0f, - brandLogo.getHeight() / 2.0f + brandLogo.getWidth() / 2f, + brandLogo.getHeight() / 2f ); brandLogo.addAction( - Actions.sequence( - Actions.alpha(0), - Actions.parallel( - Actions.fadeIn(1f), - Actions.scaleTo(1f, 1f, 1f, Interpolation.pow2InInverse) - ), - Actions.repeat( - RepeatAction.FOREVER, - Actions.sequence( - Actions.parallel( - Actions.rotateTo(-10, 10f, Interpolation.sine), - Actions.scaleTo(0.85f, 0.85f, 10f, Interpolation.sine) - ), - Actions.parallel( - Actions.rotateTo(10, 10f, Interpolation.sine), - Actions.scaleTo(1.25f, 1.25f, 10f, Interpolation.sine) - ) - ) - )) - ); - - startLabel.setPosition( - (Gdx.graphics.getWidth() / 2.0f) - (startLabel.getWidth() / 2.0f), - 32 - ); - - startLabel.addAction( Actions.repeat( RepeatAction.FOREVER, Actions.sequence( - Actions.alpha(0f), - Actions.fadeIn(1f), - Actions.delay(5f), - Actions.fadeOut(1f) + Actions.parallel( + Actions.rotateTo(-5f, 5f, Interpolation.smoother), + Actions.scaleTo(0.9f, 0.9f, 5f, Interpolation.smoother) + ), + Actions.parallel( + Actions.rotateTo(5f, 5f, Interpolation.smoother), + Actions.scaleTo(1.1f, 1.1f, 5f, Interpolation.smoother) + ) ) ) ); - infoLabel.setPosition(8, (Gdx.graphics.getHeight() - infoLabel.getHeight() - 8)); + stage.addActor(brandLogo); + + // Debug label: + DebugLabel debug = new DebugLabel(skin); + debug.setPosition(4, stage.getHeight() - debug.getHeight() - 4); + stage.addActor(debug); - // Start to render: - render(Gdx.graphics.getDeltaTime()); + Gdx.input.setInputProcessor(new InputMultiplexer(stage)); + // Generate background tiles: + bgMenuTiles = new ArrayList<>(); + genNewBgTiles((int) stage.getWidth(), (int) stage.getHeight()); + leafTiles = new ArrayList<>(); + delLeafTiles = new ArrayList<>(); + } + + @Override public void show() { + // Start to render: + render(Gdx.graphics.getDeltaTime()); } @Override @@ -224,46 +178,32 @@ public class MenuScreen implements Screen, InputProcessor { Gdx.gl.glClearColor(0, 0, 0, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - if (anyKeyPressed && !brandActionsSet) { - startLabel.clearActions(); - startLabel.addAction(Actions.fadeOut(0.5f)); - - brandLogo.clearActions(); - brandLogo.addAction( - Actions.sequence( - Actions.parallel( - Actions.alpha(1f), - Actions.rotateTo(0f, 2f), - Actions.scaleTo(1f, 1f, 2f), - Actions.moveTo( - (Gdx.graphics.getWidth() / 2f) - (brandLogo.getWidth() / 2f), - (Gdx.graphics.getHeight() - brandLogo.getHeight()) - 81, - 2f, - Interpolation.sine - ) - ), - Actions.repeat(RepeatAction.FOREVER, - Actions.sequence( - Actions.parallel( - Actions.rotateTo(-5f, 5f, Interpolation.smoother), - Actions.scaleTo(0.9f, 0.9f, 5f, Interpolation.smoother) - ), - Actions.parallel( - Actions.rotateTo(5f, 5f, Interpolation.smoother), - Actions.scaleTo(1.1f, 1.1f, 5f, Interpolation.smoother) - ) - ))) - ); - - menuTable.clearActions(); - menuTable.addAction( - Actions.parallel( - Actions.fadeIn(1.5f), - Actions.moveTo(0, (Gdx.graphics.getHeight() / 2f) - (menuTable.getHeight() / 2f) - 64f, 2.5f, Interpolation.smoother) - ) - ); - - brandActionsSet = true; + // Generate a new leaf: + if (!isSummer) { + LeafParticle _leaf = new LeafParticle( + (isAutumn) ? environmentAtlas.findRegion("leaf") : environmentAtlas.findRegion("snowflake"), + (float) java.lang.Math.floor(java.lang.Math.random() * Gdx.graphics.getWidth()), + Gdx.graphics.getHeight(), + (float) Math.getRandomNumber(-257, 256) + 1, + (float) Math.getRandomNumber(-257, 256) + 1, + (float) Math.getRandomNumber(5, 15)); + + _leaf.setScale(5f); + + if (isAutumn) { + switch (Math.getRandomNumber(0, 3)) { + case 0: _leaf.setColor(Color.CORAL); break; + case 1: _leaf.setColor(Color.YELLOW); break; + default: _leaf.setColor(Color.RED); break; + } + } else { + switch (Math.getRandomNumber(0, 1)) { + case 0: _leaf.setColor(Color.WHITE); break; + case 1: _leaf.setColor(Color.SKY); + } + } + + leafTiles.add(_leaf); } game.batch.begin(); @@ -275,6 +215,10 @@ public class MenuScreen implements Screen, InputProcessor { } } + for (LeafParticle spr : leafTiles) { + spr.draw(game.batch); + } + game.batch.end(); for (ArrayList<Sprite> array : bgMenuTiles) { @@ -296,6 +240,17 @@ public class MenuScreen implements Screen, InputProcessor { } } + if (!isSummer) { + for (LeafParticle spr : leafTiles) { + if (spr.getX() > Gdx.graphics.getWidth() || spr.getY() > Gdx.graphics.getHeight()) { + delLeafTiles.add(spr); + } + } + + for (LeafParticle spr : delLeafTiles) { leafTiles.remove(spr); } + delLeafTiles.clear(); + } + stage.draw(); stage.act(delta); } @@ -304,24 +259,87 @@ public class MenuScreen implements Screen, InputProcessor { public void resize(int width, int height) { bgMenuTiles.clear(); - for (int i = 0; i < height / bgTile1.getHeight() + 1; i++) { + genNewBgTiles(width, height); + + stage.getViewport().update(width, height, true); + } + + 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, widgetSkin, 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 genNewBgTiles(int width, int height) { + bgMenuTiles.clear(); + + for (int i = 0; i < height / environmentAtlas.findRegion("tile").getRegionHeight() + 1; i++) { bgMenuTiles.add(i, new ArrayList<Sprite>()); - for (int j = -1; j < width / bgTile1.getWidth(); j++) { - Sprite spr = new Sprite(); + for (int j = -1; j < width / environmentAtlas.findRegion("tile").getRegionWidth(); j++) { + Sprite spr = new Sprite(environmentAtlas.findRegion("tile")); if ((j + i) % 2 == 0) { - spr.setTexture(bgTile1); + spr.setColor(0.98f, 0.71f, 0.22f, 1f); } else { - spr.setTexture(bgTile2); + spr.setColor(0.84f, 0.61f, 0.20f, 1f); } - spr.setSize(bgTile1.getWidth(), bgTile1.getHeight()); - spr.setPosition(bgTile1.getWidth() * j, bgTile1.getHeight() * i); + spr.setSize(64, 64); + + spr.setPosition(spr.getWidth() * j, spr.getHeight() * i); bgMenuTiles.get(i).add(spr); } } - - stage.getViewport().update(width, height, true); } @Override public void pause() {} @@ -331,50 +349,4 @@ public class MenuScreen implements Screen, InputProcessor { stage.clear(); skin.dispose(); } - - @Override - public boolean keyDown(int keycode) { - if (Gdx.input.isKeyPressed(Input.Keys.ANY_KEY)) { - anyKeyPressed = true; - } - return false; - } - - @Override - public boolean keyUp(int keycode) { - return false; - } - - @Override - public boolean keyTyped(char character) { - return false; - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - if (!anyKeyPressed) { - anyKeyPressed = true; - } - return false; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button) { - return false; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer) { - return false; - } - - @Override - public boolean mouseMoved(int screenX, int screenY) { - return false; - } - - @Override - public boolean scrolled(float amountX, float amountY) { - return false; - } } diff --git a/core/src/com/ilotterytea/maxoning/screens/SplashScreen.java b/core/src/com/ilotterytea/maxoning/screens/SplashScreen.java index 9eac50d..ccae6b1 100644 --- a/core/src/com/ilotterytea/maxoning/screens/SplashScreen.java +++ b/core/src/com/ilotterytea/maxoning/screens/SplashScreen.java @@ -1,133 +1,133 @@ package com.ilotterytea.maxoning.screens; import com.badlogic.gdx.*; -import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.Stage; -import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Image; -import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.viewport.FillViewport; import com.ilotterytea.maxoning.MaxonGame; -import com.ilotterytea.maxoning.inputprocessors.CrossProcessor; -import com.ilotterytea.maxoning.ui.DebugLabel; +import com.ilotterytea.maxoning.utils.AssetLoading; +import com.ilotterytea.maxoning.utils.OsUtils; +import com.ilotterytea.maxoning.utils.math.Math; +import com.ilotterytea.maxoning.utils.serialization.GameDataSystem; -public class SplashScreen implements InputProcessor, Screen { +import java.io.IOException; +import java.util.ArrayList; + +public class SplashScreen implements Screen { final MaxonGame game; final Stage stage; final Skin skin; - final Image whiteSquare, dev, org; - final Label infoLabel, disclaimer, legalLabel; - - final Music introMusic; + TextureAtlas brandAtlas, envAtlas; + ArrayList<Sprite> contribList; + Image dev, pub; public SplashScreen(MaxonGame game) { this.game = game; - this.introMusic = game.assetManager.get("mus/menu/mus_menu_intro.ogg", Music.class); - this.stage = new Stage(new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight())); this.skin = new Skin(Gdx.files.internal("main.skin")); - this.infoLabel = new DebugLabel(skin); - this.disclaimer = new Label(game.locale.TranslatableText("splash.disclaimer"), skin, "disclaimer"); - this.legalLabel = new Label("", skin, "disclaimer"); - - this.dev = new Image(game.assetManager.get("sprites/ilotterytea.png", Texture.class)); - this.org = new Image(game.assetManager.get("sprites/supadank.png", Texture.class)); - this.whiteSquare = new Image(game.assetManager.get("sprites/white.png", Texture.class)); - - disclaimer.setBounds(0, 0, 800, 600); - - infoLabel.setPosition( - 8, - (Gdx.graphics.getHeight() - infoLabel.getHeight()) - 8 - ); - - dev.setScale(5f); - - dev.setPosition( - (Gdx.graphics.getWidth() / 2.0f) - (dev.getWidth() * 5f / 2.0f), - (Gdx.graphics.getHeight() / 2.0f) - (dev.getHeight() * 5f / 2.0f) - ); - - org.setPosition( - (Gdx.graphics.getWidth() / 2.0f) - (org.getWidth() / 2.0f), - (Gdx.graphics.getHeight() / 2.0f) - (org.getHeight() / 2.0f) - ); - - disclaimer.setPosition( - (Gdx.graphics.getWidth() / 2.0f) - (800 / 2.0f), - (Gdx.graphics.getHeight() / 2.0f) - (600 / 2.0f) - ); - - whiteSquare.setPosition(0, 0); - whiteSquare.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - - dev.addAction(Actions.sequence( - Actions.alpha(0), - Actions.fadeIn(1f), - Actions.delay(5f), - Actions.fadeOut(0.25f) - )); - - org.addAction(Actions.sequence( - Actions.alpha(0f), - Actions.delay(7.3f), - Actions.fadeIn(2.5f), - Actions.delay(5f), - Actions.fadeOut(5f) - )); - - disclaimer.addAction( - Actions.sequence( - Actions.alpha(0f), - Actions.delay(19.8f), - Actions.fadeIn(1f), - Actions.delay(3f), - Actions.fadeOut(1f) - ) - ); - - whiteSquare.addAction(Actions.sequence( - Actions.alpha(0), - Actions.fadeIn(0.5f), - Actions.delay(25f), - Actions.fadeOut(0.5f) - )); - disclaimer.setWrap(true); - - stage.addActor(whiteSquare); - stage.addActor(infoLabel); - stage.addActor(dev); - stage.addActor(org); - stage.addActor(disclaimer); - - Gdx.input.setInputProcessor(new InputMultiplexer(this, new CrossProcessor(), stage)); + Table logoTable = new Table(); + + logoTable.setSize(stage.getWidth(), stage.getHeight()); + logoTable.setPosition(0, 0); + logoTable.align(Align.center); + + brandAtlas = new TextureAtlas(Gdx.files.internal("sprites/gui/ilotterytea.atlas")); + envAtlas = new TextureAtlas(Gdx.files.internal("sprites/env/environment.atlas")); + contribList = new ArrayList<>(); + + pub = new Image(brandAtlas.findRegion("org")); + logoTable.add(pub).size(pub.getWidth() * 5f, pub.getHeight() * 5f).pad(16f).row(); + + dev = new Image(brandAtlas.findRegion("devOld")); + logoTable.add(dev).size(dev.getWidth() * 5f, dev.getHeight() * 5f); + + stage.addActor(logoTable); + + AssetLoading.queue(game.assetManager); } @Override public void show() { - introMusic.setVolume((game.prefs.getBoolean("music", true)) ? 1f : 0f); - introMusic.play(); + int size = 64; + for (int i = 0; i < stage.getHeight() / size; i++) { + for (int j = 0; j < stage.getWidth() / size; j++) { + Sprite spr = new Sprite(envAtlas.findRegion("tile")); + spr.setSize(size, size); + spr.setPosition(size * j, size * i); + switch (Math.getRandomNumber(0, 5)) { + case 0: spr.setColor(Color.SKY); break; + case 1: spr.setColor(Color.PURPLE); break; + case 2: spr.setColor(Color.PINK); break; + case 3: spr.setColor(Color.CHARTREUSE); break; + case 4: spr.setColor(Color.ORANGE); break; + } + spr.setAlpha(0.25f); + contribList.add(spr); + } + } + + Timer.schedule(new Timer.Task() { + @Override + public void run() { + for (Sprite spr : contribList) { + switch (Math.getRandomNumber(0, 5)) { + case 0: spr.setColor(Color.SKY); break; + case 1: spr.setColor(Color.PURPLE); break; + case 2: spr.setColor(Color.PINK); break; + case 3: spr.setColor(Color.CHARTREUSE); break; + case 4: spr.setColor(Color.ORANGE); break; + } + spr.setAlpha(0.25f); + } + } + }, 1f, 1f); + render(Gdx.graphics.getDeltaTime()); } + private void update() { + if (game.assetManager.update()) { + AssetLoading.registerItems(game.assetManager, game.locale); + if (OsUtils.isAndroid || OsUtils.isIos) { + try { + game.setScreen(new GameScreen(game, GameDataSystem.load("latest.sav"), -1)); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } else { + game.setScreen(new MenuScreen(game)); + } + dispose(); + } + } + @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + game.batch.begin(); + for (Sprite spr : contribList) { + spr.draw(game.batch); + } + game.batch.end(); + stage.draw(); stage.act(delta); - if (!introMusic.isPlaying()) { - game.setScreen(new MenuScreen(game)); - } + update(); } @Override @@ -138,53 +138,8 @@ public class SplashScreen implements InputProcessor, Screen { @Override public void pause() {} @Override public void resume() {} @Override public void hide() { dispose(); } - @Override public void dispose() {} - - @Override - public boolean keyDown(int keycode) { - if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)) { - Gdx.app.exit(); - } - if (Gdx.input.isKeyPressed(Input.Keys.ANY_KEY)) { - introMusic.stop(); - game.setScreen(new MenuScreen(game)); - dispose(); - } - return false; - } - - @Override - public boolean keyUp(int keycode) { - return false; - } - - @Override - public boolean keyTyped(char character) { - return false; - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - return false; - } - - @Override - public boolean touchUp(int screenX, int screenY, int pointer, int button) { - return false; - } - - @Override - public boolean touchDragged(int screenX, int screenY, int pointer) { - return false; - } - - @Override - public boolean mouseMoved(int screenX, int screenY) { - return false; - } - - @Override - public boolean scrolled(float amountX, float amountY) { - return false; + @Override public void dispose() { + brandAtlas.dispose(); + envAtlas.dispose(); } } |
