/* 1010! Klooni, a free customizable puzzle game for Android and Desktop Copyright (C) 2017-2019 Lonami Exo @ lonami.dev 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 <http://www.gnu.org/licenses/>. */ package dev.lonami.klooni.actors; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.math.Rectangle; import dev.lonami.klooni.Klooni; import dev.lonami.klooni.Theme; import dev.lonami.klooni.game.Board; import dev.lonami.klooni.game.GameLayout; import dev.lonami.klooni.game.Piece; import dev.lonami.klooni.interfaces.IEffectFactory; // Card-like actor used to display information about a given theme public class EffectCard extends ShopCard { //region Members private final IEffectFactory effect; private final Board board; // We want to create an effect from the beginning private boolean needCreateEffect = true; private final Texture background; //endregion //region Constructor public EffectCard(final Klooni game, final GameLayout layout, final IEffectFactory effect) { super(game, layout, effect.getDisplay(), Klooni.theme.background); background = Theme.getBlankTexture(); this.effect = effect; // Let the board have room for 3 cells, so cellSize * 3 board = new Board(new Rectangle(0, 0, cellSize * 3, cellSize * 3), 3); setRandomPiece(); usedItemUpdated(); } private void setRandomPiece() { while (true) { final Piece piece = Piece.random(); if (piece.cellCols > 3 || piece.cellRows > 3) continue; // Try to center it (max size is 3, so center is the second grid bit unless max size) int x = piece.cellCols == 3 ? 0 : 1; int y = piece.cellRows == 3 ? 0 : 1; if (board.putPiece(piece, x, y)) break; // Should not fail, but if it does, don't break } } //endregion //region Public methods @Override public void draw(Batch batch, float parentAlpha) { final float x = getX(), y = getY(); batch.setColor(Klooni.theme.background); batch.draw(background, x, y, getWidth(), getHeight()); // Avoid drawing on the borders by adding +1 cell padding board.pos.set(x + cellSize * 1, y + cellSize * 1); // Draw only if effects are done, i.e. not showcasing if (board.effectsDone()) board.draw(batch); super.draw(batch, parentAlpha); } @Override public boolean showcase(Batch batch, float yDisplacement) { board.pos.y += yDisplacement; // If no effect is running if (board.effectsDone()) { // And we want to create a new one if (needCreateEffect) { // Clear at cells[1][1], the center one board.clearAll(1, 1, effect); needCreateEffect = false; } else { // Otherwise, the previous effect finished, so return false because we're done // We also want to draw the next time so set the flag to true setRandomPiece(); needCreateEffect = true; return false; } } board.draw(batch); return true; } @Override public void usedItemUpdated() { if (game.effect.getName().equals(effect.getName())) priceLabel.setText("currently used"); else if (Klooni.isEffectBought(effect)) priceLabel.setText("bought"); else priceLabel.setText("buy for " + effect.getPrice()); } @Override public void use() { game.updateEffect(effect); usedItemUpdated(); } @Override public boolean isBought() { return Klooni.isEffectBought(effect); } @Override public boolean isUsed() { return game.effect.getName().equals(effect.getName()); } @Override public float getPrice() { return effect.getPrice(); } @Override public void performBuy() { if (Klooni.buyEffect(effect)) { use(); } } //endregion }