| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- package view.ui;
- import controller.factories.InteractiveTileFactory;
- import controller.tiles.interactive.InteractiveTileController;
- import model.Inventory;
- import model.items.ITEM_NAME;
- import model.tiles.InteractiveTileModel;
- import model.tiles.InteractiveTileType;
- import util.Translator;
- import util.economy.EconomyData;
- import util.economy.EconomyInfo;
- import view.GamePanel;
- import view.tile.TileManager;
- import javax.imageio.ImageIO;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- public class ShopView {
- private GamePanel gamePanel;
- private List<InteractiveTileType> offers;
- int overlayY = 80;
- int slotSize = 128;
- int spacing = 8;
- int slotCount = 0;
- int offsetX, offsetY;
- public ShopView(GamePanel gamePanel){
- this.gamePanel = gamePanel;
- offers = EconomyInfo.getOffers();
- }
- public void drawOverlay(Graphics2D g2) {
- drawShopOverlay(g2, Translator.translate("menu.shop"));
- drawInventoryOverlay(g2);
- }
- private void drawInventoryOverlay(Graphics2D g2) {
- gamePanel.getInventoryView().drawInventoryOverlay(g2);
- }
- public void drawShopOverlay(Graphics2D g2, String title){
- slotCount = offers.size();
- int overlayWidth = (slotSize + spacing) * slotCount + spacing;
- int overlayHeight = slotSize + 2* spacing;
- offsetX = gamePanel.getWidth()/2 - overlayWidth/2;
- offsetY = overlayY + spacing;
- g2.setColor(new Color(0, 0, 0, 160));
- g2.fillRoundRect(offsetX, offsetY, overlayWidth, overlayHeight, 25,25);
- drawTitle(g2, title);
- offsetX += spacing;
- offsetY += spacing;
- for(InteractiveTileType type : offers){
- drawOffer(g2, type);
- }
- }
- public InteractiveTileController getClickedOffer(int x, int y) {
- int offerCount = offers.size();
- int overlayWidth = (slotSize + spacing) * offerCount + spacing;
- int baseOffsetX = gamePanel.getWidth() / 2 - overlayWidth / 2;
- int baseOffsetY = overlayY + spacing;
- int offerX = baseOffsetX + spacing;
- int offerY = baseOffsetY + spacing;
- for (int i = 0; i < offerCount; i++) {
- int currentX = offerX + i * (slotSize + spacing);
- int currentY = offerY;
- if (x >= currentX && x <= currentX + slotSize &&
- y >= currentY && y <= currentY + slotSize) {
- TileManager tm = gamePanel.tileManager;
- return InteractiveTileFactory.createTile(gamePanel.gameController, new InteractiveTileModel(tm.screenToWorldX(x), tm.screenToWorldY(y), offers.get(i)));
- }
- }
- return null; // No offer clicked
- }
- private void drawOffer(Graphics2D g2, InteractiveTileType offer){
- g2.setColor(Color.LIGHT_GRAY);
- g2.fillRoundRect(offsetX, offsetY, slotSize, slotSize, 25, 25);
- g2.setColor(Color.BLACK);
- BufferedImage image = getImage("/tiles/" + offer.toString().toLowerCase() + "/" + offer.toString().toLowerCase() + "Test.png");
- int imageSize = slotSize/2;
- g2.drawImage(image, offsetX + (slotSize/2 - imageSize/2), offsetY, imageSize, imageSize,null);
- EconomyData data = EconomyInfo.infoOf(offer);
- int stringOffset = slotSize + imageSize;
- List<Map.Entry<ITEM_NAME, Integer>> entries = new ArrayList<>(data.getCosts().get(1).entrySet());
- for(Map.Entry<ITEM_NAME, Integer> entry : entries){
- String needed = Translator.translate("item."+entry.getKey()) + ": " + entry.getValue();
- int strWidth = g2.getFontMetrics().stringWidth(needed);
- Inventory inventory = gamePanel.gameController.getModel().getInventory();
- if(inventory.hasEnough(entry.getKey(), entry.getValue())){
- g2.setColor(Color.BLACK);
- }else{
- g2.setColor(Color.RED);
- }
- g2.drawString(needed, offsetX + (slotSize/2 - strWidth/2), stringOffset);
- stringOffset += g2.getFontMetrics().getHeight();
- }
- offsetX += slotSize + spacing;
- if(offsetX >= gamePanel.getWidth() - slotSize*2){
- offsetY += slotSize + spacing;
- offsetX = slotSize + slotSize/2;
- }
- }
- private void drawTitle(Graphics2D g2, String title){
- Font defaultF = g2.getFont();
- g2.setFont(new Font("Arial", Font.BOLD, 50));
- FontMetrics fm = g2.getFontMetrics();
- int msgWidth = fm.stringWidth(title);
- g2.setColor(new Color(0, 0, 0, 100));
- int offset = 100;
- g2.fillRoundRect(gamePanel.screenWidth /2 - msgWidth /2 - offset/2, 40 - fm.getHeight()/2, msgWidth + offset, 50, 25, 25);
- g2.setColor(Color.WHITE);
- g2.drawString(title, gamePanel.screenWidth / 2 - msgWidth / 2, 50);
- g2.setFont(defaultF);
- }
- private BufferedImage getImage(String imagePath){
- try {
- return ImageIO.read(getClass().getResourceAsStream(imagePath));
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
|