This commit is contained in:
def 2023-02-10 02:56:17 +04:00
parent ecd2283770
commit 8e1eecd0e6
13 changed files with 297 additions and 0 deletions

28
terra/__main__.py Normal file
View File

@ -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()

View File

@ -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бстрактного, что ничего не почувствали. Это вас пугает."
)

18
terra/materials/metal.py Normal file
View File

@ -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("Гладкий, твердый, холодный. Это точно металл.")

74
terra/models/item.py Normal file
View File

@ -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)

21
terra/models/room/wall.py Normal file
View File

@ -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()

View File

@ -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("Вы промахнулись.")

View File

@ -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

View File

@ -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("Вы идиот.")

View File

@ -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}]"

View File

@ -0,0 +1,7 @@
from abc import ABC
from typing import Optional
class AbstractRare(ABC):
name: type[str] = "Непонятный"
adjective: type[str] = "Непонятно, абстрактно"

View File

@ -0,0 +1,6 @@
from rares.abstract_rare import AbstractRare
class MetalSeams(AbstractRare):
name = "Металические швы"
adjective = "Не монолитно, есть металлические швы, виднеются стальные заклепки"

6
terra/rares/shabby.py Normal file
View File

@ -0,0 +1,6 @@
from rares.abstract_rare import AbstractRare
class Shabby(AbstractRare):
name = "Потрепанный"
adjective = "Потрепанно, местами царапины"

13
terra/text/comments.py Normal file
View File

@ -0,0 +1,13 @@
import random
irony_list = [
"Умные мысли приследовали его.. Но он оказался быстрее.",
"99 из 99 докторов выписывают вам парацетамол, от головы.",
"А голову вы дома не забыли?",
"Тут должна была быть ирония, но ее забыли прописать.",
"Партия выписывает вам успокоительное.",
]
def print_irony():
print(random.choice(irony_list))