/*******************************************************************************
* 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.layer;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import de.dakror.arise.game.Game;
import de.dakror.arise.game.building.Barn;
import de.dakror.arise.game.building.Barracks;
import de.dakror.arise.game.building.Building;
import de.dakror.arise.game.building.Center;
import de.dakror.arise.game.building.Lumberjack;
import de.dakror.arise.game.building.Mine;
import de.dakror.arise.game.building.Quarry;
import de.dakror.arise.game.world.City;
import de.dakror.arise.net.packet.Packet;
import de.dakror.arise.net.packet.Packet.PacketTypes;
import de.dakror.arise.net.packet.Packet05Resources;
import de.dakror.arise.net.packet.Packet06Building;
import de.dakror.arise.net.packet.Packet07RenameCity;
import de.dakror.arise.net.packet.Packet09BuildingStage;
import de.dakror.arise.net.packet.Packet10Attribute;
import de.dakror.arise.net.packet.Packet10Attribute.Key;
import de.dakror.arise.net.packet.Packet11DeconstructBuilding;
import de.dakror.arise.net.packet.Packet12UpgradeBuilding;
import de.dakror.arise.net.packet.Packet13BuildingLevel;
import de.dakror.arise.net.packet.Packet14CityLevel;
import de.dakror.arise.net.packet.Packet16BuildingMeta;
import de.dakror.arise.net.packet.Packet20Takeover;
import de.dakror.arise.settings.Resources;
import de.dakror.arise.settings.Resources.Resource;
import de.dakror.arise.ui.ArmyLabel;
import de.dakror.arise.ui.BuildButton;
import de.dakror.arise.ui.ResourceLabel;
import de.dakror.gamesetup.GameFrame;
import de.dakror.gamesetup.layer.Alert;
import de.dakror.gamesetup.layer.Confirm;
import de.dakror.gamesetup.ui.ClickEvent;
import de.dakror.gamesetup.ui.Component;
import de.dakror.gamesetup.ui.InputField;
import de.dakror.gamesetup.ui.button.IconButton;
import de.dakror.gamesetup.util.Helper;
/**
* @author Dakror
*/
public class CityHUDLayer extends MPLayer {
public static Building selectedBuilding;
public static BuildButton upgrade, deconstruct;
public static CityLayer cl;
public static boolean anyComponentClicked;
BufferedImage cache;
boolean goBackToWorld;
@Override
public void init() {
try {
IconButton map = new IconButton((Game.getWidth() - 64) / 2, 20, 64, 64, "system/map.png");
map.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
goBackToWorld = true;
Game.currentGame.fadeTo(1, 0.05f);
}
});
map.tooltip = "Weltkarte";
map.mode2 = true;
components.add(map);
final InputField name = new InputField(Game.getWidth() / 2 + 50, 18, Game.getWidth() / 2 - 120, 48);
name.setMaxlength(50);
name.setAllowed(name.getAllowed() + " '.#~-");
name.setText(cl.city.getName());
name.drawBG = false;
name.onEnter = new ClickEvent() {
@Override
public void trigger() {
if (name.getText().trim().length() > 0) {
try {
Game.client.sendPacket(new Packet07RenameCity(cl.city.getId(), name.getText().trim()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
components.add(name);
BuildButton lumberjack = new BuildButton(15, Game.getHeight() - 64, 48, 48, Game.getImage("system/icons.png").getSubimage(72, 0, 24, 24), new Lumberjack(0, 0, 0));
lumberjack.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
cl.activeBuilding = new Lumberjack(0, 0, 0);
}
});
components.add(lumberjack);
BuildButton mine = new BuildButton(15 + 72, Game.getHeight() - 64, 48, 48, Game.getImage("system/icons.png").getSubimage(50, 24, 24, 24), new Mine(0, 0, 0));
mine.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
cl.activeBuilding = new Mine(0, 0, 0);
}
});
components.add(mine);
BuildButton quarry = new BuildButton(15 + 144, Game.getHeight() - 64, 48, 48, Game.getImage("system/icons.png").getSubimage(24, 24, 24, 24), new Quarry(0, 0, 0));
quarry.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
cl.activeBuilding = new Quarry(0, 0, 0);
}
});
components.add(quarry);
BuildButton barracks = new BuildButton(15 + 144 + 72, Game.getHeight() - 64, 48, 48, Game.getImage("system/icons.png").getSubimage(0, 96, 24, 24), new Barracks(0, 0, 0));
barracks.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
cl.activeBuilding = new Barracks(0, 0, 0);
}
});
components.add(barracks);
BuildButton barn = new BuildButton(15 + 144 + 144, Game.getHeight() - 64, 48, 48, Game.getImage("system/icons.png").getSubimage(24, 96, 24, 24), new Barn(0, 0, 0));
barn.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
cl.activeBuilding = new Barn(0, 0, 0);
}
});
// components.add(barn);
ResourceLabel gold = new ResourceLabel(20, 20, Resource.GOLD);
components.add(gold);
ResourceLabel wood = new ResourceLabel(190 + gold.getX(), 20, Resource.WOOD);
components.add(wood);
ResourceLabel stone = new ResourceLabel(400 + gold.getX(), 20, Resource.STONE);
components.add(stone);
ResourceLabel buildings = new ResourceLabel(gold.getX(), 60, Resource.BUILDINGS);
buildings.off = new Center(0, 0, cl.city.getLevel()).getScalingProducts().get(Resource.BUILDINGS);
components.add(buildings);
ResourceLabel people = new ResourceLabel(wood.getX(), 60, Resource.PEOPLE);
people.off = 20;
components.add(people);
ArmyLabel army = new ArmyLabel(stone.getX(), 60);
components.add(army);
updateBuildingbar();
upgrade = new BuildButton(-1000, -1000, 32, 32, Game.getImage("system/upgrade.png").getScaledInstance(32, 32, Image.SCALE_SMOOTH));
upgrade.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
try {
Game.client.sendPacket(new Packet12UpgradeBuilding(selectedBuilding.getId(), cl.city.getId()));
} catch (IOException e) {
e.printStackTrace();
}
}
});
upgrade.mode1 = true;
components.add(upgrade);
deconstruct = new BuildButton(-1000, -1000, 32, 32, Game.getImage("system/bomb.png").getScaledInstance(32, 32, Image.SCALE_SMOOTH));
deconstruct.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
deconstruct.state = 0;
Game.currentGame.addLayer(new Confirm("Bist du sicher, dass du diese Gebäude entgültig entfernen möchtest?", new ClickEvent() {
@Override
public void trigger() {
try {
Game.client.sendPacket(new Packet11DeconstructBuilding(selectedBuilding.getId(), cl.city.getId()));
} catch (IOException e) {
e.printStackTrace();
}
}
}, new ClickEvent() {
@Override
public void trigger() {
deconstruct.state = 0;
}
}));
}
});
deconstruct.mode1 = true;
components.add(deconstruct);
cache = new BufferedImage(Game.getWidth(), Game.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) cache.getGraphics();
Helper.setRenderingHints(g, true);
Helper.drawShadow(0, 5, Game.getWidth(), 96, g);
Helper.drawOutline(0, 5, Game.getWidth(), 96, false, g);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void draw(Graphics2D g) {
g.drawImage(cache, 0, 0, null);
if (selectedBuilding != null) {
int width = 300, height = 200;
Helper.drawContainer(Game.getWidth() - width, Game.getHeight() - height, width, height, true, false, g);
}
Component hovered = null;
for (Component c : components) {
c.draw(g);
if (c.state == 2) hovered = c;
}
if (selectedBuilding != null) selectedBuilding.getGuiContainer().draw(g);
if (hovered != null && Game.currentGame.getActiveLayer() instanceof CityHUDLayer) hovered.drawTooltip(GameFrame.currentFrame.mouse.x, GameFrame.currentFrame.mouse.y, g);
}
@Override
public void update(int tick) {
if (Game.world == null) return;
if (Game.currentGame.alpha == 1 && goBackToWorld) {
try {
Game.client.sendPacket(new Packet10Attribute(Key.city, -1));
} catch (IOException e) {
e.printStackTrace();
}
Game.currentGame.removeLayer(CityHUDLayer.this);
Game.currentGame.removeLayer(cl);
goBackToWorld = false;
Game.currentGame.fadeTo(0, 0.05f);
}
updateComponents(tick);
upgrade.setX(selectedBuilding == null ? -1000 : Game.getWidth() - 270);
upgrade.setY(selectedBuilding == null ? -1000 : Game.getHeight() - 170);
deconstruct.setX(selectedBuilding == null ? -1000 : Game.getWidth() - 270 + 56);
deconstruct.setY(selectedBuilding == null ? -1000 : Game.getHeight() - 170);
if (selectedBuilding != null) {
if (selectedBuilding.getStage() == 1) selectedBuilding.getGuiContainer().update(tick);
selectedBuilding.updateGuiButtons();
deconstruct.enabled = !(selectedBuilding instanceof Center) && selectedBuilding.getStage() == 1 && selectedBuilding.getStageChangeSecondsLeft() == 0;
upgrade.enabled = selectedBuilding.getLevel() < selectedBuilding.getMaxLevel() - 1 && selectedBuilding.getStage() == 1 && upgrade.canEffort
&& selectedBuilding.getStageChangeSecondsLeft() == 0;
if (selectedBuilding instanceof Center)
upgrade.enabled = selectedBuilding.getLevel() < City.levels.length - 1 && selectedBuilding.getStage() == 1 && upgrade.canEffort
&& selectedBuilding.getStageChangeSecondsLeft() == 0;
}
}
public void updateBuildingbar() {
Resources products = new Resources();
for (Component c : cl.components)
if (c instanceof Building && (((Building) c).getStage() == 1 || ((Building) c).getTypeId() == 1/* Center always active */))
products.add(((Building) c).getScalingProducts());
products = Resources.mul(products, Game.world.getSpeed());
for (Component c : components) {
if (c instanceof ResourceLabel) {
if (((ResourceLabel) c).getResource().isUsable()) ((ResourceLabel) c).perHour = products.get(((ResourceLabel) c).getResource());
else ((ResourceLabel) c).off = products.get(((ResourceLabel) c).getResource()) / Game.world.getSpeed();
}
}
if (selectedBuilding != null) selectedBuilding.triggerEvents();
}
@Override
public void mousePressed(MouseEvent e) {
anyComponentClicked = false;
if (selectedBuilding != null) {
selectedBuilding.getGuiContainer().mousePressed(e);
for (Component c : selectedBuilding.getGuiContainer().components) {
if (c.state != 0) {
anyComponentClicked = true;
break;
}
}
if (new Rectangle(Game.getWidth() - 300, Game.getHeight() - 200, 300, 200).contains(e.getPoint())) anyComponentClicked = true;
}
super.mousePressed(e);
for (Component c : components) {
if (c.state != 0) {
anyComponentClicked = true;
break;
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (selectedBuilding != null) selectedBuilding.getGuiContainer().mouseReleased(e);
super.mouseReleased(e);
}
@Override
public void mouseMoved(MouseEvent e) {
if (selectedBuilding != null) selectedBuilding.getGuiContainer().mouseMoved(e);
super.mouseMoved(e);
}
@Override
public void onReceivePacket(Packet p) {
super.onReceivePacket(p);
if (p.getType() == PacketTypes.RENAMECITY) {
Packet07RenameCity packet = (Packet07RenameCity) p;
if (packet.getCityId() == cl.city.getId()) {
if (packet.getNewName().equals("#false#")) Game.currentGame.addLayer(new Alert(
"Ein Fehler ist aufgetreten. Die Stadt konnte nicht umbennant werden. Bitte probiere es erneut.",
null));
else cl.city.setName(packet.getNewName());
}
}
if (p.getType() == PacketTypes.BUILDING) {
cl.activeBuilding = null;
Packet06Building packet = (Packet06Building) p;
Building b = Building.getBuildingByTypeId(packet.getX(), packet.getY(), packet.getLevel(), packet.getBuildingType());
b.setStage(packet.getStage());
b.setStageChangeSecondsLeft(packet.getTimeleft());
b.setMetadata(packet.getMeta());
b.setId(packet.getId());
cl.components.add(b);
cl.sortComponents();
updateBuildingbar();
}
if (p.getType() == PacketTypes.RESOURCES) {
Packet05Resources packet = (Packet05Resources) p;
CityLayer.resources = packet.getResources();
}
if (p.getType() == PacketTypes.BUILDINGSTAGE) {
Packet09BuildingStage packet = (Packet09BuildingStage) p;
for (Component c : cl.components) {
if (c instanceof Building && packet.getBuildingId() == ((Building) c).getId()) {
if (packet.getNewStage() == -1) {
if (selectedBuilding != null && selectedBuilding.equals(c)) selectedBuilding = null;
cl.components.remove(c);
} else {
((Building) c).setStage(packet.getNewStage());
((Building) c).setStageChangeSecondsLeft(packet.getTimeLeft());
}
break;
}
}
try {
Game.client.sendPacket(new Packet05Resources(cl.city.getId()));
} catch (IOException e) {
e.printStackTrace();
}
updateBuildingbar();
}
if (p.getType() == PacketTypes.BUILDINGLEVEL) {
Packet13BuildingLevel packet = (Packet13BuildingLevel) p;
for (Component c : cl.components) {
if (c instanceof Building && packet.getBuildingId() == ((Building) c).getId()) {
((Building) c).setLevel(packet.getNewLevel());
break;
}
}
try {
Game.client.sendPacket(new Packet05Resources(cl.city.getId()));
} catch (IOException e) {
e.printStackTrace();
}
updateBuildingbar();
}
if (p.getType() == PacketTypes.CITYLEVEL) {
Packet14CityLevel packet = (Packet14CityLevel) p;
if (packet.getCityId() == cl.city.getId()) cl.city.setLevel(packet.getNewLevel());
}
if (p.getType() == PacketTypes.BUILDINGMETA) {
Packet16BuildingMeta packet = (Packet16BuildingMeta) p;
for (Component c : cl.components) {
if (c instanceof Building && packet.getBuildingId() == ((Building) c).getId()) {
((Building) c).setMetadata(packet.getMeta());
break;
}
}
}
if (p.getType() == PacketTypes.TAKEOVER) {
Packet20Takeover packet = (Packet20Takeover) p;
if (packet.getCityTakenOverId() == cl.city.getId() && packet.getNewUserId() != Game.userID && packet.getNewUserId() > 0) {
Game.currentGame.addLayer(new Alert("Du hast diese Stadt an " + packet.getNewUsername() + " verloren!", new ClickEvent() {
@Override
public void trigger() {
goBackToWorld = true;
Game.currentGame.fadeTo(1, 0.05f);
}
}));
}
}
}
}