Skip to content

Commit 26e60e1

Browse files
AmbratolmAmbratolm
authored andcommitted
Added new actor rpg stats
1 parent 558c24e commit 26e60e1

File tree

5 files changed

+180
-18
lines changed

5 files changed

+180
-18
lines changed

bot/cogs/board_cog.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ async def profile(
2828
await interaction.response.defer()
2929
member = member or interaction.user
3030
embed = EmbedX.info(icon="👤", title=member.display_name)
31+
embed.add_field(name="", value=member.mention, inline=False)
3132
if isinstance(member, Member):
3233
embed.description = " ".join(
3334
[
@@ -42,26 +43,49 @@ async def profile(
4243
actor = self.bot.create_actor(member)
4344
embed.add_field(name="", value="", inline=False)
4445
embed.add_field(
45-
name="Rank", value=f"🏆 **{actor.rank_name}**\n{actor.rank_bar}"
46+
name="Rank", value=f"🏆 **{actor.rank_name}**\n`{actor.rank_bar}`"
4647
)
4748
embed.add_field(
4849
name="Level",
49-
value=f"🏅 **{actor.level}**\n{actor.level_bar}",
50+
value=f"🏅 **{actor.level}**\n`{actor.level_bar}`",
5051
)
5152
embed.add_field(
5253
name="Experience",
53-
value=f"⏫ **{intcomma(actor.xp)}** / {actor.next_level_xp}\n{actor.xp_bar}",
54+
value=f"⏫ **{intcomma(actor.xp)}** / {actor.next_level_xp}\n`{actor.xp_bar}`",
5455
)
5556
embed.add_field(name="", value="", inline=False)
5657
embed.add_field(name="Gold", value=f"💰 **{intcomma(actor.gold)}**")
5758
embed.add_field(name="Items", value=f"🎒 **{intcomma(len(actor.items))}**")
59+
embed.add_field(
60+
name="Equipment",
61+
value=f"🧰 **{intcomma(len(actor.equipment))}**",
62+
)
63+
embed.add_field(name="", value="", inline=False)
64+
embed.add_field(
65+
name="Health",
66+
value=f":heart: **{intcomma(actor.health)}** / {intcomma(actor.max_health)}\n`{actor.health_bar}`",
67+
)
68+
embed.add_field(
69+
name="Energy",
70+
value=f"⚡ **{intcomma(actor.energy)}** / {intcomma(actor.max_energy)}\n`{actor.energy_bar}`",
71+
)
72+
embed.add_field(name="", value="", inline=False)
73+
embed.add_field(
74+
name="Attack", value=f":crossed_swords: **{intcomma(actor.attack)}**"
75+
)
76+
embed.add_field(name="Defense", value=f"🛡 **{intcomma(actor.defense)}**")
77+
embed.add_field(name="Speed", value=f"🥾 **{intcomma(actor.speed)}**")
78+
embed.add_field(name="", value="", inline=False)
5879
if isinstance(member, Member):
5980
embed.add_field(
6081
name="Joined",
6182
value=f"⌚ {member.guild.name} **{naturaltime(member.joined_at or 0)}**\n-# ⌚ Discord **{naturaltime(member.created_at)}**",
6283
)
6384
embed.add_field(name="", value="", inline=False)
64-
embed.set_footer(text=f"#️⃣{member.name} \n🆔{member.id}")
85+
embed.set_footer(
86+
text=f"#️⃣{member.name}\n🆔{member.id}",
87+
icon_url=member.display_avatar.url,
88+
)
6589
embed.set_thumbnail(url=member.display_avatar.url)
6690
await interaction.followup.send(embed=embed)
6791

bot/cogs/combat_cog.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from discord import Color, Embed, Guild, Interaction, Member, User, app_commands
2+
from discord.ext.commands import Cog
3+
from humanize import intcomma, naturalsize, naturaltime
4+
from odmantic import query
5+
6+
from bot.main import ActBot
7+
from bot.ui import EmbedX
8+
from db.actor import Actor
9+
10+
11+
# ----------------------------------------------------------------------------------------------------
12+
# * Combat Cog
13+
# ----------------------------------------------------------------------------------------------------
14+
class CombatCog(Cog, description="Allows players to engage in battles."):
15+
def __init__(self, bot: ActBot):
16+
self.bot = bot
17+
18+
@app_commands.guild_only()
19+
@app_commands.command(description="Attack a member")
20+
async def attack(self, interaction: Interaction, member: Member):
21+
command_name = interaction.command.name if interaction.command else "?"
22+
await interaction.response.send_message(
23+
content=f"{member.mention} 😱",
24+
embed=EmbedX.info(
25+
icon=":crossed_swords:",
26+
title="Combat",
27+
description=f"{interaction.user.mention} attacked {member.mention}.",
28+
),
29+
)

bot/cogs/farm_cog.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,12 @@ def calculate_xp_reward(message: Message):
132132

133133
return randint(1, word_count)
134134

135-
@staticmethod
136-
async def try_award_role(member: Member, role_name: str) -> Role | None:
137-
role = utils.get(member.guild.roles, name=role_name)
138-
if role in member.roles:
139-
return None
140-
elif not role:
141-
role = await member.guild.create_role(name=role_name)
142-
await member.add_roles(role)
143-
return role
135+
# @staticmethod
136+
# async def try_award_role(member: Member, role_name: str) -> Role | None:
137+
# role = utils.get(member.guild.roles, name=role_name)
138+
# if role in member.roles:
139+
# return None
140+
# elif not role:
141+
# role = await member.guild.create_role(name=role_name)
142+
# await member.add_roles(role)
143+
# return role

bot/cogs/item_cog.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from discord import Interaction, app_commands
2+
from discord.ext.commands import Cog
3+
4+
from bot.main import ActBot
5+
from bot.ui import EmbedX
6+
7+
8+
# ----------------------------------------------------------------------------------------------------
9+
# * Item Cog
10+
# ----------------------------------------------------------------------------------------------------
11+
class ItemCog(Cog, description="Allows players to use items."):
12+
def __init__(self, bot: ActBot):
13+
self.bot = bot
14+
15+
@app_commands.guild_only()
16+
@app_commands.command(description="View purchasable items")
17+
async def shop(self, interaction: Interaction):
18+
await interaction.response.send_message(
19+
embed=EmbedX.info(
20+
icon="🏬",
21+
title="Shop",
22+
description="\n⚔ Sword\n🛡 Shield\n🥾 Boot\n🍎 Apple\n🍌 Banana\n🍔 Burger\n🔫 Gun\n👕 T-Shirt",
23+
),
24+
)
25+
26+
@app_commands.guild_only()
27+
@app_commands.command(description="Purchase an item")
28+
async def buy(self, interaction: Interaction, item: str):
29+
await interaction.response.send_message(
30+
embed=EmbedX.info(
31+
icon="🛒",
32+
title="Purchase",
33+
description=f"{interaction.user.mention} purchased **{item}**.",
34+
),
35+
)
36+
37+
@app_commands.guild_only()
38+
@app_commands.command(description="View your item inventory")
39+
async def inventory(self, interaction: Interaction):
40+
await interaction.response.send_message(
41+
embed=EmbedX.info(
42+
icon="🎒", title="Inventory", description="🐵 Abducted Monkey **x 3**"
43+
),
44+
)
45+
46+
@app_commands.guild_only()
47+
@app_commands.command(description="Equip an equippable item")
48+
async def equip(self, interaction: Interaction, item: str):
49+
command_name = interaction.command.name if interaction.command else "?"
50+
await interaction.response.send_message(
51+
embed=EmbedX.info(
52+
icon="🎒",
53+
title="Item Equipage",
54+
description=f"{interaction.user.mention} equipped **{item}**.",
55+
),
56+
)
57+
58+
@app_commands.guild_only()
59+
@app_commands.command(description="Use a consumable item")
60+
async def use(self, interaction: Interaction, item: str):
61+
await interaction.response.send_message(
62+
embed=EmbedX.info(
63+
icon="🎒",
64+
title="Item Consumption",
65+
description=f"{interaction.user.mention} used **{item}**.",
66+
),
67+
)

db/actor.py

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,33 @@ class Actor(Model):
1818
display_name: str = ""
1919
is_member: bool = True # Still member in the server
2020

21+
# AI
2122
ai_interacted_at: Optional[datetime] = None # Last time actor interacted with AI
2223
ai_chat_history: list[dict[str, Any]] = []
2324

24-
xp: NonNegativeInt = 0
25-
level: NonNegativeInt = 0
26-
rank: NonNegativeInt = 0
25+
# Combat stats
26+
base_health: NonNegativeInt = 1
27+
max_health: NonNegativeInt = 1
28+
base_energy: NonNegativeInt = 1
29+
max_energy: NonNegativeInt = 1
30+
base_attack: NonNegativeInt = 1
31+
base_defense: NonNegativeInt = 1
32+
base_speed: NonNegativeInt = 1
33+
34+
# Gold, Items, & Equipment
2735
gold: NonNegativeInt = 0
2836
items: list[str] = []
37+
equipment: list[str] = [] # Equipped items
38+
MAX_ITEMS: ClassVar[int] = 20
39+
MAX_EQUIPMENT: ClassVar[int] = 3
2940

41+
# Progress
42+
xp: NonNegativeInt = 0
43+
level: NonNegativeInt = 0
44+
rank: NonNegativeInt = 0
3045
LEVEL_BASE_XP: ClassVar[int] = 100
3146
LEVEL_EXPONENT: ClassVar[float] = 2.5
3247
MAX_LEVEL: ClassVar[int] = 99
33-
3448
RANK_BASE_LEVEL: ClassVar[int] = 30
3549
RANK_EXPONENT: ClassVar[float] = 1
3650
RANK_NAMES: ClassVar[list[str]] = [
@@ -50,6 +64,26 @@ class Actor(Model):
5064

5165
# ----------------------------------------------------------------------------------------------------
5266

67+
@property
68+
def health(self):
69+
return self.base_health + 0
70+
71+
@property
72+
def energy(self):
73+
return self.base_energy + 0
74+
75+
@property
76+
def attack(self):
77+
return self.base_attack + 0
78+
79+
@property
80+
def defense(self):
81+
return self.base_defense + 0
82+
83+
@property
84+
def speed(self):
85+
return self.base_speed + 0
86+
5387
@property
5488
def rank_name(self) -> str:
5589
"""Get name of current rank."""
@@ -94,13 +128,21 @@ def try_rank_up(self) -> bool:
94128

95129
# ----------------------------------------------------------------------------------------------------
96130

131+
@property
132+
def health_bar(self) -> str:
133+
return text_progress_bar(self.health, self.max_health, 6, "▰", "▱")
134+
135+
@property
136+
def energy_bar(self) -> str:
137+
return text_progress_bar(self.energy, self.max_energy, 6, "▰", "▱")
138+
97139
@property
98140
def rank_bar(self) -> str:
99141
return text_progress_bar(self.rank, self.MAX_RANKS, 5, "⭐", "☆")
100142

101143
@property
102144
def level_bar(self) -> str:
103-
return text_progress_bar(self.level, self.next_rank_level, 5, "", "")
145+
return text_progress_bar(self.level, self.next_rank_level, 5, "", "")
104146

105147
@property
106148
def xp_bar(self) -> str:

0 commit comments

Comments
 (0)