import pygame from engine import collection from ui.scaling import make_window, request_quit, to_logical WIN_W, WIN_H = 1040, 720 BG = (24, 30, 24) TEXT = (230, 235, 230) MUTED = (150, 155, 150) HINT = (255, 220, 120) PANEL = (32, 38, 32) BTN = (60, 90, 60) BTN_HOVER = (85, 125, 85) class PresetScreen: def __init__(self): pygame.init() self.window, self.scale = make_window(WIN_W, WIN_H) self.screen = pygame.Surface((WIN_W, WIN_H)) pygame.display.set_caption("Flora — Team Presets") self.clock = pygame.time.Clock() self.font = pygame.font.SysFont("segoeui", 30) self.bold = pygame.font.SysFont("segoeui", 20, bold=True) self.small = pygame.font.SysFont("segoeui", 16) self.tiny = pygame.font.SysFont("segoeui", 13) self.back_rect = pygame.Rect(16, 16, 90, 34) self.slots = [] for i in range(4): card = pygame.Rect(WIN_W // 2 - 240, 130 + i * 92, 480, 76) set_btn = pygame.Rect(card.right - 180, card.y + 24, 80, 28) clear_btn = pygame.Rect(card.right - 90, card.y + 24, 80, 28) self.slots.append((card, set_btn, clear_btn)) def run(self): running = True while running: self.clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: request_quit() running = False elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: pos = to_logical(event.pos, self.scale) if self.back_rect.collidepoint(pos): running = False continue for i, (card, set_btn, clear_btn) in enumerate(self.slots): if set_btn.collidepoint(pos): self._set_slot(i) elif clear_btn.collidepoint(pos): collection.clear_preset(i) self._draw() pygame.transform.smoothscale(self.screen, self.window.get_size(), self.window) pygame.display.flip() def _set_slot(self, i): from ui.picker import TeamSelect ts = TeamSelect(tower_mode=True, pick_goal=4, header="Pick a team", start_label="Save") res = ts.run() self._reinit() # the nested picker quit pygame if res and res != "back" and res[0]: collection.save_preset(i, res[0]) def _reinit(self): pygame.init() self.window, self.scale = make_window(WIN_W, WIN_H) self.screen = pygame.Surface((WIN_W, WIN_H)) pygame.display.set_caption("Flora — Team Presets") self.clock = pygame.time.Clock() self.font = pygame.font.SysFont("segoeui", 30) self.bold = pygame.font.SysFont("segoeui", 20, bold=True) self.small = pygame.font.SysFont("segoeui", 16) self.tiny = pygame.font.SysFont("segoeui", 13) def _draw(self): self.screen.fill(BG) title = self.font.render("Team Presets", True, TEXT) self.screen.blit(title, title.get_rect(center=(WIN_W // 2, 52))) sub = self.small.render("Set up to 4 teams; load them with the P1–P4 buttons in battle.", True, MUTED) self.screen.blit(sub, sub.get_rect(center=(WIN_W // 2, 88))) pygame.draw.rect(self.screen, BTN, self.back_rect, border_radius=6) t = self.small.render("Back", True, TEXT) self.screen.blit(t, t.get_rect(center=self.back_rect.center)) presets = collection.get_presets() for i, (card, set_btn, clear_btn) in enumerate(self.slots): pygame.draw.rect(self.screen, PANEL, card, border_radius=8) pygame.draw.rect(self.screen, (60, 70, 60), card, 1, border_radius=8) head = self.bold.render(f"Preset {i + 1}", True, HINT) self.screen.blit(head, (card.x + 16, card.y + 10)) team = presets[i] if i < len(presets) else None if team: names = " · ".join(team) tt = self.tiny.render(names, True, TEXT) else: tt = self.tiny.render("Empty", True, MUTED) self.screen.blit(tt, (card.x + 16, card.y + 42)) pygame.draw.rect(self.screen, BTN_HOVER, set_btn, border_radius=6) s = self.tiny.render("Set", True, TEXT) self.screen.blit(s, s.get_rect(center=set_btn.center)) pygame.draw.rect(self.screen, (150, 70, 70), clear_btn, border_radius=6) c = self.tiny.render("Clear", True, TEXT) self.screen.blit(c, c.get_rect(center=clear_btn.center))