diff --git a/blank_sheet.png b/blank_sheet.png new file mode 100644 index 0000000..37bfa12 Binary files /dev/null and b/blank_sheet.png differ diff --git a/generate_sheets.py b/generate_sheets.py new file mode 100644 index 0000000..7e02eef --- /dev/null +++ b/generate_sheets.py @@ -0,0 +1,275 @@ +import cv2 +import random +import numpy as np + +IMGPATH = "blank_sheet.png" + +cells = { + "all": [ + "ACE", + "BODYBLOCK", + "Rawdog", + "Accidental teamkill", + "tirilnade", + "CS2 bug", + "\"DU HAR BOMBEN\"", + "A snake eating its own tail indicates that its excrement provides food for it", + "\"MORRAPULER\"", + "\"KLASKER\"", + "\"HÆ? Er jeg den eneste igjen?\"", + "Noen blir knifa", + "Noen blir zeusa", + "Noen caller cheats", + "Match win", + "Noen klager på luckshots", + "Noen caller hacks", + "Ace steal (noen tar siste kill)", + "comeback fra 6+ losses under mostanderen", + "\"Du så han\"", + "\"Du hørte han\"", + "Accidental teamflash", + "Noen suicider", + ], + "parameterized": [ + "{} acer", + "{} clutcher", + "{} blir knifa", + "{} knifer noen", + "{} zeuser noen", + "{} topfragger", + "{} bottomfragger", + "{} 1deager", + ], + "markus": [ + "Markus bommer lineup", + "Markus finner på excuse for at han suger", + "Markus prater om spray transfers", + ], + "helen": [ + "Lille skløtte", + "Henrik tar over", + "Helen deafener seg selv", + ], + "hanna": [ + "Hanna tror hun spiller valo", + ], + "leander": [ + "Leander bommer et lett awp shot", + "Leander er for redd for å bli hørt av fienden", + "Leander accidentally hopper når han skyter noen", + ], + "petter": [ + "Petter roper NÆÆÆÆÆÆÆIIIII", + "Petter topfragger", + ], + "tita": [ + "Tita får >2 kills i en runde", + "Tita snur ryggen til en fiende", + ], + "thea": [ + "Thea får run n gun headshots med m4a1s", + "Thea prøver å banne overpass", + ], + "stash": [ + "Stash thrower clutchen", + ], + "mathias": [ + "Mathias får mer enn 2 kills med xm", + "Mathias spiller cs2", + ], + "seb": [ + "Seb kjøper shotgun", + "Seb ignorerer strat og løper alene inn på en site", + ], + "kristoffer": [ + "Kristoffer baiter oss bare for å ninja defuse", + "Kristoffer ninja defuser", + "Kristoffer caller strat", + ], + "sven": [ + "Sven spiller CS2", + ], + "randoms": [ + "Vi får en russer på laget", + ] + +} + +import cv2 + +import cv2 + +import cv2 +from PIL import Image, ImageDraw, ImageFont +import numpy as np + +def put_text_in_box(image, text, top_left, bottom_right, font_path, font_size=20, color=(0, 0, 0)): + """ + Puts text inside a bounding box on the cv2 image with automatic text wrapping, using PIL for text rendering. + + :param image: Source cv2 image (numpy array). + :param text: Text string to be put. + :param top_left: Tuple (x, y) defining the top-left corner of the bounding box. + :param bottom_right: Tuple (x, y) defining the bottom-right corner of the bounding box. + :param font_path: Path to a .ttf font file. + :param font_size: Initial font size. + :param color: Text color in RGB. + :return: Image with text (numpy array). + """ + + # Convert the cv2 image to a PIL image + image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) + draw = ImageDraw.Draw(image_pil) + font = ImageFont.truetype(font_path, font_size) + + # Calculate text size and wrapping + x1, y1 = top_left + x2, y2 = bottom_right + w, h = x2 - x1, y2 - y1 + lines = [] + line = [] + + for word in text.split(): + # Check if adding the word to the line would exceed the width + line_width, _ = draw.textsize(' '.join(line + [word]), font=font) + if line_width <= w: + line.append(word) + else: + lines.append(' '.join(line)) + line = [word] + + # Add the last line + lines.append(' '.join(line)) + + # Draw text + y = y1 + for line in lines: + draw.text((x1, y), line, fill=color, font=font) + y += font.getsize(line)[1] + + # Convert back to cv2 image format and update the original image + cv2_image = cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR) + np.copyto(image, cv2_image) + + +def sample_cells(players: list[str]) -> dict[str, list[str]]: + assert 0 < len(players) <= 6 + + default_space = cells["all"] + + if len(players) < 5: + default_space += cells["randoms"] + + player_cells = { + + } + + for player in players: + other_players = players.copy() + other_players.remove(player) + player_space = default_space + [i for player in players for i in cells[player] if player in cells] + other_players.append("du") + player_space += [s.format(random.choice(other_players)) for s in cells["parameterized"]] + + sampled_cells = np.random.choice(player_space, replace=False, size=25) + player_cells[player] = list(sampled_cells) + + print(player_cells) + return player_cells + + +def generate_sheets(players): + sample_space = sample_cells(players) + assert len(sample_space) == len(players) + image = cv2.imread(IMGPATH) + + player_sheets = { + + } + + for player in players: + player_sheets[player] = generate_sheet(sample_space[player], image) + + for p, sheet in player_sheets.items(): + cv2.imwrite(p + ".png", sheet) + + +def generate_sheet(sample_space: list, image: np.ndarray): + image = image.copy() + + start = 8, 294 + end = 625, 910 + + sliced = image[295:910, 10:625] + patches = [] + + for i in range(0, 5): + for j in range(0, 5): + print(sample_space) + + width = 123 + put_text_in_box( + sliced, sample_space.pop(), (i*width+1, j*width+1), ((i+1)*width, (j+1)*width), font_path="/mnt/c/Windows/Fonts/comic.ttf" + ) + # tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width] + # for i in range(0, 5): + # for j in range(0, 5): + # width = 123 + # index = random.randint(0, len(patches)-1) + # tile = patches.pop(index) + # sliced[i*width:(i+1)*width, j*width: (j+1)*width] = tile + + return image + +def clear_sheet(path): + image = cv2.imread(path) + + start = 8, 294 + end = 625, 910 + + sliced = image[295:910, 10:625] + patches = [] + + # for i in range(0, 5): + # for j in range(0, 5): + # width = 123 + # tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width].copy() + # patches.append(tile) + + for i in range(0, 5): + for j in range(0, 5): + width = 123 + sliced[i*width+i:(i+1)*width, j*width+j: (j+1)*width] = 255 + + cv2.imwrite(f"CLEARED_{path}", image) + + + +# def generate_sheet(path): +# image = cv2.imread(path) + +# start = 8, 294 +# end = 625, 910 + +# sliced = image[295:910, 10:625] +# patches = [] + +# for i in range(0, 5): +# for j in range(0, 5): +# width = 123 +# tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width].copy() +# patches.append(tile) + +# for i in range(0, 5): +# for j in range(0, 5): +# width = 123 +# index = random.randint(0, len(patches)-1) +# tile = patches.pop(index) +# sliced[i*width:(i+1)*width, j*width: (j+1)*width] = tile + +# return image + + +generate_sheets( + ["markus", "sven"] +) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e2926bf --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +cv2 +Pillow +numpy \ No newline at end of file