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 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> entries = new ArrayList<>(data.getCosts().get(1).entrySet()); for(Map.Entry 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; } }