EmergentOrganization/cell-rpg

View on GitHub
core/src/io/github/emergentorganization/cellrpg/scenes/game/menu/pause/Equipment/EquipmentMenu.java

Summary

Maintainability
B
5 hrs
Test Coverage
package io.github.emergentorganization.cellrpg.scenes.game.menu.pause.Equipment;

import com.artemis.Entity;
import com.artemis.World;
import com.artemis.managers.TagManager;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.kotcrab.vis.ui.widget.VisLabel;
import com.kotcrab.vis.ui.widget.VisTable;
import com.kotcrab.vis.ui.widget.VisTextButton;
import io.github.emergentorganization.cellrpg.PixelonTransmission;
import io.github.emergentorganization.cellrpg.components.EnergyLevel;
import io.github.emergentorganization.cellrpg.components.EquipmentList;
import io.github.emergentorganization.cellrpg.core.Tags;
import io.github.emergentorganization.cellrpg.core.entityfactory.Entities.Equipment.Equipment;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import io.github.emergentorganization.cellrpg.scenes.game.menu.pause.Submenu;

public class EquipmentMenu extends Submenu {
    private final Logger logger = LogManager.getLogger(getClass());
    private final PixelonTransmission pt;
    private final World world;
    private VisLabel energyLabel;
    private Stage stage;

    public EquipmentMenu(PixelonTransmission pt, World world, VisTable table, Stage stage, String buttonText) {
        super(table, stage, buttonText);
        this.pt = pt;
        this.world = world;
        this.stage = stage;
    }

    @Override
    public void launchSubmenu() {
        super.launchSubmenu();
        menuTable.addSeparator();
        //menuTable.setDebug(true);
        //menuTable.debugAll();

//        final Preferences prefs = GameSettings.getPreferences();
//        final VisTextButton devMode = new VisTextButton( );
//        menuTable.add(devMode).pad(0f, 0f, 5f, 0f).fill(true, false).row();
//        devMode.addListener(new ClickListener(){
//            @Override
//        public void clicked(InputEvent event, float x, float y){
//                super.clicked(event, x, y);
//                prefs.putBoolean(GameSettings.KEY_DEV_DEVMODE, !GameSettings.devMode());
//                devMode.setText( );
//            }
//        });

        // TODO: show scroll bar if some cards outside of window
        try {
            Entity player = world.getSystem(TagManager.class).getEntity(Tags.PLAYER);
            EnergyLevel energyLevel = player.getComponent(EnergyLevel.class);

            for (Equipment equip : player.getComponent(EquipmentList.class).equipment) {
                appendEquipmentCard(equip, energyLevel);
            }
            appendFreeEnergyIndicator(energyLevel);
        } catch (NullPointerException ex) {
            logger.error("cannot show equipment (player not instantiated?)", ex);
        }

        //menuTable.pack();
        //menuTable.layout();
    }

    private void appendFreeEnergyIndicator(EnergyLevel energyLevel) {
        energyLabel = new VisLabel();
        update_energyLabel(energyLevel);
        menuTable.add(energyLabel);
        menuTable.row();
    }

    private void appendEquipmentCard(final Equipment equipm, final EnergyLevel energyLevel) {
        // TODO: set color of card based on equipm.type
        final VisTable cardContainer = new VisTable();
        cardContainer.addSeparator(true);

        // === LEFT COLUMN ===
        final VisTable leftCol = new VisTable();

        // Power
        final VisLabel powerImg = new VisLabel();
        update_pwrIndicator(powerImg, equipm);
        leftCol.add(powerImg);
        leftCol.row().expandX();

        // Damage
        final VisLabel damageImg = new VisLabel("dmg:" + equipm.damaged);
        leftCol.add(damageImg);
        leftCol.row().expandX();

        // Minus
        final ImageButton minusBtn = new ImageButton(pt.getUISkin(), "minus");
        leftCol.add(minusBtn).expand().right().bottom();

        cardContainer.add(leftCol).pad(2f).expandY().fill();

        // === MIDDLE COLUMN ===
        final VisTable midCol = new VisTable();

        final VisTable spriteAndDetailGrp = new VisTable();
        final Image sprite = new Image();
        spriteAndDetailGrp.add(sprite);
        final VisTable detailsCol = new VisTable();

        final VisLabel name = new VisLabel(equipm.name);
        detailsCol.add(name).row();

        final VisTable statsGrp = new VisTable();
        final VisLabel shieldStat = new VisLabel();
        statsGrp.add(shieldStat);
        final VisLabel attackStat = new VisLabel();
        statsGrp.add(attackStat);
        final VisLabel moveStat = new VisLabel();
        statsGrp.add(moveStat);
        final VisLabel subStat = new VisLabel();
        statsGrp.add(subStat);
        update_stats(equipm, shieldStat, attackStat, moveStat, subStat);
        detailsCol.add(statsGrp).row();

        final VisTextButton actionBtn = new VisTextButton("click to edit");
        detailsCol.add(actionBtn);

        Slot slot = new Slot(Item.BATTERY, 1);  // TODO: this needs to be replaced...
        SlotTooltip tooltip = new SlotTooltip(slot, pt.getUISkin());
        tooltip.setTouchable(Touchable.disabled); // allows for mouse to hit tooltips in the top-right corner of the screen without flashing
        stage.addActor(tooltip);

        actionBtn.addListener(new TooltipListener(tooltip, true));

        spriteAndDetailGrp.add(detailsCol);

        midCol.add(spriteAndDetailGrp).row();

        // energy bar
        final VisLabel energyBarLabel = new VisLabel("");
        update_energyBarLabel(energyBarLabel, equipm);
        midCol.add(energyBarLabel).bottom().center();

        cardContainer.add(midCol).pad(2f).expand().fill();

        // === right col ===
        final VisTable rightCol = new VisTable();
        final ImageButton plusBtn = new ImageButton(pt.getUISkin(), "plus");
        rightCol.add(plusBtn).expand().bottom().left();
        cardContainer.add(rightCol).pad(2f).expandY().fill();


        cardContainer.addSeparator(true);
        menuTable.add(cardContainer).expandX().fill();
        menuTable.row();
        menuTable.addSeparator();

        plusBtn.addListener(new ClickListener() {
            @Override
            public void clicked(InputEvent event, float x, float y) {
                super.clicked(event, x, y);
                logger.trace(!equipm.powerIsFull());
                if (!equipm.powerIsFull() && energyLevel.allocateEnergy(1)) {
                    equipm.powerFilled += 1;
                    update_energyLabel(energyLevel);
                    update_energyBarLabel(energyBarLabel, equipm);
                    update_pwrIndicator(powerImg, equipm);
                    update_stats(equipm, shieldStat, attackStat, moveStat, subStat);
                } // else not enough power available or already full
            }
        });

        minusBtn.addListener(new ClickListener() {
            @Override
            public void clicked(InputEvent event, float x, float y) {
                super.clicked(event, x, y);
                if (equipm.powerIsEmpty() && energyLevel.freeEnergy(1)) {  // if power not empty
                    equipm.powerFilled -= 1;
                    update_energyLabel(energyLevel);
                    update_energyBarLabel(energyBarLabel, equipm);
                    update_pwrIndicator(powerImg, equipm);
                    update_stats(equipm, shieldStat, attackStat, moveStat, subStat);
                } // else no power allocated to free
            }
        });
    }

    private void update_stats(Equipment equipm,
                              VisLabel shieldStat, VisLabel attackStat, VisLabel moveStat, VisLabel subStat) {
        shieldStat.setText("|" + equipm.shieldStat() + "/e|");
        attackStat.setText("|" + equipm.attackStat() + "/e|");
        moveStat.setText("|" + equipm.moveStat() + "/e|");
        subStat.setText("|" + Integer.toString(equipm.satStat()) + "|");
    }

    private void update_pwrIndicator(VisLabel powerIndicator, Equipment equipm) {
        powerIndicator.setText("pwr:" + equipm.isPowered());
    }

    private void update_energyLabel(EnergyLevel energyLevel) {
        energyLabel.setText("Energy Available:" + energyLevel.energyAvailable());
    }

    private void update_energyBarLabel(VisLabel energyBarLabel, Equipment equipm) {
        String energyBar = "|";
        // base energy boxes
        for (int i = 0; i < equipm.baseEnergy; i++) {
            if (equipm.powerFilled > i) {
                energyBar += "X|";
            } else {
                energyBar += "O|";
            }
        }
        // other energy boxes
        for (int i = 0; i < equipm.energySlots; i++) {
            if (equipm.powerFilled - equipm.baseEnergy > i) {
                energyBar += "x|";
            } else {
                energyBar += "o|";
            }
        }
        energyBarLabel.setText(energyBar);
    }
}