From eb506f7a166935df3913aabd759350a8a64fc5b2 Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Sun, 31 May 2026 22:28:40 +0200 Subject: [PATCH] yeah, some ai and enemy zombies --- levels.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++-- main.py | 2 +- sprites.png | Bin 7132 -> 7312 bytes sprites.pxo | Bin 8537 -> 8706 bytes 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/levels.py b/levels.py index d36a15e..77cfc73 100644 --- a/levels.py +++ b/levels.py @@ -6,6 +6,12 @@ zombie_dx, zombie_dy = 1, 1 zombie_x, zombie_y = 645, 214 zombie_timer = 0 holding_milk = False +zombie_hp = 20 +milkactive = False +enemy_zombies = [ + {"x": 200, "y": 200, "hp": 20, "dead": False, "dx": 1, "dy": 1, "timer": 0}, + {"x": 400, "y": 300, "hp": 20, "dead": False, "dx": -1, "dy": 1, "timer": 0}, +] def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick): # the function for our first level, ignore the unused variables here, you can use them when you edit it screen.blit(load_sprite(sheet, 0, 0, 48, 36, screen_width, screen_height), (0, 0)) # this renders a button I made in the sprites.png, its purely for visual purposes so it doesnt matter where you click rn @@ -197,7 +203,7 @@ def level4(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, level = 4.5 return level def level5(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, smalltext): # function for level 5 - global zombie_x, zombie_y, zombie_timer, zombie_dx, zombie_dy + global zombie_x, zombie_y, zombie_timer, zombie_dx, zombie_dy, zombie_hp, milkactive, milk_pos_x, milk_pos_y, holding_milk screen.blit(load_sprite(sheet, 49, 46, 48, 36, screen_width, screen_height), (0, 0)) zombie_timer += 1 if zombie_timer > 60: # change direction every ~1 sec @@ -208,4 +214,63 @@ def level5(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, zombie_y += zombie_dy zombie_x = max(0, min(zombie_x, screen_width - 96)) zombie_y = max(0, min(zombie_y, screen_height - 96)) - screen.blit(load_sprite(sheet, 27, 82, 7, 12, 56, 96), (zombie_x, zombie_y)) # ZOMBIE \ No newline at end of file + if tick <= 200: + dialog = smalltext.render("click enemies to damage them", True, (255, 255, 255)) + screen.blit(dialog, (50, 50)) + elif 800 >= tick >= 200: + dialog = smalltext.render("drag milk to dead enemies to", True, (255, 255, 255)) + dialog2 = smalltext.render("make them your own minions", True, (255, 255, 255)) + screen.blit(dialog, (50, 50)) + screen.blit(dialog2, (50, 75)) + zombie_hp_box_red = pygame.surface.Surface((60, 10), pygame.SRCALPHA) + zombie_hp_box_red.fill((255,0,0)) + screen.blit(zombie_hp_box_red, (zombie_x, zombie_y-20)) + if zombie_hp > 0: # AVOIDING ERRORS AT ALL COSTS + zombie_hp_box_green = pygame.surface.Surface((zombie_hp*3, 10), pygame.SRCALPHA) + zombie_hp_box_green.fill((0,255,0)) + screen.blit(zombie_hp_box_green, (zombie_x, zombie_y-20)) + if random.randint(tick-300, tick+300) == tick and not milkactive: + milk_pos_x, milk_pos_y = random.randint(0, screen_width), random.randint(0, screen_height) + milkactive = True + + for ez in enemy_zombies: + if not ez["dead"]: + ez["timer"] += 1 + if ez["timer"] > 60: + ez["dx"] = random.choice([-2, -1, 1, 2]) + ez["dy"] = random.choice([-2, -1, 1, 2]) + ez["timer"] = 0 + ez["x"] += ez["dx"] + ez["y"] += ez["dy"] + ez["x"] = max(0, min(ez["x"], screen_width - 96)) + ez["y"] = max(0, min(ez["y"], screen_height - 96)) + if ez["hp"] <= 0: + ez["dead"] = True + screen.blit(load_sprite(sheet, 46, 82, 7, 12, 56, 96), (ez["x"], ez["y"])) # enemy zombie + zombie1 + else: + screen.blit(load_sprite(sheet, 34, 82, 12, 12, 96, 96), (ez["x"], ez["y"])) # dead sprite + # milk revive check + if milkactive and not holding_milk and not click: + milk_rect = pygame.Rect(milk_pos_x - 20, milk_pos_y - 50, 49, 74) + dead_rect = pygame.Rect(ez["x"], ez["y"], 96, 96) + if milk_rect.colliderect(dead_rect): + ez["dead"] = False + ez["hp"] = 20 + milkactive = False + + screen.blit(load_sprite(sheet, 27, 82, 7, 12, 56, 96), (zombie_x, zombie_y)) # ZOMBIE + + if milkactive: + milk_collision = pygame.Rect(milk_pos_x - 20, milk_pos_y - 50, 49, 74) + msx, msy = pygame.mouse.get_pos() + if milk_collision.collidepoint(mouse.get_pos()): + if click: + holding_milk = True + if not click: + holding_milk = False + if holding_milk: + milk_pos_x, milk_pos_y = msx, msy + screen.blit(load_sprite(sheet, 20, 82, 7, 12, 49, 74), (milk_pos_x - 20, milk_pos_y - 50)) # MILK CARTON + + return level \ No newline at end of file diff --git a/main.py b/main.py index ebfbcef..279a7f6 100644 --- a/main.py +++ b/main.py @@ -30,7 +30,7 @@ def main(fps=window_fps): # the main function if event.key == pygame.K_ESCAPE: # what happens when you press escape running = False # poof if event.key == pygame.K_k: - level = 2.5 + level = 4.5 if event.type == pygame.MOUSEBUTTONDOWN: # what happens when you press down a mouse button click = True # sets the click variable to True so level function in levels.py can see print(pygame.mouse.get_pos()) # prints out where the mouse is during the click for debugging purposes diff --git a/sprites.png b/sprites.png index 8057517b8446d2ec3671abcaa4b1622afd8b0668..e1ace432b68e5989037553a1a7cb6ad571ff1096 100644 GIT binary patch delta 3504 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 BW4-_Y delta 3557 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 Z80T9qPE%nveHmUT>v3Vvuv^Ml{2lp|g~R{=