/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive 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.
*
* Matter Overdrive 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 Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.data.biostats;
import matteroverdrive.api.android.IBionicStat;
import matteroverdrive.client.render.HoloIcon;
import matteroverdrive.client.render.HoloIcons;
import matteroverdrive.entity.player.AndroidPlayer;
import matteroverdrive.util.MOStringHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Simeon on 5/27/2015.
*/
public abstract class AbstractBioticStat implements IBionicStat
{
int xp;
String name;
IBionicStat root;
List<IBionicStat> competitors;
List<ItemStack> requiredItems;
List<IBionicStat> enabledBlacklist;
int maxLevel;
boolean showOnHud;
boolean showOnWheel;
HoloIcon icon;
public AbstractBioticStat(String name, int xp)
{
this.name = name;
this.xp = xp;
competitors = new ArrayList<>();
requiredItems = new ArrayList<>();
enabledBlacklist = new ArrayList<>();
maxLevel = 1;
}
@Override
public String getUnlocalizedName() {
return name;
}
@Override
public String getDisplayName(AndroidPlayer androidPlayer, int level)
{
return MOStringHelper.translateToLocal("biotic_stat." + name + ".name");
}
@Override
public boolean isEnabled(AndroidPlayer android, int level)
{
return checkBlacklistActive(android, level);
}
public String getDetails(int level)
{
return MOStringHelper.translateToLocal("biotic_stat." + name + ".details");
}
@Override
public boolean canBeUnlocked(AndroidPlayer android,int level) {
//if the root is not unlocked then this stat can't be unlocked
if (root != null && !android.isUnlocked(root, root.maxLevel())) {
return false;
}
//if any of the competitors are unlocked then this stat can't be unlocked
if (areCompeditrosUnlocked(android))
return false;
if (requiredItems.size() > 0 && !android.getPlayer().capabilities.isCreativeMode) {
for (ItemStack item : requiredItems) {
if (!hasItem(android, item)) {
return false;
}
}
}
return android.isAndroid() && (android.getPlayer().capabilities.isCreativeMode || android.getPlayer().experienceLevel >= xp);
}
protected boolean hasItem(AndroidPlayer player, ItemStack stack)
{
int amountCount = stack.stackSize;
for (int i = 0;i < player.getPlayer().inventory.getSizeInventory();i++)
{
ItemStack s = player.getPlayer().inventory.getStackInSlot(i);
if (s != null && s.isItemEqual(stack))
{
amountCount-=s.stackSize;
}
}
return amountCount <= 0;
}
@Override
public void onUnlock(AndroidPlayer android, int level)
{
android.getPlayer().addExperienceLevel(-xp);
consumeItems(android);
}
//consume all the necessary items from the player inventory
//does not check if the items exist
protected void consumeItems(AndroidPlayer androidPlayer)
{
for (ItemStack itemStack : requiredItems)
{
int itemCount = itemStack.stackSize;
for (int j = 0; j < androidPlayer.getPlayer().inventory.getSizeInventory(); j++)
{
ItemStack pStack = androidPlayer.getPlayer().inventory.getStackInSlot(j);
if (pStack != null && pStack.isItemEqual(itemStack))
{
int countShouldTake = Math.min(itemCount,pStack.stackSize);
androidPlayer.getPlayer().inventory.decrStackSize(j,countShouldTake);
itemCount -= countShouldTake;
}
if (itemCount <= 0)
return;
}
}
}
@Override
public void onTooltip(AndroidPlayer android, int level, List<String> list, int mouseX, int mouseY)
{
String name = getDisplayName(android, level);
if (maxLevel() > 1)
{
name += String.format(" [%s/%s]",level,maxLevel());
}
list.add(EnumChatFormatting.WHITE + name);
String details = getDetails(level);
String[] detailsSplit = details.split("/n/");
for (String detail : detailsSplit)
{
list.add(EnumChatFormatting.GRAY + detail);
}
String requires = "";
if (root != null)
{
requires += EnumChatFormatting.GOLD+String.format("[%s%s]",root.getDisplayName(android,0),root.maxLevel() > 1 ? " " + root.maxLevel() : "");
}
if (requiredItems.size() > 0)
{
for (ItemStack itemStack : requiredItems)
{
if (!requires.isEmpty())
{
requires += EnumChatFormatting.GRAY + ", ";
}
if (itemStack.stackSize > 1)
{
requires += EnumChatFormatting.WHITE.toString() + itemStack.stackSize + "x";
}
requires += EnumChatFormatting.WHITE + "[" + itemStack.getDisplayName() + "]";
}
}
if (!requires.isEmpty())
{
list.add(MOStringHelper.translateToLocal("gui.tooltip.requires") + ": " + requires);
}
if (competitors.size() > 0)
{
String locks = EnumChatFormatting.RED + MOStringHelper.translateToLocal("gui.tooltip.locks") + ": ";
for (IBionicStat compeditor : competitors)
{
locks += String.format("[%s] ",compeditor.getDisplayName(android,0));
}
list.add(locks);
}
if (level < maxLevel())
{
list.add((android.getPlayer().experienceLevel < xp ? EnumChatFormatting.RED : EnumChatFormatting.GREEN) + "XP: " + xp);
}
}
public boolean checkBlacklistActive(AndroidPlayer androidPlayer,int level)
{
for (IBionicStat stat : enabledBlacklist)
{
if(stat.isActive(androidPlayer,level))
{
return false;
}
}
return true;
}
@Override
public void registerIcons(HoloIcons holoIcons)
{
icon = holoIcons.registerIcon("biotic_stat_" + name,18);
}
public void addReqiredItm(ItemStack stack)
{
requiredItems.add(stack);
}
@Override
public boolean showOnHud(AndroidPlayer android, int level)
{
return showOnHud;
}
@Override
public boolean showOnWheel(AndroidPlayer androidPlayer, int level)
{
return showOnWheel;
}
@Override
public int maxLevel() {
return maxLevel;
}
public IBionicStat getRoot()
{
return root;
}
public void setRoot(IBionicStat stat)
{
this.root = stat;
}
public void addCompetitor(IBionicStat stat)
{
this.competitors.add(stat);
}
public void removeCompetitor(IBionicStat competitor)
{
this.competitors.remove(competitor);
}
public List<IBionicStat> getCompetitors()
{
return competitors;
}
public void setMaxLevel(int maxLevel)
{
this.maxLevel = maxLevel;
}
public int getMaxLevel()
{
return maxLevel;
}
public void setShowOnHud(boolean showOnHud)
{
this.showOnHud = showOnHud;
}
public void setShowOnWheel(boolean showOnWheel){this.showOnWheel = showOnWheel;}
public List<ItemStack> getRequiredItems()
{
return requiredItems;
}
public List<IBionicStat> getEnabledBlacklist()
{
return enabledBlacklist;
}
public void addToEnabledBlacklist(IBionicStat stat)
{
enabledBlacklist.add(stat);
}
@Override
public HoloIcon getIcon(int level)
{
return icon;
}
@Override
public int getXP(AndroidPlayer androidPlayer, int level)
{
return xp;
}
public boolean areCompeditrosUnlocked(AndroidPlayer androidPlayer)
{
if (competitors.size() > 0) {
for (IBionicStat competitor : competitors) {
if (androidPlayer.isUnlocked(competitor, 0)) {
return true;
}
}
}
return false;
}
}