diff --git a/main.py b/main.py index 0b04ece..840dfae 100644 --- a/main.py +++ b/main.py @@ -39,9 +39,11 @@ def genRooms(WIDTH, HEIGHT, type:str): def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)] - mobs=[Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 125, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))] + mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))] others = [] - objects = [main, mobs, others] + npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)] + objects = [main, mobs, npcs, others] + freeze = False #Gameplay is freezed in certain situations while running: screen.fill('#000000') @@ -49,6 +51,9 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): for event in events: if event.type == pygame.QUIT: quitGame() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_e: #when book is open gameplay is freezed + freeze = not freeze # RENDER YOUR GAME HERE """with open(background, 'r') as i: bg = pygame.image.load(i) @@ -56,20 +61,28 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): # fill the screen with an image to clear the screen screen.blit(bg, (0, 0)) """ - for thing in objects[0]: - if not thing.update(pygame.key.get_pressed()): - menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) - thing.draw(screen) - - for mob in objects[1]: - mob.update(objects) - mob.draw(screen) - - for thing in objects[2]: - thing.update(objects) - thing.draw(screen) - + if not freeze: + for thing in objects[0]: + thing.book.hidden = not freeze + if not thing.update(pygame.key.get_pressed(), objects): + menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) + thing.draw(screen) + for mob in objects[1]: + mob.update(objects) + mob.draw(screen) + + for npc in objects[2]: + npc.update(pygame.key.get_pressed(), objects) + npc.draw(screen) + + for thing in objects[3]: + thing.update(objects) + thing.draw(screen) + else: + objects[0][0].book.hidden = not freeze + objects[0][0].book.draw(screen) + objects[0][0].book.update() # flip() the display to put your work on screen pygame.display.flip() @@ -170,8 +183,9 @@ def main(): #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'medieval', 48, "Play", play)) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'medieval', 48, "Options", uwu)) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'medieval', 48, "Exit game", quitGame)) - test(screen, clock, running, background, isblack, WIDTH, HEIGHT) menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) + test(screen, clock, running, background, isblack, WIDTH, HEIGHT) + """while running: for event in pygame.event.get(): if event.type == pygame.QUIT: diff --git a/viecher.py b/viecher.py index f3f07bd..4dfcf6c 100644 --- a/viecher.py +++ b/viecher.py @@ -45,7 +45,6 @@ class Objects(): self.x = x self.y = y self.hidden = False - self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height()) def draw(self, screen): @@ -54,9 +53,59 @@ class Objects(): self.rect.x, self.rect.y = self.x, self.y screen.blit(self.sprite, self.rect) - class NPC(Objects): - pass + def __init__(self, name, ms, sprite, convo_act, x, y) -> None: + self.talking = False + self.hidden = True + super().__init__(name, ms, sprite, x, y) + self.conversation = Convo('Hello, you can shoot fireballs with f now.', convo_act, 'person') + + def talk(self, objects): + self.talking = True + objects[0][0].talking = True + self.conversation.hidden = False + + def draw(self, screen): + super().draw(screen) + if self.talking == True: + self.conversation.draw(screen) + + def update(self, keys, objects): + if self.talking: + self.conversation.update(keys, objects) + +class Convo(): + def __init__(self, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None: + self.x = x + self.y = y + self.width = width + self.height = height + self.hidden = False + self.font = pg.font.Font(f'fonts/{fonts[font]}', font_size) + with open('art/images/label.png', 'r') as tb: + self.box = pg.image.load(tb) + self.box = pg.transform.scale(self.box, (width, height)) + self.labelRect = pg.Rect(self.x, self.y, self.width, self.height) + self.labelSurf = self.font.render(text, True, '#1E90FF') + + + def draw(self, screen): + if self.hidden: + return + self.box.blit(self.labelSurf, [ + self.labelRect.width/2 - self.labelSurf.get_rect().width/2, + self.labelRect.height/2 - self.labelSurf.get_rect().height/2 + ]) + screen.blit(self.box, self.labelRect) + + def update(self, keys, objects): + if keys[pg.K_SPACE]: + objects[0][0].book.addspell('fireball') + self.talking = False + objects[0][0].talking = False + self.hidden = True + + class Fighter(Objects): @@ -69,18 +118,16 @@ class Fighter(Objects): self.attack_range = atr self.lastHurt = pg.time.get_ticks() self.lastAttack = pg.time.get_ticks() - self.hurtCooldown = 250 - + self.hurtCooldown = 0 class MainCharacter(Fighter): - def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, weapon=None, shield=None) -> None: + def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) - self.attack_spell = weapon - self.shield_spell = shield + self.book = Book(0, 0, [], None, None) self.talking = False self.level = Level(1000, 38, level, 150, 40, f'will to live: {level}%', 'simple', 20) - self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50) + self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50, hurtCooldown=self.hurtCooldown) def draw(self, screen): if self.hidden: @@ -89,9 +136,11 @@ class MainCharacter(Fighter): screen.blit(self.sprite, self.rect) self.health.draw(screen) self.level.draw(screen) + self.book.draw(screen) - def hurt(self, damage): - self.health.hurt(damage) + def hurt(self, damage, objects): + if not self.talking: + self.health.hurt(damage) def walk(self, keys, objects): moveto = vec(0, 0) @@ -106,26 +155,40 @@ class MainCharacter(Fighter): if not moveto == vec(0, 0): moveto.scale_to_length(self.speed) self.x += moveto[0] / fps - self.y += moveto[1] / fps + self.y += moveto[1] / fps touches = pg.sprite.spritecollideany(self, objects[1] + objects[2]) if touches is not None: - self.x -= moveto[0] / fps #change later - self.y -= moveto[1] / fps #change later + self.x -= moveto[0]*1.5 / fps #change later + self.y -= moveto[1]*1.5 / fps #change later + if isinstance(touches, NPC): + touches.talk(objects) + + def attack(self, obj, moveto = vec(0,1)): + if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks(): + if self.book.current_sp == 'fireball': + weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5) + else: + return + obj[3].append(weapon) + self.lastAttack = pg.time.get_ticks() def update(self, keys, objects): - self.walk(keys, objects) + if not self.talking: + self.walk(keys, objects) + if keys[pg.K_f]: + self.attack(objects) if self.health.health <= 0: return False else: return True class Hearts(): - def __init__(self, health, sprite, x, y) -> None: + def __init__(self, health, sprite, x, y, hurtCooldown) -> None: self.x = x self.y = y self.health = health self.lastHurt = pg.time.get_ticks() - self.hurtCooldown = 1000 + self.hurtCooldown = hurtCooldown self.hidden = False self.sprite=[] for parts in sprite: @@ -189,6 +252,32 @@ class Level(): ]) screen.blit(self.box, self.labelRect) +class Book(): + def __init__(self, x, y, spells, current_spell, current_shield) -> None: + with open(f'art/images/book.png') as i: + self.sprite = pg.image.load(i) + self.sprite = pg.transform.scale(self.sprite, (1280, 720)) + self.x = x + self.y = y + self.hidden = True + self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height()) + self.sp_list = spells + self.current_sp = current_spell + + def draw(self, screen): + if self.hidden: + return + self.rect.x, self.rect.y = self.x, self.y + screen.blit(self.sprite, self.rect) + + def addspell(self, spell): + if spell not in self.sp_list: + self.sp_list.append(spell) + self.current_sp = spell + def update(self): + pass + + class Mobs(Fighter): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) @@ -211,8 +300,14 @@ class Skeleton(Mobs): def attack(self, moveto, obj): if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks(): - obj[1].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage)) + obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage)) self.lastAttack = pg.time.get_ticks() + + def hurt(self, damage, objects): + self.health -= damage + if self.health <= 0: + self.hidden = True + objects[1].remove(self) def update(self, obj): self.chase(obj) @@ -223,27 +318,44 @@ class Weapons(Objects): super().__init__(name, ms, sprite, x, y) self.moveto = moveto self.damage = damage - - -class Arrow(Weapons): - def __init__(self, name, ms, x, y, moveto, damage, sprite="arrow.png") -> None: - super().__init__(name, ms, sprite, x, y, moveto, damage) pos = vec(1,0) angle = pos.angle_to(moveto) with open(f'art/images/{sprite}') as i: self.sprite = pg.transform.rotate(pg.image.load(i), -angle) + + def die(self, objects, kills): + touches = pg.sprite.spritecollideany(self, objects[0] + objects[1]) + if touches is not None and isinstance(touches, kills): + touches.hurt(self.damage, objects) + self.hidden = True + objects[3].remove(self) + +class Spells(Weapons): + def __init__(self, name, ms, sprite, x, y, moveto, damage) -> None: + super().__init__(name, ms, sprite, x, y, moveto, damage) + +class Fireball(Spells): + def __init__(self, name, ms, x, y, moveto, damage, sprite = 'fireball.png') -> None: + super().__init__(name, ms, sprite, x, y, moveto, damage) + + def move(self): + self.moveto.scale_to_length(self.speed) + self.x += self.moveto[0] / fps + self.y += self.moveto[1] / fps + + def update(self, objects): + self.move() + self.die(objects, Mobs) + +class Arrow(Weapons): + def __init__(self, name, ms, x, y, moveto, damage, sprite = 'arrow.png') -> None: + super().__init__(name, ms, sprite, x, y, moveto, damage) def move(self): self.moveto.scale_to_length(self.speed) self.x += self.moveto[0] / fps self.y += self.moveto[1] / fps - def die(self, objects): - touches = pg.sprite.spritecollideany(self, objects[0]) - if touches is not None and isinstance(touches, MainCharacter): - touches.hurt(self.damage) - self.hidden = True - def update(self, objects): self.move() - self.die(objects) + self.die(objects, MainCharacter)