com.lyeeedar.Roguelike3D.Graphics.Screens.RecipeScreen.java Source code

Java tutorial

Introduction

Here is the source code for com.lyeeedar.Roguelike3D.Graphics.Screens.RecipeScreen.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Philip Collin.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     Philip Collin - initial API and implementation
 ******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Screens;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop;
import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Payload;
import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Source;
import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop.Target;
import com.lyeeedar.Roguelike3D.Roguelike3DGame;
import com.lyeeedar.Roguelike3D.Game.GameData;
import com.lyeeedar.Roguelike3D.Game.GameStats;
import com.lyeeedar.Roguelike3D.Game.Item.Component;
import com.lyeeedar.Roguelike3D.Game.Item.Item;
import com.lyeeedar.Roguelike3D.Game.Item.Recipe;
import com.lyeeedar.Roguelike3D.Roguelike3DGame.GameScreen;

public class RecipeScreen extends UIScreen {

    public static final int NUM_RECIPES = 6;

    Table table;
    Table left;
    Table leftBot;
    Table mid;
    Table right;

    ButtonGroup bg;
    boolean recipeListMode = true;

    public RecipeScreen(Roguelike3DGame game) {
        super(game);
    }

    List<Recipe> recipes;

    @Override
    public void show() {
        Gdx.input.setInputProcessor(stage);
        recipes = GameStats.getAllRecipes();

        recipeListMode = true;

        createUI();
    }

    public void createUI() {
        left.clear();
        mid.clear();
        right.clear();

        if (recipeListMode) {
            left.add(getRecipeList()).width(200);
            setRecipeDesc();
            TextButton craft = new TextButton("Craft Recipe", skin);
            craft.addListener(new InputListener() {
                public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                    recipeListMode = false;
                    pickRecipe();
                    createUI();
                    return false;
                }
            });
            right.add(craft);
        } else {
            left.add(createCraftingLeftView());
            left.row();
            left.add(leftBot);
        }

    }

    ArrayList<RecipeButton> recipeButtons;

    private ScrollPane getRecipeList() {
        Table rlist = new Table();
        bg = new ButtonGroup();
        recipeButtons = new ArrayList<RecipeButton>();

        boolean test = true;
        for (Recipe r : recipes) {
            RecipeButton rb = new RecipeButton(skin, r, bg);
            recipeButtons.add(rb);

            if (test) {
                test = false;
                rb.toggle();
            }

            rlist.add(rb).width(200).height(30).padBottom(10);
            rlist.row();
        }

        ScrollPane scroll = new ScrollPane(rlist, skin);
        scroll.setColor(0, 0, 0, 1.0f);
        scroll.setScrollingDisabled(true, false);

        return scroll;
    }

    private void setRecipeDesc() {
        mid.clear();

        Recipe r = null;
        for (RecipeButton rb : recipeButtons) {
            if (rb.isChecked()) {
                r = rb.recipe;
                break;
            }
        }

        mid.add(new Label("Name: " + r.recipeName, skin));
        mid.row();
        Table rarity = new Table();
        rarity.add(new Label("Rarity: ", skin));
        rarity.add(GameData.getRarityLabel(r.rarity, skin));
        mid.add(rarity);
        mid.row();
    }

    Recipe chosenRecipe;

    public void pickRecipe() {
        for (RecipeButton rb : recipeButtons) {
            if (rb.isChecked()) {
                chosenRecipe = rb.recipe;
                break;
            }
        }

        recipeListMode = false;
        createUI();
    }

    ArrayList<CraftButton> craftButtons;
    CraftButton selected = null;

    private Table createCraftingLeftView() {
        craftButtons = new ArrayList<CraftButton>();
        Table view = new Table();

        for (char[] row : chosenRecipe.visualGrid) {
            for (char c : row) {
                final CraftButton cb = new CraftButton(skin, c);
                if (c != ' ') {
                    craftButtons.add(cb);
                    cb.addListener(new InputListener() {
                        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                            if (selected != null)
                                selected.setColor(1.0f, 1.0f, 1.0f, 1.0f);
                            selected = cb;
                            selected.setColor(0.3f, 1.0f, 0.3f, 1.0f);
                            createCraftingCenterView();
                            createCraftingRightView();
                            return false;
                        }
                    });
                }
                view.add(cb).width(20).height(20);
            }
            view.row();
        }
        return view;
    }

    private void createCraftingLeftButton() {

        leftBot.clear();

        for (CraftButton cb : craftButtons) {
            if (cb.component == null)
                return;
        }

        TextButton tb = new TextButton("Craft Item", skin);
        tb.addListener(new InputListener() {
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                HashMap<Character, Component> components = new HashMap<Character, Component>();
                for (CraftButton cb : craftButtons) {
                    components.put(cb.reference, cb.component);
                    GameStats.removeComponent(cb.component, chosenRecipe.getComponentAmount(cb.reference));
                }
                Item i = chosenRecipe.craft(components);
                System.out.println(i);
                return false;
            }
        });

        leftBot.add(tb);
    }

    private void createCraftingCenterView() {
        mid.clear();

        if (selected == null)
            return;

        mid.add(chosenRecipe.getComponentDescription(selected.reference, skin));
        mid.row();

        if (selected.component == null)
            return;
        Component c = selected.component;

        Table tc = new Table();

        tc.add(new Label("Crafting Component", skin));
        tc.row();
        tc.add(new Label("Name: " + c.name, skin));
        tc.row();
        Table rarity = new Table();
        rarity.add(new Label("Rarity: ", skin));
        rarity.add(GameData.getRarityLabel(c.rarity, skin));
        tc.add(rarity);
        tc.row();
        tc.add(new Label("Soft/Hard: " + c.soft_hard, skin));
        tc.row();
        tc.add(new Label("Flexible/Brittle: " + c.flexible_brittle, skin));
        tc.row();

        mid.add(tc);
    }

    private void createCraftingRightView() {
        right.clear();

        bg = new ButtonGroup();
        Table t = new Table();

        for (Component c : GameStats.getAllComponents()) {
            // Check valid type
            if (!chosenRecipe.checkComponent(c, selected.reference))
                continue;

            // Check amounts
            int usedAmount = 0;
            for (CraftButton cb : craftButtons) {
                if (cb.component != null && cb.component.toString().equals(c.toString())) {
                    usedAmount += chosenRecipe.getComponentAmount(cb.reference);
                }
            }

            boolean check = false;
            if (selected.component != null && selected.component.toString().equals(c.toString()))
                check = true;
            else if (usedAmount + chosenRecipe.getComponentAmount(selected.reference) > c.amount)
                continue;

            // Valid!
            ComponentButton cb = new ComponentButton(skin, c, bg);
            t.add(cb);
            t.row();
            if (check)
                cb.cbox.toggle();
        }

        ScrollPane scroll = new ScrollPane(t, skin);
        scroll.setColor(0, 0, 0, 1.0f);
        scroll.setScrollingDisabled(true, false);

        right.add(scroll);
    }

    @Override
    public void hide() {
        Gdx.input.setInputProcessor(null);
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

    @Override
    protected void createSuper() {
        table = new Table();
        stage.addActor(table);
        table.setFillParent(true);

        left = new Table();
        leftBot = new Table();
        mid = new Table();
        right = new Table();

        table.add(left).width(200);
        table.add(mid).width(200);
        table.add(right).width(200);
    }

    @Override
    protected void superSuperDispose() {
    }

    @Override
    public void update(float delta) {
        if (Gdx.input.isKeyPressed(Keys.ESCAPE))
            game.switchScreen(GameScreen.MAINMENU);
    }

    class CraftButton extends Button {
        char reference;
        Component component;

        public CraftButton(Skin skin, char reference) {
            super(skin);
            this.reference = reference;
        }

        public void setComponent(Component c) {
            this.component = c;
            this.clear();

            this.add(new Image(c.icon));
        }
    }

    class RecipeButton extends Button {
        Recipe recipe;
        CheckBox cbox;
        boolean clicked = false;

        public RecipeButton(Skin skin, Recipe recipe, ButtonGroup bg) {
            super(skin);
            this.recipe = recipe;

            cbox = new CheckBox("     " + recipe.recipeName, skin);
            bg.add(cbox);

            add(cbox);
            addListener(new InputListener() {
                public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                    clicked = true;
                    return true;
                }

                public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                    if (clicked) {
                        clicked = false;
                        cbox.toggle();
                        setRecipeDesc();
                    }
                }

                public void touchDragged(InputEvent event, float x, float y, int pointer) {
                    clicked = false;
                }
            });

        }

        public boolean isChecked() {
            return cbox.isChecked();
        }
    }

    class ComponentButton extends Button {
        Component component;
        CheckBox cbox;
        boolean clicked = false;

        public ComponentButton(Skin skin, final Component component, ButtonGroup bg) {
            super(skin);
            this.component = component;

            cbox = new CheckBox("     " + component.name, skin);
            bg.add(cbox);

            add(cbox);
            add(new Image(component.icon));
            addListener(new InputListener() {
                public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                    clicked = true;
                    return true;
                }

                public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                    if (clicked) {
                        clicked = false;
                        cbox.toggle();
                        selected.setComponent(component);
                        createCraftingCenterView();
                        createCraftingLeftButton();
                    }
                }

                public void touchDragged(InputEvent event, float x, float y, int pointer) {
                    clicked = false;
                }
            });

        }

        public boolean isChecked() {
            return cbox.isChecked();
        }
    }

}