feat: 新增土地资源坐标

refactor🎨: 移除部分全局变量
This commit is contained in:
Art_Sakura 2025-03-18 18:39:02 +08:00
parent 0185e2cb44
commit 2bf5ab8052
11 changed files with 351 additions and 28 deletions

View File

@ -2,9 +2,14 @@ from nonebot import get_driver
from nonebot.plugin import PluginMetadata
from zhenxun.configs.utils import PluginExtraData
from zhenxun.utils.message import MessageUtils
from .command import diuse_farm, diuse_register
from .globalClass import g_pJsonManager, g_pSqlManager
from .config import g_pJsonManager
from .database import g_pSqlManager
from .drawImage import g_pDrawImage
# from .globalClass import g_pDrawImage, g_pJsonManager, g_pSqlManager
__plugin_meta = PluginMetadata(
name="真寻的农场",
@ -26,11 +31,16 @@ driver = get_driver()
@driver.on_startup
async def start():
# 初始化数据库
# await g_pSqlManager.init()
await g_pSqlManager.init()
# 初始化读取Json
# await g_pJsonManager.init()
await g_pJsonManager.init()
# await g_pDrawImage.drawMyFarm("11223")
await g_pDrawImage.drawMyFarm("22")
# 析构函数
@driver.on_shutdown

View File

@ -5,7 +5,8 @@ from nonebot_plugin_uninfo import Uninfo
from zhenxun.utils.message import MessageUtils
from .globalClass import g_pDrawImage, g_pSqlManager
from .database import g_pSqlManager
from .drawImage import g_pDrawImage
diuse_register = on_alconna(
Alconna("开通农场"),
@ -23,7 +24,7 @@ async def _(session: Uninfo):
if user:
await MessageUtils.build_message("你已经有啦").send(reply_to=True)
else:
info = {"uid": uid, "name": "测试", "level": 1, "point": 0}
info = {"uid": uid, "name": "测试", "exp": 0, "point": 100}
aaa = await g_pSqlManager.appendUserByUserInfo(info)
@ -50,7 +51,14 @@ diuse_farm = on_alconna(
@diuse_farm.assign("$main")
async def _(session: Uninfo):
uid = str(session.user.id)
image = await g_pDrawImage.drawMyFarm()
level = await g_pSqlManager.getUserLevelByUid(uid)
if level <= 0:
await MessageUtils.build_message("尚未开通农场").send()
return None
image = await g_pDrawImage.drawMyFarm(uid)
await MessageUtils.build_message(image).send()
@ -96,6 +104,7 @@ async def _(session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("n
"请在指令后跟需要购买的种子名称"
).finish(reply_to=True)
# result = await ShopManage.buy_prop(session.user.id, name.result, num.result)
uid = str(session.user.id)
point = await g_pSqlManager.getUserPointByUid(uid)

View File

@ -9,24 +9,29 @@ g_sDBFilePath = DATA_PATH / "farm_db/farm.db"
g_sResourcePath = Path(__file__).resolve().parent / "resource"
class CJsonManager:
def __init__(self):
self.m_pItem = None
self.m_pPlant = None
self.m_pLevel = None
self.m_pSoil = None
@classmethod
async def init(cls) -> bool:
if not await cls.initItem():
async def init(self) -> bool:
if not await self.initItem():
return False
if not await cls.initPlant():
if not await self.initPlant():
return False
if not await self.initLevel():
return False
if not await self.initSoil():
return False
return True
@classmethod
async def initItem(cls) -> bool:
async def initItem(self) -> bool:
current_file_path = Path(__file__)
try:
@ -34,7 +39,7 @@ class CJsonManager:
current_file_path.resolve().parent / "config/item.json",
encoding="utf-8",
) as file:
cls.m_pItem = json.load(file)
self.m_pItem = json.load(file)
return True
except FileNotFoundError:
@ -44,8 +49,7 @@ class CJsonManager:
logger.warning(f"item.json JSON格式错误: {e}")
return False
@classmethod
async def initPlant(cls) -> bool:
async def initPlant(self) -> bool:
current_file_path = Path(__file__)
try:
@ -53,7 +57,7 @@ class CJsonManager:
current_file_path.resolve().parent / "config/plant.json",
encoding="utf-8",
) as file:
cls.m_pPlant = json.load(file)
self.m_pPlant = json.load(file)
return True
except FileNotFoundError:
@ -62,3 +66,41 @@ class CJsonManager:
except json.JSONDecodeError as e:
logger.warning(f"plant.json JSON格式错误: {e}")
return False
async def initLevel(self) -> bool:
current_file_path = Path(__file__)
try:
with open(
current_file_path.resolve().parent / "config/level.json",
encoding="utf-8",
) as file:
self.m_pLevel = json.load(file)
return True
except FileNotFoundError:
logger.warning("plant.json 打开失败")
return False
except json.JSONDecodeError as e:
logger.warning(f"plant.json JSON格式错误: {e}")
return False
async def initSoil(self) -> bool:
current_file_path = Path(__file__)
try:
with open(
current_file_path.resolve().parent / "config/soil.json",
encoding="utf-8",
) as file:
self.m_pSoil = json.load(file)
return True
except FileNotFoundError:
logger.warning("plant.json 打开失败")
return False
except json.JSONDecodeError as e:
logger.warning(f"plant.json JSON格式错误: {e}")
return False
g_pJsonManager = CJsonManager()

10
config/level.json Normal file
View File

@ -0,0 +1,10 @@
{
"level":
{
"1": 0,
"2": 3000,
"3": 7500
},
"soil":[1, 5, 10, 15, 25, 35],
"point":[0, 2000, 5000, 10000, 30000, 50000]
}

155
config/soil.json Normal file
View File

@ -0,0 +1,155 @@
{
"soil":
{
"1":
{
"x": 1341,
"y": 571
},
"2":
{
"x": 1455,
"y": 627
},
"3":
{
"x": 1574,
"y": 686
},
"4":
{
"x": 1689,
"y": 745
},
"5":
{
"x": 1806,
"y": 804
},
"6":
{
"x": 1926,
"y": 863
},
"7":
{
"x": 1226,
"y": 627
},
"8":
{
"x": 1340,
"y": 683
},
"9":
{
"x": 1455,
"y": 739
},
"10":
{
"x": 1573,
"y": 798
},
"11":
{
"x": 1690,
"y": 857
},
"12":
{
"x": 1807,
"y": 916
},
"13":
{
"x": 1111,
"y": 683
},
"14":
{
"x": 1226,
"y": 739
},
"15":
{
"x": 1340,
"y": 795
},
"16":
{
"x": 1458,
"y": 855
},
"17":
{
"x": 1575,
"y": 912
},
"18":
{
"x": 1693,
"y": 972
},
"19":
{
"x": 997,
"y": 739
},
"20":
{
"x": 1111,
"y": 795
},
"21":
{
"x": 1225,
"y": 851
},
"22":
{
"x": 1341,
"y": 910
},
"23":
{
"x": 1461,
"y": 967
},
"24":
{
"x": 1578,
"y": 1025
},
"25":
{
"x": 882,
"y": 795
},
"26":
{
"x": 997,
"y": 851
},
"27":
{
"x": 1111,
"y": 907
},
"28":
{
"x": 1226,
"y": 963
},
"29":
{
"x": 1343,
"y": 1025
},
"30":
{
"x": 1460,
"y": 1084
}
}
}

View File

@ -4,7 +4,7 @@ import aiosqlite
from zhenxun.services.log import logger
from .config import g_sDBFilePath, g_sDBPath
from .config import CJsonManager, g_sDBFilePath, g_sDBPath
class CSqlManager:
@ -42,7 +42,7 @@ class CSqlManager:
CREATE TABLE user (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
level INTEGER DEFAULT 1,
exp INTEGER DEFAULT 0,
point INTEGER DEFAULT 0
);
""")
@ -75,7 +75,7 @@ class CSqlManager:
user_dict = {
"uid": row[0],
"name": row[1],
"level": row[2],
"exp": row[2],
"point": row[3],
}
results.append(user_dict)
@ -87,6 +87,14 @@ class CSqlManager:
@classmethod
async def getUserPointByUid(cls, uid: str) -> int:
"""根据用户Uid获取用户农场币
Args:
uid (str): 用户Uid
Returns:
int: 用户农场币
"""
if len(uid) <= 0:
return -1
@ -100,6 +108,61 @@ class CSqlManager:
logger.warning(f"查询失败: {e}")
return -1
@classmethod
async def getUserLevelByUid(cls, uid: str) -> int:
"""根据用户Uid获取用户等级
Args:
uid (str): 用户Uid
Returns:
int: 用户等级`
"""
if len(uid) <= 0:
return -1
try:
async with cls.m_pDB.execute(
"SELECT exp FROM user WHERE uid = ?", (uid,)
) as cursor:
async for row in cursor:
exp = int(row[0])
#获取等级列表
levelDict = g_pJsonManager.m_pLevel['level']
sorted_keys = sorted(levelDict.keys(), key=lambda x: int(x), reverse=True)
for key in sorted_keys:
if exp >= levelDict[key]:
return int(key)
except Exception as e:
logger.warning(f"查询失败: {e}")
return -1
@classmethod
async def getUserSoilByUid(cls, uid: str) -> int:
"""根据用户Uid获取解锁地块
Args:
uid (str): 用户Uid
Returns:
int: 解锁几块地
"""
if len(uid) <= 0:
return -1
level = await cls.getUserLevelByUid(uid)
soilNumber = 0
soil_list = g_pJsonManager.m_pLevel['soil'] # type: ignore
#获取解锁地块
for soil in soil_list:
if level >= soil:
soilNumber += 1
return soilNumber
@classmethod
async def appendUserByUserInfo(cls, info: list[dict]) -> bool:
"""添加用户信息
@ -114,9 +177,9 @@ class CSqlManager:
try:
await cls.m_pDB.execute(
"""
INSERT INTO user (uid, name, level, point) VALUES (?, ?, ?, ?)
INSERT INTO user (uid, name, exp, point) VALUES (?, ?, ?, ?)
""",
(info["uid"], info["name"], info["level"], info["point"]),
(info["uid"], info["name"], info["exp"], info["point"]),
)
await cls.m_pDB.commit()
@ -124,3 +187,5 @@ class CSqlManager:
except Exception as e:
logger.warning(f"添加失败: {e}")
return False
g_pSqlManager = CSqlManager()

View File

@ -1,11 +1,43 @@
from ast import arg
from zhenxun.services.log import logger
from zhenxun.utils._build_image import BuildImage
from .config import g_sResourcePath
from .config import g_pJsonManager, g_sResourcePath
from .database import g_pSqlManager
class CDrawImageManager:
@classmethod
async def drawMyFarm(cls) -> bytes:
async def drawMyFarm(cls, uid: str) -> bytes:
"""绘制我的农场
Args:
uid (str): 用户UID
Returns:
bytes: 返回绘制结果
"""
# soilNumber = await self.m_pSql.getUserLevelByUid(uid)
soilNumber = 1
img = BuildImage(background=g_sResourcePath / "background/background.jpg")
soil = BuildImage(background=g_sResourcePath / "soil/普通土地.png")
await soil.resize(0, 229, 112)
grass = BuildImage(background=g_sResourcePath / "soil/草土地.png")
await grass.resize(0, 229, 112)
soilPos = g_pJsonManager.m_pSoil['soil']
for key, value in soilPos.items():
if soilNumber >= int(key):
await img.paste(soil, (value['x'], value['y']), center_type="center")
else:
await img.paste(grass, (value['x'], value['y']), center_type="center")
return img.pic2bytes()
g_pDrawImage = CDrawImageManager()

View File

@ -1,9 +1,9 @@
from .config import CJsonManager
from .database import CSqlManager
from .drawImage import CDrawImageManager
# from .config import CJsonManager
# from .database import CSqlManager
# from .drawImage import CDrawImageManager
g_pJsonManager = CJsonManager()
# g_pJsonManager = CJsonManager()
g_pSqlManager = CSqlManager()
# g_pSqlManager = CSqlManager()
g_pDrawImage = CDrawImageManager()
# g_pDrawImage = CDrawImageManager(g_pJsonManager, g_pSqlManager)

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
resource/soil/草土地.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB