From 8e1eecd0e68354b0f3fba351808d4e8ad936c4b8 Mon Sep 17 00:00:00 2001 From: def Date: Fri, 10 Feb 2023 02:56:17 +0400 Subject: [PATCH] init --- terra/__main__.py | 28 ++++++++ terra/materials/abstract_material.py | 24 +++++++ terra/materials/metal.py | 18 +++++ terra/models/item.py | 74 ++++++++++++++++++++ terra/models/room/wall.py | 21 ++++++ terra/models/user_body/abstract_body_part.py | 33 +++++++++ terra/models/user_body/hand.py | 15 ++++ terra/models/user_body/head.py | 20 ++++++ terra/models/weapon/abstract_weapon.py | 32 +++++++++ terra/rares/abstract_rare.py | 7 ++ terra/rares/metal_seams.py | 6 ++ terra/rares/shabby.py | 6 ++ terra/text/comments.py | 13 ++++ 13 files changed, 297 insertions(+) create mode 100644 terra/__main__.py create mode 100644 terra/materials/abstract_material.py create mode 100644 terra/materials/metal.py create mode 100644 terra/models/item.py create mode 100644 terra/models/room/wall.py create mode 100644 terra/models/user_body/abstract_body_part.py create mode 100644 terra/models/user_body/hand.py create mode 100644 terra/models/user_body/head.py create mode 100644 terra/models/weapon/abstract_weapon.py create mode 100644 terra/rares/abstract_rare.py create mode 100644 terra/rares/metal_seams.py create mode 100644 terra/rares/shabby.py create mode 100644 terra/text/comments.py diff --git a/terra/__main__.py b/terra/__main__.py new file mode 100644 index 0000000..5aa19e5 --- /dev/null +++ b/terra/__main__.py @@ -0,0 +1,28 @@ +from materials.metal import Metal +from models.room.wall import Wall +from models.user_body.head import Head + +wall = Wall(material=Metal) + + +wall.look() + +print("\n") +print("\n") +wall.leak() + +print("\n") +print("\n") +wall.take() + +print("\n") +print("\n") +wall.touch() + +print("\n") +print("\n") +wall.punch(weapon=Head) + +print("\n") +print("\n") +wall.iron() diff --git a/terra/materials/abstract_material.py b/terra/materials/abstract_material.py new file mode 100644 index 0000000..9058069 --- /dev/null +++ b/terra/materials/abstract_material.py @@ -0,0 +1,24 @@ +from abc import ABC +from typing import Optional + + +class AbstractMaterial(ABC): + """ + Abstract materiak + """ + + name: type[str] = "Абстрактный материал" + description: type[str] = "Нечто абстрактое" + + hardness: type[int] = 0 + health_multiplier: type[int] = 0 + + def leak(self) -> Optional[None]: + """Leak""" + print("Вы чувствуете вкус пустоты, она вас пугает.") + + def touch(self) -> Optional[None]: + """Touch""" + print( + "Вы дотронулись до чего то настолько aбстрактного, что ничего не почувствали. Это вас пугает." + ) diff --git a/terra/materials/metal.py b/terra/materials/metal.py new file mode 100644 index 0000000..e84b263 --- /dev/null +++ b/terra/materials/metal.py @@ -0,0 +1,18 @@ +from materials.abstract_material import AbstractMaterial + +from dataclasses import dataclass + + +@dataclass +class Metal(AbstractMaterial): + name = "Металл" + description = "Гладкое, бликует" + + hardness = -20 + health_multiplier = 5 + + def leak(self) -> None: + print("Вы почуствовали неприятную горечь и металлический вкус во рту. Гадость.") + + def touch(self) -> None: + print("Гладкий, твердый, холодный. Это точно металл.") diff --git a/terra/models/item.py b/terra/models/item.py new file mode 100644 index 0000000..3a1d6f4 --- /dev/null +++ b/terra/models/item.py @@ -0,0 +1,74 @@ +from dataclasses import dataclass +from materials.abstract_material import AbstractMaterial +from models.weapon.abstract_weapon import AbstractWeapon +from models.user_body.hand import Hand + +from text.comments import print_irony + + +@dataclass +class Item: + name: type[str] = "Обьект" + description: type[str] = "Обьект как обьект, че бубнить то?" + + rares: type[dict] = None + material: type[AbstractMaterial] = AbstractMaterial # Материал обьекта + health: type[int] = 1 # Здоровье: базовое значение * material.health_multiplier + scale: type[int] = 1 # Размер: от 1 до 100 + + def show_stats(self) -> str: + health_percentage = "{0:.0f}%".format(100 * self.health / 100) + + return f"[H:{health_percentage}]" + + def look(self) -> None: + + if self.scale <= 5: + scale_description = "Крохотное размером" + elif self.scale <= 15: + scale_description = "Уместится на ладони." + elif self.scale >= 100: + scale_description = "Огромное по размеру" + + print(f"Вы рассматриваете обьект {self.name}. {self.description}.") + print(scale_description, end="") + print( + f". Явно сделана из {self.material.name}. Кажется вам {self.material.description.lower()}", + end="", + ) + + if self.rares is not None: + for rare in self.rares: + print(",", rare.adjective.lower(), end="") + print(".") + + def take(self, success: type[bool] = True): + if success: + print(f"Вы положили {self.name} в инвентарь.") + else: + print(f"Предмет: '{self.name}' нельзя взять.") + + def touch(self): + print(f"Вы дотронулись до {self.name}" + ".") + self.material.touch(self) + + def leak(self, irony: type[bool] = True) -> None: + print( + f"Вы лизнули {self.name}, но зачем? По ощущениям", + self.material.description.lower() + ".", + ) + self.material.leak(self) + + if irony: + print_irony() + + def punch(self, weapon: type[AbstractWeapon] = Hand): + print( + f"Вы ударили {self.name + self.show_stats()}, оружием {weapon.name + weapon.show_stats(weapon)}" + ) + + weapon.punch(self, weapon=weapon) + + def iron(self): + print(f"Вы гладите {self.name}, вроде не мяукает.") + self.material.touch(self) diff --git a/terra/models/room/wall.py b/terra/models/room/wall.py new file mode 100644 index 0000000..03c185a --- /dev/null +++ b/terra/models/room/wall.py @@ -0,0 +1,21 @@ +from models.item import Item +from materials.abstract_material import AbstractMaterial +from rares.metal_seams import MetalSeams +from rares.shabby import Shabby + +from text.comments import print_irony + + +class Wall(Item): + def __init__(self, material: type[AbstractMaterial] = AbstractMaterial) -> None: + self.name = "Стена" + self.description = "Обычная стена орбитальная станции, которую вы бы могли видеть у себя в каюте" + + self.rares = [Shabby, MetalSeams] + self.material = material + self.health = 1000 * self.material.health_multiplier + self.scale = 100 + + def take(self) -> None: + Item.take(self, success=False) + print_irony() diff --git a/terra/models/user_body/abstract_body_part.py b/terra/models/user_body/abstract_body_part.py new file mode 100644 index 0000000..046abaa --- /dev/null +++ b/terra/models/user_body/abstract_body_part.py @@ -0,0 +1,33 @@ +from abc import ABC +from typing import Optional + +from models.weapon.abstract_weapon import AbstractWeapon + + +class AbstractBodyPart(ABC): + """ + Abstract body part + """ + + name: type[str] = "Пятая конечность" + description: type[str] = "Непонятно откуда, но она у тебя есть" + + hardness: type[int] = 0 + health: type[int] = 0 + + def punch( + self, + weapon: AbstractWeapon, + ): + if weapon.get_hit_chance(self, weapon=weapon): + if self.material.hardness <= 0: + print( + f"Вы ударились {weapon.name} об {self.name} и почуствовали ощутимую боль." + ) + else: + print( + f"Вы ударились {weapon.name} обо что-то мягкое, этим оказалось {self.name} ." + ) + + else: + print("Вы промахнулись.") diff --git a/terra/models/user_body/hand.py b/terra/models/user_body/hand.py new file mode 100644 index 0000000..b88266c --- /dev/null +++ b/terra/models/user_body/hand.py @@ -0,0 +1,15 @@ +from dataclasses import dataclass + +from models.user_body.abstract_body_part import AbstractBodyPart +from models.weapon.abstract_weapon import AbstractWeapon + + +@dataclass +class Hand(AbstractBodyPart, AbstractWeapon): + name = "Рука" + description = "Твоя рука - верный друг, помощник, партнер" + + damage = 1 + health = 100 + hardness = -5 + difficult_handling = 15 diff --git a/terra/models/user_body/head.py b/terra/models/user_body/head.py new file mode 100644 index 0000000..e7f02b7 --- /dev/null +++ b/terra/models/user_body/head.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass + +from models.weapon.abstract_weapon import AbstractWeapon +from models.user_body.abstract_body_part import AbstractBodyPart + + +@dataclass +class Head(AbstractWeapon, AbstractBodyPart): + name = "Голова" + description = "Твоя голова - пока что на плечах" + + damage = 0 + health = 100 + hardness = 0 + difficult_handling = 15 + + def punch(self, weapon): + + AbstractBodyPart.punch(self, weapon=weapon) + print("Вы идиот.") diff --git a/terra/models/weapon/abstract_weapon.py b/terra/models/weapon/abstract_weapon.py new file mode 100644 index 0000000..d05e8ac --- /dev/null +++ b/terra/models/weapon/abstract_weapon.py @@ -0,0 +1,32 @@ +from abc import ABC + +import random + + +class AbstractWeapon(ABC): + """ + Abstract weapon + """ + + name: str + + damage: int + health: int + difficult_handling: int # -20 - +20 + + def get_hit_chance(self, weapon: "AbstractWeapon") -> bool: + hit_chance = weapon.difficult_handling * self.scale + + if random.randint(1, hit_chance) >= 10: + return True + else: + return False + + def punch(self, weapon: "AbstractWeapon"): + """Punch""" + print("Вы ударили ничем, ни о что") + + def show_stats(weapon: "AbstractWeapon") -> str: + health_percentage = "{0:.0f}%".format(weapon.health, 100) + + return f"[D:{weapon.damage}, H:{health_percentage}]" diff --git a/terra/rares/abstract_rare.py b/terra/rares/abstract_rare.py new file mode 100644 index 0000000..99167bc --- /dev/null +++ b/terra/rares/abstract_rare.py @@ -0,0 +1,7 @@ +from abc import ABC +from typing import Optional + + +class AbstractRare(ABC): + name: type[str] = "Непонятный" + adjective: type[str] = "Непонятно, абстрактно" \ No newline at end of file diff --git a/terra/rares/metal_seams.py b/terra/rares/metal_seams.py new file mode 100644 index 0000000..b0bddab --- /dev/null +++ b/terra/rares/metal_seams.py @@ -0,0 +1,6 @@ +from rares.abstract_rare import AbstractRare + + +class MetalSeams(AbstractRare): + name = "Металические швы" + adjective = "Не монолитно, есть металлические швы, виднеются стальные заклепки" diff --git a/terra/rares/shabby.py b/terra/rares/shabby.py new file mode 100644 index 0000000..9e33c93 --- /dev/null +++ b/terra/rares/shabby.py @@ -0,0 +1,6 @@ +from rares.abstract_rare import AbstractRare + + +class Shabby(AbstractRare): + name = "Потрепанный" + adjective = "Потрепанно, местами царапины" diff --git a/terra/text/comments.py b/terra/text/comments.py new file mode 100644 index 0000000..b44d2e3 --- /dev/null +++ b/terra/text/comments.py @@ -0,0 +1,13 @@ +import random + +irony_list = [ + "Умные мысли приследовали его.. Но он оказался быстрее.", + "99 из 99 докторов выписывают вам парацетамол, от головы.", + "А голову вы дома не забыли?", + "Тут должна была быть ирония, но ее забыли прописать.", + "Партия выписывает вам успокоительное.", +] + + +def print_irony(): + print(random.choice(irony_list))