diff --git a/game.py b/game.py index af48153..56c332e 100644 --- a/game.py +++ b/game.py @@ -25,6 +25,12 @@ def normalDist(difficulty): # Cap it to be 0-1 again and return return min(max(v, 0), 1) +def PIL2PG(pilImage: Image) -> pygame.Surface: + """ + Converts a PIL image to a Pygame surface. + """ + return pygame.image.fromstring(pilImage.tobytes(), pilImage.size, pilImage.mode) + class Font: def __init__(self, data, fontSize): self.font = ImageFont.truetype(os.path.join('./fonts/', data['file']), fontSize) @@ -41,7 +47,7 @@ class Game(gameUtils.Game): self.pm (NoPELib.PlayerManager): This is where your players are stored. self.cfg (dict): Everything from the `game.toml` file. You can access it like this: self.details['title'] """ - + # Don't remove this. It does important things. :3 super().__init__(*args, **kwargs) @@ -50,8 +56,8 @@ class Game(gameUtils.Game): # The actual text in the captcha, used to check what the user typed self.currentCaptchaText = '' # The image of the captcha - self.currentCaptchaImg = '' - + self.currentCaptchaImg = pygame.Surface((0, 0)) + self.fonts = [] self.Drawsurface = Image.new("RGB",(800,220),(255,255,255)) @@ -65,7 +71,7 @@ class Game(gameUtils.Game): #for fontData in j: # self.fonts.update() - + def fontsByDifficulty(self, difficulty, width=0.3): """ Gets a list of fonts that fall within the specified difficulty. @@ -81,21 +87,37 @@ class Game(gameUtils.Game): to draw the fonts, add noise, random shapes, transforms etc. based on self.gameDifficulty """ - self.Drawsurface = Image.new("RGB",(800,220),(255,255,255)) # creates a surface to draw the fonts on - draw = ImageDraw.Draw(self.Drawsurface) # creates an object to let us draw to the surface + # Create a surface for that captcha + drawSurface = Image.new("RGB", (800,220), (255,255,255)) + # Create a drawing object + draw = ImageDraw.Draw(drawSurface) + # Temporarily stores the current captcha text captcha = '' + # Get a random cpatcha length capLength = random.randint(3, 6) for i in range(capLength): + # Calculate the base X position of this character + # TODO: Make this better, I'm not too happy with my implementation here. x = self.size[0] / (capLength + 3) x *= i + # Get the selected difficulty for this character charDiff = normalDist(self.gameDifficulty) + # Pick a random font based on that difficulty font = random.choice(self.fontsByDifficulty(charDiff)) + # Pick a random character char = random.choice(font.alphabet) - draw.ellipse((x, 10, x+5, 15), fill = 'blue', outline ='blue') - draw.text((x, 10), char, font=font.font, fill=(0,0,0)) #actually draws the text + # Draw the selected character, with the selected font + draw.text((x, 10), char, font=font.font, fill=(0,0,0)) + # Append the character to the captcha captcha += char - + + # Store the correct captcha text + self.currentCaptchaText = captcha + + # Store the created image + self.currentCaptchaImg = PIL2PG(drawSurface) + print(captcha) def onEvent(self, event): @@ -123,13 +145,8 @@ class Game(gameUtils.Game): # Don't remove this. It does important things. :3 super().update() - #self.textTest = ImageFont.truetype("./fonts/"+self.fonts[2]["file"],200) #loads the font - - self.pygameConvert = pygame.image.fromstring(self.Drawsurface.tobytes(), self.Drawsurface.size, self.Drawsurface.mode) #converts the pillow image to a pygame image - #no, there wasn't an easier way I could find to achieve this, stab me - self.surf.fill((0, 0, 0)) #sets the background colour - self.surf.blit(gameUtils.centre(self.pygameConvert,self.size)) #draws the text to center of the screen + self.surf.blit(gameUtils.centre(self.currentCaptchaImg, self.size)) #draws the text to center of the screen #TODO: actually scale the text, however, more work needs to be done on the actual function of the game first def close(self):