diff --git a/classes.py b/classes.py index 03f5a7c..5e0dbb4 100644 --- a/classes.py +++ b/classes.py @@ -138,10 +138,12 @@ class HealthBar(Label): self.box[i] = pygame.image.load(tb) if not self.filling_is <= self.filling_should: self.filling_is -= 1.5 + if self.filling_should >= self.filling_is: + self.filling_is += 1.5 self.box[i] = pygame.transform.scale(self.box[i], (self.filling_is, self.height)) self.labelRect = pygame.Rect(self.x, self.y, self.width, self.height) - self.labelSurf = self.font.render(f'{self.text}: {self.percentage}%', True, self.font_color) + self.labelSurf = self.font.render(f'{self.text}: {round(self.percentage, 1)}%', True, self.font_color) self.box[-1].blit(self.labelSurf, [ self.labelRect.width / 2 - self.labelSurf.get_rect().width / 2, self.labelRect.height / 2 - self.labelSurf.get_rect().height / 2 @@ -536,7 +538,7 @@ class Convo(Label): objects[0][0].talking = False class Drops(): - def __init__(self, type, level, objects) -> None: + def __init__(self, type, level, mult) -> None: table = { 'boss': { 'xp': 150, @@ -551,7 +553,7 @@ class Drops(): ], 'will': 5 }, - 'normal': { + 'mob': { 'xp': 5, 'gold': 20, 'artifacts': [ @@ -564,7 +566,7 @@ class Drops(): ], 'will': 0.1 }, - 'ad': { + 'add': { 'xp': 0, 'gold': 3, 'artifacts': [ @@ -578,6 +580,12 @@ class Drops(): 'will': 0 } } + self.table = table[type] + self.multiplicator = level * mult + + def drop(self, main): + main.skill_xp += self.table['xp'] * self.multiplicator + main.gold += self.table['gold'] * self.multiplicator class Fighter(Objects): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None: @@ -855,7 +863,7 @@ class Level(Label): super().__init__(x, y, width, height, text, font, font_size, font_color, sprite) self.level = level def draw(self, screen): - self.text = f'will to live: {self.level}%' + self.text = f'will to live: {round(self.level)}%' super().draw(screen) class Thinks(Label): @@ -944,14 +952,14 @@ class Book(): 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) - self.drops = drops * (self.level / 2) + self.drops = Drops('mob', self.level, drops) def chase(self, obj): x = obj[0][0].x y = obj[0][0].y moveto = vec(x, y) - vec(self.x, self.y) if not (moveto).length() <= self.attack_range: - moveto.scale_to_length(self.speed) + moveto.scale_to_length(int(self.speed)) self.x += moveto[0] / fps self.y += moveto[1] / fps touches = pygame.sprite.spritecollideany(self, obj[4]) @@ -980,15 +988,15 @@ class Mobs(Fighter): if self.health <= 0: objects[0][0].killed.append(self.name) self.hidden = True + self.drops.drop(objects[0][0]) objects[1].remove(self) - def update(self, obj): self.chase(obj) class Skeleton(Mobs): - def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite = 'people/skeleton.png', drops=0) -> None: + def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite = 'people/skeleton.png', drops=2) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops) def attack(self, moveto, obj): @@ -1001,7 +1009,7 @@ class Skeleton(Mobs): class Zombie(Mobs): - def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite_sheet='people/zombiewalk.png', drops=0) -> None: + def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite_sheet='people/zombiewalk.png', drops=1) -> None: super().__init__(name, ms, sprite_sheet, x, y, health, damage, level, asp, atr, drops) self.load_frames(f'art/images/{sprite_sheet}') self.current_frame = 0 @@ -1045,7 +1053,7 @@ class Zombie(Mobs): self.lastAttack = pygame.time.get_ticks() class Rat(Mobs): - def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/rat.png', drops=0) -> None: + def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/rat.png', drops=1) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops) def attack(self, moveto, obj): @@ -1053,9 +1061,22 @@ class Rat(Mobs): obj[3].append(Punch('punch', 100, self.x, self.y, moveto, self.damage, MainCharacter)) self.lastAttack = pygame.time.get_ticks() -class Boss(Mobs): - def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/reddy.png', drops=0) -> None: +class Adds(Mobs): + def __init__(self, name, ms, sprite, health, damage, level, asp, atr, drops, x, y) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops) + self.drops = Drops('add', self.level, drops) + def attack(self, moveto, obj): + pass + + +class Boss(Mobs): + def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/reddy.png', drops=1) -> None: + super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops) + self.max_hp = health + self.drops = Drops('boss', self.level, drops) + self.adds = SpawnAdds(15, ['add', '125', sprite, 3, 0.5, 1, 1.5, 250, 1], [3, 7]) + self.ability = Heal(10, 25, 5) + self.adds.last_used = pygame.time.get_ticks() - 12500 def attack(self, moveto, obj): reddyattack_sound = mixer.Sound('audio/soundeffects/reddyattack.mp3') @@ -1073,7 +1094,63 @@ class Boss(Mobs): objects[0][0].killed.append(self.name) self.hidden = True objects[1].remove(self) + + def update(self, obj): + super().update(obj) + self.adds.spawn(obj) + event = self.ability.cast(obj) + if event.type == 'heal': + self.health += event.num + if self.health > self.max_hp: + self.health = self.max_hp + elif self.health < 0: + self.health = 0 +class Event(): + def __init__(self, _type: str, num: int) -> None: + self.type = _type + self.num = num + +class Ability(): + def __init__(self, cd, stage = 0) -> None: + self.cooldown = cd + self.stage = stage + self.last_used = 0 + + def cast(self, objects): + if self.last_used + self.cooldown * 1000 <= pygame.time.get_ticks(): + self.last_used = pygame.time.get_ticks() + +class SpawnAdds(Ability): + def __init__(self, cd, add:list, count:list, stage=0) -> None: + super().__init__(cd, stage) + self.add = add + self.count = count + + def spawn(self, objects): + if self.last_used + self.cooldown * 1000 <= pygame.time.get_ticks(): + for i in range(random.randint(*self.count)): + objects[1].append(Adds(*self.add, random.randint(32, 1888), random.randint(32, 1048))) + self.last_used = pygame.time.get_ticks() + +class Heal(Ability): + def __init__(self, cd, amount, time, stage=0) -> None: + super().__init__(cd, stage) + self.amount = amount + self.time = time + + def cast(self, objects): + if self.time * 1000 + self.last_used > pygame.time.get_ticks(): + return Event('heal', (self.amount / self.time / 1000)) + elif self.time * 1000 + self.last_used == pygame.time.get_ticks(): + self.last_used = pygame.time.get_ticks() + return Event('heal', (self.amount / self.time / 1000)) + elif random.randint(0, 88) % 5 == 0: + if self.last_used + self.cooldown * 1000 <= pygame.time.get_ticks(): + self.last_used = pygame.time.get_ticks() + # else: + # self.last_used + return Event('None', 0) class Weapons(Objects): def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None: @@ -1162,6 +1239,9 @@ class Punch(Weapons): def __init__(self, name, ms, x, y, moveto, damage, kills, sprite = 'weapons/empty.png', life_ticks=100) -> None: super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks) self.kills = kills + # if self.kills == Mobs: + # self.rect.width *= 2 + # self.rect.height *= 2 def update(self, objects): self.move(objects) diff --git a/main.py b/main.py index 5c7857e..8a672db 100644 --- a/main.py +++ b/main.py @@ -41,6 +41,7 @@ def genRooms(WIDTH, HEIGHT, type:str, objects:list): Room(type, 'normal', room_backgrounds[random.randint(0, 0)], [objects[0], objects[1], objects[2], objects[3], objects[4] + [room_objects[random.randint(0, 0)] for _ in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, j) for j in range(random.randint(5, 10)) ] + print(objects) rooms.append(Room(type, 'boss', room_backgrounds[random.randint(0, 0)], [objects[0], objects[1], [], [], objects[4] + [room_objects[random.randint(0, 0)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, 88)) #rooms = [Room(type, 'boss', room_backgrounds[random.randint(0, 0)], [objects[0], objects[1], [], [], objects[4] + [room_objects[random.randint(0, 0)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, 88)] #rooms =Room(type, 'normal', room_backgrounds[random.randint(0, 4)], [objects[0], objects[1], objects[2], [room_objects[random.randint(0, len(room_objects) - 1)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, [True, True, True, True], j) @@ -105,6 +106,7 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): if objects[0][0].level.level >= 100: isblack = True if isinstance(result, str): + print(result) if result == 'village': village(screen, clock, running, background, isblack, WIDTH, HEIGHT) elif result == 'play':