CgppbXBvcnQgcmFuZG9tCmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKCiMgQ29sb3JzIGZvciBsb290IGRpc3BsYXkgKEFOU0kgY29kZXMpCkNPTE9SUyA9IHsKICAgICdub3JtYWwnOiAnXDAzM1s5NG0nLCAgICAjIEJsdWUKICAgICdlcGljJzogJ1wwMzNbOTVtJywgICAgICAjIFB1cnBsZQogICAgJ2xlZ2VuZGFyeSc6ICdcMDMzWzMzbScsICMgT3JhbmdlICh5ZWxsb3cpCiAgICAnZW5kJzogJ1wwMzNbMG0nCn0KCmNsYXNzIExvb3Q6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcmFyaXR5KToKICAgICAgICBzZWxmLnJhcml0eSA9IHJhcml0eQogICAgICAgIGJhc2Vfc3RhdHMgPSB7J2F0dGFjayc6IDAsICdkZWZlbnNlJzogMCwgJ3NwZWVkJzogMH0KICAgICAgICBpZiByYXJpdHkgPT0gJ25vcm1hbCc6CiAgICAgICAgICAgIHNlbGYuc3RhdHMgPSB7azogcmFuZG9tLnJhbmRpbnQoMSwgMykgZm9yIGsgaW4gYmFzZV9zdGF0c30KICAgICAgICBlbGlmIHJhcml0eSA9PSAnZXBpYyc6CiAgICAgICAgICAgIHNlbGYuc3RhdHMgPSB7azogcmFuZG9tLnJhbmRpbnQoMywgNikgZm9yIGsgaW4gYmFzZV9zdGF0c30KICAgICAgICBlbHNlOiAgIyBsZWdlbmRhcnkKICAgICAgICAgICAgc2VsZi5zdGF0cyA9IHtrOiByYW5kb20ucmFuZGludCg2LCAxMCkgZm9yIGsgaW4gYmFzZV9zdGF0c30KCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBjb2xvciA9IENPTE9SU1tzZWxmLnJhcml0eV0KICAgICAgICBzdGF0c19zdHIgPSAnLCAnLmpvaW4oZiZxdW90O3trfTp7dn0mcXVvdDsgZm9yIGssIHYgaW4gc2VsZi5zdGF0cy5pdGVtcygpKQogICAgICAgIHJldHVybiBmJnF1b3Q7e2NvbG9yfXtzZWxmLnJhcml0eS5jYXBpdGFsaXplKCl9IExvb3QgW3tzdGF0c19zdHJ9XXtDT0xPUlNbJ2VuZCddfSZxdW90OwoKY2xhc3MgRW5lbXk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm91bmRfbnVtKToKICAgICAgICBzZWxmLmhwID0gNSArIHJvdW5kX251bSAqIDIKICAgICAgICBzZWxmLmF0dGFjayA9IDEgKyByb3VuZF9udW0KICAgICAgICBzZWxmLmFsaXZlID0gVHJ1ZQoKICAgIGRlZiB0YWtlX2RhbWFnZShzZWxmLCBkbWcpOgogICAgICAgIHNlbGYuaHAgLT0gZG1nCiAgICAgICAgaWYgc2VsZi5ocCAmbHQ7PSAwOgogICAgICAgICAgICBzZWxmLmFsaXZlID0gRmFsc2UKCiAgICBkZWYgYXR0YWNrX3BsYXllcihzZWxmLCBwbGF5ZXIpOgogICAgICAgIHBsYXllci5ocCAtPSBzZWxmLmF0dGFjawoKY2xhc3MgUGxheWVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaHAgPSAxMDAKICAgICAgICBzZWxmLmJhc2VfYXR0YWNrID0gNQogICAgICAgIHNlbGYuYmFzZV9kZWZlbnNlID0gMgogICAgICAgIHNlbGYuYmFzZV9zcGVlZCA9IDIKICAgICAgICBzZWxmLmxvb3QgPSBbXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGF0dGFjayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5iYXNlX2F0dGFjayArIHN1bShsLnN0YXRzWydhdHRhY2snXSBmb3IgbCBpbiBzZWxmLmxvb3QpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGVmZW5zZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5iYXNlX2RlZmVuc2UgKyBzdW0obC5zdGF0c1snZGVmZW5zZSddIGZvciBsIGluIHNlbGYubG9vdCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzcGVlZChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5iYXNlX3NwZWVkICsgc3VtKGwuc3RhdHNbJ3NwZWVkJ10gZm9yIGwgaW4gc2VsZi5sb290KQoKICAgIGRlZiBpc19hbGl2ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5ocCAmZ3Q7IDAKCiAgICBkZWYgYWRkX2xvb3Qoc2VsZiwgbG9vdCk6CiAgICAgICAgc2VsZi5sb290LmFwcGVuZChsb290KQoKZGVmIGRyb3BfbG9vdCgpOgogICAgcm9sbCA9IHJhbmRvbS5yYW5kb20oKQogICAgaWYgcm9sbCAmbHQ7IDAuNjoKICAgICAgICByYXJpdHkgPSAnbm9ybWFsJwogICAgZWxpZiByb2xsICZsdDsgMC45OgogICAgICAgIHJhcml0eSA9ICdlcGljJwogICAgZWxzZToKICAgICAgICByYXJpdHkgPSAnbGVnZW5kYXJ5JwogICAgcmV0dXJuIExvb3QocmFyaXR5KQoKZGVmIHByaW50X3N0YXR1cyhyb3VuZF9udW0sIHBsYXllciwgZW5lbWllcyk6CiAgICBwcmludChmJnF1b3Q7XG5Sb3VuZCB7cm91bmRfbnVtfSAtIFBsYXllciBIUDoge3BsYXllci5ocH0mcXVvdDspCiAgICBwcmludChmJnF1b3Q7RW5lbWllcyBhbGl2ZToge3N1bShlLmFsaXZlIGZvciBlIGluIGVuZW1pZXMpfSZxdW90OykKICAgIHByaW50KGYmcXVvdDtQbGF5ZXIgQXR0YWNrOiB7cGxheWVyLmF0dGFja30sIERlZmVuc2U6IHtwbGF5ZXIuZGVmZW5zZX0sIFNwZWVkOiB7cGxheWVyLnNwZWVkfSZxdW90OykKICAgIHByaW50KGYmcXVvdDtMb290OiB7W3N0cihsKSBmb3IgbCBpbiBwbGF5ZXIubG9vdF19JnF1b3Q7KQoKZGVmIHBvb2xmaWN0aW9uKCk6CiAgICBwbGF5ZXIgPSBQbGF5ZXIoKQogICAgbWF4X3JvdW5kcyA9IDEwMAogICAgZm9yIHJvdW5kX251bSBpbiByYW5nZSgxLCBtYXhfcm91bmRzICsgMSk6CiAgICAgICAgZW5lbWllcyA9IFtFbmVteShyb3VuZF9udW0pIGZvciBfIGluIHJhbmdlKHJvdW5kX251bSldICAjIGVuZW1pZXMgc2NhbGUgd2l0aCByb3VuZAogICAgICAgIHByaW50X3N0YXR1cyhyb3VuZF9udW0sIHBsYXllciwgZW5lbWllcykKCiAgICAgICAgd2hpbGUgYW55KGUuYWxpdmUgZm9yIGUgaW4gZW5lbWllcykgYW5kIHBsYXllci5pc19hbGl2ZSgpOgogICAgICAgICAgICAjIFBsYXllciBhdHRhY2tzIGZhc3Rlc3QgZW5lbXkgZmlyc3QKICAgICAgICAgICAgYWxpdmVfZW5lbWllcyA9IFtlIGZvciBlIGluIGVuZW1pZXMgaWYgZS5hbGl2ZV0KICAgICAgICAgICAgdGFyZ2V0ID0gYWxpdmVfZW5lbWllc1swXQogICAgICAgICAgICBkYW1hZ2UgPSBtYXgocGxheWVyLmF0dGFjayAtIDEsIDEpCiAgICAgICAgICAgIHRhcmdldC50YWtlX2RhbWFnZShkYW1hZ2UpCgogICAgICAgICAgICAjIEVuZW1pZXMgYXR0YWNrIHBsYXllcgogICAgICAgICAgICBmb3IgZSBpbiBhbGl2ZV9lbmVtaWVzOgogICAgICAgICAgICAgICAgaWYgZS5hbGl2ZToKICAgICAgICAgICAgICAgICAgICBkYW1hZ2VfdG9fcGxheWVyID0gbWF4KGUuYXR0YWNrIC0gcGxheWVyLmRlZmVuc2UsIDEpCiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmhwIC09IGRhbWFnZV90b19wbGF5ZXIKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGxheWVyLmlzX2FsaXZlKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCZxdW90O1lvdSBkaWVkISBHYW1lIE92ZXIuJnF1b3Q7KQogICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgpCgogICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKCiAgICAgICAgIyBMb290IGRyb3AgZnJvbSBlYWNoIGVuZW15CiAgICAgICAgZm9yIGUgaW4gZW5lbWllczoKICAgICAgICAgICAgaWYgbm90IGUuYWxpdmU6CiAgICAgICAgICAgICAgICBpZiByYW5kb20ucmFuZG9tKCkgJmx0OyAwLjU6ICAjIDUwJSBjaGFuY2UgdG8gZHJvcCBsb290CiAgICAgICAgICAgICAgICAgICAgbG9vdCA9IGRyb3BfbG9vdCgpCiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmFkZF9sb290KGxvb3QpCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiZxdW90O0VuZW15IGRyb3BwZWQ6IHtsb290fSZxdW90OykKCiAgICAgICAgaWYgbm90IHBsYXllci5pc19hbGl2ZSgpOgogICAgICAgICAgICBwcmludCgmcXVvdDtZb3UgZGllZCEgR2FtZSBPdmVyLiZxdW90OykKICAgICAgICAgICAgYnJlYWsKCiAgICBpZiBwbGF5ZXIuaXNfYWxpdmUoKToKICAgICAgICBwcmludCgmcXVvdDtDb25ncmF0dWxhdGlvbnMhIFlvdSBzdXJ2aXZlZCAxMDAgcm91bmRzIG9mIFBvb2xmaWN0aW9uISZxdW90OykKCmlmIF9fbmFtZV9fID09ICZxdW90O19fbWFpbl9fJnF1b3Q7OgogICAgcG9vbGZpY3Rpb24oKQo=
import random
import sys
import time
# Colors for loot display (ANSI codes)
COLORS = {
'normal': '\033[94m', # Blue
'epic': '\033[95m', # Purple
'legendary': '\033[33m', # Orange (yellow)
'end': '\033[0m'
}
class Loot:
def __init__(self, rarity):
self.rarity = rarity
base_stats = {'attack': 0, 'defense': 0, 'speed': 0}
if rarity == 'normal':
self.stats = {k: random.randint(1, 3) for k in base_stats}
elif rarity == 'epic':
self.stats = {k: random.randint(3, 6) for k in base_stats}
else: # legendary
self.stats = {k: random.randint(6, 10) for k in base_stats}
def __str__(self):
color = COLORS[self.rarity]
stats_str = ', '.join(f"{k}:{v}" for k, v in self.stats.items())
return f"{color}{self.rarity.capitalize()} Loot [{stats_str}]{COLORS['end']}"
class Enemy:
def __init__(self, round_num):
self.hp = 5 + round_num * 2
self.attack = 1 + round_num
self.alive = True
def take_damage(self, dmg):
self.hp -= dmg
if self.hp <= 0:
self.alive = False
def attack_player(self, player):
player.hp -= self.attack
class Player:
def __init__(self):
self.hp = 100
self.base_attack = 5
self.base_defense = 2
self.base_speed = 2
self.loot = []
@property
def attack(self):
return self.base_attack + sum(l.stats['attack'] for l in self.loot)
@property
def defense(self):
return self.base_defense + sum(l.stats['defense'] for l in self.loot)
@property
def speed(self):
return self.base_speed + sum(l.stats['speed'] for l in self.loot)
def is_alive(self):
return self.hp > 0
def add_loot(self, loot):
self.loot.append(loot)
def drop_loot():
roll = random.random()
if roll < 0.6:
rarity = 'normal'
elif roll < 0.9:
rarity = 'epic'
else:
rarity = 'legendary'
return Loot(rarity)
def print_status(round_num, player, enemies):
print(f"\nRound {round_num} - Player HP: {player.hp}")
print(f"Enemies alive: {sum(e.alive for e in enemies)}")
print(f"Player Attack: {player.attack}, Defense: {player.defense}, Speed: {player.speed}")
print(f"Loot: {[str(l) for l in player.loot]}")
def poolfiction():
player = Player()
max_rounds = 100
for round_num in range(1, max_rounds + 1):
enemies = [Enemy(round_num) for _ in range(round_num)] # enemies scale with round
print_status(round_num, player, enemies)
while any(e.alive for e in enemies) and player.is_alive():
# Player attacks fastest enemy first
alive_enemies = [e for e in enemies if e.alive]
target = alive_enemies[0]
damage = max(player.attack - 1, 1)
target.take_damage(damage)
# Enemies attack player
for e in alive_enemies:
if e.alive:
damage_to_player = max(e.attack - player.defense, 1)
player.hp -= damage_to_player
if not player.is_alive():
print("You died! Game Over.")
sys.exit()
time.sleep(0.1)
# Loot drop from each enemy
for e in enemies:
if not e.alive:
if random.random() < 0.5: # 50% chance to drop loot
loot = drop_loot()
player.add_loot(loot)
print(f"Enemy dropped: {loot}")
if not player.is_alive():
print("You died! Game Over.")
break
if player.is_alive():
print("Congratulations! You survived 100 rounds of Poolfiction!")
if __name__ == "__main__":
poolfiction()