FoodStack.java

package com.devcharles.piazzapanic.utility;

import java.util.ArrayDeque;

import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.devcharles.piazzapanic.components.ItemComponent;

public class FoodStack extends ArrayDeque<Entity> {

    private Engine engine;

    public void init(Engine e) {
        engine = e;
    }

    public final int capacity = 12;

    /**
     * Put a new food into inventory, use this instead of
     * {@code FoodStack.push(Entity food)}
     * as it binds the item location to the player and maintains a maximum inventory
     * size of 12.
     * 
     * @param food
     * @param cook
     * @return
     */
    public boolean pushItem(Entity food, Entity cook) {
        if (this.size() < capacity) {
            ItemComponent item = engine.createComponent(ItemComponent.class);
            item.holderTransform = Mappers.transform.get(cook);
            food.add(item);
            this.push(food);
            return true;
        }
        return false;
    }

    /**
     * Used internally, please use {@code FoodStack.pushItem(Entity food)} instead.
     */
    @Override
    public void push(Entity food) {
        super.push(food);
        setVisibility(this.size(), null);
        return;
    }

    
    /* (non-Javadoc)
     * @see java.util.ArrayDeque#pop()
     */
    @Override
    public Entity pop() {
        Entity e = super.pop();
        e.remove(ItemComponent.class);
        setVisibility(this.size(), e);
        return e;
    }

    private void setVisibility(int size, Entity e) {
        if (size > 1) {
            for (Entity food : this) {
                Mappers.transform.get(food).isHidden = true;
            }
        } else if (size == 1) {
            Mappers.transform.get(this.peek()).isHidden = false;
        }

        if (e != null) {
            Mappers.transform.get(e).isHidden = false;
        }
    }
}