def get_car_image(): try: level = Af.read_file_content("saves/active_user.txt", 1)[0].split(" ")[3] except IndexError: level = 21 return Af.load_image(f"cars/{level}.png")
def tutorial(screen: Af.Surface): Af.play(change_menu_sound) position_x_tutorial = (1080 - 260) // 2 position_y_tutorial = [y for y in range(110, 600, 100)] effects_tutorial = ["controls", "save", "enemy", "level_up", "game_menu"] buttons = [ mc.Button(position_x_tutorial, y, f"menu/buttons/4/{position_y_tutorial.index(y) + 1}.png", effects_tutorial[position_y_tutorial.index(y)]) for y in position_y_tutorial[:len(effects_tutorial)] ] button_coo = { 0: (680, 90), 1: (680, 90), 2: (698, 192), 3: (685, 178), 4: (685, 178) } effects = [Af.load_image(f"menu/effects/1/{i + 1}.png") for i in range(4)] user = mc.User() user.get_active_user() user.get_texts() tutorial_menu = mc.User_Menu(screen, f"menu/interfaces/Main/tutorial.png", buttons, button_coo, effects, user) Af.write_file_content( "parameters/prev_men.txt", "game_menu") # make sure any submenu returns to Game Menu after return tutorial_menu.display_menu()
def start_page(screen: Af.Surface): start = mc.Start(screen) Af.play(start_sound) output = start.display_menu() if output: return "main_menu" return False
def change_properties(self): self.segment_number = Af.randint(5, 7) self.internal_beam_radius = 2 * self.segment_number self.external_beam_radius = Af.get_fibonacci(self.segment_number) self.frame = 0 self.segments_coo = [self.starting_point_coo] self.last_segment_direction = Af.choice([-1, 1])
def individual_is_perfect(self, individual): self.individual = individual while self.run: # terminate execution for event in pygame.event.get(): if event.type == pygame.QUIT: self.run = False if event.type == pygame.KEYDOWN: self.manage_buttons(event.key) # parts effects self.parts_list.remove_parts(self.obstacles_list.internal_list) self.parts_list.create_parts() # car movement self.car_movement_y() # collision & damage if self.car.obstacle_collision(self.obstacles_list.internal_list): self.resistance = False self.parts_list.internal_list, value = self.car.parts_collision( self.parts_list.internal_list) self.parts_collected += value # obstacles effects self.obstacles_list.remove_obstacles() self.obstacles_list.create_obstacles() # Refresh screen if self.run: self.run = self.continue_game() self.refresh_game() self.time_passed += self.clock.tick(self.frame_rate) / 990 self.update_individual() Af.stop_all_sounds() Af.play(game_over_sound) return False # if it gets here, it means it not good enough
def obstacle_collision(self, l_obstacles): for obst in l_obstacles: if self.hit_box.overlap(obst.hit_box, (self.x - obst.x + obst.adjust, self.y - obst.y + obst.adjust)): Af.play(hit_sound) return True return False
def choose_image(self): self.folder = str(Af.randint(1, 4)) if self.folder == "4": self.image = Af.load_image(f"obstacles/4/{Af.randint(1, 11)}.png") else: self.image = Af.load_image(f"obstacles/{self.folder}/1.png") self.hit_box = pygame.mask.from_surface(self.image) self.rect = self.image.get_rect()
def game_parts(screen: Af.Surface): game = gc.Mission_PARTS(screen) precision, avg_speed, parts_collected, time, max_speed = game.game_loop() results = mc.Report_Mission_Parts(screen, precision, avg_speed, max_speed, parts_collected, time) parts = results.display() Af.save_performance_parts(parts, max_speed, time) return "missions"
def exit_game(screen: Af.Surface): Af.play(exit_sound) buttons = [ mc.Button(240, 410, f"menu/buttons/3/1.png", False), mc.Button(580, 410, f"menu/buttons/3/2.png", True) ] if not mc.Exit("menu/exit/exit_game.png", screen, buttons).display_menu(): Af.terminate_execution() return "main_menu"
def add_text(screen: Af.Surface): Af.play(change_menu_sound) buttons = [ mc.Button(335, 495, "/menu/buttons/5/1.png", False), mc.Button(573, 495, "/menu/buttons/5/2.png", True) ] at = mc.Add_Text(screen, buttons) at.display_menu() return "manage_gp"
def exit_game_menu(screen: Af.Surface): Af.play(exit_sound) buttons = [ mc.Button(240, 410, f"menu/buttons/3/1.png", False), mc.Button(580, 410, f"menu/buttons/3/2.png", True) ] if not mc.Exit("menu/exit/exit_menu.png", screen, buttons).display_menu(): Af.erase_active_user_data() return "main_menu" return "game_menu"
def mutate_value(value, mutation_chance=M_C): if Af.random() > mutation_chance: # invert value's signal value *= Af.random_choice([-1, 1]) if Af.random() > mutation_chance: # increase or decrease value value += Af.random_choice( [-1, 1]) * (Af.random() / Af.random_choice([1000, 100, 10])) if Af.random() > M_C: return Af.random_choice( [-1, 1]) * (Af.random() / Af.random_choice([100, 10])) return value
def set_up_texts(self, first=False): self.text_name = Af.choice(Af.get_text_names())[:-4] # chooses random text from existing texts self.text_to_write_image = Af.load_image(f"texts/{self.text_name}.png") # loads the text's image lines = Af.read_file_content(f"texts/{self.text_name}.txt") # loads the text's content self.text_to_write = [line.split(" ") for line in lines[1:]] # sets the text in proper format self.screen.blit(self.text_to_write_image, (280, 320)) image = Af.get_text_images("") # turns written text into images to display self.written_text_images = [image, image, image, image, image, image, image, image] self.written_text = [[""]] self.line = 0 # sets current line to 0 (beginning) self.max_lines = int(lines[0]) # gets the number of lines that the chosen text has
def activate_fire(self, fire_type): if self.last_fire != fire_type: self.last_fire = fire_type self.fire_image_time = 0 if self.fire_image_time < 1: self.fire_image_time += 1 if fire_type: Af.play(fire_sound) self.fire_image = Af.load_image("cars/car effects/nitro/blue.png") else: self.fire_image = Af.load_image("cars/car effects/nitro/red.png")
def game_ai(screen: Af.Surface): game = gc.Mission_AI(screen) precision, speed, parts_collected, resistance, time, finished = game.game_loop( ) results = mc.Report_Mission_AI(screen, precision, speed, parts_collected, resistance, time, finished) go_to_next_level, parts = results.display() Af.save_performance_ai(go_to_next_level, parts, speed) if Af.get_user_level() == 13 and not Af.user_is_a_winner(): return "winner" return "game_menu"
def add_segment(self, car_x, car_y): if self.frame == self.segment_number: # last segment is always the car's position self.segments_coo.append((car_x, car_y)) return None medium_segment_length = (car_x - self.segments_coo[0][0] ) // self.segment_number # (Xf-Xi)/ n segment_x = self.segments_coo[-1][0] + Af.randint( int(medium_segment_length * 0.75), medium_segment_length) segment_y = self.segments_coo[-1][1] + Af.randint( 10, 70) * self.last_segment_direction self.last_segment_direction *= -1 # invert next segment direction self.segments_coo.append((segment_x, segment_y))
def change_password(screen: Af.Surface): Af.play(change_menu_sound) buttons = [ mc.Button(335, 210, "/menu/buttons/5/0.png", None), mc.Button(335, 356, "/menu/buttons/5/0.png", None), mc.Button(335, 495, "/menu/buttons/9/1.png", False), mc.Button(573, 495, "/menu/buttons/9/2.png", True) ] cma = mc.Create_Modify_Account("menu/interfaces/Main/change password.png", screen, buttons, True) effect = cma.display_menu() if effect == "change_password": return effect return "manage_us"
def parts_collision(self, l_parts): value = 0 new_parts = [] for part in l_parts: if part.x + 44 >= self.rect[ 0] and part.x <= self.rect[0] + self.rect[2]: if part.y + 24 >= self.rect[ 1] and part.y <= self.rect[1] + self.rect[3]: value += part.value Af.play(part_sound) continue else: new_parts.append(part) else: new_parts.append(part) return new_parts, value
def __init__(self, screen, mode=False): self.screen = screen self.speed_meter_image = Af.load_image("HUD/meter/7.png") self.precision_meter_image = Af.load_image("HUD/meter/7.png") self.background = Af.load_image("HUD/HUD_background.png") self.speed = 0 self.precision = 0 self.energy = 0 self.resistance = 0 self.parts = 0 self.mode = mode if mode: self.time = "infinite" else: self.time = 60 self.set_up_HUD()
def draw(self, screen, car_x, car_y): if self.frame == 0: Af.play(self.space_time_hit_sound) if car_x > Af.CAR_STE_MIN_DAMAGE_DISTANCE: # lightning should not hit car if car is too far car_x = Af.CAR_STE_MIN_DAMAGE_DISTANCE car_y += 25 # adjust y coordinate to match car center car_x += 25 # adjust y coordinate to match car center self.frame += 1 self.add_segment(car_x, car_y) # create a new segment of the lightning self.draw_segments(screen) # draw all segments if self.frame == self.segment_number: # lightning has been fully drawn self.change_properties() return False return True
def game_menu(screen: Af.Surface): Af.play(change_menu_sound) y_coo = [y for y in range(107, 600, 80)] b_effects = ["story", "m_ai", "missions", "tutorial", "manage", "exit2"] buttons = Af.create_buttons(mc.Button, "menu/buttons/2", b_effects, y_coo) effects_coo = { 0: (687, 90), 1: (687, 90), 2: (687, 192), 3: (687, 178), 4: (687, 178), 5: (687, 178) } effects = [Af.load_image(f"menu/effects/3/{i + 1}.png") for i in range(4)] user = mc.User() user.get_active_user() user.get_texts() g_menu = mc.Game_Menu(screen, f"menu/interfaces/Main/game menu.png", buttons, effects_coo, effects, user) next_link = g_menu.display_menu() if next_link == "m_ai": mission_is_unlocked = int( Af.read_file_content(f"saves/{user.name}/next_level.txt", 1)[0]) if not mission_is_unlocked: next_link = "nx_l" Af.write_file_content( "parameters/prev_men.txt", "game_menu") # make sure any submenu returns to Game Menu after return next_link
def __init__(self): self.images = [ Af.load_image(f"Characters/Space-Time Entity/{i + 1}.png") for i in range(6) ] self.draw_lightning = False self.already_hit_target = False self.lightning = Lightning() self.index = 0
def create_new_account(screen: Af.Surface): Af.play(change_menu_sound) if len(Af.list_users()) == 7: Af.show_error_message(screen, 6) return "main_menu" buttons = [ mc.Button(335, 210, "/menu/buttons/5/0.png", None), mc.Button(335, 356, "/menu/buttons/5/0.png", None), mc.Button(335, 495, "/menu/buttons/5/1.png", False), mc.Button(573, 495, "/menu/buttons/5/2.png", True) ] ac = mc.Create_Modify_Account("menu/interfaces/Main/create account.png", screen, buttons) effect = ac.display_menu() if effect == "new": return effect elif effect: return "game_menu" return "main_menu"
def manage_buttons(self, event: pygame.event.Event): if event.key == pygame.K_KP_ENTER or event.key == pygame.K_RETURN: if self.line < 7: # prevents from adding too much lines self.written_text.append([""]) self.line += 1 self.current_word_index = 0 else: # prepare another text to write pass elif event.key == pygame.K_SPACE: # go to next line in case written words are numerically equal to words to write if len(self.written_text[self.line]) == len(self.text_to_write[self.line]): self.written_text.append([""]) self.line += 1 self.current_word_index = 0 if self.written_text[-1][-1] != "": # prevents adding new words in case current word is empty self.written_text[self.line].append("") self.current_word_index += 1 elif event.key == pygame.K_BACKSPACE: if self.written_text[-1] == [""] and len(self.written_text) != 1: # if line is empty go to previous self.written_text.pop() self.line -= 1 self.current_word_index = len(self.written_text[-1]) - 1 # prevents from going beyond deleting last word elif self.written_text[-1] == [""] and len(self.written_text) == 1: pass elif self.written_text[-1][-1] != "": # checks if a word is not empty to make sure letter can be deleted if self.last_letter_correct(): self.correct_letters -= 1 self.written_text[-1][-1] = self.written_text[-1][-1][:-1] elif self.written_text[-1][-1] == "": # pass to previous word if current is empty self.written_text[-1].pop() self.current_word_index = len(self.written_text[-1]) - 1 self.total_words -= 1 elif event.unicode != "": # verify that a character is a symbol, letter or number before writing it if self.written_text_images[self.line].get_size()[0] > 490: # checks if line is too long to fit self.written_text.append([""]) self.line += 1 self.current_word_index = 0 self.written_text[self.line][self.current_word_index] += event.unicode if self.last_letter_correct(): self.correct_letters += 1 else: Af.play(wrong_letter_sound)
def __init__(self): self.internal_list = [] self.first_parts = True self.choices = [20, 121, 240] self.y = Af.choice(self.choices) self.dist_between_parts = 5 + 44 self.min_dist_between_blocs = 100 self.max_dist_between_blocs = 200 self.min_parts = 3 self.max_parts = 7
def cross_over_layers(layers1, layers2): new_values = [] for layer1, layer2 in zip(layers1, layers2): new_layer = [] for values1, values2 in zip(layer1, layer2): if Af.random() >= 0.5: new_layer.append(values1) else: new_layer.append(values2) new_values.append(new_layer) return new_values
def create_parts(self): dist_between_blocs = Af.randint(self.min_dist_between_blocs, self.max_dist_between_blocs) type_p = self.calculate_type_part() if self.first_parts: for i in range(Af.randint(self.min_parts, self.max_parts)): self.internal_list.append( _part( space_between_obstacles[-1] + dist_between_blocs + i * self.dist_between_parts, type_p, self.y, i % 10)) self.first_parts = False return 0 if self.control_last(): for i in range(Af.randint(self.min_parts, self.max_parts)): self.internal_list.append( _part( space_between_obstacles[-1] + dist_between_blocs + i * self.dist_between_parts, type_p, self.y, i % 10)) self.y = Af.choice(self.choices) return 0
def missions(screen: Af.Surface): Af.play(change_menu_sound) y_coo = [y for y in range(107, 600, 80)] effects_game = [ "m_endless", "m_aim", "missions", "missions", "missions", "game_menu" ] buttons = Af.create_buttons(mc.Button, "menu/buttons/11", effects_game, y_coo) effects_coo = { 0: (687, 90), 1: (687, 90), 2: (687, 192), 3: (687, 178), 4: (687, 178), 5: (687, 178) } effects = [Af.load_image(f"menu/effects/3/{i + 1}.png") for i in range(4)] user = mc.User() user.get_active_user() user.get_texts() missions_menu = mc.User_Menu(screen, f"menu/interfaces/Main/missions menu.png", buttons, effects_coo, effects, user) next_link = missions_menu.display_menu() Af.write_file_content( "parameters/prev_men.txt", "game_menu") # make sure any submenu returns to Game Menu after return next_link
def mover(self): init_m, nxt = 650, 20 change = { init_m: f"/obstacles/{self.folder}/2.png", init_m - nxt: f"/obstacles/{self.folder}/3.png", init_m - nxt * 2: f"/obstacles/{self.folder}/4.png", init_m - nxt * 3: f"/obstacles/{self.folder}/5.png", init_m - nxt * 4: f"/obstacles/{self.folder}/6.png", init_m - nxt * 5: f"/obstacles/{self.folder}/7.png" } self.x -= 10 if self.x in change and self.folder != "4": self.image = Af.load_image(change[self.x])
def __init__(self, x, type_p, y, cardinality): self.type_p = type_p self.adjust = 15 self.y_middle = y + self.adjust self.y = self.y_middle + cardinality self.x = x self.value = self.type_p**2 self.image = Af.load_image(f"parts/part{self.type_p}.png") self.hit_box = pygame.mask.from_surface(self.image) self.rect = self.image.get_rect() self.length = 32 self.movement_module = 10 self.upwards = True