Initial commit: Plants turn-based battle game
This commit is contained in:
+104
@@ -0,0 +1,104 @@
|
||||
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("Plants — 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("Plants — 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))
|
||||
Reference in New Issue
Block a user