From 8fecbd4078f7a9e6361686841676d2cd1a504105 Mon Sep 17 00:00:00 2001 From: rickyroze Date: Tue, 6 Mar 2018 12:58:09 -0500 Subject: [PATCH 01/17] Project Proposal` --- ProjectProposal.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 ProjectProposal.txt diff --git a/ProjectProposal.txt b/ProjectProposal.txt new file mode 100644 index 00000000..3c044037 --- /dev/null +++ b/ProjectProposal.txt @@ -0,0 +1,17 @@ +What is the main idea of your project? What topics will you explore and what will you generate? What is your minimum viable product? What is a stretch goal? + - We will make a tank game based on wii tanks. Our MVP will be a 2 player PVP. A stretch goal is to add an AI. +What are your learning goals for this project (for each member)? + + - Alex: getting better at using class and object, also make readable code + + - Ricky: Get better at debugging, making more readable and modular code, and getting better with classes and objects. + +What libraries are you planning to use? (if you don’t know enough yet, please outline how you will decide this question during the beginning phase of the project). + - Pygame and whatever else we need. +What do you plan to accomplish by the mid-project check-in? (See below for some generic goals; edit to suit your particular project) + + - We plan to have a tank that can move (stretch: shooting projectiles?) + +What do you view as the biggest risks to you being successful on this project? + + - Ususlly time is the biggest factor in completing projects like this. \ No newline at end of file From 70126c4f211330e8ec4ef497d674904c21b70fc4 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Thu, 8 Mar 2018 20:56:03 -0500 Subject: [PATCH 02/17] add 3/8/18 moves in 2D poorly? --- Move.py | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 Move.py diff --git a/Move.py b/Move.py new file mode 100644 index 00000000..0cd480c8 --- /dev/null +++ b/Move.py @@ -0,0 +1,119 @@ +import pygame +from pygame.locals import * +import time + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + # for brick in self.model.bricks: + # pygame.draw.rect(self.screen, + # pygame.Color(255, 255, 255), + # pygame.Rect(brick.x, + # brick.y, + # brick.width, + # brick.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.display.update() + +class BrickBreakerModel(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.bricks = [] + self.width = size[0] + self.height = size[1] + self.brick_width = 100 + self.brick_height = 40 + self.brick_space = 10 + + self.paddle = Paddle(20, 100, 500, self.height - 500) + + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + for brick in self.bricks: + output_lines.append(str(brick)) + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) + + +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0.0 + self.vy = 0.0 + + def update(self): + """ update the state of the paddle """ + self.x += self.vx + self.y += self.vy + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.model.paddle.x += -1 + if event.key == pygame.K_RIGHT: + self.model.paddle.x += 1 + if event.key == pygame.K_UP: + self.model.paddle.y += -1 + if event.key == pygame.K_DOWN: + self.model.paddle.y += 1 + +if __name__ == '__main__': + pygame.init() + + size = (1000, 1000) + + model = BrickBreakerModel(size) + print(model) + view = PyGameWindowView(model, size) + #controller = PyGameKeyboardController(model) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + model.update() + view.draw() + time.sleep(.001) + + pygame.quit() From 58a553dbf862cbf58438e28dab8b68bc89e385db Mon Sep 17 00:00:00 2001 From: rickyroze Date: Fri, 9 Mar 2018 03:32:42 -0500 Subject: [PATCH 03/17] PhotoTest.py should work. I want to talk to you about integrating them. --- BasicsOfPythonGame.py | 12 ++++ GrassBackground.jpg | Bin 0 -> 55254 bytes MiniProject4.py | 16 ++++++ Move.py | 2 +- MoveWBackground.py | 124 ++++++++++++++++++++++++++++++++++++++++++ PhotoTest.py | 17 ++++++ 6 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 BasicsOfPythonGame.py create mode 100644 GrassBackground.jpg create mode 100644 MiniProject4.py create mode 100644 MoveWBackground.py create mode 100644 PhotoTest.py diff --git a/BasicsOfPythonGame.py b/BasicsOfPythonGame.py new file mode 100644 index 00000000..b4120964 --- /dev/null +++ b/BasicsOfPythonGame.py @@ -0,0 +1,12 @@ +import pygame +from pygame.locals import * +pygame.init() +SCREENRECT = Rect(0, 0, 640, 480) +background = [pygame.image.load('GrassBackground.jpg'),pygame.image.load('GrassBackground.jpg')] +screen_width=700 +screen_height=400 +screen=pygame.display.set_mode([screen_width,screen_height]) +for i in range(6): + screen.blit(background[i], (i*1, 0)) +playerpos = 3 +screen.blit(playerimage, (playerpos*10, 0)) \ No newline at end of file diff --git a/GrassBackground.jpg b/GrassBackground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b5e8a54fced2c693644cff53bb1a5fa8b86a31f GIT binary patch literal 55254 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

p)#_ipe34%lkqSiF9A;6Xv^)gHrn# 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 JxiTJ~|Jhm~Dx?4a literal 0 HcmV?d00001 diff --git a/MiniProject4.py b/MiniProject4.py new file mode 100644 index 00000000..5a0dee06 --- /dev/null +++ b/MiniProject4.py @@ -0,0 +1,16 @@ +import pygame +#from pygame.locals import * +pygame.init() +screen = create_screen() +player = load_player_image() +background = load_background_image() +screen.blit(background, (0, 0)) #draw the background +position = player.get_rect() +screen.blit(player, position) #draw the player +pygame.display.update() #and show it all +for x in range(100): #animate 100 frames + screen.blit(background, position, position) #erase + position = position.move(2, 0) #move player + screen.blit(player, position) #draw new player + pygame.display.update() #and show it all + pygame.time.delay(100) #stop the program for 1/10 second diff --git a/Move.py b/Move.py index 0cd480c8..d1387fa5 100644 --- a/Move.py +++ b/Move.py @@ -11,7 +11,7 @@ def __init__(self, model, size): self.model = model self.screen = pygame.display.set_mode(size) - def draw(self): + def draw(self,screen): """ Draw the current game state to the screen """ self.screen.fill(pygame.Color(0,0,0)) # for brick in self.model.bricks: diff --git a/MoveWBackground.py b/MoveWBackground.py new file mode 100644 index 00000000..11b3f10d --- /dev/null +++ b/MoveWBackground.py @@ -0,0 +1,124 @@ +import pygame +from pygame.locals import * +import time +pygame.init() +#display.set_mode(resolution=(0,0), flags=0, depth=0) +background_image = pygame.image.load("GrassBackground.jpg").convert() +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size=(800, 600)): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(resolution=(800,600)) + self.screen.blit(background_image, [0, 0]) + + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + # for brick in self.model.bricks: + # pygame.draw.rect(self.screen, + # pygame.Color(255, 255, 255), + # pygame.Rect(brick.x, + # brick.y, + # brick.width, + # brick.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.display.update() + + + +class BrickBreakerModel(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.bricks = [] + self.width = size[0] + self.height = size[1] + self.brick_width = 100 + self.brick_height = 40 + self.brick_space = 10 + + self.paddle = Paddle(20, 100, 500, self.height - 500) + + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + for brick in self.bricks: + output_lines.append(str(brick)) + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) + + +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0.0 + self.vy = 0.0 + + def update(self): + """ update the state of the paddle """ + self.x += self.vx + self.y += self.vy + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.model.paddle.x += -1 + if event.key == pygame.K_RIGHT: + self.model.paddle.x += 1 + if event.key == pygame.K_UP: + self.model.paddle.y += -1 + if event.key == pygame.K_DOWN: + self.model.paddle.y += 1 + +if __name__ == '__main__': + pygame.init() + + size = (1000, 1000) + + model = BrickBreakerModel(size) + print(model) + view = PyGameWindowView(model, size) + #controller = PyGameKeyboardController(model) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + model.update() + view.draw() + time.sleep(.001) + + pygame.quit() diff --git a/PhotoTest.py b/PhotoTest.py new file mode 100644 index 00000000..d3fb66ef --- /dev/null +++ b/PhotoTest.py @@ -0,0 +1,17 @@ +import pygame +from pygame.locals import * +import time +pygame.init() +screen = pygame.display.set_mode([800, 600]) +clock = pygame.time.Clock() +background_image = pygame.image.load("GrassBackground.jpg").convert() +done = False +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + elif event.type == pygame.KEYDOWN: + done = True +screen.blit(background_image, [0, 0]) +clock.tick(60) +pygame.quit() \ No newline at end of file From 3a43bf0a6519f62f03a7ef03fe99791cafdfbc17 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 9 Mar 2018 14:18:48 -0500 Subject: [PATCH 04/17] add --- Move.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Move.py b/Move.py index d1387fa5..a486fb39 100644 --- a/Move.py +++ b/Move.py @@ -11,7 +11,7 @@ def __init__(self, model, size): self.model = model self.screen = pygame.display.set_mode(size) - def draw(self,screen): + def draw(self): """ Draw the current game state to the screen """ self.screen.fill(pygame.Color(0,0,0)) # for brick in self.model.bricks: @@ -87,13 +87,13 @@ def handle_event(self,event): if event.type != KEYDOWN: return if event.key == pygame.K_LEFT: - self.model.paddle.x += -1 + self.model.paddle.vx += -1 if event.key == pygame.K_RIGHT: - self.model.paddle.x += 1 + self.model.paddle.vx += 1 if event.key == pygame.K_UP: - self.model.paddle.y += -1 + self.model.paddle.vy += -1 if event.key == pygame.K_DOWN: - self.model.paddle.y += 1 + self.model.paddle.vy += 1 if __name__ == '__main__': pygame.init() From ab8d3a7327e3000ce89f4611b27d10c3d11f80bb Mon Sep 17 00:00:00 2001 From: rickyroze Date: Fri, 9 Mar 2018 14:36:40 -0500 Subject: [PATCH 05/17] Phototest working --- PhotoTest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PhotoTest.py b/PhotoTest.py index d3fb66ef..ba797483 100644 --- a/PhotoTest.py +++ b/PhotoTest.py @@ -12,6 +12,7 @@ done = True elif event.type == pygame.KEYDOWN: done = True -screen.blit(background_image, [0, 0]) + screen.blit(background_image,[0,0]) + pygame.display.flip() clock.tick(60) pygame.quit() \ No newline at end of file From b4a6f886815ae9a5d76fa373c1aaf445b47aade6 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 9 Mar 2018 14:52:01 -0500 Subject: [PATCH 06/17] pic --- top_down_tank-8hkMRt.png | Bin 0 -> 864 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 top_down_tank-8hkMRt.png diff --git a/top_down_tank-8hkMRt.png b/top_down_tank-8hkMRt.png new file mode 100644 index 0000000000000000000000000000000000000000..15751706cedcaa8a5ea3e5e8bfae0d2b4982af9a GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;U{?2ZaSW-L^Y-pV&o>StY!B|9 zUVA{z<%ZIwHnRlj%;ft=tu8g%aU=H4PRN~mf98k` zAJ8-+K}$i*@5X)akI#R+?seLF$+pCAdtN_|xnFws)%$C@e|CLkcrZa= zjn8ZB^3A2n9{>ASXZ7y)zFQVcm<47rDVVT2WNwDSC^*wOwl$`}w{5H*s-b zZV7`^Fhk3>3^5J!&%s#-GuEmGD$3rz7Px$hiPToP_DlEw-@bjjBu9)xYY_v7t~Gaw z&!daUX@NRl|Nf25^4a|E-8-|r_P1B+ep>=HX?5!cvGls2movVbD2Eu!g1z=ui|K8r zMTx8x!$M64r))c>t#+R`yXf&1T0-PSyB)m0y?XME`{wh_G2MpmORWBu>)*T<7Z;cI zUHK(L%Q6Ozw~IKod^@=&=zB{L#GE@lJNU8Qq6&D^g1^RX0UYP&Ye(|+SkZ}Ecd*Sz0M{itKf;(`lowCZenEBAa zWHpfEdwl-9Df^LsJ)P10Pvap@-~Gb(qv?KSozm6UmppT+@Lgqo)R`F=ce(!pYIutt zpK+ZSbWy|UO6FXMF?vHq)$ literal 0 HcmV?d00001 From 9c3958317a0d4284b3017f69f8106faac33bc3fd Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Sat, 10 Mar 2018 15:12:27 -0500 Subject: [PATCH 07/17] hack plz --- Move.py | 4 ++- tank_move.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tank_move.py diff --git a/Move.py b/Move.py index a486fb39..651ce76b 100644 --- a/Move.py +++ b/Move.py @@ -38,7 +38,7 @@ def __init__(self, size): self.brick_width = 100 self.brick_height = 40 self.brick_space = 10 - + self.player_image = pygame.image.load("").convert() self.paddle = Paddle(20, 100, 500, self.height - 500) def update(self): @@ -67,6 +67,7 @@ def __init__(self, height, width, x, y): self.vx = 0.0 self.vy = 0.0 + self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() def update(self): """ update the state of the paddle """ self.x += self.vx @@ -114,6 +115,7 @@ def handle_event(self,event): controller.handle_event(event) model.update() view.draw() + screen.blit(Paddle.player_image, [Paddle.x,Paddle.y]) time.sleep(.001) pygame.quit() diff --git a/tank_move.py b/tank_move.py new file mode 100644 index 00000000..4c4f03d6 --- /dev/null +++ b/tank_move.py @@ -0,0 +1,73 @@ +import pygame +from pygame.locals import * +import time + +# Define some colors +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([800, 600]) + +# This sets the name of the window +pygame.display.set_caption('CMSC 150 is cool') + +clock = pygame.time.Clock() + +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics. +background_image = pygame.image.load("GrassBackground.jpg").convert() +player = pygame.image.load("top_down_tank-8hkMRt.png").convert() +player.set_colorkey(BLACK) +done = False +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.player.position.x += -1 + if event.key == pygame.K_RIGHT: + self.player.position.x += 1 + if event.key == pygame.K_UP: + self.player.position.y += -1 + if event.key == pygame.K_DOWN: + self.player.position.y += 1 +controller = PyGameKeyboardController(player) +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + # elif event.type == pygame.MOUSEBUTTONDOWN: + # click_sound.play() + + # Copy image to screen: + screen.blit(background_image, background_position) + + # Get the current mouse position. This returns the position + # as a list of two numbers. + controller.handle_event(event) + x = player.position.x + y = player.position.y + + # Copy image to screen: + screen.blit(player, [x, y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() From 402897cf589be434be15268620b12e30e9a0712c Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Sat, 10 Mar 2018 19:00:52 -0500 Subject: [PATCH 08/17] it working --- Test.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Test.py diff --git a/Test.py b/Test.py new file mode 100644 index 00000000..5c03f96f --- /dev/null +++ b/Test.py @@ -0,0 +1,95 @@ +""" + Sample Python/Pygame Programs + Simpson College Computer Science + http://programarcadegames.com/ + http://simpson.edu/computer-science/ + + Explanation video: http://youtu.be/4YqIKncMJNs + Explanation video: http://youtu.be/ONAK8VZIcI4 + Explanation video: http://youtu.be/_6c4o41BIms +""" + +import pygame +from pygame.locals import * +import time + +# Define some colors +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([600, 361]) + +# This sets the name of the window +pygame.display.set_caption('CMSC 150 is cool') + +clock = pygame.time.Clock() +y = 0 +x = 0 + +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self): + #self.model = model + self.x = 0 + self.y = 0 + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.x += -1 + if event.key == pygame.K_RIGHT: + self.x += 1 + if event.key == pygame.K_UP: + self.y += -1 + if event.key == pygame.K_DOWN: + self.y += 1 +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics. +background_image = pygame.image.load("GrassBackground.jpg").convert() +player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() +player_image.set_colorkey(BLACK) +controller = PyGameKeyboardController() +done = False + + +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + # elif event.type == pygame.MOUSEBUTTONDOWN: + # click_sound.play() + #if event.type != KEYDOWN: + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event(event) + # Get the current mouse position. This returns the position + # as a list of two numbers. + # player_position = pygame.mouse.get_pos() + # x = player_position[0] + # y = player_position[1] + + + # Copy image to screen: + screen.blit(player_image, [controller.x, controller.y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() From 9bf6e911cbc2f68146cb4fe1c157157a74d93b35 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Tue, 13 Mar 2018 16:53:42 -0400 Subject: [PATCH 09/17] classes --- Test.py | 49 ++++++++++++++++++----------- master.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 master.py diff --git a/Test.py b/Test.py index 5c03f96f..5487596d 100644 --- a/Test.py +++ b/Test.py @@ -14,7 +14,7 @@ import time # Define some colors -WHITE = (255, 255, 255) +#WHITE = (255, 255, 255) BLACK = (0, 0, 0) # Call this function so the Pygame library can initialize itself @@ -24,11 +24,26 @@ screen = pygame.display.set_mode([600, 361]) # This sets the name of the window -pygame.display.set_caption('CMSC 150 is cool') +# pygame.display.set_caption('CMSC 150 is cool') clock = pygame.time.Clock() -y = 0 -x = 0 + +class Player(object): + """ Encodes the state of the paddle in the game """ + def __init__(self): + """ Initialize the player and position (x,y) """ + + self.x = 0 + self.y = 0 + self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() + self.player_image.set_colorkey(BLACK) + def update(self): + """ update the state of the paddle """ + self.x += self.x + self.y += self.y + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) class PyGameKeyboardController(object): """ Handles keyboard input for brick breaker """ @@ -44,13 +59,13 @@ def handle_event(self,event): if event.type != KEYDOWN: return if event.key == pygame.K_LEFT: - self.x += -1 + self.x += -10 if event.key == pygame.K_RIGHT: - self.x += 1 + self.x += 10 if event.key == pygame.K_UP: - self.y += -1 + self.y += -10 if event.key == pygame.K_DOWN: - self.y += 1 + self.y += 10 # Before the loop, load the sounds: #click_sound = pygame.mixer.Sound("laser5.ogg") @@ -59,12 +74,13 @@ def handle_event(self,event): # Load and set up graphics. background_image = pygame.image.load("GrassBackground.jpg").convert() -player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() -player_image.set_colorkey(BLACK) +# player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() +# player_image.set_colorkey(BLACK) + +clock = pygame.time.Clock() controller = PyGameKeyboardController() +player = Player() done = False - - while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: @@ -78,15 +94,12 @@ def handle_event(self,event): controller.handle_event(event) - # Get the current mouse position. This returns the position - # as a list of two numbers. - # player_position = pygame.mouse.get_pos() - # x = player_position[0] - # y = player_position[1] + player.update() + # Copy image to screen: - screen.blit(player_image, [controller.x, controller.y]) + screen.blit(player.player_image, [controller.x, controller.y]) pygame.display.flip() diff --git a/master.py b/master.py new file mode 100644 index 00000000..1dd271fb --- /dev/null +++ b/master.py @@ -0,0 +1,92 @@ +import pygame +from pygame.locals import * +import time + +# Define some colors +WHITE = (255, 255, 255) # have no idea what it does +BLACK = (0, 0, 0) # need to keep + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([600, 361]) + +clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) + +class Player(object): # player object right now is confusing do it postion here but not being used + """ Encodes the state of the paddle in the game """ + def __init__(self): + """ Initialize the player and position (x,y) """ + + self.x = 0 + self.y = 0 + self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() #image goes here + self.player_image.set_colorkey(BLACK) + + def update(self):# this may work idk yet + """ update the state of the paddle """ + self.x += self.x + self.y += self.y + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class PyGameKeyboardController(object): #works well a little jumpy maybe use vx + """ Handles keyboard input for brick breaker """ + def __init__(self): + #self.model = model + self.x = 0 + self.y = 0 + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.x += -10 + if event.key == pygame.K_RIGHT: + self.x += 10 + if event.key == pygame.K_UP: + self.y += -10 + if event.key == pygame.K_DOWN: + self.y += 10 +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics only back grond +background_image = pygame.image.load("GrassBackground.jpg").convert() + + +clock = pygame.time.Clock() +controller = PyGameKeyboardController() +player = Player() +done = False +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event(event) + player.update() + + + + # Copy image to screen: + screen.blit(player.player_image, [controller.x, controller.y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() From 7dc4eb521093446db04ebc6bc3ac9ab250878e2a Mon Sep 17 00:00:00 2001 From: rickyroze Date: Thu, 15 Mar 2018 23:38:30 -0400 Subject: [PATCH 10/17] Player 1 and player 2 tanks. --- BlueTank.png | Bin 0 -> 4219 bytes NewBackground.jpg | Bin 0 -> 112343 bytes RedTank.png | Bin 0 -> 4238 bytes TestGame.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 BlueTank.png create mode 100644 NewBackground.jpg create mode 100644 RedTank.png create mode 100644 TestGame.py diff --git a/BlueTank.png b/BlueTank.png new file mode 100644 index 0000000000000000000000000000000000000000..43d6cb97f2c32b72b9f4eb79a71314590fdd7e0e GIT binary patch literal 4219 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 literal 0 HcmV?d00001 diff --git a/NewBackground.jpg b/NewBackground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e8e51bcea63f4c845c8a84fcf6ad00847a29ef2 GIT binary patch literal 112343 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

oozc1^Oewf>iO>o!HC=L9>+Uj=pR7WT>y zJ?E0Wx`J5^ao}tZg)&>%XhQFd9$psbPRmmt4)20Fw6qsP!O`7dLO2)d?7-RPgsHnb zKRD75HuKsn3;K-rm02hQD%fwevhQFB2-Q(kdF|gg7o+$Hq@My$1lQjS2DP5ZvWDIG zg)=}qiMiVIXO6(#U%w|#R}6Ug3j0kHxDP1v3F_#fsWlW>vzFTwz$#Wkb}X9bH;@`3 zO?@l8)8Opq!7DVmZrWKr{?tjmhRot?fN8^04)(aohQZmZwK7mJLcxZ)!N2-r} zK9)+){zxYQTbWWFOxAmFgqZwNIHEJf3?DdwJWR5fy>C2NhJIff5FRb^9kch1Q%o%% zHJg=Jll9HbMQfY9>gZ?gSPNc1Z5QG6mXk|BLAI+mFKDDTT z)dyh~quhcnf3qmo&Es{mSbUHO$O$()cugS}GT@8Nv~2eE$SXNPN_pR(yx_(cOwH{0 z-8?XVyhyx~i4X5UKtbn z>ba(KTV`Gka;(>fYpj#BcksQ(u@CB`<1D7BN*#(aO2V@FNoUXS^j?89^OglH;Zp3; zquiBs2ITmIJUykf2XbsvTc?{F?c+O2G-;N89yzlIH}^<%>Y+IX|MbIpb7D)L>Q9oE z0@rFAmPu#pL7^D$eV#@cKU;k!IwusZ^<_fm$WFwvXk<_B0GnO+w#2}>4BvkJX;!)e z^!JD7{o1a4np9FO^HhKdMj}aCRs~!8QP9-p4Q+U3*FNXELGb-}d&)y^muFimgR0jl zvuRqauew&!dCq((IQP~5giURJv9{}{Kj(Z4`lj~%5Jr!yojkhS^Meknjg3A7ZKI|g zRre!M4@l8q_$Sdax&7hDpjq$_q$yuYkm!PP0 zDMhV8-ARVYyH)=rxl3GSk5#lw>mMbof;kITkkBhJin)?<{Zw>ApaBogZt}J`cl|yS zJydk`Vr&&9%;<8imv;`4h`)8G7Tor&RaiwJWi%*E5nuU#zBro zAX4(08O#t21}$!=Uqk4J`e2i$tUWRZ zK!{cJcMJJVy4d-M1Xmvqmy+?^XL0$888`MB*b)zkmU__@W2of<*uw{FC(IMx*^m z9l3F$qx`M*`B-veQn(Y8*_xj;D4E&0MRyU>B3#@I;~8ZcnAOuTAosLpR+KQfoODOvFInpJT=xH2;ho>`Ckb@~nzoz~7&LPXTdB z2EuH(EMYv3e85ZAhio|D!*%dXj!tt8brWm^Zv8|sL(SxIZGpBGdRwxq>cHLr2B0Kd zNAt>;YO|pJh6(L`U_4gXDxja?E1G3_%1%%nLbKL*x3J4VYu37QIHq%#gY^=0QW~7z z)XLA*e4&Nw=vC(h<pdwH z{mh%Ee*TzXd8Du>xPJPePR;6aK#`ymRD0MI0sP+C_eeu55-}6Ypt?T>0-KAA6$c1l z_VsNsn2q})2Fc~D-xqGb{mrgY``^?mHMx*yw(plxS~YkjH4~s=8!#wZapIiuVwXu6 zgd3$4i~e&?~+%9lPq|Hh?_JL;~0=?tU5n0yTEDBD9c&MSFrz^soFJ$V0O?3>i@R|Um0{(9`mRYEOUDD=D4075By*qwYB>C@)a9 zuG#8EwtZ8nmu1aH4L4vh(VM?QJRu!(JUfL=CucjN7i;dl=(26Qup#iP1@7pK+Jvm3 zeK)Z|MTO5YouK7ute5z4ZAZf{a)4%XT}d!-y-n?#!Dz#*eXX5QzG%o+P?}uzyxcA&qPehFr~| zs7XdirYW5mr~zlQJVkW@2xTp$yLX$>uxR~$;3Xf>?lxyBU_yW(7C1{VT-XeDsnJV* z@N+EXHZfo{Q06*1@xJj*yB@kXjqWO~y<`0t>+w`nbl)aXkGwBr0K`fo7bJijTz=Nz zS-PQo`L(;tRyORE%&NzrLeMZiR;m+^icod+8dO!#L)|(Ofabrtdv{N1|4T$ zmIm+$%?x{Jxd0g^9vt*L&-&$7k@O3}T8v_l9++XXY^M>*(lqovg3U?YtHiLVNu+5pNpSD|l*N0P360?m+rIeCNN2s92XQeGnI z$0rU)jsAJ4L3EHsEP>{c_U4S-X{Qxtp&{I!Bg~v^`?3La=gn!Ev%m8(*7CIT8>u)| zJKZR=gG<-M1x#ws=O@Xt-O?uR%HBGv`0OO;!t0rV0MM0k6tkyzm#1zD*DU?_WOY1nFazxVmeXM3>cbVJ{dfxr6dYi1 z3+-A_(30=gs-I5CyqgYzeT>dpSf8i@ju7bU89I2 z#rd;}t19-&rlvo@-057A;>sv61Y&Q{<8^Vk)-_|(#~f&0VV_{6^0#5a22z1o6&E_LcV~Q&4yOPvliG=i{+mk;dHKF4?x*< zc$%Rzu(GM|p5RRYctC1JfbiG{gV-@E^wlsZS-DF-GkJd#1?kj~y*drXY&hbbRxnL# zV;6C4lc39pTGS)(?uH>{n|2iwqErCBwuSF+R>GR<=gSzTH$rnvXXvo3npilL~U0Ul+Pxv;_>}2vnBmy++5IV)+5UP^LjjZmVC|mwg(kSZ>cUd^`eb zU&{t7!JldGUh6J9FJHIp5ibZkC>pT3V5NUs$|t$F{aGiA2*=R>-f|_6D$ZmRz~)3k z?`JO%p0aivg)-Z1Ws|b!!`=Z(gy&lnM=qN@$W`D4q*otlExZo~bb>DG+3GGDpLC9w_C;cG=fohAl)Hf>=5T6Vu^}T|IOy^=7;dko-MH5oHY6KNfqq^`F;* zSY>0)P8BxRXKhpG{;y5HG(VDA(nWa!$OWqf9OagL$p=n4OAT}Lo*i;sX+O`&?D-|^ zi3eC)5a<^;{h)asOz*gVJlhMVVD!-E*Q~*Q6?JF*$__B{n1(0xOQTTn+|tMg*}6CS ztc(6pygF_XfqAwcbAmk1uMVGtPG8FXM$gNFs35jo^83maeK2*P<&<0im@*Wl@Xyql z07xj}{UQQ@a*yttsP==Cy;T1^tJs+jwZOxA`Zfe(r%Yw~8PNZBs@0QVZf?1OP#?1L zrN;=PX@KHd1AiPNNmPhwhfM81CYLXpvlxw;eB*WT>$^g$8LjoGP7#m(O(Le4UNLi6 zNp3J~XDv}ALNo}2e)?cvTYuZ{(lrV8;7g2SMK$3YXL%n69?>y?!$lz?a@&)@wsGn?rD4jJG&0I~CuPne5e*g~lwr%~jtQ zH7t0)Y)c_QQr%FO`NsQ6o5-|ETmO;dYS8PjZT>uIHgY-5wFZox@N9(2qpQoM&x-w- zL%oq25>FE^qrN5;>q2qgcZ@tja`GtUtK;T-24<9ETd)7VCZ?Df(dYn)t^<>|uD|i0 zE8Z1{v1|hsM1&utCcI#UVzaMzX8#R&m7iyM6~>5ckUO~Xw~Tyb&x`A#T$zdNmF<3zRb7-3y2?oEYmb|~k|f)8ubtVDruj_5Hp4{^^e%j~-pu=kp%tb~#WImA}PH|O=g z!rm5UysVfP_siSRTyvB7NK>l$S*N-$sh2KoR2sF>?w~L;;89({#gkB#6lN4w?H4c! zYI!#>ArTL2_N_er57X4w@gPk?^$P&UPG{zJg)hz=nZmR!D1*2p&(L&ZUJ7lsst<@D?bp14%d zjD=Da+66ZJAdj5egJM~A)Y>WY^&4bbWyp~wNnP3Moh3$)Tl^?5`B-Xb-zzHrK_)R1 z8xhJ4`@vj0V)2Jhz7PyWwCN~W)em#(Jdwg(g}-wkX9RKio}Pp2x*SJr&InK&1@HX+ zon{IvFS7woLyyW$04R(v|HssDmyx>_vHJM@)9SF6$+vt7B)Mm;X}Gy>Tm^R^IZX8v zD`{K-)p~<)(`tG3wF-Rh8@L;)a#QfzXUX+7Be;5UHav@zVy3*|ED$}veT6DM>h#t( z%~OswUUL{Ht~@!6tJ*iKPo3!6t)~#g3EBtpF(3RtT}9U`fLjGvOah~YJb6CJRb=n| z3%7_4crDhl&I9K%XyDM3`&35A&kIPvH zDkr9|&{b3Ll&#@qcm}wc2&n+7EuzM=k=IFSelXt=H69g& zyUiu`bJiGrK*oE(i#z~`rDqtuPjobGi~36Ag{9He8^p%*G&LkF;}f~Nmue6UNg=b8 z{Ejb9=_8WPgbh2Kl3BttaAjDSjW!^bfWCV=3`h!A1w5m^7ADTi**48V@jxEh``m)U z1PSHY2di8#_^2G-f%Sz7;@y|L%D^n)YnN)K+Smd&%*AOS7X(i56q2cbiwhI7HB8JbPvoQ*kRUtBfeY&41^{&CWEr<;_}_T(w##C z1-H?N`-sm5TwJgaPK%|I>LYdEmQL0u^|Q(=H(qdzfM@Q4pw zxU-i~8Erb@RR~YTHj!dOlK9l1_MthqcYSBs!3Hd;~CrOckY6mZifL zwpU)HdjAtIGL5;Zp{4WM%ya9k*bBaKo7I8DSRUE8gLF$OPQZmMQi~vP9b2bjgoXeP z)_AaZ8j=@`7JZsE5(<4#rhe7EAfwl)%+T|^$v)zTNoD>LMtks)f)U|5@F^}*^tCddmYf4EY^(5-^8L0cj* zA?5^Rf940n#bQ3?%hTjmYTGFvv@}9%vtODjBlcO%{bMiqnBX4Cq3z+ zJ3p#}ymxgRm^hjLEQ~U!vZ%DCtE>Apw&6hjC+$qPtuGD#6if7k#Cow(H{U{0pl1$Ax=id&Z@>me$b=^Dwh zYrh!O@{BLQOCKtOW$T99oA5uoaAdl>C}$Of7eWz-?|H^eHlIePK8q9n?Y+`pYkV^n z6K?!myLBmzd(idaxxNP(+Z=L)^UGrqMHDTYmNFe4CWbESEPjp!{d;E*%Oh3C=_+-t zmt&Po70K|*ktudLPdf_XY}Uz(mGTsXu!=WqmT7%1&I7J@B2PyQ))pL)s6mWh9SD;{ zE>Fem6LekRTx0IK7|Udmz$Mre$Fmr4EojqJ@Cl=37P~IaEm~giA*(kNJtxOHd=)f5 z*!PI0juxOEbYVjM{EXlxfQru)0U@gQBnNp`2Am9FfpzIi4MZgMKafzawSbmw<^^HT z0`lTeSieOHrdne{?6IY((JnUZZ9!VuUP*^4MStYJ{5EE-fNu~BK-t}&PU%9s(HD#I ze|Hm%;6|rOY{**y0{!QAO`+uK$+enn^F|G)l4f8KXzz!;wk=Hc+~1Ca5w=1;m; z5x5d$Voq1Gn#3`vtS!^jKO5*C9e*;_yFq0+jt`5w%*C~QAg536snkt*DZS?f5l6#u zwsdqrj5>%7hE0x0LN^9J<5ZpE(YfGuI3UH;$wDiHpJZ*4f>^xbYGS^8N=?wY9|j8n ze`dC$wl{=an3}_Dt#~C0`?rEGa}hkU>x3eiuZDfa=!g{!tLZDsp3FD09c{PU+wi>w zlcj+=aNx4Ldu?kd)7hox7oGRm7^rU0i{;zu;tJg1EfS-}(o$aJ&I}h0B5O0Y+;2Cn zv~SCg4;#d<*X`^3HDpD7X}${HPezG#tD^HxMH=eo&7hXj?B={c66rtPeQF+IbxAhUagS_W3fW6r`TEGc$gV2^9V0#7sD+u3s* z2??6!Np^u60J_JnQtF0cP70&t+$f?@%NWHTym2T)hE=4s-R(z$O&v4cO|e%IX2+Ga z88vP_fL|1byXYAM7?rmZ2%&T)5W;*+6jBI8TD2uw4HyI9in!0E1Z=jv683tpfH?k% zxfd2tY*S;x%=(WMmv{6;&b4UXaOH1MawV>vv}eS40^na zP4sE@x^yoKm5X3+NO`JCY#ACKf_K_g>#MW}%;awP=)LlV)3;yh*^N1|nR?X&75CE3 z^Gbsru`5RXSy@`5vD2E%xy)#UzQ;cj#!vcIF2=qw{ zQXZ2(nZ`UV0QMvAa{|8U{kR5&(pljAq6bl4$^&BeUOlC~kqa70U_2`Gn<%VdQ)eyo@b_z7}yg1YSvo1WY-6ZU>mzUDusxT|`1`%TiWSQR{^czJ&e?)WntNDFSJ z56-#ZL>uVziG$Po3^!*8Bw)N_kNll{05jh=F@craxQmy zl1PMo)eUu_sVIMMwn3E92KXJMn|*rjZIaNB;Ue+g<>)_bE?#`7DY$1E^X*;xd4AEH zWbcdAK=i#Q{H~Ta`)-e@gQ3nG}xAk=(v!(#JAExXZw%I zGu6K`Y+$wpSCWEx*}saq>%O^gi$O^?1M7wBx?Sx{{)0d?RkxN2>~3bFqsxVDbi#uq zED4C#%eArZ?!2E+a&8FUq88c^!2KF~qJD@B-<&T_B=T;|L&R$KVE!;wZxfsVd+ST7 z5^vPHc73PIRb?rTCB^< zF7Rs!DRIZKKT?)oCr`+d3We&o{A&w512O?syLw)#keGa5O~>S4V%|-qzRZ7B21(w5 z?l*@{U|(3`E9CY^A@wHoYR?Dy2eiJiA)j2vSzV79O>}fIS5GavB)Vvhoo@eqehajW znFntsyI`93!sLEL19Fxu%~P>e+0@mUW#sc!v9kV^JlVe^O|+PKSL$rmXL)sWdv+gw{CDuX4D`w| zv2zRnMXaMnlkGDeeL%j$fvZx1yG_GlyzK9r{tzK>fEg%0QY2(&LCb2k zZl`;`s|%X^))PC+a5u>3_KX&57!tms^zJ{V=c(i(rJFWx3}E6!z(; z^y6;geqAy*vza@Fy^NW{k%a#(Ovy5gl6A!0ly%{jD`o>c_J#+SXO2l2^naRr#n9cf zoip~diBTmOo)|T;kgjMo|CMGtN`M9MLbkO-HAN}9)o?Paf7n2B9`7zXYuk~>-P z0Jo4qz9{;=g?`+}7Udvv%SfLz0RBh> zdz^lnkt5=(hO5$mah+*g#Wc0!MH2WSb>a3|x#kAB7`Sh{Xk6=`yuTnq#i)sE&uuY^ z9X;#pER-_g7d06W{)H2Mp48f7dz@p~7}OW{#H^0Hm^jVv zOtjw;#9^eZ^l;ddq| zx_~nqL2gpPNGhzV=L_Wzz==fr3%N21dzjkke_7%y>qXeedsvQeUViyDaco;I(Wg~0 zlk#qNQMO0JQK{x(ORL|PFV+A!s;prLGeFUIepgEKq$=x|HhU96(>qbJ=-C*}cD@{K zZF2hiJK{E@*&Ws&h!OEzQOL(+UM_bX+^>l_Fx;lM6XZoPm@L7^Mjo3Yh?zFF!0E86?c5NEy|sHVPU{a(WJz zuky#%z|WwrA0}Yq61!DhJqX7h1u@Sts3XpuvOP!h4nb!fd4*f?U6X!J*9@?P&Zox6 z?|N;lZ;ox;ZQ_(>TgD|z2AK^5wDKo$pktI$sYX_RNS(r!3qcHuA+@uUrBkfVM&kg` z)HxK9uv*mhaYv%-g*1d&AmZIMB}&d?Y2D=qLBR_l%e}mLXUBQGKGy^rm1*3jsh*f? zR>KBg|^QtGpnI4SfrTN$$(nfi?cd6(4ZPZbXI>M%m>*&P=R zb1cv9x*M2kMPLZooxz^qw*#!SIl0wlW%m0z9c@Pqcycp%df`xEd!o##+uj zg278WL8^(j0(_vMCozZ$*pAL_{K|A(BBeTmTilh0{SY{HpGMpT3)Xq)0 zi5rm|zb}%aHYf2MC>I>CLs6zO@Re;IX6=<6U$nCoeDxKC)`5nz*FETuQ zCr&iZm7{(yGs8JyENDffEgn;XLDS|j^^;?gc|mRkA}4oQEp_i$NFYgaukkD0#}?T2 zIs_>+@X=$DD3?A^7%%VNFYGx1Ct!t%-|7eXN$BaI5ctYF?4R;B8!M=G?>NApE&m*S zeOXDHb&a{~=XDb%z*l%k#(j1GtMMI_;LL{#7$QY(Ab>Q95iU$q11`~7wjl4uKteQM z-C|sF6;dG`tx$C?VUeJ1IxQBkmme-sl8(_ovbR7dig7WS?99)Xsj};RmGlN7-euk7 zj?)=3Wv+=2yTT2z&kjR1?6IyK{d6G{r?|pC6?|4tRN)mR=b`%xlGeL}Qlhro?LO<% z2y{Zd(+n)|p8_=Gj4q!c*Wd~KBXoI4jhG(AAC6XQH}rU4kgFR@FX~t8V@&IK{OkCy zmQ*qmYTTJ3!6Nqk-^GAbUb(r8oCv|Tfg=SfsX=IIJu-~DG+t_JBz7U+Wzk1CbTrzb zqdT2QD^QsI4$66p2(u};_;BQ@78XyNrl40bD+eRhMV{c^vO%9n*f`>SCj5mJ&-IK5 z$hn$Z2A)x|tlTgp7CB9Li9Ouy23AtKN2+@5ZWBw*nb^Dnn#F|SPfiT4X4pf_R~faw zO?sH4Rf#H3$sDl~${k|3?zfUMU0u#`G_Z40TGWEhXY^K>SAF_6#_~$I&TeyX%z+W^ zy{nh{@T$B{ZCl}nO)cw}6p27?7xttBT84@|S_NXULRWT8BcX(YeKOaKW1U_4%NB_Z z2fZWxk|{et3;$z9>G>-o>ta-0NzW7NJ`y=gr?Rqjmh*Y;)`Z;_SjcB+_{pO=`i!Fv z2X>7tC>$0Ji^hf`sAVNIj?|u5hHQsB0X{)DF8euyW5b8SU`C8FZp{9eA6027MUnxY zN?EM#H9*p^d(PE1*k3T#i~BxXPqZS5e## zfZw`nRov&P9F@z1qS4z2t#!ApfmY*v1!oH8QeiQeA?z}R-Z6M@nlR4fFHpPb=3RUB zdxVr*2)9(G*LSh{mu!#Nv3R>{kH1+};(lBAK|VX>i{8+hyL2dwQhPqC0)W-MIOs7U zADmVi6E)3H7EEz6d@#FO10LJ%sVTe`CEU(N%A1r_TAGxjw_CJzUro36ND8iQ;Uwhf z?CphurA`^Jj!N;Vx+S?LL=8~v1VJwM=&@QTxew|sw$3i!IW7xjCLMEc7X36IkM}U& z!@jU4(@X7Ghogn5<201%zJ;6@F~${I6~BF8s)PonY3dxxPm;WmR9#&}_l@9tO?@8S z@?)LOR^K$h^QM!eD(vKQiPwARNBwI9Id5jv=5nf-doMRJ@McQ)>eZG{zdDHSvr;8> zvzY1U3YDN%r&laDVyn~p^l6>j2K)BrW9_44YNA;cRh>h}@+|g?+VS5!vA@ZaXJ&jURo@@|)8ibxR*(@kq}SP4 zofkbjs~#!3s|InWdja#i`G+KO%D~X=4EYw~u&VI~OT9Sz`9k{fJf)E_HEdUe)Ft*0 zb*0!ZWNs^Js&h@{sLrf?g>1BqsM%qQAs*(0cBNB=?ILw*Q!JvxO{<9Ij+U=wWNcD< zgK0huSNr^co~X!9)yK?NY=TE)I5c)@&*Vqp8cl$fKw#96w_wF?H!E*zs$}gF@R6&P zI0_kEGWnRP+TODtm2oR(6)CcOavj38mUoH-o0*nJXi~POx^>z_UCGsXP5CDD)ZO`R z!TiU(1z|ol2nkL>X`$=)emR=&W_^%mVyGA2FLf=4TSofXCzHxuSNw^Xa1OXjxE(m7 zHzbBN%E6J{q_FKJEXjTKxa{%Qy8GzK(%l?=+@0^NBmyLyPlXJDxRHO^cxeP!$!h(e zFjh6h8F7w76Dl+YZp5vk*+|SGb+*c)dBmCB#pD2UeyD}f_fTeG9Vs&Gt}G|XY1#d_ z61Q$#R+=&IXP9tY+4{YKD%gG^H;z`aoChex?shgfZ3JXr89b{p0x9KG#Vk2Q8ZL&& z1h-UjuK68&fZ#VcjOP9PaABS5_y8qe%b3oBPPp^Kd-rlH9{)PTVdB+Ex{qDvZd}3F z3OSU@`!)Y$boOM(`Xk!lC00-aSK+QjhC% z5_HgoP;H=5_aLo#s=P~~lkO5rEx!hFMiBqEXvZ7L&C2z?)LPd=a%$Z;8kv%BZhu6s zRiY#D4c_h(SMn|VHt2;goUdSK&1;!&hs8xOzs8J}2Rxmj%I{dp8jYY<&0;)yJ9vg3_J$^U`7w6U1g?m}cCE zNELN+sqvSVQcAHz(E=;`>XKQYQ1;M zyi&Jz4@CWP^i*_sKFsR=wzurNk(L7)kPS{R7H{WQc&+CYvxZD{n?=@V{cC?t#q2d! z$Q9vAt`s-bePd^F6i8wcqm9f<=(c%1uJh=EipL=vPIe9{=G~zbU%N#ckq=&_`kv*-3+Td4CQ$$Jsd$gD z<>60!2ePXnBZvhf*stL3`tw7s(?C%XGz^cUQtaXJ6rS=48pHHw5Y{aiVk3;h&{tWRoE$zj0e&xKwf9OhB zNwwIF`SkUae|8s$J@BtL@|J72ajem`#-$wyRI-Ji2dY7*6`w%5Pd5%v`R8l`F;hZRUT5b7a_a-8fo2ra;pdf?qem`!?=h7Zxnfd73+@4d;5%a%!JUA!Z7D!3-Nt@gyDe9X!T1UN|R zCcgDVJY5E$$rtuUnGi>ruCPDr@_`)$)leyDt;$6%U6NpFg#C-u=$1Dp6%v# z1X)|u$x7-tlwoAD`6w&)*Jb~PaSy8fiFeaOFD0u!u3a|REDP#p!rshd8QE@M{6a36 zf0%aCe>~pnSykc(l9?R*EV!oNp1sqwJIY{hVoM#7&dtGj=zbu{?=TsFS&gn*9;3s@I!d&zO4M2HPYv^)N8s zD6?PsyLQoB;l;Ubct5Hft2@6yFZTSNkNPxcJO8-9W83B|)#5)J2dRNOJ#Grzhkt8K z#K3_Ds>JnT?-wuY>Z``uX+3^X#3wNN#!~6#yXp(35kjx@qGgQ5Oirbof6?0X^!I!I z{fpcWC_xEE17kSxL|0SjB9Z36QEC=pcC39{lKlC?2AcF4Y%cZgUz=8Ve*CFg%#){( zEpe$LVpRcO4_L)UL7TwK*LN;#xEJW1p^LObYlnc9v)<8LauYf2)}Fa?mJXJ1eE{iP z^+iqI+7yNtTck83Y*Ry?$gSb;XuJF%C)avs{1qk?v0n(LL~e-JJPFMia?a_c8qc7y zrp;W_pmPnTIh#sCI!d96t)d38OL@V~OA|b;qiya6G)wNkw=>`ZG*DPu()F$!AzJd@Nx=Ybccf|fP^wo4Y~?bS{daVQK&Z^~Rh z$Yr$-XHzo^_8eUGK&xMcKDA6UGI$&zpfqMOHEw61+`@{4A8jKM449Gx%)4ZdUy?Yj!c1=@zbr3q? zv($)Co<@+#_69*KMEm%dZVPb2)N-QAF!>Uc0pwBSr_t)0wbJcooo85YL;<|c(8b{Z zfCFeDm2GT5pv_|vk;bEjxot2@NU#b^pc8z>`NiCT|8KLQ@-%W6uK%2U<6sd85c+8; zf-z#$TYZ(RAv=zPtwjM>M_fz0!gtUXivF#eF;cxEAmd1#_{<;u5HH|XSj+S@8d*`v z3A`1^+s${$;V1AZLeJ^klHpuD6zpV9rao3JNWA#ehd-3_ z@NkN2+gU9kW(SpG;E}fqKOUmyxJ;xPyM3M@s{5-&)CZa1Iz)S(<$mY05*kjH#99hu9 z&;vQFBR1$m;Nf6`Jag4^@mYXj6Wg%(GFdRHaa4LQ=EeJFe2Bzo;t40zLr!aY{ePZJ zS+-g7!t!WoIR4<2|*qO)1sncREp z;^nTmSLkfFn;puhdjS!eS8QV^P7+XjFy~zhC}p}YECnelBOqlbti%bCTU>X&To6@? z#-7fGf?9NN?x*$u<&zl)YSjL^hp`2UGU$eq0lh3*}X| zegWWvyg!aa+JE|da2F4e*it|{FB_kY$Gac7V#3;!qwdl+kGU$FdK>Tl`2aJyk$r>i zmCq_bA~*4H;F=>ga{;K?VrJTaT_I<=aOV14a@A5bX!!#N+(wZSk=MOciLc@*#}ZM= zF8J*Raldzhba(aN^&Osfiy@R3s!HJrF!o*SQz9^^plO=s`u8Q8C7s6k2bmf+>N}?!Of>9l~Jr6SPZ}YeGeF~e{SSatn zGo)IxVUyA18tW%srXnj`2EM;<4=*1UNt!vcZgY`m(|`8ksH28>)%lJiVM0AlDO=GG z$_e_J$ORI+swa8@OLH=Ou)JAKFaI{b15g7gfC7ZC=NhY zge!K}BcxEuXAxnl>9H7OLBauf7enVhS(^8_)=|81fD`$T2{ZL0V56+?Vi~G=Z}`uC z{M=p!7;&hVW`*ykU!11ud)iQ$2jc0jQUp&jdU(o7aWRi~iOj7Z1(LEon17(8N z-5hLkZ$r8`P04$#j6n{Yh|c?UyK#K;JT$M2{h5u=QRN1VvN87@TXMPXkuH0bvDo43i zk5EY-@(ajOA2fsq5P&l;?>2_6FmG6dewXPr#}=gs^IQ8|)gF8u;coQz8JxZ7-g?ZU z$*>93dc>pgJ4q^n94J+_YSzslM{m*EZH~w-r<>s$IeewHMxC-6B%Sw@qLJYQycA z6u%r9p1&B|j-?&xYjoR8Ul~Ysg$WyGqA*{>^&PpV?@#)FOvKaj7jZRbFETS6ajDSG z{rkf|m%DM@3{~kw7iSJ!b-NwEN!3ORuGCvp)#DHn4EyZl@=?!-9o5^j=S$M|ezRSDr|vP4C*G-mK1s#%lhMg$~orQSC!iDM&Cg~rxLjo?zFq-3t10VdNkwFW{KTikaKCmR{%#g(&w2x z-5~r>wL#FnN%bD1b5i1Tzl-B}!_$P%(duuU+GuCWWGR3)$MadSJX^}s--JC&wk;-p zf1T23gX>z1YZFk63)JAi7c(WVtd42(;KwzGm-2qtyRn z5`B}$)QmUFO1V)G14Wy1w6J#RUDy*dgd0AdboB@5=v>A3KdlYey!m^jOw@UW1pbTr z`1k-SOn8q`#--Ce8o;5hm|gx1x`-{~{6~=Byt9CT98b?~oQC^Zo-!o+s5S1TG>@6o z<|4n^HK(_xxA2?d*r5uC(ha*4$wCud4?+EJ9|FT zJ!(^+AX?o9uc&B6)SE(BkX^IiK!=e?(4%+D?^E2Zq6&=t{LbZ;TU zB!c@j5?Uu6*C4skPedH5Edd2Vf%TF@&4Pu);IoA+fJEMW+1xW{L@ z*PTPX#>>RUxIb0j=x$6ql%LO0;I!q^rwV^;)DSpMrhvt;b}z46ANV#zCp$!UJuu5D z{*s>`TKbZ;;vQ{fR_o(3cAPY+kLnu(;4 z{&9@yi99oV_6>tZVJ!6Kt1AwLW z&ui@+FjJCrKavP|C6W7yzAdwrzP}wU$(L;4g64yYmgFP+t|5@r!Fhy(jJE;vi811i z&erbz|M}L`QmtU{9Aq@6ti-yQ-~`@k7zG8PCoog@>rG0k!}dhzK{)dncpGkH`f7dG zKcbPvwBmhi7mH^>)~*!y8imQ{CGsz!_@q*)^vdDA_bcIxjHInSgC*+uA1Y)!dRvwq za)ht|L&*%<7Z~sAkUqoAXiQ1yX0E9W24|t70W{R1Rol3xqGsT z?!pqNoD7e}EyT4VDl>jZiWc&%s09VrBWNvrkzeMj+mGY9y3PteZM1$G?O}@-ZP*d` zXG=I!>FXGE<&xk_Glz?;H^)CbdKBfj)Qi#c5~ zx2hGkvPUs%`06QDat~k26XEjAX-El?9ux}6HGJK2L!9ez^WrfdebBfkOD#)?W%KPP zRgHFE%%@m|_h8P*&&jB?VC(0T8dX4*X~z_RS=iT<0qp`cc`hR0{Fi*b{S7|oeCw+S zDD(cn4L{3zajCa~dOcp1F@=8oJejk0^H;k<5Y$E@wJL>J3aPOsW?j zzvfH|*(Mf8xEx(AW6+dMHnb|z5f`%9l8DRQGYdSebf5aHUASgNj>;80YODs}!9~cs zftXRp3AzJS&*hAx`P$z9n5=M#sJaP=n#^#Wj`q8%-f^M5*YCbu!1%$-Z4SlBJXy(Z zvDB+_(4MS-oQ9t^3vFGxVuEPHwg?e1C?~w?Ma^1e>Gpp*od77dMhw_ zHz;<|E=1gBrw5W_>D-ZYC)pkB<2COOaCXhePggL8J>G@xLS-@ma9u%0UZf!$SfAMK z;QhRODoSZV^Ev9tu8;Ctl@H0!F^VMS_MCYLh6-vab@>ySXVtT*!B)XHl^R*eBH&|00GLZ^J?F zADB;H0n-RtaG~KBhecby#Z9$FcZ9QrgNwVfkz+&i_#4SO*i%(^DT3 zriu?R>})%Yv2I22V5l>P^CBg0G=`<(J>ubN^|BGzr@b~i^4fUu6)!89`&-Kxua1Y+ z`xRdFOyuu+WDN*MiFeVFb2B^d;_a(_5OCAII}f>xCOjHNWQU`G?|F*jjiRg#bQY%c zJmK&B-R0W}_K`g=%bZhQ+~wLF!tmO?n{1H{ny@ndR>Eb#%C%Bri1&B%X&>ds^YDW&(v|h79}7Qj zbdLNi`Lyld6^%&WP!MO1_KXs$nD^`~xLvTvzi+HhHI2-BSW$YbWx)|^|1Qm-Fqxb) z(mU8_XrY*YxmDQmBJ3!9A*<#*33${cG`vYHJFyu?F&TTJ-`6I8oJIVUva(ArY*AT) zS=(6yTc*V{EG=}%|>uNGchr@fspkYR}V1d9Rv;f)oy@X#%MW` zw=D&c6KYor?jQzO@FT8reXkt@s*zp%n~ zsOgnZc_sN1@=v`x#j%pFBn-&pvz*A`y=c8cebE@p1Er9`-IWU?n8(pe5KBO_d&$vs zUv07pD&N+TEV5+wjpK1Os0Isu`I2kaF#)Sgf@;ETi*w6fV{|p}>azM&8 zi`-KAXA36ucmkVO;*STmn`$Pn#RSa^d69|){L$2q`raOl2tpJNG)wMhg zi$@A9-M<$? z9K#9a=q_#uqEcUGur^Nf@l=?Lk(ErRBfdR&cu6rZ3U8jpuTUld-ZuXR$NI`NnfZUD zP(Q%?er-8Z?3H8w9p&G2^U>AC>LuK(MC=pt+`ZoVn}po%s)6QDe;C_ z`_s1w9{=l2Z~GN{(r^@JBR#suuSjOs2IMGf=PA#qIy~whW$=dziM!PK{_)*_KMEQh(S72D2KO6Q!gnC^+;-mnl|jLuBVjR=S5Nh*q+bydc9mxXzLe%4}hBh(zG za&V}LMixxsqQK2ex0pu@rhb zrDmFpgz{KU5lfo)RcHzQ#e4vtQ!6HQrlH|D8Br`T(Ipy}qt3pLheGZiM9=Oy)nep&gnMBq zz~0kQ^x7~*M5J!lo1A|+rMb_^?sj>e!|q}eKyucFRW;AFYMKF6eQU;VhQvK(I7vVb z^>%!uI}IcAA;xXbXVGv8!ZL-C>%1;+zqn|QnCQ*u)6Qwmh~9`6L%R@3V)F(RVGg9j zk8uQik+X!atw4niDoVOf#G~>(P#i6JM&=LHEpsa0B2o-#N6gde2x~q^*s0_iz$Q|w z;2bgZ402ty99;`7Z1um0bG8CQcbT^N&TkWks@vNA(*1qV&^e1c|H_^sq@~N~u@zn0CW*bQEf*JrG|>TWLFwi@+6pu^h_xc+>fMjn3w`$;>+4 zQ62T56;oM9T&C9Wfwt`pG*?q?T>|b)H`N;WSj!p>!8&sSBE5v_4gI;^RR`Ki5HVpS!g+Ukrw z?JaCKy?2>SE#73!Z>tLb{m%x9GBNEe(y7JM225~8FjibZtZK=G2y=1^WrI%eB8{%O zERkjZx81D`pHi!L-obbF)A#js(5A! zv3Eg4*hN_3AYa*{bR5r!hF_(|$TxvnA~hR_i)^+A^xNu@OEL|xRG->e&?)jK9PdCn z<)8UpH?U~HUUI+#IsW(f_xhI@x$q))V+`NJA)~zuhb0mY58}RyJd{c?R1?*f-auP- zuN%S}2+_Kc?R5aLH)g_B62t5UMWdlQwsKKxiP;(+N(uB}!v0+;i-#>U4ZkF^sUKSn z;+U>w-x$GNyPENtd9bsW&$U-VBFovbI`Xo3oLLrbx@vcXn6t?TP-6ko@g$-UJQ?=6Agm!F5YBy7f1ql<<17JOp zV9>xETzx|pWI3Daq-eTNo7MT_=%CohDx>8>Hc)<@Z<3@*9+m-A(=)En0$zva<(6QN ztdL-qUlZ*QsyaJZ$n4L4Dlz?N>w1T<6@c04eAlQjuwgs<(I?sNH|l6%^=WDZ@e;Cz z&Q8`-Xk?$;8jx#y3-g)I%C;ijQr}djBaLod08F_3*Sjj)gnC?^DY<8)B2Qn!^UYg=N>!quQ}of^EdHiXJI^A{{JZg?T^a?&eq`=IR+IY7-T7s zwlnJWW=zAGbDHiUxC_??bLsZ&e|vo&)H#?wTpD{a@;ybhe0T5QV=tCETQTax%O9@W z(g}o309u{vE8F)2gSFXhA_CPv?23_*5Zy+zsr^fc&kJ>uVUHzSxty}X zW6g5`!Aj>O*9=7uX@y>?bi18VWfQEdQ@!~mp+wn%#v$`p%rt<%`*cT0!VfW89!~!l zM8TYO5O|u@QZBN`MQ*IqMN@QNoR@N~Kb9|jbpRT0^_fpG{Jd~Zm&1k3RN*S<9EW4E9yze36> z6UBbpcFt(e!$WIB7jN%SgNEP8N}+a#Gir|2PW*%&*~J&?Vy(cAJ53$&+k#Z_n6n;d zJE(1sT31OZ@4Ic@Z~D~Y+Hz$Xe)!v%oFrjhCI>7x9bDJ=y0hKOBA0pFAWh|Ji`l7m zxzuLG7jWoA5m;QoUFY>iURd;wgO>J4;_lt@UaWUXmsq+zS;KGXeHv&vtk%Nx>qL4y zTAvoUl4YC))`cA)_FJKQ>gkJa-`2`Tu2@-RvmN)DYzQGX|DwSJw)OD83VuAy(ll_m zehw@+a;bKgv@vDi6E+PkdAFxQL7YDL!wg z0wIe-2!|?z9SWBUzrRz4TRYLfN5GL|7C;4S{w(8sIQzF1j*`a*1VKduHSYy&3Neq%_CZl8y{G-SyNK=Wdm;MG4}Qq<{=OyE!C8}^ zwbTwO%k8Mfm1WxQ*DB&V=FBkcBy0b>W@Yet!+>D%dZxqhyn<_Vwxbc%Qv@O0k zRGbcSPj2U>$<*v1ZaBAI7S+nlG*$v0=b~!6B!jv!SQ9M?S{Ws*nlx4dzP!!OgiXjO znu`0W1o%z}>uu6KnrE(es*-891B*1b+ffN(b7z*K+R;;}c@B==b%*#@!^-B^l^UB5 z*jt2r-@m`dMwlHRIwdKKnn_5nz{$2^&^Y;#4#)H4p96IG%g2r{{bqA?tN=6*G@jX1KgMbN%aHlv~Z~@o@)_kLBcEz)R zQh$B&2jcnCah5@Wu&e*xX=*{Ee>aW{l{-T}VIg>-#@+($qTh@7Z^9OPUri%B?yLwe-#d>MD7iJHr-jM{_8s46 z#?M7}4mT?}kWcOwpL4O=qNQkE2NZhD>Dv)wsjQ&A<6adFcFH}AAh#a(L3b!9EiA(^ z-uoWR1)P#!&eDP47uP59t>joDRUHe~QUkh@@fKA}WKm4|*YyS@c!d6q?$TY8V#3-t zH;$lt={6u*kZ)E>Z@AC>X3OP6`4rFW1c!#)yH;T8#EKlgJ-#5UIxy?2ZpW43aZWyB!cHnzZEN7B}2F9CiI-Rlx@hA?eUIbAM%BWk11TnoTdA&DB%fRZ%^dijU*8U zm2ImKgv})lSL8FKa3$|T1?}rY)5z*ms>x=%M5tGD;VOOW#t(gJVqUZu^^o<;)bjTe zNSYmIgNtLjy#B2Fsd)1fw%Q*R8m;(J2$~;4iw^uUzmgZz`jB5sP;HpeD@L_`948^b z$CKV$5m@@Xagp5FbK|_;b8@%#W<+L1@#~@%9OdT!NILUysQ3TPHo3kYV!P#wazMsigcdVa1Cw@&5O-mEV+T4GH!#R3lBE z&maCvr_N*32Th2LS&mxABx$6pG9n=M*cjEaz`AuA@d*~%iKr@+;No?0IL@;Vebr$y zzk;CU6^pM$BhC6ssUDx@H8iPM=c$xkP;7U(^op*3f>rYcVEEzdS>HbIlLBQPb5HPy zHJ`jN%0fP7j0vJY*udoui-xiO2(#t7-ucHf%`z)~MuEHBW}noo z_Ef_|slWkG$uP?dKJFNu2gPuviAejvF8H_>cC^}uDnhKo1 zf!AUJzdV|;{b9>T*pICq#wR__LIsTjfC`D9%{v~<8;<3u$viBtnO$!lGAZP=E?3CV zH$m#BpE@ze^hWboe$`dMQ)|gXn(aXa*C@Zwj(|Ib?K>`IC?qB3GqDj1>;X%mZ??!nL$ih8MT zDOd~OPn%BS6Rx?cpjL_X+2aC_#hbA$ZiOmVzona~?kx((VDo;680v;k&Hs@eT>Mvo zLw*R!IQ5cE29y#PNBVr}1?2gv+y^i8DMovK*<994Oh!4r?@;eWG9RK6{ZRe{$65mR zmz|TF&J>yJLsFZiF1D-l@rRUNDsS+Vr~ZJkQMJ!C!;NgO2^rt1XgL6v=oD5N#1P4f zv8B*-?tv<8FY_c?2w=S3!nMVShINc`R$7!cWMe`r zst0dpUF0NDcoR@DaU3}OLVx$$ntlK_COS$IGoj=2t=gF&Fzy7Ohk#U2lf47@kDh27 zbD<`)6Ct$Z!NSB+=s+xII)kre{$>7=*viQY<>Bl`XmgVZq{G8&DL0lfO{tju?0c!X zyTJSLof!Fj9>;FO3v1y>Po^SjTm6jEhd4gd=@VwDs>ktK))}M?% zUACUq8-d9NUtNR5QJoak_kID-Bw#588chIspkpl3c7ai zhQ;Xe3YUG|cE@q-Pt@Qvpk9(PX>Uk{UXAO}C`dUGtkz6L1Dx27Zjo{)|8M|MS0bY< z5I1zl!k$O7J4GfA89mJ*sIRq!r$9@2HGTL7vsBZ)gLjy zOXT#K`f-|lweUWHC(~V$6!_AL&)rj6R=M%7v4BwiQ8gEwM%-`+AjSA zuiRK2T;TnOA7SNYhK3K);jk))?|1DAhVFgP@jP@VreCEneT=fa{olXpdJkToBCsBr zV?~ku0RnQ7joxUFXJ0m6Y+H$`? zkB>#OgC&*q^{eTk*wVOR>w#r#dh>bD3QQ6CxHP^jc8kzTU?F(V(%O;qr#SN-RUq4H zt9&bh%zcRS3#lcT)RNbKj{5#wlXVRpEeBB4$h;`kZBKS@tW0!*Ibj2+NAqlAdCfR%XFd~MEtr`a zrx!C@)UZl#&vYrlO4XhKU9z3zW&g{>a(hd}#0szpRP}*Ooo;*X3dmi??w+oFa@F4u zgY6$4o%XIamT8wwnQrb3$!=ieJx?$xo~v{)p^}=Z#tzDr``==uerwJpnH0nYV}04T z6mUGcpW9I%F|n0bh-Jg122>C0AIt1Be2U+C?WK+MME!zME5rtK`9M{kI8o2}m`^Et zC7DN@2NoUlN(+9gsk!*Nla7(w!ecNls}7E;XA`0q%5me@1^dW1k+z z#Npys87$5KI^(h_ga>#)m?Bm=Rd<}+RI)h&3}0QIL8 zp9&IzjfRm`0TSM#9JrfjViB;>>!f%me+nRy&d&e*0+(2F>SHl?LrT`2q4WBQ0xxq^7eu4lf-=tA20P5gaeB!#IZD*wbXFp%RqE+Sx zmoP4Tx2L5ygsU0^!h{s&0jPb}Qom68BOp zlPG~^T-6p z(*SIIJCFer#jtqAw`IRi5i^AD0BfIgX-^a=5z4y;K4qOsz|Fw?#6~oiHl2igp(viTsK$WEXPy!unHdL*Jd30Ut8QX6s5j^w+U6j;dzgP zd*C!LvA^}WFdm@VN45;xw9M?f!&y^D_1>Psz(7;0CKv?X6Ty zYKryaQ~VyE3|wS;Cvl52L6{o-g!&hCDZ3K$qGDP1IGaZ0zoEOn{h`!*{aJ`H@_6xc zZNOowU8G!hCwI}+-R-$Bx-n)e%3Oty=~Y^P;z-lROc-J$&td$&ca}QcV1aY|HE`;> zny;DtHn*-@3n(bv^Gr?#Q|NZqiPD_Ns`>s4c<;ZYzrq*Q*8X_2BSR)xLsX1FYdvhqam}>GG<-g zFZlVbhJ>VAD?y+e-4^1kVP!!8{gC(D@PN(12gPfOvmT?u_6)^)2e!x5-i;1KZwefL zb3K5Qsau{Ubnn89b!H0BfNL@r>FHHg9uuppvvJd1N7{20mo7ipAo9+OKlvxBb~P{X zi2B3C2WR=SvrA_RaDuKrCc>G?%ceT}(5dcrw0K@4f7K6(F<&Z7(i0UdbXu(mT(SC% z^C`P1fCPz>I3D1l{XYbZ$d@fxCFL1^K+C(5?|0*l*&PVvT60)9rE7@-U#Aq+ce5UD zq`gL>!D?8FTlZzGY3ikd?gKj8M^RQ%3u*(i8!|bTBz?HQNTRsfyc~?u=5# zeJ5}X)j)mp>?9}rrid}}95Lt>Q{z}xszQ#s$79u#1kU>7DGQnWqg5dLsr?sZ!x=y% zlW0bwJb`K${&=qup=(lI4n*St+0HV@MM0Sdy}&QfaOX6igG2BZ!6K>WfZUa6BB81! z-oh6!WSn7CA8PNchAgY+LX}WtvSYO!!3wg^m)&MC8l;BpLUVPO;9U95;Zi7#BwXBZ zu;VBSN}lsEJ~993s80gQjx8a!nK2tUKg70IaOFSoYW_~1SkaAbVjE{)=ev9%N_AwW zqu!mv!-$_wsT(ph6wu~U5;gq~*_oH@MPfNEp<%5%>n|zr!7ffSCwL4TBPsFcj~~x8 zf=VR8SHB_tHtTkBT7VyOlYc^5#acboHsRjR`>P`*ey@W2%AhG{EqzKTedt{gnfvpV z-xa_qk{Zevg;~{oAs0-Z;~%m&vSim&wKEUr4(`wPEU3%PRk!fuBJfEH>j42G^W!fIGf;V&+qVOJ7#Pz?yh$2s5zlwx1-I&c7_f*c!@&d42}I< zD6+KC8))UZ<9j2R#f#wB*N!R+&Dav+2I@pdnmK#z)?qI_OYP#_C)i)l_ox`rXZjCP zdn=olvZ9&`%sh6?l%BD>n}k+zng=xxW1XvNqG5@IZ{Qo?Jc5XdAfG*-`e4wYj43L& zX~=qOq8Q8Xl;ReZgd*?^!V$E7eYMM;NH)&Tj|`%F*Gcvv)(*+P*TeYCkeDADZeAf83c~6w-DF!-B$31 zT&LIKNhRt+6uCkrmU)$rixc0ySCw8zDw=Snr@imWNHY~DTh>fuLtMAoPUD5MDx*l; zn`N(@%{STCJWL}IHrns2-54I{C*o_HKQdZeUd;``LblG8{f7>@6tCu_@#!?cZB9Lx zGy~IdIbX#4U_g6Zg={r1LX!K1qVhG8;~DlnAsy!fOKc(E(C?)#u`JGLhrr$y zt7QvKaVWIs8+x-VdRJ3V4J*>@U=MX!gOY^hTWL7;=A34vK6d+?E}Mq0DEZBr>p0=0 zP%jiBJRKb4waK7I`_k9(U=#G28Dv>x7o-u@hwH&HMAUA$M5`*QSngy2sv+Z(e4Qb5 z1%B(!PzqGTCGdP_K>DAHo@D1Gw)+}^n=&C_XjGcu$ha2gZz=^IkK6>z1B|Vc>D?^4 z-vpe{67fy(1PH2Cz(lL3qnX1-h3crGsd)je3}^uuYAAgXwAzJ`ot_e$**1CQ_F*rV zJ@x^WfE&v`021FdBO^&X8QeY;HYpr%cSdu?N^;$9t+b5pX+ex%mmbAwo^j~&A$cqs zlvF?RgDsdZpSlJ64@jyD`uZHkE8l*+5&ECw+p||$B~CTLh||1V-Fd;cS6-KkAz#7*@iN0PyTM@Z?NnB{dp1U85XTUXk9{C?U5MO( zny{0(#ya^Mh#T}{&c!njcK0d(0|R&1Dwq(`u06SdI}k}My;1%18rSQK!dEQZa|4}D z~k}-y^8MK{`s@G8(;~QT18%?to2*q+O z*`+|Y=V1+{`7{hb1_%+PexMq*g(fXf_uxrp0qV)w$HcZ%UsE3SUilY>ap9Dsqj+jL=#MkBY|+mGBs6m;*wV+mR`EIc4wcVoJOJ9D()Oc2!^@) za#HntuIn{FJ3_cB{Q&zXNBfY^v&^UFbkiugcCBv<_Qa^ZT4|_=v2D({s6G;tACA6N z62CT4e7(th(bW{SN9)_l&exf4VU0%_EtOcQC-tCO-~O86gQsRlp|8&fl^A*yqIv-~Rh6 zxz8AMqE=Ui+Z7l75lUwEVqFNc#!Xm?nqhgSpzvD_cA~gK0q`=PK>o_>Y23FLx_-sM<<=H8;GHAU)N`~67v(GTJ$V^DOEH~7b(TURu!v~jy_lIYoBo1|9=*~#lW#Xt zME;s_lL4OjiFJNErI$G(jo)% z6)(e8T||xy{4_nD?`4Q)6NR6(QRwd-nGiu8vaG=B{}%x~!5Z5|k3_!zMZhAz4{9&h zEPM8RM52j2+YbA%Len%ZG4zaUN42a+8m=yU2fnnD$B!`T?K8C6wL}e1RI4}~qx6O{ zK=Mz@9+a}IfxyqHL02cpGSKSJphy=r>?cc_a`)kxzkkTCs%HjnGCF6ZYzSBoM5`R&rjhxWKZ1~&#DU^8L#?_39?Ox{?<{Pw zUcRNUI?fVlWY>733hpKFw=|VWH=t^y6>~*1lX`fH^0g+G_1PQ}+Coh?B&{alTAa4J z3g)P_S|Rf0p{ibO8eCq}OvNUbRima+&%F8Mz2a=H+QxVXivqszs~=DK36bc>!{Sxe4b)`|5g{izAa)BGH$x;K!ZF)6XGV(4oLST8WpDqmviZH zPP-uK`||&q@UXro6m%(E+4DXjFbm#RhuEG{2IM*MW*p=*fbZw{wiRTUEnH-*30od_ zyoj&t%&GBnuspzPvnYB!8lYA2pJFb2=ctP5umQr*$j?%>X1{Fx!X}Gj|+ zwRL5Oro&Ft*x0xMezjNTU;R`Vbj_(I?=}WicUWjiB7~ncB=$gGlEU$OD6n z^U~-RsQUc;g6YoRrICh9F8|FSlcSx-DQ|mpcxWF=HF3b93)|OZIsNKn=v;hdQkUV0z98y z)@vMmxMB#tV@$y7ZVJ6V@Fql#8tZZwpk^U&H@%)IBk`GgmDpg)Udn-MFl%EjqFi(l zj>xqqw&z+r-~uC%qxQLmQR7>OZRlJZ0m`?{P?gN6WEQZ13s!7~V(ebb-dfKJy~?|L ze*K=b=+13s=QYhM+GHW#PJMUx}m2uU{F~Qzdtct~rAAQEKOXtPYb;*byap}~i}kW0cXn}`&Imx9rFQsO z8~Ms$tBgjYW?kx}?!)IW_jv+|O?Ms~xgP-vBKj!*DGTFb`B?`gx+lDI)@oY3h*2>!{_K-NRmNI@r`eI$z`R&89i_kIn z*IcbcGG3FaK;q(ly-4v$41b$uO%IiA}C? z#8c?&v?RB#wzNs9;h;u+$qdzz3nIhiQwo5va=B>s#blX)6RuoaxF)VXlqAJlTBcMN z&7>hG^NQo+J<4x$D7u&*NEOGTVQ9c*Gt_gxAz=A$D;aHSQ5|!^l*wR~5!ZlfsToAt z1x0HSVo~fn>Mg5w#q4hM9Tt?Q!QuP6!Xg$5P3gZ?n=nr}h;$2uU>(vZO6$1xpR>h&mq~)$e z*E+CcUmbCLBn_L<3!9RgH-McH?A~I3^Ey-m`KkRjsUZ;Sb9So^0${9;ZChvz!ey0b z5xLe7(Bje+b&98(ZU(SsoqWoo$iVrbFr_FJkoME}JRb^?v24txZ)mkeD&h~&UmQT_ zAI8d;Qqeba_=tV`H-BfK3KON_uufqvg{5D`wW9b!l0CY#SwbnTOLfR!9pzAsT~!z{ z4FFRg)dS50@3JYV4voDj0-o}z^@c@s30&s+kwIcOk;VZgad1IqZa0p3VM@>ue!JxQw_Q0)_zO^!pJkB+?*#(O{qUn|fkr>L&}K2p(u_cIw5HZeKW zOo*LXaLIJbbvg$2UT`Z9Me!2rdfJ}kjF@ov6`?bab-(c~zY)|QXzl(@>9VKC=jpDn z;3(OuK&_|a!02~t$>gBDbE+%X9Gs0%cjlXbR?37man|$lrirTtm#4N{=C zLH?S1>J>Ogd(LGS5Kn)HOlWK2>>WtwpHLJbZ896S+7*8#jxhu&b`3RKV-ck)y?~Zc zkc>T@hBiLUyP0+L`Guf3OEzM3DIHi~udJ1P)c6D_`D-D=cR*ZmCgu=u>5|($s6@#$ z@RzAFM@+`dApHmahZrGXV@J($0*Xf1jnj;FHT2adv{fSggNCFtbl%7WB9D48V`;eo z!Ouh3+O%0#B8JL#8QDnk(|uvIyKF<;OT z3jl5%e#`01YaKlQc_ICySvoa`j!MY*S6d)0^sj1C@Uq*r}X44 zH7iLTQ*&!n*|jX8xf1r6$?H_fD!owa`HM7dus*9^CN_Yt(349^;2I1BK{#=yZk$KE zs0eVBFVw%VOX+;XKrEFB4t_Nv&Y1+>mTeu=*sHT(;_@bj*EwRKSfHSQ_-ss)Dp=l#xyGpqf(tLvh* zI&!YsPCfZ&`se+t$GQ3WY;MTihU<1XsvJEN3@GF@Z6GR4e<(x`e$r%8=+p(7|9KL8 zi3G%`H>mdDm-J$q#go#@>ZE70^M?nAU-61vkw)K8)saM8V zV>J(qM4LVnt2)V-YTns4UFB|hkmS*fML#Wm&by{3&$3CyP4(4!gCcRhDUehKB0=8R z3}07(Q1f=rdo$EM|Mn4|{6)t~gu#Vv@ME{7Lg+va({N~U6%4O?q}=ReA|dUt4~(Si zt0%y`jlE|i0Dz;7ozFw63{8h=QQq3}KV>t6NV9WO;2NkBd6lPtS}aHW^Em6wzOL_) zT=4OARq#zdmul#ZHWq(Ap5_Tfi*Wb3wZM6eIX$MK65q>Y{_Dx-Rs6j!AezV#oTFCgV# zTUp~c4V~-ZgwWjVUyA?jVsX7pVE;m+KWM;ny3)EUplJQcO67$OvtV!ZluUR`Bwy6= z|1uQL^O>8irC|@^tZ_n@im?}PsSbn6$sy6DH8S3l^%jkUgkqiz!hYBf4#z3Xq9nVG z;R4bTK?e?LPpCX#Y|10u_6f@h@Vttu!H?C>VmX*WzL1z0)8)6kJp6*=dw4pH6u zeMKCE+RUX>YuCa#&H{XIf<%I92{liYqaiT`eue+aH6=y>=nQ>CyQK_eRq8pzPdlcm+D3Hjhoa%=b&4{V6qS3G#4{a-a1 z2vwc9=8LbBH)FOONUmm5@30K$X!;VJ_%yq9CHQ!7##u+Rk}y7U&dKCzW{pA*o6Qls zt@J{q@#twY?WN~=Kxp%_+CJ&{Byks^Ni<{M-CulLvFIaDyp+qc;^$c;TRFMTMPIU< zAn*$=8NbfXLln=9r_ATUMuIXu1m+bUSgHRCCiqGfRE=@(yF2x6|M$&$BWR2bfltuG zxiXyuMk@JnpRfRm^#_uQO@Hvrgt1IC4T>CDuKunx0K2em ztA0pHa)4l8(e*f$jMwKZ3mRn+J zw5bA7*Fdie{P{YgVhIO|u0W_w@`8maE+XxLGeiO!p_UO(X?FVG%!dx!YGy=i_@78P zF5q_BPK>*MT_2og`)Su9u+i|ch^#(5lY$B8F}Be)+Za<6DP0cazAKiBIf{fr%d4U39CjVB-V zx-ADUthW2M^-~BO1hMj|!mnD{Pnffudhz7Z%R$eiB|yS#L|R?H#pvSbdtkCPx^pJ& zc!?ELeVOm_rqHprm#2gFORve@EkG5~S>qxeO&D9$iX*6)jSrFT zkN-enp~I-xx|itjHG#0)kn`Uq+F?j89b&1aIwZeLo=Gl$gN9rFRL#e;)dpjCqAnq= z8rV1#R&wLQPpC=zF4$*3S|Ul^2ZLC(A6{Vr8T@wM?S6bL>Sm6Ja=5r+bTMmQylLL} z?`Nc!XS+Vq&~XRXhd8nWGpbq0ZiG$KgkQ(89+1Lf=k4kb?uOWrGLVj{tI*dR{=ltc|4iwKsl4GXSjEL4k{Z4!RkitUv!&Y zR=TJp72i^xmFD;?Ad4_rj`=3Pt0_m%`>r?wo>aAHB=lOKj}Tj@M{Y1DA#sT>Ohrsa zXJHR{-Vc||ByfxY>HgJR4#$|jiz~yjBM|#k^xMXx28WpmJMgY3ufe7AO)v;>tkAVm zV1A*c|28DKv#$)3c6G>=0^g4o&NaH@)Ia3ao1yYY7S}Gq|8~1WaN3*PdLH=TwHs@f zvv*sbT55iG#CHiZn`eq0QGA&Ukd-(fKMn6MyZ9AiRZMgn5HU^hq>Dr#fVRA5P!R!t z`4oDUk72}CS{ecCk?`5Xd0|U?uF)qu>+-PZk^p>uV1X4MN*{E`mF{pFX;J~Ej%UQ7&-W~#q+n9ivBQmm;-(>vliC;`ipjuthr?cx~4f%hF zuja_oWX#%5|D%VBmi2XY-eM_|R~(|7vP@0&nu{xVw-*=$TsMie)|5_hr|0j9l{f4E zOpeJq(n#YhhU$bXz)9rfBA>Qy{U1W%ZnXuqb#*833(i!`>)?L(!#G}KhQZ$B!%u9u zL&e4Abg&+@Y-^;yi-QnQc z8xFv2J>PUN9>t^0pcG${b_!u{wVrqCwseSC^RV&afJ~WeJf19pyYNAWe8Q3)aR!bk zhU#A*Xq zPuDStwSUikO;Q}*YYnt3eOyAl9;7{%$uWQbtAJW`MqfAg#(tP0&)j@K`8jPXnS@R? zs~kFwpT5H(GK>frkvJ3J*YW*bJ}Ia-)BF9`E{^R)B-fua9GEA;Ut+kp6#SxVOW6>|GKn2V@a+ z4l#cg&ZFM!vg4*~u#g0&wxvV=wH`B4Cu9vT@)+;;M@u8Kl?lk#4bN9lN_CYy+%~wZ zuT4t$;>kEF&Pc)xMP%e{u7#eq{~?zC=#W)3Xxb1B5U!v_awUQ5jUXAUxI!c`OFAHp z&ojijZ8LO%_n!}?Ky2mjr%~RN9@s(uD1e)QKccNP{_=JC^F9vKf{0Z=xy46egUu6T^$n_emCS;dm9blG-dAPg(<|je z=km|iFZ>Uo^P8}u*o#T+(m$W%{pLZBNl=q6uYgFRgQ!#UrfL=cE4Qnlvg?Yo);JJr zdK?}n-%}YjARl9Y7A@UiU+f{K?EBB#;Un4^=w-EMZl>2CO~*y7g``Q$$=&Tfnc>k9 zwi_6oNvWvcu1JtCul!T3|BYl_cvQvVRJTx1yh)^zm%Yg`>DirADA~TpR2BKyvYa4y zNuS9H`YZO{I7!&8<3x)&|49^(LfZol;dH1b?0tn8fJ8xREL160{2#)$CZ25MIYnQ( z9?ASlBzf^l&eODaeSPv*9rqi(6VQDBayg5qG}yFibnrFa1lqh`=(5^pA_YFjBlcIu zVZJh&OvCv=s)UMpRbfvW$WWQgNboTQP@H`0^Fwjz_BYZCrq< zej@6NC4AF;UGv9yl`PDW0!U$go@oNTlQ@2l7|O85L|A71iYL`j+};1nIM0NX`SLu7 zPlGpa(qB&4fmkb@l3)(;3NO!oT5Y8HQF!RUM)2Y3pU2MsDk>1+jQ}x+$pZ@XgfG2E zO-U_15!_P4irJ~%R9LeMVz-eU4tc5CKb3ibBSuB9=JJI?hW@O81qMd8i~5!@4>{`k z%ijP6$Vlqg9u>y|It}%v2+*JSIpWPkT7e&&7Uw8&(eHnVi)WLmZqJ@Np|dryJN;30 zIC>j8Xt1i}(ubFMqy|jH!pKZ3C#3Tmh>H-*I0NA!GwXfS<>@wa8}~X|{0Y=w;e_@^ zeH60NyXBxAXfz}pRf%rzkl1PaMTtvp-aYXyZgP7&pU+5yO&6_7-&$?U)WMM=kFeM% z(3QV6TKIQ6T;L%2k29GYX>R^!{&ym(HuXI+5bv*sYkE=_S46(Sg0x|@=OP*aui!=~ zn~HeST>a5CHOK7+zZh~gW$Bie)a;043$jCr_##1w;m5iy>e#Znt_jH5aRu^Kk2BOJ zBWT4YDIz@vvsLP@1cBKIJmu}U-@!uQwI6``00dS6+?!EeW*>A)-*p1yH=EUQHhAlCtu;;g1b=B5l3*Jvi#^JVC6LQ{KQe7`f1`&)f zA*l__T8}3*7j7%XI9dpBCu3>(_Es^jT=`V{UE}8T4mnb9Z@zC<+5V2Yj2oNTIL{*c zp0p%>LLSp4Q~cnY5-(3ZUylyCkHZ`mL3Nb`hAORU`70Eg!`cB0cO$VCU)eYkeJ9!L zL|Tn%Z(}kQZ6hZu69jfBD;$S5P?%I3eXMc3zU)VLzzk#`MrFYPQ(Xj)%xT)kMTbV!RWdbw;dj8SX(I~8-jd-S|Zv4V_P zVH4wnzb?n=-MnK%1sTLAtBADiDysxZ&R=gXT1y+vdBvppmvySxw7FoL8c+*nzwM57 zlJoCX^|CxOV=^D!=R%^Pzys?+wMDg+IckcE8RB+hgqgynZ~hqVG-2pgY!0!~xZ7cn5Uycrc-9T(1QZg%Cy20j|=6H;AW#E=;-cRoBk?Pe;XR58BJ4!Lj z-+5TZyl)X^Z^B&CTQyuRu{n6~|AqUd&dEl92hTwx)otAt7g@)M6P^{I%sMzHEebMRWN&uZT1b^v6D=;n35=;?ZTWksxvqhk!N*#@0$N z{@p`S=S2E=&+%^{6k6a5Oz8w3O%cmiCw$Kgy)chnq}98-{U<|MvNQQYEUOMw)+0E% zmZ>|zMzq|64g-Rb2@+dH!0Pu~c~+t)ZsS7FHvt;WiAD}-h8#`DAuA)0Mlz^U%UN#R z8f-fD=d}mj<3geaPsm9|Ins7cuu+bs%#NKq&KnjV=+}?f+m|3cZAv3Mz$!EYmFCu? zW#_P4OEY*_M8?tq4ljtpHA_*Lc>f?z?m2>cyd4|anJZd*q5cF59Aq5WRRL(53N~F! zxJ|GcqG8|NhXqnh?1NVaeTE9&(#tma(fjBBcAtEZIf&b4s`{O&m*DLyjI z-ItM&c6Tln7ts~Ao5vXaOvBW|=A*^=mBV&Siu^C95DT```v$XR7wF5StmGRV@`pPA z&Cfe0Taz->WOnT^C_62WGqESumBgFfrJF!n38(VeIdoBR^_Cw@!=Xq_K+Q=PI`9A~ zd(d_ZHrRAANFW`tICgww&AU_k-~SMl+?e1#lm_*r${jOW&9X$wSW(g?R?HAzo6m&I ztFAKTUHSLGVQo=Vr~qHVh`BXDQh2 zv{x?^knkZ=-^`CT!h}FJ*z1+pJ~xQcCuwESgbha755zMZS4n|z5}TO84=t#kVtOa$XPA4R+}kiN6t$S7viZy{~~3!hn1!o&xU}pMJ(v`PsN0Ca2sj zF;o&e2>p~8BWv6>h^|v{9D$+6rUDQB|D{84c1Xla@D}}K-r@4c=6^rZhGo59u=vP3 zi!R<6;ofmo-8#Rl@ZMQY7+1kNqDsz&siHQyriszXPlA@XT@SNH$E5u;f~lrr zYYfgz(C}o&*!QqK4h%^tuz5?N2UP)5+>(e(j@qvvW_o*R<2fB$NrXHz%q@J+9ACC| zCWrjpx*&18h40h*R47!*V{O;m>Cf!s;Qx@eI6kh%#fsb=(x}k+CXV7lm48LGnJ*FR zrOK1wai3ggk95cYtAg{;Uk$3`Hy>Ca&bb%)F+Pg_-fJRkHbKhMlleYR4($+E;kvD6 zd_vX=5e~cHDoYR|$jTzx^Fm~58;Jx71M;r9h>m0k+|-(}?VES)KN-B-qdM5AENj*} zZpLSV1v2$JjQyS-1Ll?89hlo{*drMpyH2LMX@nye#Bkz%QdX|zY0m(U_&-E>_BWJn zt|^Qs1Dl_5|CymG!fXwH08uGL1LV%Ot+w(vTni!4%#7SY7yq{MpCwDWjBp03IabP^ zGMNEi+GT+;m-ev9w5)8->>)rs)(d<m{B)lYb(v zWM^6L{pjp4&Otbki91}z=QPG*Q!E7o5ZOjwg$3JOj%UUk_cu>eK$lV#twP#SRZ>l7 z(t!e`@4%zN#&`of7H+?~I9(lg5hCCS!V&i)@A=$Ih1G&S0c&1$;m}e>rQZWm>eb&@ zkAJbo4SEwvPo#;e9C}=+*skUj>=Qo3=Ce?*$7y-YOX}8B22X|%ibDtRc5y+mh#R2X^i*_u%@)zpYYJ-+%P=07fz z=r%D^^%m6n{m!jB-((!z%Z(KokZ0m7KEs*I^;qYNJI*Z|nBA`51TpcGU|*PbHawm4 zK53KcG%Th%;DTjXK$=umHepT|J0Z>gPEG%&+x6IK5=MY|Ef_ndn>=!u2NcSF;Af$ zdg!O*Rc+7bN;oDW#l`6R{m%N?tQJ+qj8b1;e>bt5l@z6HJyOld`AD%}SuD%ynLEvBW?clX6*4)(EA1$F)LFa($TY_r|?wo})bdgf}Gfu0$BoCkA?fehI?^jk~ zuSGt6818b-p|^my09u#PiLi*TOUL01?M=lIBVzQ9t@a}$b^f>T3Fq26?B*B`N^sZe zMa(SdpEY9@I=x^cWYgeV2E!KD<1yFh$%m6v2Ma+Hp*3x)qq}>h^qu!DG%~@RO|Syc z%Z+OUoS=edXVrUGnta8EPIaCf?Cg@aR}wVJkA%w!lpCSCcYud>tMKfl6`89V!o9l&3E*cEZ^(ew#{1{ zaTw0(tmzscE;zQQ>mP4lfV@!UyyVG5=zq)H$_&E!KEI3%;C05P9d@Vh?>@NjkgKO$h#KX)gwbemCxy~V;DV-ZiXx(GW*K`H*XUQrjcOd0GQ2z{)Bv+&< zyjJkm#fQUTYWeO`w9q)QV_p(p%cn4dG~WnDWLwr4Lx6-*l`fyy05S;a_N5>Ba3tTx zacg`X=sy#EbAmNRse(RIfm&z8ST=dep_V>h!uEWha)q6Y^$aEA9LZClJZ>^#26jAF zva-a64Ytw8% z)uj*JqBXFdcW6g7Xu(d_Y(2O~I;2~%Q2VIllAF|v3ix`lF;~FuWU=q1TYm@9S2ZE$a8KMwgq#Gx9xMQF9% zx8gH+>L;%;AaB&k$j0WuHbjOZa@5CE2+R2FOXWQxn(^zGb_?bgB5v-vCloB0E8l?1 zg(h0aBDV0-00Q*#5 zZT86GoTR{z_oxD!eM0D_&7?hTdh)oPO+>b_!i*wKMR!zs3iW8@Ym=<-J#MrR_I9^l z+^KAF?@fWdXIwiA_LhFD8-tD<)omJ8XT?qpvD#j-_G9Nrz3<0$1gF32IPjr}oa=0C zsp);8aF6O7RdHnD-FdP8qs&jA8ZC;A#Wd}xSqKr0HBzjcWM(^%#)}e}ncgvu@|p`_ zM9S3=4%Aa9Lp;O|kwm%TC;E_%GzDU*k>oG1Yx}AgM~!cMiLtEw>d6;_MaLM27BVKp z+|LS}oNl8M&t_F!hVOukpT!#LCI`+OiOF(W@fZfya8M9Lc7ApJg7`R2q&d1vV# zZ(`LA#=^B5pypNAjRaOFAsxTF{CB7~!@>VlX<8Rri;xs2_#L}gr7WG0ctIAR=WKYN z`BN%zi&j7CwaaCgXg||T#rDb}JV1+DAbNu#4#cIhkB0AV15Qh-$Z>dGFRrga1K6%Fr^!zlQLso7C!c9t#;Ec z`Xy6KJV!bs>2{xTlsq;QZ~lE$Pg`Y2$)0`^7s4E~tPf zCB|EBfBWwe~)Q|o?X5ahL7?qckDz;Se<=k_7)(&(k`ASA_9Kp`yQ0vij#onRE*U9WUF9i za>7TfUAmrNlGd{T>dd0=+oZ2l*2HudcGX&)Dy4^lDF+W9WF}Kp((L1ofz7+fGFT|o z_7@;AV@KXGg7~a`gIg(HYot0Rv{w`_u<|Pc0~;Uz>{S%46t3%Tsh1Li#V_x3XQ0xZ zvLu;OB*AjKbQ6O7UyY8qkxbd0=`D7L+%6!IM~&GWg|&Jyt1?LxF&w|w;3~_4wCvO5 z7P=wL)@Wu@e<|75S<8>L?Mxb$@zm%ma;QzTR9&ro@-7q?OK?xXI9`c*LD=B8N8j?Q z)>B^eJZdY?KC>+rASG{x6!?9$it9Y7Ot!OL_C*OfQ6`It;OaW+G3d@HnNTF80W<|% zu<{DAdm;oj9hNw)&38g%qV3}55;u^m^LDsU6k_v*QvrqFE{G;CM;@22$jR`~PyCrp zG$zdkgq|}?S;~wLcDI0{HTMrvh6ps=DOE61Mpy3Bw;oc-y>TOHOU$Uo?sm!AMORF=eJRD_W#sTFb$A)}PdVK;ES%!+X3Q-;fcJ<5js6{u5t2hEwV3`tYt; zBL2F89MS<)K^zX6=U*<}zrF#Ns&v_1Qoll@%{M*o+I8Y(@0umoh38}}@f&+(ag?xo zdaG}ioZni`jiI*M;r(XZcrgQ!Ot0pIrB@_UfT$=}aJXQYS-XB{jSi40F2V6%*5|Gs z44DIOhfJ33KqvWNy8gL!iuWlacd@vP9xXBWshp<)eK|Tw6ZY=mdEwarbGBB)X&(=? zgUGo|!as+BL;BNra#;Mi05+Ncu9;5KrCK5C$5H;)c)ka`=HB;s1wOtMlgcU+D@I&> z956{i(W|;mW=gxYfYW|O; z>yD>-|Nr*h936X$gF=XkjO=xAK6d1wY*9&r>~XSJNM$?2h|ENaW2KT2qHv-}Dy7oU z{k?pDf8HLCa-H+}yx*_abBa_GuCh^`f&c*U1bzLG5NPaZq-wQMg>e2}Wrqj;7(t3N z4A|^8AhwLfW}_fKC{I4NYMsh1OgW<(GBIeG^^i}ZRNIYBZq9%4kXnj ze*6c;uo-*Vr(uX2{p{VNcw#I!L=hmTwHWG9w)G40Dq^Mllk0j6qN^yk7jEoFu^0L{ z(WRC}3?Ao<@@S_|^IKJz?(@kFR-8O)&FeUSGf$#-kV$$D3cZ@e#F48(7C*KgS;&yy z8k9(HFLEof**KQI>R&ge|6>mN#-fARFVN+EpGNgfFVj%C2v#p$N)~2X1F2OXJ7z?6 zD4Q7)Gv`CHl3eJO6rPH9I6TZ^!N_BC3GJ;b@Ql(L6%#ti!mh|jSSB<98?d5~q?W(? zBj!=IzRi)Ccd2)&?$Ngl#^;AnmVf&Lg}(szTNNr4Gi@3h^R<#@F&Ad2=fWUNBgQk~P=@xA zhE$=qT!x~uyZxx@CPo$#p~}}zgIE`|yF*D6(uF|G<-O~oa#5-*K_MRN78+} zR3@)Fk`xN~2cKD15IYC zQq1E#9QwuDIF-j-a>nfE&bt0_xhfwrYD_&;qa_U=MAOM@nnM8}uLb*T(?~L%pf&ME zf9KwJ6}i+-i(Vp&I+C;Gagj`x6&fY8wW{MSL6rY+rUq_IG%muq)LaZErP@zZ8w8RPiHb~^8<`%B z#up~#1zo14ywnLx42Mvika(f2l^G!lKADv+k7wxz)$wK~s?@#DxZ+Lb{3>9Uf{}p- z*$xgLjbfBk5Om8s{SmpJfq2c`NSD}v_lcsI+nLnV|FVQ#`>BcS%d~shGbMQa-*-JYJO*>{BX$Q13t+pChR-kPSe2O%$r{h@*`=Y`y$Q$O^K~2 zsEbCv&(KlLdorr7a96-?Q^D3Mj&&ipFq%4er2h)D@2bZs%$dtP-CS4k+0P_b9>12g zaFG4CX}WK1G`&N>QGU+kgDBGWVLFxl+G&TG^{o*zKONdrr7L;-<*(DNiVVwl@4tL# zcJeK&`iHj`i8UwBag?hcZ*%9Z?aZiPxRVNi>;-se}_o7v;8_OA- z`YRT)8ROGA7~=cF;yx1ueW(Rs^U*LaBZ-oHzt9Q}2;-_jvSX$Bc-xFCQYw*ryOrwl z#*3=NKRErSKG1%KP(C+pYKN(kcp^e~ROVIjUJ>pEXQCVmt5e;k(vgMf{;;LY*#$ev z+mKu7XmSioDqhAa<+QZG^wuwbGk>aHO~9H@7J2~0hY~C&iYhJNt;=Q^nPUT?^oAqB zc>XL!d2#lXv2-boxF<6J;iMFR37%tQj4cZ$zH~u!ICc3b#O<=1xYLM9r8=kDDhzb@ z>gYR&CmxXQ@$~)zltPzV66&^aWzNFC08hAbq=Xj6VzYmwpSSTq#c?f9m)3n)A&| z$V=O>ND->P;x5_YY!%xG#RW0=T0Pvrq#;%Zc5$ zeDWUT@HD?YFiNvFqp+%E7*Waurl(69zM#*WK-yNuDYpnFwQ@<98p* z5Ze2|i?Uag=X_OZsuA5xtyv>&~VWCim*| zoO@|QQ*l+Xvy=;fon#cK1`--LEX(2N6kzF>2^Ecgt2hZ(C%9!l)wrjkyqT_+2?F`r z6sZIJ6|SPx!cV{~08F5sPt``{%h=q{Z+arK-^9z#(+XeD@^;Rs4jhg=pZIbpFcBeNicbxCd!fZKKb zqfuMoNin))H=*ZZ$YlVX4_I!XF>I?q<^rv7&U+0s=>5rbPCVbBC zD)_D+xgfFElaaSB4uM2WFKb& z-K#fec@jCL#WMd$RSDgx+=Y2dBJ2ZrH z#dRHn-(|JqpYKnIDm#;h!Y2CO)g{xf915&sLKMFG!I zD0%Eh1J_sdt?h2scbGqFjw_EQDdUN1y~06#_(oM0%z}%+z_imhi7W=Sj3tGqd_V8$ zmhZ53c&5b#XR#$)w3#!>*PAE)N9UPQu`rX*ip}6wMsWqieC-hNTIj-ykd?s+8Q{V%E$F+AR`x*=6Yp-^dvv(9cjcg%4TArf`6HZwrm|2oweJHL@VHLU4~{9lLb6Q(&~0An!JGcO&p;gn1J`Q zq9yn(0yp7xCex z=}q_+6CL3HvQ$GBrAy`-;2VeRD2h%*G{^@p2ksY z*9^19?7d2;5}Lx34+}33^&2iWp^UXONfk~`6E|t3e>ZAJxSI}FTso|>#A*{CSkjWd z^l;SRBNs}Tk2Rj^zWu6`Qp4M~1wWK2foC@Y*^x;2*l^#1l^kpa^3>58)n6{#^_=;a~^{5lgBpZH1>Cprr(C3Bg7 z>IrkMU4^V4v}7@WVwJnOd(j=FHkEeFD!!V33Quf3^#mTAB5i-Q1&$e%bvh(NM<7qc zGhf(0Mt~uHzErrgD@NN{9#83 za&?Pc#&1jP>K{DmkctYFT^xZ8=+!5-@#;Kg>5n|3s!8l?@jcW2ffn(dgWZg_&wGEJ zO1+ZHW!zz`y*kOj)$p*_I_c1o#E7$S@JubHNlX$>AP18}%qK@?xe$>9#l1Ha_D?Zh z1FJ=h2BfefP3@xRUFwKNzev2|}(SmfAvjqJD zxCN^Bf@it4_H zb_%S<=iQdrLYg^-K_?kbjo&*Gmhd&l=K#gH!nUgI9p61!_c}?~7}tCBXtX&d(&vwD zCMh@YW8Cw%kvLjj2bt-Aic&&xViXu=u`-+leO#id_lFxZv}o z(5NXz$vS-dWzz55s}7Q{2Qlp&m2~}UR0m^I*|zl=NO#eX(vn2i2nIPk_1KK^LhZwBXXqgifQYf=%o zOC5C9YQKy7&cit>$n~AW5FFe}ad`8=MibhF=xz2RtKB#{qaPlPT@JE=% z*VI;Wrb2q4L$mX{?5Xli0Nlzs^Y`TJGMx0#(*Okq`>-Nd%y*WyrxphlL>vk056Awa zGen1$3=>r=u~(MbkNKYxn)RE%MQ9azNl^Kyj={VXsmeJ%R~NR!9$b*1+ZFm%%~qI^ zREt?HWUqmE$Hqpe--+ z6&qg0;%KCL=e6!T>CFh9UI>o3>HKQJdm1}|hLMMaMO*rYL+-~!DTHa5c`|Nk%zql@ z3e}jrO-$3aR;KfnHhJygo2#y>kYc3XS}GDBU8XB08r5g2U7Y)rKc2@Tw}$IA%L<;@ zULq9Q1tM(u)oLg2DwK)r*R#DamuseY!TiY~v{&_>7iv}QrK!0i?%3s!FqJ@0)nmF>J8&#L;iA;Yckeb1DMzrMiymJ+4TZlVS zh8#`N5VuOaOXZ+_(8cd`1bwU$l0MT_zN)I4I>5YNyw&!G`YLg5T3gcCO@` zdW!YI->4o`7cyd{}3}2R+{rhFYu+_I5JacF#?nCtQ{urt~HXt^`O~pv=UVV%; zAM0dX3X3X13uk!!g{iu_$@6=YC?ikLVRZS9;U}=2gpR-tdH$0@8FCs^YJ$FkVMEf!x1W$*hceo=i}E!sZyYEC_Qg^z?S!pu6bPu& ze?Mp?2}%AElztgW*IZe&t>&+qHiUg(m&f`BZZT|# zYGoXq3;`>A1KJ3URxNq}^rr>{)SnR4kP*AQtxK*lv{dYdyA#i*r5}L=JfVO1g3wj1 zT^9nAmi0z{Lcn|!5#1omzW*GwNA5*u%@)d`&Y5oM8XF@d&wkani8##U-;JUHy=YUW z`(`UKsW$mRiS)xXih@>Vb~`2s%wAUU@V#POuc2%KN}k-%0K%{P;4T z9d9sJSH;T+GmI`fhw_tO*KhO-;r4fz{$qr|Uvv964x(OF^7*ajw5>m-*060RM9hgq z(5Wi^^2n%hA~d*?whmwx6~Xh!@#EtAK2dDAjq~`(4+x&AI(silDB;zhXT1BBGN*vf z&9~X*V436(IBCZ**qC@W!0_keii3Qk*ZgQB>TRi$X}qsOpJDD>+@@l2LI6oMj$!!Urv1tG6U%(ufyL6<1)fn@YD{T9Fp-czzO9Y#(z6|8&7=3u`f*s zU1LZP1&F_-kkM(2>gfp+J+9RFa)<`JmY$^(8^AD=?CwmZn3^VeX?T}xB z6dhL$M<-$R?d)G`u%J9S(t7^nuM1SRFwRW5B-zjdG0bw=(t|yL1jCxI9}Y?6FiBma zD*23>FHC1UftxDLY&m`>WoZW_3dKXjLhmHt|CTH

&{)hIisDZy4NrqQKI$1QSV$^vYgf}I$8IeO?Z_5o~2geR8-U-n;?sy zPx?!lwZ(mGFYn+BLHbK4S`KQ|MmJB0v(oIkNCFV3i>?O#LvZwxgT37jr93BfWj>xz zHJ!+j=m0?70{{AVsWw7|^V2sqY~}Egniwj_qo;D@g$FJ5CVsQ3}gTKc~XM(2yl69UP6Y6QP`o0qm<7KlW8tZAytSae$sFhF|8S0 z@TgBD3HdBtd3P*%pSSLpQcq@Eb#-T|^L^4Uxay>h?PZ+a5{PZ37aUCit2no0@K<$e zY(jDyX52^Pc=C&9E~lX{XW_6s{YB6~aYa2I33|5i30TJoD=*o7cvBTZ&AU9!vsogEgt`cJW{po zA6uH=&Wiu|5cswoQ}xs{(vjnb94fFNmr%b~*HBs9Cx;60I9jUsAKft|B=?vtHD!nV zNbK+&it3;-$mi4r4=LC@RkCfaJ5Hl~2xJ=Rk~Z{)TLqN^N|k$@rO6kJjFIlnmBr-D zeg!=!jKJE;X*5}#hkyOJc2fit8fm@z6Z};UWooaU&MDcG+KVY{Ua<@v0jf|dW(c(7 zc%p%<@a>~`(uLi}!^`}Mm`@hks3)hy>oqC@tg=dU-h;XxHnW}x=Pg7K?CuS48u(|& zt-!XkR$>LJ6Y_N#6R6Rsm(O>Cxup9nlW)v3kRaZ-qC{s7ViHWuS)oc5-v}`iT;`F} zjP00ue)AAyVW%{T>Y~TYj)oc)hv7Cw{=k*Nnw!@pD~ok!sMR6ZYHKR zJ(Rs}oz;l+7;LF;=yYWFF2dY2x)`pzJDDO!{wZa~!dVvXiAZ<-M|WBNKRVZc50DG@ z!-xN-02ba3`Vx0hz;+es{})uw^J_!NYxKAvp@Wmxst)pbO&9J({(+Wt%@W}|tw$j7 zZ~VOreL}p6-7k3Kjx;;6X+hm3s^3`rB8rM#i`5`dikbeS>(>9X15&z?n%3YyRin26 z%OjeqoLF!TU4S#ZVZvrqmp7FJg*R6hLZK1G+{5iqogSHft;(0sx$DlZ$kSP_fv%R% z&bQ3svI`C52ZuY`2p1Mle|(Gbd3F7Pi)P=ED!!+?np-2!Q{}lYHVRujhvQcx<4FH$|_Gy!9P z4dtP^vZKhew|A+Im((QnI5fmAN(>4I)8a2NGgO0;+~z>&3;arDasUq|albEt_-a95 zLHzp~h{%;7A)@?E8r5>a$FIjKx0$LUI`XbSNDKf?rdoRAxN{N6%BY|v& z&ioBxH||P0&r?wgT!@!a@r%oVz-aS31Q_HK>ThA=&?W3b8IZ0!0wU9nw5|l-Xb|#R#%qJIO?_ zw={|QdsowlXD!x&D)h?ZQ-Z_n(I*Y$JdX=)?XpWFW@7eh(AUa;x@5Tz8?$AIm#)JR zj=ic88Qf{i<2ErEAA0KF9{0=LfyFO~Wg*vC-CdV(z3&6}VRWdXGb-fN`~5n9*dLCq zum|PZJRyG04Q`))v<_j4fqrf(6CeWkc__JEwJvHes0~*?`lukMzXDW3I(MhTUXf&Y z=;oe#a#=VByv2K@$$zp_y1=XhfA{+XGYq*^8j^CHy0orCgnmVy8{f2R1`?5FX>iC2 zj1jT<%zJ9lMLYXdSiJ~s*#zA85b(<2}P? zN3#hUxR~lw3`3jeK}Cy*(2{?i(%X|IG>D%_y}+9F-C&l?@XcAxbxBBK;U{p-mo)V# z0stMCuW7j8$zOJ1`ZrZ23qhnXV3VEFjCR_8Bb>eUKj!UA6?$H2C!;i z3XEQuvOYn1NQ0@e!Y_{H{gmV^oNK}1LZ5_7hnN=P&C`vD6%*boOo6m8M*yT1+c2xXsNFm4$dp-Nw-9sV>xD z)rWppkB?nGrNA`l!ZEI!@wqKH4Z~fbU?S(-y==AC&_{}So`QMsXkQ8@wU9$kNII%1 z1+!-V+2uWhvpzlWwE-6e`{52Hj>I^Ga+!1K z;{vBe|JNN*kANg?B2JF)@Oo)#j$>fiUAZ6_db2Y7%Y7Ds`y(3$N~1Oim5|*raEG4} z6(~>s46y6|TtYz&BZuHODmHgrQ+HMDpww05+FD8KD{YuM-F&xK{Jwy{(gwMFSa6d- z$%M~g>qI|IAH-%&xE*|h@Ov1a>wSy}4Upy8Py>?26AqPsG4xw|c^Jx};i_Y{!AnQ{ zlAZ*N8P-JjhaAU0)Qq4h>G{7IM@|;d9RpFGfW6ioFIhPu0_%QacxAyzUl*G9MDhO; zh?|Ga)?bY1T|D=NJM}rr-H0i13Qs10-eL>a^ZE&&>qIAczop#9mP%Ly)@Xfvatq1| zyu7Phl21D!T6!jN#o$*RO$BcY5+pir5`xpg0gnO=C$QS{)Ef;nacShR3sP@ z^eGU@Yb+z}+(z|CSWZBXRDMTSqfSBRT5_HX(MmE_u9CwA*b6*)JjK5pRV(!B{(b>o zM|BTD`9VEBrLd$W{DU#X60|$kpBN8`9Lb*%vrv(yO^_eXDHez3Xxa@|)~%@D zvlc{{;(TkO8m`?#dF^EdQ9U(~Eu}Mb0CiGUTGBhblm4MALa?e=zK4qo_l-CgzuM9r z9OIRoeRZNBO?sRlu9~;euBONOBMMz}p{L=A`UPXUH+3PQnaN{g_S6|+s~qF6+BgA9 zx41(<(TXX3#THcw&!*TD;iAF^k6)wq0SeoHbbi;scQELtP*7DmCFr$7J|%1P>ftd2 zp_5P-7C0H7P>?%5b^Z(0-HMX(3DUpi;(1ucy6outz7 z6&oWT)l*e!-%FN*3Y?`Z{&ngyy7dW#eO9<%Fe39G9dd3N1W)Gxx0{>H=@SR< z*1)!-K@WK5obkcDJ2wmm#N>1Bzv$+{76nZdyP_loWl`|Aqicve0o zmZ_0Ltt{j_uOB|O-*_zYh@lFawWDFC$r}`pTnGE-NdeO;jzkE;LDg%VcklQn@eI>R zlu#EK7%f#yWNv=zHoVjtAv_#rFl%IERZth?cN0}#9hILb8mH2GB1M4h3%iy?q*_2R zjpHyd`1OVPF%PR4Q4r@R3X(o%m4`M6j(;8%&;ltjt&&nvEF5ZR)(8_|#@r8~>Epv- z-l!&tDZj(8fB~WOvqMLU@Oh$QP*mSQWksP4qFAs&;QOrEdWUV6M#)JI0+C`tbDgO~ zvy1$xPm57|FaG3v804Avo2lJZ>_wAh$B%sFVv_)Vhn?!ql)&~u1LtAI5GgS@OJ=(L z9^!r&*r+a=UxlbH?w0FC+&}C$s7Un#f|hDxx}~a64yD4G z4{)%MD?XE3|0YM;iFF0o+QdQ^1SrZo&B#XsK>~?JwpSNB@E&9?_jI-4oNgznJGAGoQasI#G0X(0|1E z$A`lm3_4umKfa)IZEP&w-B>b_?-1%picZUqdM zN9nsjnw$=`ixJKY8uK^2JMq`ejY6dD?Mb^;w6hutbsc64S7C}p$~l(_)8YJW> zlPBTw*8-5M<~9hctWZ$aEl^ZlJ2VnRLCg1WI`u1r78MrPNI0a9N7&ZNl~dI+kSAwz z4VD1CXzYlv{L)||IV3RXdBe|rfd|vXR|%u8C-78{JBb+1aE7k4V?o?!R^}LpJ z!SNK#b$Jww*5&fWxXE*XUI@!imD0%Rnp1KT&p_Xe?@s3626p#no^0Q8$2*SrZ)g*x zbG~62nI_xf5B6z^;gTX1dsviRAS4fvsv%rXm8894 zyZ&uBouxTvpS+;+1JT=Bx*?ixCDw{Jr+70W4J2B+Y=>?;UQ!f|>B2>(o9=H)AD(y1 zJvMziAb(SxwZB)%xV8CSsbsI7w1=;BO7B~Fuj1nN@ z6Dq}wS06T*EG{=~JsRxQOqh>xH*^2$)2z!?{6t1+-o?c0d0dhFD~O*0>t=G{FFmlq&KdKs|DYZBsDSZW~>?gAINAxq*kQ7u=sZ$iach%c%qGBXHpHpm-Durc zq0Qvjvt_D8D_j@5t6*xLrKHApRwFQW{1=V9L+MPIhGGQ>^iMi#PY-iIP+SO1>XaKa zEvicrBV1pe`5zp+olvf|Re=2*xouufMF^9S*H<21Ltz^->Vo(eUj-#|Pee@ca-z?} z2m+@n`|D=`r$u+1>9+3N zzvm&%!?u$SN%Ruv&OP6L&9Om83>_m_`}C$?U{XPcZ7d?M?@A+fy8N{Ef;V$01Zjpw z6Ud6=LIfZWjL0yGm@V=QeIEY8(oB%6OgkMqn`iHMaYRRE74JFO4v$pezt))?WAuyH zxa^?MJAQu5+Ryka18-mEr=t^M^eNC~x2p=nmsZxe;`U@wmj%Z5b!nl=XM~hRKe8U! zT%bWZXnve4jhtJ5ehmZ6j`rm-`_ubTrt^2QK$q)WWbuMiZwEd@g;EE(JPP&70Zfmr zp)SQQPK8kK-mLYQQ>o}nyG-4mYi5{+P!#K-sqH@Z6$d%SeR$%OKSt>azQJa}cR%n^ zd>SBay@cPpw~Zt~n(G2Sm6a$hrWw>pI#^FxBg==Ec4+10C03>4`2k8dMT`75t!NH% z7K=%|T-V){F4i5g+ab3G4_pDfB8ZKO{R^%F*Us(Q9r9O0kOL*^`7S|Zlfsi@zIlYE zYa!B_X|0DmN3Tq-<}II=79t0`e}0=>dMqe(;3`UMVW!tSxhbCa*ylrEL%Zqo=!=Ca zw^H5ty}4v^v}y@_*chNAsYDG#6|wSDGiC<6lY}o`j=}BlwK+)EY}lW1Ql&q=G-ns zv*Z0rS6mfJ6DDX6$LN7Pm#~Cz{j43zH9;vs0)_2W9E5LSKJoso`veJaUt}_bQ3hyo z2iweD;QRUSMbhB_@Btx0%2K@1WV3E%k+52qHWd@elZtXPfhg3W4|Kb{8&oSi@KUub zN-A-3=T63hi}Q5xOG=vt;t*+TAn`BSxv)%gqMHGuE}asOH{1dx$@Kfp==UFqQu^Pp zUpbn){Fv{TA+ewr1wCG5@1o7*FJ^&`2cPkBC$%zX}uUXzg zA~K)XAws0g0}Ui1;viVt5eGl88PgiR%}$cgWFZDI_*&B5RWTgN7DwzpzbsBXnQ98B zm57@y8dxf^tKigjAIR^;G;zF8fy2s=b#`aDHPON>LnK!2%iEBQT-k#8S{BX}%tyq{ zp)<1?Y4Xyd;X zb)2JVfGFBv?v&aKohb(qv9Lta;}M6Y3+tUglwt0vV=?w2Yzmqk@p9h#^z96bNLEt^ zKAJdNwCh{#{B4Q2b0zFp4~Of@%TzdAnJXL(VTdZ2n0Vw{HDY#+ryoni z&>uPJiR&p5hM8?TKoER5aJy~aCOvdja|=zJSjhQ1mB=X36=@B-lkeP#*APxgCrBi@2x+ zskmc%4(nEkg~#Ses@8bSLt#d*$w7gexqx=YxMP6^e4Cx^1%_-B5+LZCgw`yVikb-L zk^POBRrxD4ipZ0z@Lem%4q~dI9oh!*Vo~M3Sc@UgD}(06h(;tfO$*7#2#{gdH36iC`V0E8u5>*w}rle+{u4sNJ#(BRFsoHS2dua68K|jN9hR^a9=|E z`;YABC~tA2=L0%u@?BGhF9aYRp7wVO{lVzS{iabWn`-I7wnV0kotMW`3~HZQM>5oQ zQtUkaXbk1WJsmq)CYJ*DkEN1p*&0o?QGBqI99cY z3b0{ca6&m=RE_E8LS&~y@NS7iU(UTQy6G~n79aU#IQPD!{L+J9@2fW>=T7B0iyyt9 z`-+|8uE!BIk<{T+tr3+~nKzdun%ih$9;fJ3FG`|cZ7Fo9opmkO@($Z^lj&jS{S!?- zGK)$!`k(?3|M`N@G$IwZYaj<*0GnwQ1*Ela*fxjOJ-d7ufE>ZMLiYuYQ)7~WNm zW^{n66gd$4clHaFe%KNRCd?1$DrQyD901lb0?1ET5Uo;HOi-x$%k3?MC66qvP|7r z!p+IWcI)iZ{RO#}iGxo*9gF0)Rj%_y?5qp-R<3pn)8Yj2X1wKxi@L?tZ$AYyYb+}j zk4DhjMxHuMZ^TTrbYVNnai`>Q0YAuzQff$qN?ni))i*R(pvf(-MXwsy4WR-?MQaP- zvzh?TME+*V6bTANF3AVEgohvk$-^}Ex|9c<~^QH^7~|u*&SK~XY|gCR4BpIe-O~85_Ux#p!E~M zRx>d0enbq-65+jxycWH9h(H3!_N^k^gP2*eRpTGbXF`>S2x6gfQGOWdK24Z&tn81v+LeSY<2nw~JK0sXgDiKHZaLaRVDTP0)^K)W21t%U?eSZ)2&-?&5fMVW9RGx&Ox^^_&BCY@- zw*7`-&p2@SJE)zsS6VB1OQ^{Cwb6>4e=qx2G;n8R7GS-5?Kw|1wDsHu4TLj+Li`B~ z#>LDVtMKm|NyN&5CaGuHn46h52v0Jrl2W=9J5jo_bP=-2l+OrSttNFT+GTb^gjwGs zm`h$|&i)0i;P^uGmqosu!h(Z$QNH7TH^oB_nE$DN8*q0iPgy_T!3>|r%y8$ z%6I_E<1Dvj@OlgPY2xu>!tk|A!?0Ln&qE=(kP`DYUg3> z1Q*VLOD*IyLnl^~DSf;yxffF>A9N9zjD1|WY15ZD;^D6%p4PHr71OAyK9gU(W zpXrnnMS_LOexmuev~^#R^xf;Ws15?<(WAF_$gclGAc;?qYUC4m|KW-1p+^Ec=2oATAsTW}>uNkO6EM*7$(%Iaht4MV54t$$9?eU$0KX{7FX%}W& z9!w+Po977aY2tgCKoM;j+w%BE1sQtF27qzW=uuP;XqWSxZT~Dqr2+V}W_K+G94i-wsEv?;+UjG~p|~j6XVlaUtqnm+ zq6-~utZ+tutbQNXs{%pp^p`^67U-o@(xEzwK>y5#wYTxCKSQUk73N=$!WfxLMg3;6 z?eg`|3y;Ia)*~mSbCj3}G|G$8BiV4>O$rpqHDWk6j{32Gcv*k>3hWy0atwTj9lzxz zer(#HIs@h2R(-al7g&X$9okK$?qcC+_d`>=`AZRo%8Yy3dNYn*?>>4;hNgKdgURYH*LAEngRkdY$`8%(_ zysbrbf>%6;2UBSY;|4Ygz9ZZnDyUxO8nMFn$5(B!KwIfxF#n)wUW{NJvXU);~e z&M=`oYOP{9lr87ZRUFQctCLG2q&CkB@ZmWQh(&vlXV&!uL{~-4WDZ>wId+ zflC})b(4gg#9N700~~&FAsLKCZu>qqGxjUk>=@sAS#`{cA(`~aj7Qi2ZP@mGEYl^- ziyWb=GQd z=R)>{@7GODo28LE$*8A$V${~v<#tSOF@*#+F*NCm#20~tz?1YQ*o(t?eWTOPW=93% zua`oc0Jex3V?|J>Vmrx|poofm>|HxcuFOkJ+az?=o&{u-cu9A)Cjw`NX}2>wWS0nW zR$&4xkQeIE)!66srW3wuR5DyZ^$0&2TTZNrK%NrFeJ4LCd&vStp?NR`Q_kd*2Hvj! zUc{fSSlOr4h#}IU$upSld>e%Ks7m|*tj;gW9X^BE%7sJ=(m-ID*y~8_vNHb)RL-m8 zO6v;{bOf06p=7`U5=Niw*O>Z_CU-rIi=Kf>m-IqE{F6m+oSQc8P^zi!mJ&xKVB+?_ z5KbrnK||xaPV$@tWR2J$`|p!V=6_hu(ufTQbI(XMw*f`$PiU_RHW{ZiUhzAc4SWWf z7&)vo<04;khthBvEnhyr>_wCLbDEwEp~Chd zO>#zr`+(2H=rv^C{LUL z-1Q`(3B>dDj%1uhIe_{SPoG##iAk@4tOeqwTnZnU2fhhgN zR76~J&fSf=okH`_XD2k`Ow|||UlpTe$`S^$l2-c9t}G`jd9;2<(*?MojEg;$eaG<> zdR@w?3}Q`Sxqj!=!&~AfNxHsf>FjJD0$-AMOg4sx;wzEPJ|8uS%wJC4*B%iDK5ljNcuw^%3Fv~bsct) znBYm2t(wd>ZQ-hI_ca@YS@Ue+jXsF`v^e~~+i)U&9Nt3F5afv?D1J7w?}EHR3KayC zwYNY~ST{_<5BUl0;`^^6i;hfrPiJD95!a=xK;K|EVO&Bme)fTk(f25IJ$vPU3 z3{UpL710y5_tqo)f21A)W)Iqu^4z@4LcQU*Z$-lp7()If-VZ z3e0T(>jyK0B-5B}E(HIwn0#cE4%gqu`Mq`4-+Y&d@vNzxsziQYD#quXn z#;REj!xGOuk@NKv4LtKvpoOXoSivkB!OWz?DLefi-KkA`aYPa=j!@luG@J`s?)qT+ z&qf&g|C3EniYpYUlRyGZK6}l1GaB{ZXR+5<7?J(UkuyVc=#qP%8h;}}`H(YLMZpw5 zHU=Vf>x=AU6TzT|95ywOLxrX@RQVF>-@V!Ynd+%0K(|06=CN%MIt6&<@eOfy7$VjyeQ^d*nsDQd&uUcuTq-2l?VV~3J)zuBqFz^>c2-VROUQnuhI8b- z7W~?I66#rcbAm4qa~~EEk*`tV4pHKFF&^aqo!z`}ocZRY5U1YP2aQtm4OTKDJu2MV zqT9FMYbsBDqE#12a)cNfcLQh`#R>lJL2Kub)5dR>8$bMmwOXfhOdyB8ouq4>a$buG z8x!8NibdaRO45hO*{Z&SF=&hn?^zM2RZOc`AnJk~FOsrzSs2qMZp%|t`4XdzD%owO zRUI$1+AX{$T=-|v&PSPk!Eou8*-)31CqjEWCTlJx+o>BUj|jE09pxpjN40YC z4u+LV=qDS;c13@)S$-a(e?ut~&vm8x%6V>XT+adI4C1E0Khu(m1c5N19;i7xr+!BfRBa;;-T#=QS;vL8{sME=Ddg&7CEZ%; z%*Y75VfQ^`i zez{T5tVrN()FyoKvaq@cf{Fc7yNUoglwUfO#>s4&rvEn?Up{4;P@t{00-;~g`Wv7e zTlgY!1F4bqf0+pLYqewVVb=;<(EhR2t3k?PyBw~EWe?Uv?JQ)O=jsUk<{*&hbV`*T z->QqLqw@r%>gzYbQ>o|8Kvm=QNI*aufI-+yxkT)f;B50y*&QhZowbq{>o(_Ra46zo zD>sZJDI{7>k(yo=vfTBNw>WQ8G9eV;GYoWc>u5-Y54_krap%litBB1zlEf3O_H{Fh z6>L{0hoH)SK?`rBI^3^@3lT(*dl@_iFG$(k+~*dUY$ih1ub7F%p#Pu(RW^rOSoqH2 z%(hR~U_e0Mkld3tZd7Oj^h^VBoHRGu$tqPahej={ioN-UAGph5s(5O_O0`j$xPm zHde7)6m^($U)U}NW z=jIwUSdqCu;SrU4ik53OgbRsG!cwP`n4%D;Dia~4|J16}Vv0b6(8h2rHx@)Y13>G- zFJK24^6m?PTjhY14UNbfM&oD54ru+I+>SBBRe1U?hR=`SJXC+Oj@e>B>b*$%Wr(ec z(#6OqoD^m~f0L@8I<4-NxGiZRaD94ZpeUf`kSp&Wu>t#12?3fRS`#aY6<+lYscslz zH?{Reed9L5^dFdN%;TJvP^BO;QK|+q1R7u%eEhJR*zAB_yqwUtgvz3oAd*3w+HrCq z&>meiUxIuh(#0T5gHrXjvrKsj)ML432QN_C z_KAmDfQH>*qSjt{H4D^d7IwP%(%sFSA*fVHFxSSxW*jPs_1z*AoAD0f2xXFG`hvz^ zJEk$>-b5OfOC0H95v!5Cd{4-z-x_Rh5Z3Q<>%t;W^d>*~zPL5+kGq9^$IL2tb$0Bh z53VQT0`Br}#CxHBX{jV$qzzG+=JY~a&7m3<)xC9+ATn(N6a(bZz!WQgw1&+haKo~? z&Vvr-qDk})fFr8^@7X&w8(~P#Hym+sqhOE);arR`lZBDRQ?RsH8pu~S z;M~e0ewIPxyq0`&4T}WLi zy7+VJM(uZJ+1vs@oya;5{kKaYL1Z+n3mXW4<}#0+HNg2b@7-Fd+<_!`)aY!PJ!8+N zC0gVS+poY!CvN~@g9yzHk~%H&MdQ5LSVvt3ZUdkNs}Q~`EYBm~aGv3Cj~nfK7q@P6 zWd`SFdAtXz6Swkz0)5DA9|y~AuMDBgK;rSzaPUAMVWr`|qQWHfKL(o(-fOGlBNugj z64ce}veDeKl#>R!WuF2+0${+~w&x-sMEr>Go zBZKp6zYxYrv?{I=>?MgV2bKVBRLoA#5PJrmol>_j2J}!LNr;9tRYLZ;`)5+%={)J~ z{2uU$m!qQz-Bhz|q-i^!6*tb+ZqR`cThMY~72u?Vu42ypwV7u2Xl{h$lYsxZ)~nmR zwEmBSxVW=hc^+pzs+l>GX9lqqY0oK~^PtQwu#++s(g3f9;`L8X?{S3fHp5B0d?4e; z=LarK$={f`Q8TEz?fmYbtGoApJ$Z%WN#gtbQ+Zf%Q0ywEt`rYm0(bCW)Ue-YFRYNT zqjV-AK-XoNT_#Tg5Wq-V_zB`IyIT0=tYSwmzAg~&r&r|4E z-!8fJFy-4(NroZ4SOmYaz$O!7B=9ztPNC~C`M;UDDjFwhOrpD5#M^D>R}~VzeWoLqquw=d4dZ%=xRcu z3l*jviY5bmhOL_jr65zCswxZwa$imc(knStPaJ%^Zvl22qgrB>8~Vi>LU3e-9Q9fF z-m4=x@(sh`cMbi(XdS;dvwr|4N?S2d#ez%rUCky{a?SEAL#+5k+AOd$e~2-t?*$hA zX5X>250K$lyR40`h2Rec%cW!aDkT;B3T-;LEhOsE)S+0W`@1zsECop}JbR|X0dZR$$d<1Xcq=v8(Y<7ICY~JujdS+af7YU3}IsC5n?&+`sW3%tr2!2~GcT9C5$wt|WFR@KUUlw(9g^Q(#PssSUZ)H%Vgp z9uAw!mN?=uQAX*XWC-KJ8O|MWiPpAe|6};W_wN$n<(|G{^2a|~{{h#%>>fVQNjsP; zS3zcs+RckQNk+mYSef;+rTm3+Q*2Dk{#)e7X;KrLNUdTWP&$OTa&M>5OpDI= zP?|g9b`1Y3c<=<*u*IPAn3vvBf&e(f>eAyTvGseB^^}tusd*(~Tc_7Z$*NrKA57l7 z(Hz<;(HH2P%DrXpSWEQvyC2BJqmR-f4|7b zoOBu=-_^eV@-HLroJ%pm9$u2>(B}wjwMidT5vO2me$Xio2 ztN(5drRrVkugyh21$k<~a^deK2tr*{o9r=f7_Kes^2&1~0Lt;Or9vt4SOo0mbgQTz zLwI?R)>xVr?Y`a#aR9`bBQgX?Jf!UhxsMePnP=tUV8p(NKr!Ty)&WUO4d?kFNi>qr zmr@6Zo24gUH?h6=5uKZaRU(t+rht&qZ}GXb%_y#@{Jy(YEW)W1E*0BvBZ(}xW43Q8 zFO$Zv_y1sd*_k;)Y#oI*20zDAWz_6dvor z5u8;GoeHuBSN=!q1OkX1?CK9G2_H`9`wDsTl@+$P+~|$}SF1r7Z?!T`lwdzV7)5WY3CF~>DyPMea8t#` z1^$cQ_Q_$7B7e-R_;BW?3FtL@?Q#0Kn)*~3G$tmi#1L^&Z|S1I(YPqrt6Ya>eB<38 zYP5@&#c$TKyU$%+doI#LU3+B3C}Jn^wtXqSLaW-x6PK8uqyGTdc{7W*#<>gYjiqT} zhVj)+|W27?10nc?S& z+Z~bN+VAs=8c8fC9iEz+j-<b8CRINd1J z=n4mel&;)rkZdhp{c;Y5g#WS7#>E?ZlE%M`E{v~vYx)xysy(#ZubM^t@duN`#ihHr zk0|C@GU@t@6|$Pw{?0#5H4f(sB0-1C%MFA7IK=K=UE-YQYW|C5{gICHR#&~MbES&*^D*cpE$$ff47Ck_)^MnjtJyaN8Zv6S54H{=MAQ(lTe?Khp&25% zp!f=5D$$;eY)zu6cC=sMaENZrTx{9!kh*-mUNr~(CFosMyIY8tzt z5)L~oz4qsr#OkKKxU?Rj$tDz<-6CPnes7blN}H)-xhbmn5wxHcfEGd5Rjk3$BVk8L zB3iGhLGDWN*P|c7-2hAE7~pW00UK$C^lFcqxN8uE<=|~Q@HA2l@?C+>aO)|tk~nWT5E0$YE_^~eiDdIIxKMpyJgEEv%OPpr~Z9_h7My<#XnimLQ906&-ui&2W16%p1T^!-+)Q5uP>MD zTE?iVY~0vo^?!}Lvy8S6bEViZU0+>D@z0A_Ao_gU1K9$Kq=JCv&^jCu_pcjsEKQN6 zrDz{mW}grzBFOJ+5OM#r$)R5wt^aX2bQzIv%{e`!%rY*0Ios-3tg{yJ?W{tPzju53(WFO+gy06D@D0N$j~ zU}194_(GyD!9>B@v`HVMG+A2XHc3Tv56hfIP)RL;LPq44q=)PE*d_G*figS*fXosg zRk23zN?_P=3ZSvG=Awebw-*#a!41hrx%!PZZmeRGRArp2mI1`Bo_O)fu*5Aqg5?Qr z;ci2Ed{uJ_vOsD)d{`CcQU^MJCN%9dlf!uaPA!Y?D};)ijC1C9{$L)h~7@=;&SAG7iOU| ztT7NqlCOlEq+BvVqcN{cAGs|hDF!*IMZN$n-MA6JN7@`LP)Pc+h0X!7Lpqh_;{2!!>prF0fD19mM%clWc2{HR7$%C#x1B8_iCm6BCmohMRew}+)Mi6 zyQ?QF?&A1yl||n#cr#R-&jHZ64>v@_ms7I?y*JkgRhqLH0S=^2R~#YlwYL`~gT|DiE(# z?e4x-I5>>Era|$@h-90~k?pC9#eIiZ=-$^I$C4tC$A5fzTettBR*7D#|G97_@#C{U ze~m531SIXkPrMxh(ylKNHHy3ksd}s}p2)i;2XW`NwOt{NHW4KY z^XGeWb%uXhR|Lwj`u82cy{ZXa*3o^Qe}0FNf_mT#6B6pjo<%z*t6wUk^ME24vu%8U z1GY+D{E7k0l2ot3Pq4&;HIK6>CS&HfTdw-3~C>ID_R z{bdns(Y$u&<}_qKiBq;}w0t6?^49IVCG>PPS`$*Gt8&8@adx3JCFo>yRT*O6?Tp+j zK<>f+`A|HHmYn}?Ed}PfBM4=H6XO5i;}c&!%xwq4G+dKt*r&5+F}fiNd_+5h|u33-EC`9p^h zYEvTu4kZigS!-kpGsm$AOoD|pmE|=}4|*UB2uL%fZYS6WkFB{uG|u$v$WA+A_y91f z#?q6wk>2wxPk-?y;LKh9svv!C+>O$4=sN{tafZ(LZ$x1VS9s?Dj?yxu`{PC=fTr|V zk^GONgxw6ptL~Lco5(SPw#YaRk}~~@Gyiaoq?72!8C5^^?EA5AP2IR2sP=O ziojbdpnsny?0UFL!rUyD$|m2y*JU21!KXCj|EvbST(jL(0RP~HO8R>mhtC=_^qIlg zw9y6{s$k<)t`rA3%}{T-Fo=VE@X?v5PsSiFI0KGb58GK#8LRlKodKq(^qy`#(sLDz z(`jvMj?1v|NtZRjRNRMGhp~YGA*OsdbK@cs0Iyf)T3L$CvHkazM@QpZ;`80l-EkUJ zd8jj4kkw)~T>u!+>2%=@VI*}WHwuz%1tt%xIHlHwtD5WGSKvSG?yi_DbK9;&pB{8T zC$@FR;?rySI=dHN$No8%ok^;cKMr+mr01e`;z>Bgpr{)|{{1thQe00Me77ZzU$KTQ>;yxI&3(;Wk zxUX6}pMzn{kpBNuo~`Nx1B{~}qMbIEbbz8%(H428bj&YwsJyY}g{6QjXPR!MuXo_; z;_9`i0qJi~r&Aq2s9T%btID0>x1z1ts5~U(a;kZQ2;KcjKj>kA)z&M(#7ZjMcJ6)H)a$yO4vMJr>*#^^~T;kal{z=)tdB}QD z0KWw;0TTTR@aE*ktLlwNefus&O1)TMar3zN!NrQt6slfjr!HS^Skju`k*#`p-V-j4 zO#26TDw^uzfSyq>E=QYD$WeR9U-gl~kT@5r!q;%fQx+BNEZ~3PXR(|6%>gx>{lj3$ zL=#cmcymA!Bku@Lmw^$PQ6in_*h@y?ewMoZ3Srvu0-0F0dsao@hFX^)J^YrAu!`Io z2{WYoq`~ZLE?5;0=sP_mv*Gd`9BPAoe~z}+Nsf@z4uo-rJR!TDjWCq=?m7Mlc{1=GxD@Yd@KCeT|J(cwT>=sArAb#1T8!)ZT+Q4Qq34Gs#}SS=XKoiR>0Po0L^Q)b|U37^z-u2 z0ZAb-NOU_u2s$jx^g(QaHw2Q$;p>+L{m&0#Y@)M!Kn~fVt*x-khdbe67| z1-2g~rOetx%C-vdgv9krH@YzSV@FjE_L>ico>&Fc*&_Z)X!(`i!V2z_&r{P{rR=r8 z#PX+dkBY_`DXNl315T0RJXEK)HA^TD;`}7G4L?%+*D-Emx%AxG_YbPAdR>KG6?|WI zCB!R9=fB!=GTDOpO?$UP`n&p~%(Aeviq`IV*B11CzzioVK5{piKoKS5T`$r1C>192 zTZsaaW(u z$y}pNf5`Q+pydb56(!u6m(UHWoljo;fH#$H1M6U7u|YFG$9#-yV*Z@n?zkOqpx~tK zZB}SP6>X#W29hup7VBZAcaSR%-l}nVc-_rWmzIY6fKQl=Dqf>=U;eT( z$~C`jUX&k0=lfavZ&<1{jw~Lq#97)K@Ttfs)h_aEc&OT&uUm38i1=(1!cu4ItzWJd zDjf<8m&#G#3+s6Up_`ANh^`vU9&7^38jtBi&Ey=X!G3SetsT{xUVEcoTPQz?K}WZW zxQ(BoV7BI#%dlj28DeDuEi7~x7%VjjBw7}ow0^{*-+_g#Y%cqC%n5kL?wx-sH0E~y z4piZ=+;DHqIXHw9abD(1NudxTu=}uwdY?%q>V@cJ#mh@#qoFn1#V~HzdsLCE_AAk7 z7^4efhl&JtiNZK}0Zyq?`FWtoIYw?^0ZcRl$=enysdd9eim`$u63 zbg1^k#hLTK*^Dz4635Sj<7V=G?vP(}gxop&GCvz5X6dsCS#5Ku-H8$0g`v98*gXjU zn!+lH7F{L{I#kf&f`-nhFFmk^q5+|e@q2^v@Q$XaSnJ( zG<0Tx4SzNXaY57`KQ;rh&RG>`B_UyL&^6m-72a083TMcQc=H)ql;du?Dv0*1Uigwv zLI{b9HI6TA6-$Z~ZM^?LB2#XO@KH|AQjy2mLL0q#P#UmnvDHk}-hC0`yh%+G%?i71 zIRF!w{y8GXt<06k&~T&F8v%m>yzUD}6!#>ZqA%ZTIRXCSo=%-g z|Ft7CLw?nPH)TI+;i$jXlm7wVoAnZj@^)wk`~mlPf$9-V^V`(l^Z_n zNImu4qBksym8|1Eb2iuX>JiwS%(Pl9IgV}yM(S8?GTxM??cK9`6n@_gaY)!_Vrwot z;jxy_xpC2>AV)K)D9ShMm_PR-ul2OYVNwz=GvIW`VnVA;7dK6A*k1LT_88?@ec*Gk z2l=hr#mc6>x*EH78%fL-aJWYKl4lTd?zw@-+Fv+uETT#P*d?$(X(6zUjch7 z58?zs|FC8(Oc`f6#N{9{ZYrUlz-25w1=!YhJYq!CYxu&ZmZO@_M7}G_kKm3#*$zG0 zym>C}`6MVYcK>Yhjk}v1XX8t0b;pkpz6m46_Pt)s@%2dkYn%ccHK|XF?*u@{z;*>s zPUjfZXN$Bf+9Ws_f`(_buc=J_U=im^&2Y3?IUxHUDxWNnZN>}ol|#7O=O6fIf2G;*||~Ty>fI7Rx4Lmk18e#wcF;gD_02Vo&zKBFf*JGeKccmTkgB z?B!F%MHvqKft$W|*&PmO1j5Yk$?l@ppr87839u_Wehj=Cnc>enr6XGNF*zs^uT`p3 zd_=t4dEd1~&mu5-GzEG|LkLKhA0HrzZXa9jJ$PNDl5Z1|TM#g2A@_6bl$=0?C`5cn z+1K4J%Tq*#dLj?VOO|@7!33!=p0%!{iIdQ47~=fH?r7M3z3rNgNXg8Ke@($vVcW|S zY1#7nsuiu5n`HdZn)dKGv#U$@O52a9f5?C*u0`rtwtel{t2hQP(%4eHRv`=GSSV{H zY(^+eW6}$WT2->CE|gm`=i_Q&((>@hBAHt8!v;x4`}05=naEb{yG6ntVEuG~#3@;H zUw0ef%#|;f{eF$6>kkKl!L6pashwKA?vc_8!vM8 zgvcvywl;`gJR%|gJvi#xuYec;A@7Q2<{JElSX*~Ha4pKEf==T_>7ya|U%b^_bVmx^ zQ~k8w2M|BTz9h5nw|oesRCODqLm$M`YkAv|$O1nw3i&h4B7;z~qm3R;(xPYe2%_YpPYS0=4A`bE-Ue?2qF(yt+}k1o zZQ=MsNb-AzG-$eL(FJzNuVPya!~!QF=H^iiNW@&CYTi!1-|WXx>d!TYKVzwNS{jaL zXS+7h@Fl?2_-Hof%33?}GZPKkYhXr3@wR%ra5k;nwCLFhadxf!(zPK_vEY{djA&*U zKUI!O<~G_{{dGb>$UXt`(gNmRVWfLa7M1erC8>2oWnG@b=Sw`PwHXn0II`$c8eRx4v2Nfi`3JYv;3M)W!64A5aZ>_>*Bb z46!Dp!)gn+Bk)z;IF{GwoBYgc%tb~9dFacG$erCvk5!WQ2h2q${%>s7zY9aQ+YTeG z7gyIce)UuUb259=(5Yqwym%P$b8QLT_Ci|yB9%s!0r;M9^`FsSC6oOj+Gwz?*VDhk ziSVJT+_**nuF$Rcbnf?-FCgm#{~MJj?kL^6NKX>$Dvgpbaig;EVQ;6I-;>MIKU3P_ zx0@m{R3K2QGagED<~reKsS1~M`vb>qTt%d&*hG-a?I*vW1?M_zHU9voF*LkbX0bNu zl}d3*?3#2r>QHh&n}ivIaF=~Wpqe2PO=5TrOY`E5Cs){1k%_-2KJY0zmqC@aCjE+Z!ZUr6Y~5Sv7e1$ zxG8NpGEtJqtVgbTN$k*SegO}lX2Y+}-_ZPnewYH*ri2fWF;e(OeJHw#}dJE}n_ z|CvB8-58P~6?RIE#V9v4`TpEy-X|L|mIluY#DW#NPPd@e8 zO47ZaxgFL6TJ>ylPadT!K^vWbW>oN?+S}(6I~@RA(j>&gcTE9~#R2S#*+|+?f;ynj z@sXNA(Gik#OX$RGhve@(={<-M;y=Z!KfMY2;iX z_t^p6u}dsImF$H^LF*sncvo52zRU4hL24Hl|$frGm< z1)&~?{PoG?pzWTKEaJJvb}uvxNxEUPA~3ZC;-i)+TmD_9sI&pB`SIqw2yKhctJFG# zjC$-4W5PpCtJrDT3?*LhbOZ%OJBcjAn6OD-Ss#F>eLbcoxDXZAocNydDM1w$@p+ngcf3sZQ;~ z<%_z%z5xv77D*jFI8c)rC-?Xst#Go>fdy^uvTqxyfg z204&Xg4NkZeX|h(DLqrV z4VO1tP5L|vLu?_{Dj?XnVkwKVCBkfXu9yQkb}djdm)*fun))0QGE?c9Euy7 zkalIwsSiMXh;eXmj+3x<@Su;C%U{m{LyIQk1QGxivF)p1l4Q9^LQsO1CkQY)KOM|Q vs4Z%~lFh)@rvkx;NvJOU;DN;vfc`(K-W`-GwIEfabC@<1pR7hE? z7ug~SC8BthRF)J+$8wPGnYOQU-t&Iv{pPx!dG6(R|Ng)Ka{sTn=8%WGlk)O4%OMbm zGTGVQ3w$%BkD>zj%^x^H1z*ef&O3w<$O?7ovjmcLN*e-^A7xQ}MZOd_5`)JvqcM4O zz)Zs7gJ=lEaMB= zFI;2=2bF$tfy4h!%N2eN6Bsb0gvLjr%}`R8J_DJI?>K(AAoR0wCIbnC0vv!V5`tLt zcPu}cC*lc%dH;d>`}Q9UfT5*OzT5aqEga5w6GD+g1n9=sfczy|NR8wJNH0Lh3l}f| zhX_!nfz%s5$xZ;!L_7hN#|!=035y{~lZPXrP+y=F9+MRq`EO7RmV`!;P~gcQpkTo;X(HO+f|(3bAWy)df$p+6 zv>*V<=LW%H--Af9lHzyhx$E%ZlLsVb&a6%9)?XV3rynnuSX@PVKzI>Vd@@(=;29f_sx{wy}H^Tp`M1E29Z^Hjvv;TkLUqiwOrg4J+u(u-NQdf}D zF7zcK$Uo=m^WF~~>l++wgVN#m{tHgNcW{6UQVYQTtd#5527xRmlkIJ(l4oP5mU&R8 zbsDRqicFshmI)NoT@6}o>ZxQMqmbi-!1KvzX!Qbh&KeH;QkHhUi=`Kjj$X&&BvaTN zBTi{oUK%sW^F|qK%@bC7orbNPgCg`+M9-bY{@odcx0__{E z60}KBwNSAT^Q^HV>=l3Z*Vn;lpY49)(D(T48Zb>&0<{bz`6A!c#}L8xV;*bepbt=RzxA zhTp0RbI`q6T>P53&Bw=XVT3J+ewZ{o^CsQs{k3Rl>ha^pJ;O}8(v{^7I$nsY2^f-B zOug1I+_fub6B1rjprg5O(SK=~iH65B9gl;DpeNV&lU2e{A;k@>u=0Xj@!PWL=hmy} zrJcJwbR`9dlFc@XC4L2tK|w}c1v{T&p$E21WXHzF&hCB~smjY;uiqH#nC+NcKjp4; zofq#iubr*!ruS2_tG;b}W`ShLOJ_cxK)lyE?lCVOg5H|vk7*2%lm)jC8=z+l>+iqL zPcW?C+i9GE2+?p+OYAeBt5~C(u8=k-qvZ#d?>D_zRMc*jnqp$2 z3ZO!lb%kV5t*m6{I?~XujtGvHaGwy?$^52ngge?j`Ki6G_{>;GnOt2+smt^*(z5-{ z!|XoU*|v8*Gu~bMO{&5#N}`$J%JB@1prmk*mFc~9*E5@xeFWy6>+?NXW!-qqBQE9B zZKs1gm&;F$JvT}_+THDYtI!EH@Vu_yjeNf!zvttme6H(o%CGo;+>C!m?J^dfluOHMRTD9^X*6-fVHr zd9iS*J62P{-#iFd8PGDY3E8+FR{A@e*0mFaazKeVBSec zP*|m*aju|1+1A#!Qs#!git;ucGNs}EjD-3o$>Cp{?(BV)6+e77wV5(2UTYbpbhr1T^{!YyHGpC} zO-g2tEK}$62c7eYqL$o=^R~VNBdyzaY?4z@pu1))9Az0VaH6T&BO@b&Z;uU_S6!@D zEN#GSI7w4uApv@tS#SEgc{j+$@r|hnnWn_mt9`=;?We)V*UhAI2?_6uinR zS?)P`_Uwe;nf;_>qzf<9<){;dk}Q{X@?=6osn5B}W9MUZVtuQWmV0F={giNFc-Ug$ zu3|maKX%_{OWR_;!{oefx#@MmU1G>nPclM*JXTlYC~k?KdOSN z>oUhAD->tNA=Hy6Ptp^e2i_T%`V_p{zIq-%Q`)^dI@+qsJ73Lduwa20#EztHz%L#B z*L&2QO4IT6t|-n2+v~FWY)Leg^z)ON?W&uGOs9ak{a);B?M2|uvbJ^WUrkJQqUNqt zV#{A?E{O zvhrIruGsAz>uXV(Ir1U6f$hdn|8(}ZH0vF5C0tlK-RrjnYO0ElJ(_&mv}|EGQ;3mx zhqs!sW6h4JT;7P2Gg0RB-Kbk#bVZHFVht;7K?UpVNFH!x$I;!k2O0`o+YEf_y;Vm1 zTW$`~Eh%N}KtPDz7Iaq3$!Ra8yGMb2;x;>{g76b7X=jK3?XsE!`sMCb{sn2LvyRBh z*FJPWmi1S5l3q?lEym6-%53`xwH)suug$A^Q5G&Rg0*%XGJ)pK$ZYG6745EFNaXKc zbaAnnG;*S;s=KIV_{M{R*O|alH{2dQCQc>R$A3)7hoazv1m_Xw``) zcFJ7^7xxyICin%m2WNV5!qyAXO9UqAeRstDv*)(P zm_93x#^LeFf|g7py(8~Uphl}kyw+Mupbs*T;+64>uOMyHkGi|HIr~02u=mBK=DCKw zxVt3Zuk>nSNk;h7hQIhJhJq^8(qT&Rf7<)=Qht=(qO9jtwKfQeFd+TMfb8IIU$`aU Gm;V9VQSR~p literal 0 HcmV?d00001 diff --git a/TestGame.py b/TestGame.py new file mode 100644 index 00000000..19bc423e --- /dev/null +++ b/TestGame.py @@ -0,0 +1,55 @@ +import pygame + +# Define some colors +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([600, 361]) + +# This sets the name of the window +pygame.display.set_caption('TestGame') + +clock = pygame.time.Clock() + +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics. +background_image = pygame.image.load("GrassBackground.jpg").convert() +player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() +player_image.set_colorkey(BLACK) + +done = False + +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + elif event.type == pygame.MOUSEBUTTONDOWN: + done = True + #click_sound.play() + + # Copy image to screen: + screen.blit(background_image, background_position) + + # Get the current mouse position. This returns the position + # as a list of two numbers. + player_position = pygame.mouse.get_pos() + x = player_position[0] + y = player_position[1] + + # Copy image to screen: + screen.blit(player_image, [x, y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() \ No newline at end of file From 9a9bfc333f2257aa2739c9bd1cbb3f9eed3bdb30 Mon Sep 17 00:00:00 2001 From: rickyroze Date: Thu, 15 Mar 2018 23:59:15 -0400 Subject: [PATCH 11/17] Check this oot. --- .DS_Store | Bin 0 -> 8196 bytes Test.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0029c264e4ed2d8e0a005587b9575a56fae1aec4 GIT binary patch literal 8196 zcmeHMO>Yx15PdF@nktciR)`$;$OR-M4hSwwln8MEs#1w#p-CyU>2B0)OM5}ff&ai? z;P>$Z;LX^C{fxu~Q8AY6xAppYX5QFwoC0vev*~?c0HDh%c%#Rrp~!owwXzm^Hi?dW zV1fl+;vKeeSsQH~rhqA63YY?>fGO}VD8MsYO1I_Q_iwE=1x$heQUUpVh*$;VfVoHg z=wPE)0Ah#TTKLR+fO4XMalqW8QaPu;J-9%1;fmoro$n(VPK*QQ9z7k-)8T?;7j7s{ zt&p< z1>Y*xH|VFtk$X}uB6C9igC@4SU9q=Lc8c?6ZQPg2=*{Km z*DW#D^c9^-`rgC~TKm|-Z_vnnX2hLB#C=98dCgdNIhUx_mf5cb-d05+uh*QjEU5X6 zb7Z(cR?f3#s5r|8b}+^hjHtz!oD)pT4Ar>E=#g>26|izW;Sr@(t2C5YN~^869KB*sY0j%Y`8<7U%T&pyf#!COJ*t*+tt5Q< zrN&)6WcH7#{to*j@3pl;=nGA{S16gH(V0{naV4?{jj94eeR UVD6DUEcQcy%3zHt@K+W133W3dHvj+t literal 0 HcmV?d00001 diff --git a/Test.py b/Test.py index 5487596d..3ac190fd 100644 --- a/Test.py +++ b/Test.py @@ -20,8 +20,8 @@ # Call this function so the Pygame library can initialize itself pygame.init() -# Create an 800x600 sized screen -screen = pygame.display.set_mode([600, 361]) +# Create an 1024x768 sized screen +screen = pygame.display.set_mode([1024, 768]) # This sets the name of the window # pygame.display.set_caption('CMSC 150 is cool') @@ -35,7 +35,7 @@ def __init__(self): self.x = 0 self.y = 0 - self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() + self.player_image = pygame.image.load("RedTank.png").convert() self.player_image.set_colorkey(BLACK) def update(self): """ update the state of the paddle """ @@ -73,7 +73,7 @@ def handle_event(self,event): background_position = [0, 0] # Load and set up graphics. -background_image = pygame.image.load("GrassBackground.jpg").convert() +background_image = pygame.image.load("NewBackground.jpg").convert() # player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() # player_image.set_colorkey(BLACK) From 9cd166f440c5596d41840db66fa323fe9aa4ab53 Mon Sep 17 00:00:00 2001 From: rickyroze Date: Fri, 16 Mar 2018 00:37:24 -0400 Subject: [PATCH 12/17] Made Character and controller classes more universal. --- Test.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Test.py b/Test.py index 3ac190fd..78ae70a5 100644 --- a/Test.py +++ b/Test.py @@ -30,12 +30,12 @@ class Player(object): """ Encodes the state of the paddle in the game """ - def __init__(self): + def __init__(self, filename, x, y): """ Initialize the player and position (x,y) """ - self.x = 0 - self.y = 0 - self.player_image = pygame.image.load("RedTank.png").convert() + self.x = x + self.y = y + self.player_image = pygame.image.load(filename).convert() self.player_image.set_colorkey(BLACK) def update(self): """ update the state of the paddle """ @@ -46,25 +46,25 @@ def __str__(self): return "Player, x=%f, y=%f" % (self.x, self.y) class PyGameKeyboardController(object): - """ Handles keyboard input for brick breaker """ - def __init__(self): + """ Handles keyboard input tanks """ + def __init__(self, u, d, l, r): #self.model = model self.x = 0 self.y = 0 def handle_event(self,event): - """ Left and right presses modify the x velocity of the paddle """ + """ Left and right presses modify the x velocity of the tank """ #link for event.key https://www.pygame.org/docs/ref/key.html if event.type != KEYDOWN: return - if event.key == pygame.K_LEFT: + if event.key == pygame.l: self.x += -10 - if event.key == pygame.K_RIGHT: + if event.key == pygame.r: self.x += 10 - if event.key == pygame.K_UP: + if event.key == pygame.u: self.y += -10 - if event.key == pygame.K_DOWN: + if event.key == pygame.d: self.y += 10 # Before the loop, load the sounds: #click_sound = pygame.mixer.Sound("laser5.ogg") @@ -78,8 +78,11 @@ def handle_event(self,event): # player_image.set_colorkey(BLACK) clock = pygame.time.Clock() -controller = PyGameKeyboardController() -player = Player() +controller1 = PyGameKeyboardController(K_UP, K_DOWN, K_LEFT, K_RIGHT) +controller2 = PyGameKeyboardController(K_w, K_s, K_a, K_d) + +player1 = Player("BlueTank.png", 0, 0) +player2 = Player("RedTank.png", 100, 100) done = False while not done: for event in pygame.event.get(): @@ -93,13 +96,16 @@ def handle_event(self,event): screen.blit(background_image, background_position) - controller.handle_event(event) - player.update() + controller1.handle_event(event) + controller2.handle_event(event) + player1.update() + player2.update() # Copy image to screen: - screen.blit(player.player_image, [controller.x, controller.y]) + screen.blit(player1.player_image, [controller1.x, controller1.y]) + screen.blit(player2.player_image, [controller2.x, controller2.y]) pygame.display.flip() From 41fb9eb461b85f8b2bde12d972307e1ccd1bd982 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 16 Mar 2018 01:25:52 -0400 Subject: [PATCH 13/17] Yay --- Rote_test.py | 163 ++++++++++++++++++++++++++++++++ bullet.py | 176 +++++++++++++++++++++++++++++++++++ top_down_tank-8hkMRt_fix.png | Bin 0 -> 749 bytes 3 files changed, 339 insertions(+) create mode 100644 Rote_test.py create mode 100644 bullet.py create mode 100644 top_down_tank-8hkMRt_fix.png diff --git a/Rote_test.py b/Rote_test.py new file mode 100644 index 00000000..3bec68fb --- /dev/null +++ b/Rote_test.py @@ -0,0 +1,163 @@ +import pygame +from pygame.locals import * +from math import * +import time + +# Define some colors +WHITE = (255, 255, 255) # have no idea what it does +BLACK = (0, 0, 0) # need to keep + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([600, 361]) + +clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) + +class Player(pygame.sprite.Sprite): # player object right now is confusing do it postion here but not being used + """ Encodes the state of the paddle in the game """ + def __init__(self): + """ Initialize the player and position (x,y) """ + super().__init__() + + #self.x = 30 + #self.y = 30 + self.angle = 0 + self.old_angle = 0 + self.image = pygame.image.load("top_down_tank-8hkMRt.png").convert() #image goes here + self.image.set_colorkey(BLACK) + + self.rect = self.image.get_rect() + self.rect.x = 0; + self.rect.y = 0; + + def update(self):# this may work idk yet + """ update the state of the paddle """ + #self.rect.x += self.x + # self.rect.y += self.y + #self.image_dom = pygame.transform.rotate(self.image, self.angle) + self.image = rot_center(self.image, self.angle - self.old_angle) + self.old_angle=self.angle + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class Bullet(pygame.sprite.Sprite): + """ This class represents the bullet . """ + def __init__(self, angle, x, y): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([4, 10]) + self.image.fill(WHITE) + + #self.player = Player + + self.speed = 5 + #self.x = self.player.x + #self.y = self.player.y + self.angle = angle + + self.rect = self.image.get_rect() + + self.rect.x = x + self.rect.y = y + + def update(self): + """ Move the bullet. """ + self.rect.x += self.speed * cos(radians(-self.angle+3)) + self.rect.y += self.speed * sin(radians(-self.angle+3)) + #screen.blit(bullet.image, [self.x, self.y]) + +class PyGameKeyboardController(object): #works well a little jumpy maybe use vx + """ Handles keyboard input for brick breaker """ + def __init__(self): + #self.model = model + self.x = 0 + self.y = 0 + #self.Player = Player + self.i =0 + def handle_event(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + + if event.type != KEYDOWN: + return + if event.key == pygame.K_a: + Player.rect.x += -10 + if event.key == pygame.K_d: + Player.rect.x += 10 + if event.key == pygame.K_w: + Player.rect.y += -10 + if event.key == pygame.K_s: + Player.rect.y += 10 + if event.key == pygame.K_q: + Player.angle += 1 %360 + if event.key == pygame.K_e: + Player.angle += -1 %360 + if event.key == pygame.K_2: + self.i +=1 + print(self.i) + print('pew') + +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") +def rot_center(image, angle): + """rotate an image while keeping its center and size""" + orig_rect = image.get_rect() + rot_image = pygame.transform.rotate(image, angle) + rot_rect = orig_rect.copy() + rot_rect.center = rot_image.get_rect().center + rot_image = rot_image.subsurface(rot_rect).copy() + return rot_image + + + +all_sprites_list = pygame.sprite.Group() + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics only back grond +background_image = pygame.image.load("GrassBackground.jpg").convert() +#all_sprites_list.add(background_image) + + + +clock = pygame.time.Clock() + +player = Player() +all_sprites_list.add(player) +controller = PyGameKeyboardController() +done = False + +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event(event,player) + player.update() + all_sprites_list.update() + if controller.i > 0: + bullet = Bullet(player.angle,player.rect.center[0],player.rect.center[1]) + all_sprites_list.add(bullet) + + #screen.blit(bullet.image, [bullet.x, bullet.y]) + controller.i += -1 + #player.image1 = pygame.transform.rotate(player.image, 10) + #player.image = rot_center(player.image, 1) + # Copy image to screen: + #screen.blit(player.image_dom, [player.rect.x, player.rect.y]) + + all_sprites_list.draw(screen) + pygame.display.flip() + + clock.tick(60) + +pygame.quit() diff --git a/bullet.py b/bullet.py new file mode 100644 index 00000000..e9b3b0ac --- /dev/null +++ b/bullet.py @@ -0,0 +1,176 @@ +""" + Show how to fire bullets. + + Sample Python/Pygame Programs + Simpson College Computer Science + http://programarcadegames.com/ + http://simpson.edu/computer-science/ + + Explanation video: http://youtu.be/PpdJjaiLX6A +""" +import pygame +import random + +# Define some colors +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED = (255, 0, 0) +BLUE = (0, 0, 255) + +# --- Classes + + +class Block(pygame.sprite.Sprite): + """ This class represents the block. """ + def __init__(self, color): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([20, 15]) + self.image.fill(color) + + self.rect = self.image.get_rect() + + +class Player(pygame.sprite.Sprite): + """ This class represents the Player. """ + + def __init__(self): + """ Set up the player on creation. """ + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([20, 20]) + self.image.fill(RED) + + self.rect = self.image.get_rect() + + def update(self): + """ Update the player's position. """ + # Get the current mouse position. This returns the position + # as a list of two numbers. + pos = pygame.mouse.get_pos() + + # Set the player x position to the mouse x position + self.rect.x = pos[0] + + +class Bullet(pygame.sprite.Sprite): + """ This class represents the bullet . """ + def __init__(self): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([4, 10]) + self.image.fill(BLACK) + + self.rect = self.image.get_rect() + + def update(self): + """ Move the bullet. """ + self.rect.y -= 3 + + +# --- Create the window + +# Initialize Pygame +pygame.init() + +# Set the height and width of the screen +screen_width = 700 +screen_height = 400 +screen = pygame.display.set_mode([screen_width, screen_height]) + +# --- Sprite lists + +# This is a list of every sprite. All blocks and the player block as well. +all_sprites_list = pygame.sprite.Group() + +# List of each block in the game +block_list = pygame.sprite.Group() + +# List of each bullet +bullet_list = pygame.sprite.Group() + +# --- Create the sprites + +for i in range(50): + # This represents a block + block = Block(BLUE) + + # Set a random location for the block + block.rect.x = random.randrange(screen_width) + block.rect.y = random.randrange(350) + + # Add the block to the list of objects + block_list.add(block) + all_sprites_list.add(block) + +# Create a red player block +player = Player() +all_sprites_list.add(player) + +# Loop until the user clicks the close button. +done = False + +# Used to manage how fast the screen updates +clock = pygame.time.Clock() + +score = 0 +player.rect.y = 370 + +# -------- Main Program Loop ----------- +while not done: + # --- Event Processing + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + elif event.type == pygame.MOUSEBUTTONDOWN: + # Fire a bullet if the user clicks the mouse button + bullet = Bullet() + # Set the bullet so it is where the player is + bullet.rect.x = player.rect.x + bullet.rect.y = player.rect.y + # Add the bullet to the lists + all_sprites_list.add(bullet) + bullet_list.add(bullet) + + # --- Game logic + + # Call the update() method on all the sprites + all_sprites_list.update() + + # Calculate mechanics for each bullet + for bullet in bullet_list: + + # See if it hit a block + block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) + + # For each block hit, remove the bullet and add to the score + for block in block_hit_list: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + score += 1 + print(score) + + # Remove the bullet if it flies up off the screen + if bullet.rect.y < -10: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + + # --- Draw a frame + + # Clear the screen + screen.fill(WHITE) + + # Draw all the spites + all_sprites_list.draw(screen) + + # Go ahead and update the screen with what we've drawn. + pygame.display.flip() + + # --- Limit to 20 frames per second + clock.tick(60) + +pygame.quit() diff --git a/top_down_tank-8hkMRt_fix.png b/top_down_tank-8hkMRt_fix.png new file mode 100644 index 0000000000000000000000000000000000000000..601a7bfbbb5ad266fc686c561c75ff53779a8b97 GIT binary patch literal 749 zcmV)9*@L&GMnKA{=JR?d7 zp^GI=)7Voyv|6p=So;xiMF&Sj0R;{U927WYvq*hlnfAUIqDA^`1`owOx+ey|)qk|)&fQW)vqJx712N9)@v5%;TB|11L zaClhYZBew}Uv>@8Xd^l}C~z2V@Jz>_JV#ILUDF7r%wZZqGaZ8hhkRc0(D5foZD%Sf zsI00000NkvXXu0mjfeMd$W literal 0 HcmV?d00001 From d8716297384a887d095ed52b867a0543d778b939 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 16 Mar 2018 03:45:52 -0400 Subject: [PATCH 14/17] complete --- Rote_test.py | 148 ++++++++++++++++++++++++++++++++++++--------------- Test.py | 17 +++--- 2 files changed, 115 insertions(+), 50 deletions(-) diff --git a/Rote_test.py b/Rote_test.py index 3bec68fb..74590c2a 100644 --- a/Rote_test.py +++ b/Rote_test.py @@ -2,43 +2,40 @@ from pygame.locals import * from math import * import time +import random # Define some colors WHITE = (255, 255, 255) # have no idea what it does BLACK = (0, 0, 0) # need to keep - +BLUE = (0, 0, 255) # Call this function so the Pygame library can initialize itself pygame.init() # Create an 800x600 sized screen -screen = pygame.display.set_mode([600, 361]) +screen = pygame.display.set_mode([1024,768]) clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) class Player(pygame.sprite.Sprite): # player object right now is confusing do it postion here but not being used """ Encodes the state of the paddle in the game """ - def __init__(self): + def __init__(self,filename, a, b): """ Initialize the player and position (x,y) """ super().__init__() - #self.x = 30 - #self.y = 30 + self.angle = 0 - self.old_angle = 0 - self.image = pygame.image.load("top_down_tank-8hkMRt.png").convert() #image goes here - self.image.set_colorkey(BLACK) + self.image = pygame.image.load(filename).convert() #image goes here + self.image.set_colorkey(WHITE) self.rect = self.image.get_rect() - self.rect.x = 0; - self.rect.y = 0; + self.rect.x = a; + self.rect.y = b; def update(self):# this may work idk yet """ update the state of the paddle """ - #self.rect.x += self.x - # self.rect.y += self.y - #self.image_dom = pygame.transform.rotate(self.image, self.angle) - self.image = rot_center(self.image, self.angle - self.old_angle) - self.old_angle=self.angle + + self.image_dom = rot_center(self.image, self.angle) + def __str__(self): return "Player, x=%f, y=%f" % (self.x, self.y) @@ -51,11 +48,10 @@ def __init__(self, angle, x, y): self.image = pygame.Surface([4, 10]) self.image.fill(WHITE) - #self.player = Player + self.speed = 5 - #self.x = self.player.x - #self.y = self.player.y + self.angle = angle self.rect = self.image.get_rect() @@ -67,38 +63,67 @@ def update(self): """ Move the bullet. """ self.rect.x += self.speed * cos(radians(-self.angle+3)) self.rect.y += self.speed * sin(radians(-self.angle+3)) - #screen.blit(bullet.image, [self.x, self.y]) + +class Block(pygame.sprite.Sprite): + """ This class represents the block. """ + def __init__(self, color): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([20, 15]) + self.image.fill(color) + + self.rect = self.image.get_rect() class PyGameKeyboardController(object): #works well a little jumpy maybe use vx """ Handles keyboard input for brick breaker """ def __init__(self): - #self.model = model + self.x = 0 self.y = 0 - #self.Player = Player + self.j =0 self.i =0 - def handle_event(self, event, Player): + def handle_event1(self, event, Player): """ Left and right presses modify the x velocity of the paddle """ #link for event.key https://www.pygame.org/docs/ref/key.html - if event.type != KEYDOWN: return if event.key == pygame.K_a: - Player.rect.x += -10 + Player.rect.x += -2 if event.key == pygame.K_d: - Player.rect.x += 10 + Player.rect.x += 2 if event.key == pygame.K_w: - Player.rect.y += -10 + Player.rect.y += -2 if event.key == pygame.K_s: - Player.rect.y += 10 + Player.rect.y += 2 if event.key == pygame.K_q: Player.angle += 1 %360 if event.key == pygame.K_e: Player.angle += -1 %360 if event.key == pygame.K_2: self.i +=1 - print(self.i) - print('pew') + + def handle_event2(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_j: + Player.rect.x += -2 + if event.key == pygame.K_l: + Player.rect.x += 2 + if event.key == pygame.K_i: + Player.rect.y += -2 + if event.key == pygame.K_k: + Player.rect.y += 2 + if event.key == pygame.K_u: + Player.angle += 1 %360 + if event.key == pygame.K_o: + Player.angle += -1 %360 + if event.key == pygame.K_8: + self.j +=1 + + # Before the loop, load the sounds: #click_sound = pygame.mixer.Sound("laser5.ogg") @@ -114,20 +139,34 @@ def rot_center(image, angle): all_sprites_list = pygame.sprite.Group() - +block_list = pygame.sprite.Group() +bullet_list = pygame.sprite.Group() # Set positions of graphics background_position = [0, 0] # Load and set up graphics only back grond -background_image = pygame.image.load("GrassBackground.jpg").convert() -#all_sprites_list.add(background_image) +background_image = pygame.image.load("NewBackground.jpg").convert() + +for i in range(100): + # This represents a block + block = Block(BLUE) + + # Set a random location for the block 1024,768 + block.rect.x = random.randrange(1024) + block.rect.y = random.randrange(768) + + # Add the block to the list of objects + block_list.add(block) + all_sprites_list.add(block) clock = pygame.time.Clock() -player = Player() -all_sprites_list.add(player) +score = 0 +player1 = Player("BlueTank.png", 0, 0) +player2 = Player("RedTank.png", 100, 100) +#all_sprites_list.add(player) controller = PyGameKeyboardController() done = False @@ -141,19 +180,42 @@ def rot_center(image, angle): screen.blit(background_image, background_position) - controller.handle_event(event,player) - player.update() + controller.handle_event1(event,player1) + controller.handle_event2(event,player2) + player1.update() + player2.update() all_sprites_list.update() + if controller.i > 0: - bullet = Bullet(player.angle,player.rect.center[0],player.rect.center[1]) + bullet = Bullet(player1.angle,player1.rect.center[0],player1.rect.center[1]) all_sprites_list.add(bullet) - - #screen.blit(bullet.image, [bullet.x, bullet.y]) + bullet_list.add(bullet) controller.i += -1 - #player.image1 = pygame.transform.rotate(player.image, 10) - #player.image = rot_center(player.image, 1) - # Copy image to screen: - #screen.blit(player.image_dom, [player.rect.x, player.rect.y]) + if controller.j > 0: + bullet = Bullet(player2.angle,player2.rect.center[0],player2.rect.center[1]) + all_sprites_list.add(bullet) + bullet_list.add(bullet) + controller.j += -1 + + + screen.blit(player1.image_dom, [player1.rect.x, player1.rect.y]) + screen.blit(player2.image_dom, [player2.rect.x, player2.rect.y]) + for bullet in bullet_list: + + # See if it hit a block + block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) + + # For each block hit, remove the bullet and add to the score + for block in block_hit_list: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + score += 1 + print(score) + + # Remove the bullet if it flies up off the screen + if bullet.rect.y < -10: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) all_sprites_list.draw(screen) pygame.display.flip() diff --git a/Test.py b/Test.py index 78ae70a5..a7d70a40 100644 --- a/Test.py +++ b/Test.py @@ -51,20 +51,23 @@ def __init__(self, u, d, l, r): #self.model = model self.x = 0 self.y = 0 - + self.l = self.l + self.d = self.d + self.u = self.u + self.r = self.r def handle_event(self,event): """ Left and right presses modify the x velocity of the tank """ #link for event.key https://www.pygame.org/docs/ref/key.html if event.type != KEYDOWN: return - if event.key == pygame.l: + if event.key == self.l: self.x += -10 - if event.key == pygame.r: + if event.key == self.r: self.x += 10 - if event.key == pygame.u: + if event.key == self.u: self.y += -10 - if event.key == pygame.d: + if event.key == self.d: self.y += 10 # Before the loop, load the sounds: #click_sound = pygame.mixer.Sound("laser5.ogg") @@ -78,8 +81,8 @@ def handle_event(self,event): # player_image.set_colorkey(BLACK) clock = pygame.time.Clock() -controller1 = PyGameKeyboardController(K_UP, K_DOWN, K_LEFT, K_RIGHT) -controller2 = PyGameKeyboardController(K_w, K_s, K_a, K_d) +controller1 = PyGameKeyboardController(pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT) +controller2 = PyGameKeyboardController('K_w', 'K_s', 'K_a', 'K_d') player1 = Player("BlueTank.png", 0, 0) player2 = Player("RedTank.png", 100, 100) From f1eed16f2e5eb3c0cc26b15b9623c0791a643839 Mon Sep 17 00:00:00 2001 From: rickyroze Date: Fri, 16 Mar 2018 04:22:43 -0400 Subject: [PATCH 15/17] Added pdf document and text document if you want to edit it. --- SoftdesMP4WriteUp.pdf | Bin 0 -> 57703 bytes SoftdesMP4WriteUptxt.txt | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 SoftdesMP4WriteUp.pdf create mode 100644 SoftdesMP4WriteUptxt.txt diff --git a/SoftdesMP4WriteUp.pdf b/SoftdesMP4WriteUp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..43a6b7d9d64135c5d37e5aa2447bf66bd79effa8 GIT binary patch literal 57703 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 A8UO$Q literal 0 HcmV?d00001 diff --git a/SoftdesMP4WriteUptxt.txt b/SoftdesMP4WriteUptxt.txt new file mode 100644 index 00000000..e3043058 --- /dev/null +++ b/SoftdesMP4WriteUptxt.txt @@ -0,0 +1,13 @@ +Abstract: + Alex and I made a collaborative tank game in which two players work to clear a map of blue squares. We got our idea from a mini-game within Wii Play called “tanks” and many other areal view tank games. +Results: + We mad the game as modular as possible so we could go from our “MVP” to as advanced as we want. Our “MVP” was one tank that was able to move around a screen. We then made a larger background and a second tank and also added rotation. After this, we added the capability for the tanks to fire. Finally we added randomized dots that the tanks were able to clear from the map. This is far from our MVP, but still short of our stretch goal, as the program is not always able to handle two people pressing keys at once. +Implementation: + We began by creating a window and bliting an image of equal size on to it. We next made a “Player” class that creates a sprite from an image and blits it on to the background. Within the player function is an update function that updates the position and rotation of the tank/sprite. + Our next class is “Bullet”, which creates another sprite (this time with a small rectangle), references the player’s position and current angle of rotation and sends the sprite along that angle from that position. + Next, we created a class called “Block” which generates squares at random locations around the field. We later reference this in a separate definition to create sprites that are deleted when they come into contact with our “Bullets” + Finally, we have a class called “Controller” which adds values to the player class, thus moving the player. + +Reflection: + In terms of process, we did a good job at organizing the project from the very beginning. We created a Trello and distributed tasks to ourselves. We used a Scrum-like system to show to-do, doing, and done tasks, as well as a backlog for ideas that we could ad if we had time. + Overall this worked well and we scoped our project well. it was very doable and had a lot of room to scale upward, which we did to some degree. Alex and I had some time to pair program but not as much as we anticipated. We also had a lot of work outside of class with QEA and P&M. This made it difficult to balance, especially when some assignments (usually QEA) took longer than anticipated. This gave us less time to work on the project, thus we were not able to implement all of the features that we wanted to. \ No newline at end of file From 6668550361cb6da97cb251842f055f3a83a87695 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 16 Mar 2018 12:14:18 -0400 Subject: [PATCH 16/17] push 3-16-18 --- Rote_test.py | 3 +- Tank_Cop.py | 224 ++++++++++++++++++ master.py | 2 +- .../BasicsOfPythonGame.py | 0 .../GrassBackground.jpg | Bin MiniProject4.py => test/MiniProject4.py | 0 Move.py => test/Move.py | 0 MoveWBackground.py => test/MoveWBackground.py | 0 PhotoTest.py => test/PhotoTest.py | 0 test/Rote_test.py | 224 ++++++++++++++++++ test/Test.py | 117 +++++++++ TestGame.py => test/TestGame.py | 0 bullet.py => test/bullet.py | 0 test/master.py | 92 +++++++ tank_move.py => test/tank_move.py | 0 .../top_down_tank-8hkMRt.png | Bin .../top_down_tank-8hkMRt_fix.png | Bin 17 files changed, 659 insertions(+), 3 deletions(-) create mode 100644 Tank_Cop.py rename BasicsOfPythonGame.py => test/BasicsOfPythonGame.py (100%) rename GrassBackground.jpg => test/GrassBackground.jpg (100%) rename MiniProject4.py => test/MiniProject4.py (100%) rename Move.py => test/Move.py (100%) rename MoveWBackground.py => test/MoveWBackground.py (100%) rename PhotoTest.py => test/PhotoTest.py (100%) create mode 100644 test/Rote_test.py create mode 100644 test/Test.py rename TestGame.py => test/TestGame.py (100%) rename bullet.py => test/bullet.py (100%) create mode 100644 test/master.py rename tank_move.py => test/tank_move.py (100%) rename top_down_tank-8hkMRt.png => test/top_down_tank-8hkMRt.png (100%) rename top_down_tank-8hkMRt_fix.png => test/top_down_tank-8hkMRt_fix.png (100%) diff --git a/Rote_test.py b/Rote_test.py index 74590c2a..918fb619 100644 --- a/Rote_test.py +++ b/Rote_test.py @@ -125,8 +125,7 @@ def handle_event2(self, event, Player): -# Before the loop, load the sounds: -#click_sound = pygame.mixer.Sound("laser5.ogg") +# Fuction that rotate image on its center def rot_center(image, angle): """rotate an image while keeping its center and size""" orig_rect = image.get_rect() diff --git a/Tank_Cop.py b/Tank_Cop.py new file mode 100644 index 00000000..918fb619 --- /dev/null +++ b/Tank_Cop.py @@ -0,0 +1,224 @@ +import pygame +from pygame.locals import * +from math import * +import time +import random + +# Define some colors +WHITE = (255, 255, 255) # have no idea what it does +BLACK = (0, 0, 0) # need to keep +BLUE = (0, 0, 255) +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([1024,768]) + +clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) + +class Player(pygame.sprite.Sprite): # player object right now is confusing do it postion here but not being used + """ Encodes the state of the paddle in the game """ + def __init__(self,filename, a, b): + """ Initialize the player and position (x,y) """ + super().__init__() + + + self.angle = 0 + self.image = pygame.image.load(filename).convert() #image goes here + self.image.set_colorkey(WHITE) + + self.rect = self.image.get_rect() + self.rect.x = a; + self.rect.y = b; + + def update(self):# this may work idk yet + """ update the state of the paddle """ + + self.image_dom = rot_center(self.image, self.angle) + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class Bullet(pygame.sprite.Sprite): + """ This class represents the bullet . """ + def __init__(self, angle, x, y): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([4, 10]) + self.image.fill(WHITE) + + + + self.speed = 5 + + self.angle = angle + + self.rect = self.image.get_rect() + + self.rect.x = x + self.rect.y = y + + def update(self): + """ Move the bullet. """ + self.rect.x += self.speed * cos(radians(-self.angle+3)) + self.rect.y += self.speed * sin(radians(-self.angle+3)) + +class Block(pygame.sprite.Sprite): + """ This class represents the block. """ + def __init__(self, color): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([20, 15]) + self.image.fill(color) + + self.rect = self.image.get_rect() + +class PyGameKeyboardController(object): #works well a little jumpy maybe use vx + """ Handles keyboard input for brick breaker """ + def __init__(self): + + self.x = 0 + self.y = 0 + self.j =0 + self.i =0 + def handle_event1(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_a: + Player.rect.x += -2 + if event.key == pygame.K_d: + Player.rect.x += 2 + if event.key == pygame.K_w: + Player.rect.y += -2 + if event.key == pygame.K_s: + Player.rect.y += 2 + if event.key == pygame.K_q: + Player.angle += 1 %360 + if event.key == pygame.K_e: + Player.angle += -1 %360 + if event.key == pygame.K_2: + self.i +=1 + + def handle_event2(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_j: + Player.rect.x += -2 + if event.key == pygame.K_l: + Player.rect.x += 2 + if event.key == pygame.K_i: + Player.rect.y += -2 + if event.key == pygame.K_k: + Player.rect.y += 2 + if event.key == pygame.K_u: + Player.angle += 1 %360 + if event.key == pygame.K_o: + Player.angle += -1 %360 + if event.key == pygame.K_8: + self.j +=1 + + + +# Fuction that rotate image on its center +def rot_center(image, angle): + """rotate an image while keeping its center and size""" + orig_rect = image.get_rect() + rot_image = pygame.transform.rotate(image, angle) + rot_rect = orig_rect.copy() + rot_rect.center = rot_image.get_rect().center + rot_image = rot_image.subsurface(rot_rect).copy() + return rot_image + + + +all_sprites_list = pygame.sprite.Group() +block_list = pygame.sprite.Group() +bullet_list = pygame.sprite.Group() +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics only back grond +background_image = pygame.image.load("NewBackground.jpg").convert() + +for i in range(100): + # This represents a block + block = Block(BLUE) + + # Set a random location for the block 1024,768 + block.rect.x = random.randrange(1024) + block.rect.y = random.randrange(768) + + # Add the block to the list of objects + block_list.add(block) + all_sprites_list.add(block) + + + +clock = pygame.time.Clock() + +score = 0 +player1 = Player("BlueTank.png", 0, 0) +player2 = Player("RedTank.png", 100, 100) +#all_sprites_list.add(player) +controller = PyGameKeyboardController() +done = False + +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event1(event,player1) + controller.handle_event2(event,player2) + player1.update() + player2.update() + all_sprites_list.update() + + if controller.i > 0: + bullet = Bullet(player1.angle,player1.rect.center[0],player1.rect.center[1]) + all_sprites_list.add(bullet) + bullet_list.add(bullet) + controller.i += -1 + if controller.j > 0: + bullet = Bullet(player2.angle,player2.rect.center[0],player2.rect.center[1]) + all_sprites_list.add(bullet) + bullet_list.add(bullet) + controller.j += -1 + + + screen.blit(player1.image_dom, [player1.rect.x, player1.rect.y]) + screen.blit(player2.image_dom, [player2.rect.x, player2.rect.y]) + for bullet in bullet_list: + + # See if it hit a block + block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) + + # For each block hit, remove the bullet and add to the score + for block in block_hit_list: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + score += 1 + print(score) + + # Remove the bullet if it flies up off the screen + if bullet.rect.y < -10: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + + all_sprites_list.draw(screen) + pygame.display.flip() + + clock.tick(60) + +pygame.quit() diff --git a/master.py b/master.py index 1dd271fb..b7a181d4 100644 --- a/master.py +++ b/master.py @@ -71,7 +71,7 @@ def handle_event(self,event): for event in pygame.event.get(): if event.type == pygame.QUIT: done = True - + # Copy image to screen: screen.blit(background_image, background_position) diff --git a/BasicsOfPythonGame.py b/test/BasicsOfPythonGame.py similarity index 100% rename from BasicsOfPythonGame.py rename to test/BasicsOfPythonGame.py diff --git a/GrassBackground.jpg b/test/GrassBackground.jpg similarity index 100% rename from GrassBackground.jpg rename to test/GrassBackground.jpg diff --git a/MiniProject4.py b/test/MiniProject4.py similarity index 100% rename from MiniProject4.py rename to test/MiniProject4.py diff --git a/Move.py b/test/Move.py similarity index 100% rename from Move.py rename to test/Move.py diff --git a/MoveWBackground.py b/test/MoveWBackground.py similarity index 100% rename from MoveWBackground.py rename to test/MoveWBackground.py diff --git a/PhotoTest.py b/test/PhotoTest.py similarity index 100% rename from PhotoTest.py rename to test/PhotoTest.py diff --git a/test/Rote_test.py b/test/Rote_test.py new file mode 100644 index 00000000..918fb619 --- /dev/null +++ b/test/Rote_test.py @@ -0,0 +1,224 @@ +import pygame +from pygame.locals import * +from math import * +import time +import random + +# Define some colors +WHITE = (255, 255, 255) # have no idea what it does +BLACK = (0, 0, 0) # need to keep +BLUE = (0, 0, 255) +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([1024,768]) + +clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) + +class Player(pygame.sprite.Sprite): # player object right now is confusing do it postion here but not being used + """ Encodes the state of the paddle in the game """ + def __init__(self,filename, a, b): + """ Initialize the player and position (x,y) """ + super().__init__() + + + self.angle = 0 + self.image = pygame.image.load(filename).convert() #image goes here + self.image.set_colorkey(WHITE) + + self.rect = self.image.get_rect() + self.rect.x = a; + self.rect.y = b; + + def update(self):# this may work idk yet + """ update the state of the paddle """ + + self.image_dom = rot_center(self.image, self.angle) + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class Bullet(pygame.sprite.Sprite): + """ This class represents the bullet . """ + def __init__(self, angle, x, y): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([4, 10]) + self.image.fill(WHITE) + + + + self.speed = 5 + + self.angle = angle + + self.rect = self.image.get_rect() + + self.rect.x = x + self.rect.y = y + + def update(self): + """ Move the bullet. """ + self.rect.x += self.speed * cos(radians(-self.angle+3)) + self.rect.y += self.speed * sin(radians(-self.angle+3)) + +class Block(pygame.sprite.Sprite): + """ This class represents the block. """ + def __init__(self, color): + # Call the parent class (Sprite) constructor + super().__init__() + + self.image = pygame.Surface([20, 15]) + self.image.fill(color) + + self.rect = self.image.get_rect() + +class PyGameKeyboardController(object): #works well a little jumpy maybe use vx + """ Handles keyboard input for brick breaker """ + def __init__(self): + + self.x = 0 + self.y = 0 + self.j =0 + self.i =0 + def handle_event1(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_a: + Player.rect.x += -2 + if event.key == pygame.K_d: + Player.rect.x += 2 + if event.key == pygame.K_w: + Player.rect.y += -2 + if event.key == pygame.K_s: + Player.rect.y += 2 + if event.key == pygame.K_q: + Player.angle += 1 %360 + if event.key == pygame.K_e: + Player.angle += -1 %360 + if event.key == pygame.K_2: + self.i +=1 + + def handle_event2(self, event, Player): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + if event.type != KEYDOWN: + return + if event.key == pygame.K_j: + Player.rect.x += -2 + if event.key == pygame.K_l: + Player.rect.x += 2 + if event.key == pygame.K_i: + Player.rect.y += -2 + if event.key == pygame.K_k: + Player.rect.y += 2 + if event.key == pygame.K_u: + Player.angle += 1 %360 + if event.key == pygame.K_o: + Player.angle += -1 %360 + if event.key == pygame.K_8: + self.j +=1 + + + +# Fuction that rotate image on its center +def rot_center(image, angle): + """rotate an image while keeping its center and size""" + orig_rect = image.get_rect() + rot_image = pygame.transform.rotate(image, angle) + rot_rect = orig_rect.copy() + rot_rect.center = rot_image.get_rect().center + rot_image = rot_image.subsurface(rot_rect).copy() + return rot_image + + + +all_sprites_list = pygame.sprite.Group() +block_list = pygame.sprite.Group() +bullet_list = pygame.sprite.Group() +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics only back grond +background_image = pygame.image.load("NewBackground.jpg").convert() + +for i in range(100): + # This represents a block + block = Block(BLUE) + + # Set a random location for the block 1024,768 + block.rect.x = random.randrange(1024) + block.rect.y = random.randrange(768) + + # Add the block to the list of objects + block_list.add(block) + all_sprites_list.add(block) + + + +clock = pygame.time.Clock() + +score = 0 +player1 = Player("BlueTank.png", 0, 0) +player2 = Player("RedTank.png", 100, 100) +#all_sprites_list.add(player) +controller = PyGameKeyboardController() +done = False + +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event1(event,player1) + controller.handle_event2(event,player2) + player1.update() + player2.update() + all_sprites_list.update() + + if controller.i > 0: + bullet = Bullet(player1.angle,player1.rect.center[0],player1.rect.center[1]) + all_sprites_list.add(bullet) + bullet_list.add(bullet) + controller.i += -1 + if controller.j > 0: + bullet = Bullet(player2.angle,player2.rect.center[0],player2.rect.center[1]) + all_sprites_list.add(bullet) + bullet_list.add(bullet) + controller.j += -1 + + + screen.blit(player1.image_dom, [player1.rect.x, player1.rect.y]) + screen.blit(player2.image_dom, [player2.rect.x, player2.rect.y]) + for bullet in bullet_list: + + # See if it hit a block + block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) + + # For each block hit, remove the bullet and add to the score + for block in block_hit_list: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + score += 1 + print(score) + + # Remove the bullet if it flies up off the screen + if bullet.rect.y < -10: + bullet_list.remove(bullet) + all_sprites_list.remove(bullet) + + all_sprites_list.draw(screen) + pygame.display.flip() + + clock.tick(60) + +pygame.quit() diff --git a/test/Test.py b/test/Test.py new file mode 100644 index 00000000..a7d70a40 --- /dev/null +++ b/test/Test.py @@ -0,0 +1,117 @@ +""" + Sample Python/Pygame Programs + Simpson College Computer Science + http://programarcadegames.com/ + http://simpson.edu/computer-science/ + + Explanation video: http://youtu.be/4YqIKncMJNs + Explanation video: http://youtu.be/ONAK8VZIcI4 + Explanation video: http://youtu.be/_6c4o41BIms +""" + +import pygame +from pygame.locals import * +import time + +# Define some colors +#WHITE = (255, 255, 255) +BLACK = (0, 0, 0) + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 1024x768 sized screen +screen = pygame.display.set_mode([1024, 768]) + +# This sets the name of the window +# pygame.display.set_caption('CMSC 150 is cool') + +clock = pygame.time.Clock() + +class Player(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, filename, x, y): + """ Initialize the player and position (x,y) """ + + self.x = x + self.y = y + self.player_image = pygame.image.load(filename).convert() + self.player_image.set_colorkey(BLACK) + def update(self): + """ update the state of the paddle """ + self.x += self.x + self.y += self.y + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class PyGameKeyboardController(object): + """ Handles keyboard input tanks """ + def __init__(self, u, d, l, r): + #self.model = model + self.x = 0 + self.y = 0 + self.l = self.l + self.d = self.d + self.u = self.u + self.r = self.r + def handle_event(self,event): + """ Left and right presses modify the x velocity of the tank """ + #link for event.key https://www.pygame.org/docs/ref/key.html + + if event.type != KEYDOWN: + return + if event.key == self.l: + self.x += -10 + if event.key == self.r: + self.x += 10 + if event.key == self.u: + self.y += -10 + if event.key == self.d: + self.y += 10 +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics. +background_image = pygame.image.load("NewBackground.jpg").convert() +# player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() +# player_image.set_colorkey(BLACK) + +clock = pygame.time.Clock() +controller1 = PyGameKeyboardController(pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT) +controller2 = PyGameKeyboardController('K_w', 'K_s', 'K_a', 'K_d') + +player1 = Player("BlueTank.png", 0, 0) +player2 = Player("RedTank.png", 100, 100) +done = False +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + # elif event.type == pygame.MOUSEBUTTONDOWN: + # click_sound.play() + #if event.type != KEYDOWN: + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller1.handle_event(event) + controller2.handle_event(event) + player1.update() + player2.update() + + + + # Copy image to screen: + screen.blit(player1.player_image, [controller1.x, controller1.y]) + screen.blit(player2.player_image, [controller2.x, controller2.y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() diff --git a/TestGame.py b/test/TestGame.py similarity index 100% rename from TestGame.py rename to test/TestGame.py diff --git a/bullet.py b/test/bullet.py similarity index 100% rename from bullet.py rename to test/bullet.py diff --git a/test/master.py b/test/master.py new file mode 100644 index 00000000..1dd271fb --- /dev/null +++ b/test/master.py @@ -0,0 +1,92 @@ +import pygame +from pygame.locals import * +import time + +# Define some colors +WHITE = (255, 255, 255) # have no idea what it does +BLACK = (0, 0, 0) # need to keep + +# Call this function so the Pygame library can initialize itself +pygame.init() + +# Create an 800x600 sized screen +screen = pygame.display.set_mode([600, 361]) + +clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) + +class Player(object): # player object right now is confusing do it postion here but not being used + """ Encodes the state of the paddle in the game """ + def __init__(self): + """ Initialize the player and position (x,y) """ + + self.x = 0 + self.y = 0 + self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() #image goes here + self.player_image.set_colorkey(BLACK) + + def update(self):# this may work idk yet + """ update the state of the paddle """ + self.x += self.x + self.y += self.y + + def __str__(self): + return "Player, x=%f, y=%f" % (self.x, self.y) + +class PyGameKeyboardController(object): #works well a little jumpy maybe use vx + """ Handles keyboard input for brick breaker """ + def __init__(self): + #self.model = model + self.x = 0 + self.y = 0 + + def handle_event(self,event): + """ Left and right presses modify the x velocity of the paddle """ + #link for event.key https://www.pygame.org/docs/ref/key.html + + if event.type != KEYDOWN: + return + if event.key == pygame.K_LEFT: + self.x += -10 + if event.key == pygame.K_RIGHT: + self.x += 10 + if event.key == pygame.K_UP: + self.y += -10 + if event.key == pygame.K_DOWN: + self.y += 10 +# Before the loop, load the sounds: +#click_sound = pygame.mixer.Sound("laser5.ogg") + +# Set positions of graphics +background_position = [0, 0] + +# Load and set up graphics only back grond +background_image = pygame.image.load("GrassBackground.jpg").convert() + + +clock = pygame.time.Clock() +controller = PyGameKeyboardController() +player = Player() +done = False +while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + + # Copy image to screen: + screen.blit(background_image, background_position) + + + controller.handle_event(event) + player.update() + + + + # Copy image to screen: + screen.blit(player.player_image, [controller.x, controller.y]) + + pygame.display.flip() + + clock.tick(60) + +pygame.quit() diff --git a/tank_move.py b/test/tank_move.py similarity index 100% rename from tank_move.py rename to test/tank_move.py diff --git a/top_down_tank-8hkMRt.png b/test/top_down_tank-8hkMRt.png similarity index 100% rename from top_down_tank-8hkMRt.png rename to test/top_down_tank-8hkMRt.png diff --git a/top_down_tank-8hkMRt_fix.png b/test/top_down_tank-8hkMRt_fix.png similarity index 100% rename from top_down_tank-8hkMRt_fix.png rename to test/top_down_tank-8hkMRt_fix.png From 4ae1c7ae7d7c224215e151bbb75a429d4c3e1059 Mon Sep 17 00:00:00 2001 From: Alex Bahner Date: Fri, 16 Mar 2018 12:18:01 -0400 Subject: [PATCH 17/17] repush --- Rote_test.py | 224 --------------------------------------------------- Test.py | 117 --------------------------- master.py | 92 --------------------- 3 files changed, 433 deletions(-) delete mode 100644 Rote_test.py delete mode 100644 Test.py delete mode 100644 master.py diff --git a/Rote_test.py b/Rote_test.py deleted file mode 100644 index 918fb619..00000000 --- a/Rote_test.py +++ /dev/null @@ -1,224 +0,0 @@ -import pygame -from pygame.locals import * -from math import * -import time -import random - -# Define some colors -WHITE = (255, 255, 255) # have no idea what it does -BLACK = (0, 0, 0) # need to keep -BLUE = (0, 0, 255) -# Call this function so the Pygame library can initialize itself -pygame.init() - -# Create an 800x600 sized screen -screen = pygame.display.set_mode([1024,768]) - -clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) - -class Player(pygame.sprite.Sprite): # player object right now is confusing do it postion here but not being used - """ Encodes the state of the paddle in the game """ - def __init__(self,filename, a, b): - """ Initialize the player and position (x,y) """ - super().__init__() - - - self.angle = 0 - self.image = pygame.image.load(filename).convert() #image goes here - self.image.set_colorkey(WHITE) - - self.rect = self.image.get_rect() - self.rect.x = a; - self.rect.y = b; - - def update(self):# this may work idk yet - """ update the state of the paddle """ - - self.image_dom = rot_center(self.image, self.angle) - - def __str__(self): - return "Player, x=%f, y=%f" % (self.x, self.y) - -class Bullet(pygame.sprite.Sprite): - """ This class represents the bullet . """ - def __init__(self, angle, x, y): - # Call the parent class (Sprite) constructor - super().__init__() - - self.image = pygame.Surface([4, 10]) - self.image.fill(WHITE) - - - - self.speed = 5 - - self.angle = angle - - self.rect = self.image.get_rect() - - self.rect.x = x - self.rect.y = y - - def update(self): - """ Move the bullet. """ - self.rect.x += self.speed * cos(radians(-self.angle+3)) - self.rect.y += self.speed * sin(radians(-self.angle+3)) - -class Block(pygame.sprite.Sprite): - """ This class represents the block. """ - def __init__(self, color): - # Call the parent class (Sprite) constructor - super().__init__() - - self.image = pygame.Surface([20, 15]) - self.image.fill(color) - - self.rect = self.image.get_rect() - -class PyGameKeyboardController(object): #works well a little jumpy maybe use vx - """ Handles keyboard input for brick breaker """ - def __init__(self): - - self.x = 0 - self.y = 0 - self.j =0 - self.i =0 - def handle_event1(self, event, Player): - """ Left and right presses modify the x velocity of the paddle """ - #link for event.key https://www.pygame.org/docs/ref/key.html - if event.type != KEYDOWN: - return - if event.key == pygame.K_a: - Player.rect.x += -2 - if event.key == pygame.K_d: - Player.rect.x += 2 - if event.key == pygame.K_w: - Player.rect.y += -2 - if event.key == pygame.K_s: - Player.rect.y += 2 - if event.key == pygame.K_q: - Player.angle += 1 %360 - if event.key == pygame.K_e: - Player.angle += -1 %360 - if event.key == pygame.K_2: - self.i +=1 - - def handle_event2(self, event, Player): - """ Left and right presses modify the x velocity of the paddle """ - #link for event.key https://www.pygame.org/docs/ref/key.html - if event.type != KEYDOWN: - return - if event.key == pygame.K_j: - Player.rect.x += -2 - if event.key == pygame.K_l: - Player.rect.x += 2 - if event.key == pygame.K_i: - Player.rect.y += -2 - if event.key == pygame.K_k: - Player.rect.y += 2 - if event.key == pygame.K_u: - Player.angle += 1 %360 - if event.key == pygame.K_o: - Player.angle += -1 %360 - if event.key == pygame.K_8: - self.j +=1 - - - -# Fuction that rotate image on its center -def rot_center(image, angle): - """rotate an image while keeping its center and size""" - orig_rect = image.get_rect() - rot_image = pygame.transform.rotate(image, angle) - rot_rect = orig_rect.copy() - rot_rect.center = rot_image.get_rect().center - rot_image = rot_image.subsurface(rot_rect).copy() - return rot_image - - - -all_sprites_list = pygame.sprite.Group() -block_list = pygame.sprite.Group() -bullet_list = pygame.sprite.Group() -# Set positions of graphics -background_position = [0, 0] - -# Load and set up graphics only back grond -background_image = pygame.image.load("NewBackground.jpg").convert() - -for i in range(100): - # This represents a block - block = Block(BLUE) - - # Set a random location for the block 1024,768 - block.rect.x = random.randrange(1024) - block.rect.y = random.randrange(768) - - # Add the block to the list of objects - block_list.add(block) - all_sprites_list.add(block) - - - -clock = pygame.time.Clock() - -score = 0 -player1 = Player("BlueTank.png", 0, 0) -player2 = Player("RedTank.png", 100, 100) -#all_sprites_list.add(player) -controller = PyGameKeyboardController() -done = False - -while not done: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - done = True - - - # Copy image to screen: - screen.blit(background_image, background_position) - - - controller.handle_event1(event,player1) - controller.handle_event2(event,player2) - player1.update() - player2.update() - all_sprites_list.update() - - if controller.i > 0: - bullet = Bullet(player1.angle,player1.rect.center[0],player1.rect.center[1]) - all_sprites_list.add(bullet) - bullet_list.add(bullet) - controller.i += -1 - if controller.j > 0: - bullet = Bullet(player2.angle,player2.rect.center[0],player2.rect.center[1]) - all_sprites_list.add(bullet) - bullet_list.add(bullet) - controller.j += -1 - - - screen.blit(player1.image_dom, [player1.rect.x, player1.rect.y]) - screen.blit(player2.image_dom, [player2.rect.x, player2.rect.y]) - for bullet in bullet_list: - - # See if it hit a block - block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) - - # For each block hit, remove the bullet and add to the score - for block in block_hit_list: - bullet_list.remove(bullet) - all_sprites_list.remove(bullet) - score += 1 - print(score) - - # Remove the bullet if it flies up off the screen - if bullet.rect.y < -10: - bullet_list.remove(bullet) - all_sprites_list.remove(bullet) - - all_sprites_list.draw(screen) - pygame.display.flip() - - clock.tick(60) - -pygame.quit() diff --git a/Test.py b/Test.py deleted file mode 100644 index a7d70a40..00000000 --- a/Test.py +++ /dev/null @@ -1,117 +0,0 @@ -""" - Sample Python/Pygame Programs - Simpson College Computer Science - http://programarcadegames.com/ - http://simpson.edu/computer-science/ - - Explanation video: http://youtu.be/4YqIKncMJNs - Explanation video: http://youtu.be/ONAK8VZIcI4 - Explanation video: http://youtu.be/_6c4o41BIms -""" - -import pygame -from pygame.locals import * -import time - -# Define some colors -#WHITE = (255, 255, 255) -BLACK = (0, 0, 0) - -# Call this function so the Pygame library can initialize itself -pygame.init() - -# Create an 1024x768 sized screen -screen = pygame.display.set_mode([1024, 768]) - -# This sets the name of the window -# pygame.display.set_caption('CMSC 150 is cool') - -clock = pygame.time.Clock() - -class Player(object): - """ Encodes the state of the paddle in the game """ - def __init__(self, filename, x, y): - """ Initialize the player and position (x,y) """ - - self.x = x - self.y = y - self.player_image = pygame.image.load(filename).convert() - self.player_image.set_colorkey(BLACK) - def update(self): - """ update the state of the paddle """ - self.x += self.x - self.y += self.y - - def __str__(self): - return "Player, x=%f, y=%f" % (self.x, self.y) - -class PyGameKeyboardController(object): - """ Handles keyboard input tanks """ - def __init__(self, u, d, l, r): - #self.model = model - self.x = 0 - self.y = 0 - self.l = self.l - self.d = self.d - self.u = self.u - self.r = self.r - def handle_event(self,event): - """ Left and right presses modify the x velocity of the tank """ - #link for event.key https://www.pygame.org/docs/ref/key.html - - if event.type != KEYDOWN: - return - if event.key == self.l: - self.x += -10 - if event.key == self.r: - self.x += 10 - if event.key == self.u: - self.y += -10 - if event.key == self.d: - self.y += 10 -# Before the loop, load the sounds: -#click_sound = pygame.mixer.Sound("laser5.ogg") - -# Set positions of graphics -background_position = [0, 0] - -# Load and set up graphics. -background_image = pygame.image.load("NewBackground.jpg").convert() -# player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() -# player_image.set_colorkey(BLACK) - -clock = pygame.time.Clock() -controller1 = PyGameKeyboardController(pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT) -controller2 = PyGameKeyboardController('K_w', 'K_s', 'K_a', 'K_d') - -player1 = Player("BlueTank.png", 0, 0) -player2 = Player("RedTank.png", 100, 100) -done = False -while not done: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - done = True - # elif event.type == pygame.MOUSEBUTTONDOWN: - # click_sound.play() - #if event.type != KEYDOWN: - - # Copy image to screen: - screen.blit(background_image, background_position) - - - controller1.handle_event(event) - controller2.handle_event(event) - player1.update() - player2.update() - - - - # Copy image to screen: - screen.blit(player1.player_image, [controller1.x, controller1.y]) - screen.blit(player2.player_image, [controller2.x, controller2.y]) - - pygame.display.flip() - - clock.tick(60) - -pygame.quit() diff --git a/master.py b/master.py deleted file mode 100644 index b7a181d4..00000000 --- a/master.py +++ /dev/null @@ -1,92 +0,0 @@ -import pygame -from pygame.locals import * -import time - -# Define some colors -WHITE = (255, 255, 255) # have no idea what it does -BLACK = (0, 0, 0) # need to keep - -# Call this function so the Pygame library can initialize itself -pygame.init() - -# Create an 800x600 sized screen -screen = pygame.display.set_mode([600, 361]) - -clock = pygame.time.Clock() # I sure this controls the time the game (how faster the puase is at the bottom) - -class Player(object): # player object right now is confusing do it postion here but not being used - """ Encodes the state of the paddle in the game """ - def __init__(self): - """ Initialize the player and position (x,y) """ - - self.x = 0 - self.y = 0 - self.player_image = pygame.image.load("top_down_tank-8hkMRt.png").convert() #image goes here - self.player_image.set_colorkey(BLACK) - - def update(self):# this may work idk yet - """ update the state of the paddle """ - self.x += self.x - self.y += self.y - - def __str__(self): - return "Player, x=%f, y=%f" % (self.x, self.y) - -class PyGameKeyboardController(object): #works well a little jumpy maybe use vx - """ Handles keyboard input for brick breaker """ - def __init__(self): - #self.model = model - self.x = 0 - self.y = 0 - - def handle_event(self,event): - """ Left and right presses modify the x velocity of the paddle """ - #link for event.key https://www.pygame.org/docs/ref/key.html - - if event.type != KEYDOWN: - return - if event.key == pygame.K_LEFT: - self.x += -10 - if event.key == pygame.K_RIGHT: - self.x += 10 - if event.key == pygame.K_UP: - self.y += -10 - if event.key == pygame.K_DOWN: - self.y += 10 -# Before the loop, load the sounds: -#click_sound = pygame.mixer.Sound("laser5.ogg") - -# Set positions of graphics -background_position = [0, 0] - -# Load and set up graphics only back grond -background_image = pygame.image.load("GrassBackground.jpg").convert() - - -clock = pygame.time.Clock() -controller = PyGameKeyboardController() -player = Player() -done = False -while not done: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - done = True - - - # Copy image to screen: - screen.blit(background_image, background_position) - - - controller.handle_event(event) - player.update() - - - - # Copy image to screen: - screen.blit(player.player_image, [controller.x, controller.y]) - - pygame.display.flip() - - clock.tick(60) - -pygame.quit()