init
This commit is contained in:
parent
ecd2283770
commit
8e1eecd0e6
28
terra/__main__.py
Normal file
28
terra/__main__.py
Normal 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()
|
24
terra/materials/abstract_material.py
Normal file
24
terra/materials/abstract_material.py
Normal 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
18
terra/materials/metal.py
Normal 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
74
terra/models/item.py
Normal 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
21
terra/models/room/wall.py
Normal 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()
|
33
terra/models/user_body/abstract_body_part.py
Normal file
33
terra/models/user_body/abstract_body_part.py
Normal 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("Вы промахнулись.")
|
15
terra/models/user_body/hand.py
Normal file
15
terra/models/user_body/hand.py
Normal 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
|
20
terra/models/user_body/head.py
Normal file
20
terra/models/user_body/head.py
Normal 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("Вы идиот.")
|
32
terra/models/weapon/abstract_weapon.py
Normal file
32
terra/models/weapon/abstract_weapon.py
Normal 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}]"
|
7
terra/rares/abstract_rare.py
Normal file
7
terra/rares/abstract_rare.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
from abc import ABC
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractRare(ABC):
|
||||||
|
name: type[str] = "Непонятный"
|
||||||
|
adjective: type[str] = "Непонятно, абстрактно"
|
6
terra/rares/metal_seams.py
Normal file
6
terra/rares/metal_seams.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from rares.abstract_rare import AbstractRare
|
||||||
|
|
||||||
|
|
||||||
|
class MetalSeams(AbstractRare):
|
||||||
|
name = "Металические швы"
|
||||||
|
adjective = "Не монолитно, есть металлические швы, виднеются стальные заклепки"
|
6
terra/rares/shabby.py
Normal file
6
terra/rares/shabby.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from rares.abstract_rare import AbstractRare
|
||||||
|
|
||||||
|
|
||||||
|
class Shabby(AbstractRare):
|
||||||
|
name = "Потрепанный"
|
||||||
|
adjective = "Потрепанно, местами царапины"
|
13
terra/text/comments.py
Normal file
13
terra/text/comments.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import random
|
||||||
|
|
||||||
|
irony_list = [
|
||||||
|
"Умные мысли приследовали его.. Но он оказался быстрее.",
|
||||||
|
"99 из 99 докторов выписывают вам парацетамол, от головы.",
|
||||||
|
"А голову вы дома не забыли?",
|
||||||
|
"Тут должна была быть ирония, но ее забыли прописать.",
|
||||||
|
"Партия выписывает вам успокоительное.",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def print_irony():
|
||||||
|
print(random.choice(irony_list))
|
Loading…
Reference in a new issue