/*******************************************************************************
* Copyright 2015 Maximilian Stark | Dakror <mail@dakror.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.dakror.arise.ui;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import de.dakror.arise.game.Game;
import de.dakror.arise.game.building.Building;
import de.dakror.arise.game.building.Center;
import de.dakror.arise.layer.CityHUDLayer;
import de.dakror.arise.layer.CityLayer;
import de.dakror.arise.settings.Resources;
import de.dakror.arise.settings.Resources.Resource;
import de.dakror.arise.util.Assistant;
import de.dakror.gamesetup.GameFrame;
import de.dakror.gamesetup.ui.button.IconButton;
import de.dakror.gamesetup.util.Helper;
/**
* @author Dakror
*/
public class BuildButton extends IconButton {
Resources products, scale, buildingCosts;
String desc;
BufferedImage tooltipCache;
int tooltipRows, tooltipHeight, minCityLevel, level, maxLevel;
public int number;
boolean upgradeMode;
public boolean canEffort;
public BuildButton(int x, int y, int width, int height, Image img) {
super(x, y, width, height, img);
mode1 = true;
level = 0;
}
public BuildButton(int x, int y, int width, int height, Image img, Building b) {
this(x, y, width, height, img);
setBuildingMode(b);
}
public void setBuildingMode(Building b) {
upgradeMode = false;
tooltip = b.getName();
desc = b.getDescription();
products = b.getProducts();
scale = b.getScale();
buildingCosts = b.getBuildingCosts();
minCityLevel = b.getMinCityLevel();
level = b.getLevel();
maxLevel = b.getMaxLevel();
tooltipCache = null;
}
public void setUpgradeMode(String text, String desc, Resources buildingCosts, int minCityLevel) {
upgradeMode = true;
products = new Resources();
scale = new Resources();
tooltip = text;
this.desc = desc;
this.buildingCosts = buildingCosts;
this.minCityLevel = minCityLevel;
tooltipCache = null;
}
public void setProducts(Resources p) {
products = p;
}
public void setScale(Resources s) {
scale = s;
}
public void setLevel(int l) {
level = l;
}
public void setMaxLevel(int l) {
maxLevel = l;
}
public Resources getBuildingCosts() {
return buildingCosts;
}
@Override
public void draw(Graphics2D g) {
super.draw(g);
if (number > 0) Helper.drawRightAlignedString(number + "", x + width + 7, y + height + 5, g, 35);
}
@Override
public void update(int tick) {
if (buildingCosts != null) checkIfCanEffort();
}
@Override
public void drawTooltip(int x, int y, Graphics2D g) {
try {
if (level < maxLevel - 1 || maxLevel == 0) {
Color c = g.getColor();
ArrayList<Resource> resources = buildingCosts.getFilled();
ArrayList<Resource> products = this.products.getFilled();
if (tooltipCache == null) {
int hW = g.getFontMetrics(g.getFont().deriveFont(40f)).stringWidth(tooltip) + 40;
int width = hW > 250 ? hW : 250;
tooltipRows = Helper.getLineCount(desc, width - 40, g, 25);
tooltipHeight = tooltipRows * 25 + 75 + resources.size() * 30 + (products.size() > 0 ? 55 + products.size() * 30 : 30) + (minCityLevel > 0 ? 35 : 0)
- (buildingCosts.size() == 0 ? 30 : 0);
tooltipCache = new BufferedImage(width, tooltipHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) tooltipCache.getGraphics();
Helper.setRenderingHints(g2, true);
g2.setFont(g.getFont());
Helper.drawShadow(0, 0, width, tooltipHeight, g2);
g2.setColor(Color.white);
Helper.drawString(tooltip, 20, 50, g2, 40);
Helper.drawStringWrapped(desc, 30, 80, width - 40, g2, 25);
if (resources.size() > 0) Helper.drawString("Kosten", 25, 50 + tooltipRows * 25 + 35, g2, 30);
if (products.size() > 0) Helper.drawString("Produktion", 25, 80 + tooltipRows * 25 + 35 + resources.size() * 30, g2, 30);
for (int i = 0; i < products.size(); i++) {
Resource r = products.get(i);
float sc = scale.get(r) * (r.isUsable() ? Game.world.getSpeed() : 1);
float f = this.products.get(r) * (r.isUsable() ? Game.world.getSpeed() : 1) + sc * level;
String scStr = sc > 0 ? (upgradeMode ? " -> " + (sc + f > 0 && r.isUsable() ? "+" : "") + Assistant.formatNumber(sc + f, 0) + (r.isUsable() ? "/h" : "") : " (+"
+ Assistant.formatNumber(sc, 0) + "/lvl)") : "";
String str = (f > 0 && r.isUsable() ? "+" : "") + Assistant.formatNumber(f, 0) + (r.isUsable() ? "/h" : "") + scStr;
Assistant.drawLabelWithIcon(30, 80 + tooltipRows * 25 + 40 + resources.size() * 30 + i * 30 + (minCityLevel > 0 ? 60 : 0), 25, new Point(r.getIconX(), r.getIconY()),
str, 30, g2);
}
}
int width = tooltipCache.getWidth();
int height = tooltipCache.getHeight();
int x1 = x;
int y1 = y;
if (x1 + width > GameFrame.getWidth()) x1 -= (x1 + width) - GameFrame.getWidth();
if (y1 + height > GameFrame.getHeight()) y1 -= (y1 + height) - GameFrame.getHeight();
g.drawImage(tooltipCache, x1, y1, null);
for (int i = 0; i < resources.size(); i++) {
Resource r = resources.get(i);
if (r.isUsable()) {
boolean en = CityLayer.resources.get(r) >= buildingCosts.get(r);
g.setColor(en ? Color.white : Color.red);
} else {
boolean en = CityLayer.resources.get(r) < buildingCosts.get(r);
g.setColor(en ? Color.decode("#18acf1") : Color.red);
}
Assistant.drawResource(buildingCosts, r, x1 + 30, y1 + 100 + tooltipRows * 25 + i * 30, 25, 30, g);
}
if (minCityLevel > 0) {
g.setColor(CityHUDLayer.cl.city.getLevel() >= minCityLevel ? Color.white : Color.red);
Helper.drawString("min. Stadtlevel: " + (minCityLevel + 1), x1 + 25, y1 + 80 + tooltipRows * 25 + 40 + resources.size() * 30 + products.size() * 30, g, 25);
}
g.setColor(c);
} else {
String tooltip = "Bereits maximiert.";
int width = g.getFontMetrics(g.getFont().deriveFont(30f)).stringWidth(tooltip) + 30;
int height = 64;
int x1 = x;
int y1 = y;
if (x1 + width > GameFrame.getWidth()) x1 -= (x1 + width) - GameFrame.getWidth();
if (y1 + height > GameFrame.getHeight()) y1 -= (y1 + height) - GameFrame.getHeight();
Helper.drawShadow(x1, y1, g.getFontMetrics(g.getFont().deriveFont(30f)).stringWidth(tooltip) + 30, height, g);
Helper.drawString(tooltip, x1 + 15, y1 + 40, g, 30);
}
} catch (Exception e) {}
}
public void checkIfCanEffort() {
ArrayList<Resource> resources = buildingCosts.getFilled();
canEffort = true;
for (int i = 0; i < resources.size(); i++) {
Resource r = resources.get(i);
if (r.isUsable()) {
boolean en = CityLayer.resources.get(r) >= buildingCosts.get(r);
if (!en) canEffort = false;
} else {
boolean en = CityLayer.resources.get(r) < buildingCosts.get(r);
if (!en) canEffort = false;
}
}
if (CityHUDLayer.cl.city.getLevel() < minCityLevel) canEffort = false;
if (CityLayer.resources.get(Resource.BUILDINGS) >= new Center(0, 0, CityHUDLayer.cl.city.getLevel()).getScalingProducts().get(Resource.BUILDINGS) && !upgradeMode)
canEffort = false;
if (!upgradeMode) enabled = canEffort;
}
}