diff --git a/__init__.py b/__init__.py index 2025009..0107e5a 100644 --- a/__init__.py +++ b/__init__.py @@ -36,8 +36,7 @@ async def start(): # 初始化读取Json await g_pJsonManager.init() - aaa = await g_pFarmManager.sowing("1754798088", "胡萝卜", 1) - logger.info(aaa) + # await g_pFarmManager.harvest("1754798088") # 析构函数 @driver.on_shutdown diff --git a/command.py b/command.py index 3f74d7b..650f4e1 100644 --- a/command.py +++ b/command.py @@ -35,14 +35,12 @@ diuse_farm = on_alconna( "我的农场", Option("--all", action=store_true), Subcommand("my-point", help_text="我的农场币"), - Subcommand("plant-shop", help_text="种子商店"), - Subcommand("buy-plant", Args["name?", str]["num?", int], help_text="购买种子"), - Subcommand("my-plant", help_text="我的种子"), - Subcommand("my-props", help_text="我的农场道具"), + Subcommand("seed-shop", help_text="种子商店"), + Subcommand("buy-seed", Args["name?", str]["num?", int], help_text="购买种子"), + Subcommand("my-seed", help_text="我的种子"), Subcommand("sowing", Args["name?", str]["num?", int], help_text="播种"), - Subcommand("buy", Args["name?", str]["num?", int], help_text="购买道具"), - Subcommand("use", Args["name?", str]["num?", int], help_text="使用道具"), - Subcommand("gold-list", Args["num?", int], help_text="金币排行"), + Subcommand("harvest", help_text="收获"), + Subcommand("my-plant", help_text="我的作物") ), priority=5, rule=to_me(), @@ -82,11 +80,11 @@ async def _(session: Uninfo): diuse_farm.shortcut( "种子商店", command="我的农场", - arguments=["plant-shop"], + arguments=["seed-shop"], prefix=True, ) -@diuse_farm.assign("plant-shop") +@diuse_farm.assign("seed-shop") async def _(session: Uninfo): uid = str(session.user.id) point = await g_pSqlManager.getUserPointByUid(uid) @@ -95,17 +93,17 @@ async def _(session: Uninfo): await MessageUtils.build_message("尚未开通农场").send() return None - image = await g_pShopManager.getPlantShopImage() + image = await g_pShopManager.getSeedShopImage() await MessageUtils.build_message(image).send() diuse_farm.shortcut( "购买种子(?P.*?)", command="我的农场", - arguments=["buy-plant", "{name}"], + arguments=["buy-seed", "{name}"], prefix=True, ) -@diuse_farm.assign("buy-plant") +@diuse_farm.assign("buy-seed") async def _(session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", 1),): if not name.available: await MessageUtils.build_message( @@ -119,12 +117,75 @@ async def _(session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("n await MessageUtils.build_message("尚未开通农场").send() return None - result = await g_pShopManager.buyPlant(uid, name.result, num.result) + result = await g_pShopManager.buySeed(uid, name.result, num.result) await MessageUtils.build_message(result).send(reply_to=True) diuse_farm.shortcut( "我的种子", command="我的农场", + arguments=["my-seed"], + prefix=True, +) + +@diuse_farm.assign("my-seed") +async def _(session: Uninfo): + uid = str(session.user.id) + point = await g_pSqlManager.getUserPointByUid(uid) + + if point < 0: + await MessageUtils.build_message("尚未开通农场").send() + return None + + result = await g_pFarmManager.getUserSeedByUid(uid) + await MessageUtils.build_message(result).send(reply_to=True) + +diuse_farm.shortcut( + "播种(?P.*?)", + command="我的农场", + arguments=["sowing", "{name}"], + prefix=True, +) + +@diuse_farm.assign("sowing") +async def _(session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", 1),): + if not name.available: + await MessageUtils.build_message( + "请在指令后跟需要播种的种子名称" + ).finish(reply_to=True) + + uid = str(session.user.id) + point = await g_pSqlManager.getUserPointByUid(uid) + + if point < 0: + await MessageUtils.build_message("尚未开通农场").send() + return None + + result = await g_pFarmManager.sowing(uid, name.result, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "收获", + command="我的农场", + arguments=["harvest"], + prefix=True, +) + +@diuse_farm.assign("harvest") +async def _(session: Uninfo): + uid = str(session.user.id) + point = await g_pSqlManager.getUserPointByUid(uid) + + if point < 0: + await MessageUtils.build_message("尚未开通农场").send() + return None + + result = await g_pFarmManager.harvest(uid) + await MessageUtils.build_message(result).send(reply_to=True) + +diuse_farm.shortcut( + "我的作物", + command="我的农场", arguments=["my-plant"], prefix=True, ) @@ -140,28 +201,3 @@ async def _(session: Uninfo): result = await g_pFarmManager.getUserPlantByUid(uid) await MessageUtils.build_message(result).send(reply_to=True) - -diuse_farm.shortcut( - "播种(?P.*?)", - command="我的农场", - arguments=["sowing", "{name}"], - prefix=True, -) - -async def _(session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", 1),): - if not name.available: - await MessageUtils.build_message( - "请在指令后跟需要播种的种子名称" - ).finish(reply_to=True) - - uid = str(session.user.id) - point = await g_pSqlManager.getUserPointByUid(uid) - - if point < 0: - await MessageUtils.build_message("尚未开通农场").send() - return None - - return None - - # result = await g_pShopManager.buyPlant(uid, name.result, num.result) - # await MessageUtils.build_message(result).send(reply_to=True) diff --git a/database.py b/database.py index ab3a0dc..0c85944 100644 --- a/database.py +++ b/database.py @@ -1,6 +1,7 @@ import os from datetime import datetime, timedelta from io import StringIO +from math import e from typing import Any, List, Optional import aiosqlite @@ -55,7 +56,8 @@ class CSqlManager: CREATE TABLE storehouse ( uid INTEGER PRIMARY KEY AUTOINCREMENT, item TEXT DEFAULT '', - plant TEXT DEFAULT '' + plant TEXT DEFAULT '', + seed TEXT DEFAULT '' ); """ @@ -106,31 +108,16 @@ class CSqlManager: return False @classmethod - async def executeDBCursor(cls, command: str) -> Optional[List[Any]]: - """执行自定义SQL并返回查询结果 + async def initUserInfoByUid(cls, uid: str, name: str = "", exp: int = 0, point: int = 100): + """初始化用户信息 Args: - command (str): SQL查询语句 - - Returns: - Optional[List[Any]]: 查询结果列表(成功时),None(失败时) + uid (str): 用户Uid + name (str): 农场名称 + exp (int): 农场经验 + point (int): 农场币 """ - if len(command) <= 0: - logger.warning("空数据库命令") - return None - try: - async with cls.m_pDB.execute(command) as cursor: - # 将Row对象转换为字典列表 - results = [dict(row) for row in await cursor.fetchall()] - return results - except Exception as e: - logger.error(f"数据库执行失败: {e}") - return None - - @classmethod - async def initUserInfoByUid(cls, - uid: str, name: str = "", exp: int = 0, point: int = 100): #用户信息 userInfo = f""" INSERT INTO user (uid, name, exp, point) VALUES ({uid}, '{name}', {str(exp)}, {str(point)}) @@ -141,6 +128,7 @@ class CSqlManager: INSERT INTO storehouse (uid) VALUES ({uid}); """ + #用户土地 userSoilInfo = f""" INSERT INTO soil (uid) VALUES ({uid}); """ @@ -304,48 +292,62 @@ class CSqlManager: return soilNumber @classmethod - async def getUserSoilStatusBySoilID(cls, uid: str, soil: str) -> bool: + async def getUserSoilStatusBySoilID(cls, uid: str, soil: str) -> tuple[bool, str]: """根据土地块获取用户土地状态 Args: uid (str): 用户Uid - soil (str): 土地块 + soil (str): 土地id Returns: - bool: 是否可以播种 + tuple[bool, str]: [是否可以播种,土地信息] """ if len(uid) <= 0: - return False + return False, "" async with cls.m_pDB.execute(f"SELECT {soil} FROM soil WHERE uid = '{uid}'") as cursor: async for row in cursor: - if row[0] == None: - return True + if row[0] == None or len(row[0]) <= 0: + return True, "" + else: + return False, row[0] - return False + return False, "" @classmethod - async def updateUserSoilStatusBySowing(cls, uid: str, soil: str, plant: str) -> bool: + async def updateUserSoilStatusByPlantName(cls, uid: str, soil: str, plant: str = "", status: int = 0) -> bool: + """根据种子名称使用户播种 + + Args: + uid (str): 用户Uid + soil (str): 土地id + plant (str): 种子名称 + + Returns: + bool: 是否更新成功 + """ if len(uid) <= 0: return False - #获取种子信息 这里能崩我吃 - plantInfo = g_pJsonManager.m_pPlant['plant'][plant] # type: ignore + if len(plant) <= 0: + s = f",,,{status}" + else: + #获取种子信息 这里能崩我吃 + plantInfo = g_pJsonManager.m_pPlant['plant'][plant] # type: ignore + currentTime = datetime.now() + newTime = currentTime + timedelta(minutes=int(plantInfo['time'])) - currentTime = datetime.now() - newTime = currentTime + timedelta(minutes=int(plantInfo['time'])) + #种子名称,种下时间,预计成熟时间,地状态:0:无 1:长草 2:生虫 3:缺水 4:枯萎状态 + s = f"{plant},{int(currentTime.timestamp())},{int(newTime.timestamp())},{status}" - #种子名称,当前阶段,预计长大/预计下个阶段,地状态:0:无 1:长草 2:生虫 3:缺水 4:枯萎状态 - status = f"{plant},1,{int(newTime.timestamp())},0" - - sql = f"UPDATE soil SET {soil} = '{status}' WHERE uid = '{uid}'" + sql = f"UPDATE soil SET {soil} = '{s}' WHERE uid = '{uid}'" return await cls.executeDB(sql) @classmethod - async def getUserPlantByUid(cls, uid: str) -> str: + async def getUserSeedByUid(cls, uid: str) -> str: """获取用户仓库种子信息 Args: @@ -355,6 +357,49 @@ class CSqlManager: str: 仓库种子信息 """ + if len(uid) <= 0: + return "" + + try: + async with cls.m_pDB.execute(f"SELECT seed FROM storehouse WHERE uid = '{uid}'") as cursor: + async for row in cursor: + return row[0] + + return "" + except Exception as e: + logger.warning(f"getUserSeedByUid查询失败: {e}") + return "" + + @classmethod + async def updateUserSeedByUid(cls, uid: str, seed: str) -> bool: + """更新用户种子仓库 + + Args: + uid (str): 用户Uid + seed (str): 种子名称 + + Returns: + bool: + """ + + if len(uid) <= 0: + return False + + sql = f"UPDATE storehouse SET seed = '{seed}' WHERE uid = '{uid}'" + + return await cls.executeDB(sql) + + @classmethod + async def getUserPlantByUid(cls, uid: str) -> str: + """获取用户仓库作物信息 + + Args: + info (list[dict]): 用户信息 + + Returns: + str: 仓库作物信息 + """ + if len(uid) <= 0: return "" @@ -370,13 +415,14 @@ class CSqlManager: @classmethod async def updateUserPlantByUid(cls, uid: str, plant: str) -> bool: - """添加用户仓库种子信息 + """更新用户作物仓库 Args: - info (list[dict]): 种子信息 + uid (str): 用户Uid + plant (str): 作物名称 Returns: - bool: 是否添加成功 + bool: """ if len(uid) <= 0: diff --git a/farm/farm.py b/farm/farm.py index ca01ac3..6602815 100644 --- a/farm/farm.py +++ b/farm/farm.py @@ -1,4 +1,8 @@ -from numpy import arange +import asyncio +import logging +from datetime import datetime +from io import StringIO +from typing import Dict, List, Tuple from zhenxun.services.log import logger from zhenxun.utils._build_image import BuildImage @@ -22,15 +26,15 @@ class CFarmManager: """ soilNumber = await g_pSqlManager.getUserLevelByUid(uid) - img = BuildImage(background=g_sResourcePath / "background/background.jpg") + img = BuildImage(background = g_sResourcePath / "background/background.jpg") soilSize = g_pJsonManager.m_pSoil['size'] # type: ignore #TODO 缺少判断用户土地资源状况 - soil = BuildImage(background=g_sResourcePath / "soil/普通土地.png") + soil = BuildImage(background = g_sResourcePath / "soil/普通土地.png") await soil.resize(0, soilSize[0], soilSize[1]) - grass = BuildImage(background=g_sResourcePath / "soil/草土地.png") + grass = BuildImage(background = g_sResourcePath / "soil/草土地.png") await grass.resize(0, soilSize[0], soilSize[1]) soilPos = g_pJsonManager.m_pSoil['soil'] # type: ignore @@ -38,7 +42,9 @@ class CFarmManager: x = 0 y = 0 - isFirst = True + isFirstExpansion = True #首次添加扩建图片 + isFirstRipe = True + plant = None for index, level in enumerate(soilUnlock): x = soilPos[str(index + 1)]['x'] y = soilPos[str(index + 1)]['y'] @@ -47,25 +53,88 @@ class CFarmManager: if soilNumber >= int(level): await img.paste(soil, (x, y)) - #TODO 缺少判断土地上是否有农作物 - plant = BuildImage(background=g_sResourcePath / "plant/basic/0.png") - await plant.resize(0, 35, 58) - await img.paste(plant, (x + 100, y + 50)) + isPlant, plant, isRipe= await cls.drawSoilPlant(uid, f"soil{str(index + 1)}") + + if isPlant: + await img.paste(plant, (x + soilSize[0] // 2 - plant.width // 2, + y + soilSize[1] // 2 - plant.height // 2)) + + #首次添加可收获图片 + if isRipe and isFirstRipe: + ripe = BuildImage(background = g_sResourcePath / "background/ripe.png") + + await img.paste(ripe, (x + soilSize[0] // 2 - ripe.width // 2, + y - ripe.height // 2)) + + isFirstRipe = False else: await img.paste(grass, (x, y)) - if isFirst: - isFirst = False + if isFirstExpansion: + isFirstExpansion = False #首次添加扩建图片 - expansion = BuildImage(background=g_sResourcePath / "background/expansion.png") + expansion = BuildImage(background = g_sResourcePath / "background/expansion.png") await expansion.resize(0, 69, 69) - await img.paste(expansion, (x + 85, y + 20)) + await img.paste(expansion, (x + soilSize[0] // 2 - expansion.width // 2, + y + soilSize[1] // 2 - expansion.height)) + await img.resize(0.6) return img.pic2bytes() @classmethod - async def getUserPlantByUid(cls, uid: str) -> bytes: + async def drawSoilPlant(cls, uid: str, soilid: str) -> tuple[bool, BuildImage, bool]: + """绘制植物资源 + + Args: + uid (str): 用户Uid + soilid (str): 土地id + + Returns: + tuple[bool, BuildImage]: [绘制是否成功,资源图片, 是否成熟] + """ + + plant = None + soilStatus, soilInfo = await g_pSqlManager.getUserSoilStatusBySoilID(uid, soilid) + + if soilStatus == True: + return False, None, False + else: + soilInfo = soilInfo.split(',') + plantInfo = g_pJsonManager.m_pPlant['plant'][soilInfo[0]] # type: ignore + + if int(soilInfo[3]) == 4: + plant = BuildImage(background = g_sResourcePath / f"plant/basic/9.png") + + return True, plant, False + + currentTime = datetime.now() + matureTime = datetime.fromtimestamp(int(soilInfo[2])) + + if currentTime >= matureTime: + phase = int(plantInfo['phase']) + plant = BuildImage(background = g_sResourcePath / f"plant/{soilInfo[0]}/{phase - 1}.png") + + return True, plant, True + else: + plantedTime = datetime.fromtimestamp(int(soilInfo[1])) + + elapsedTime = currentTime - plantedTime + elapsedMinutes = elapsedTime.total_seconds() / 60 + + currentStage = int(elapsedMinutes / (plantInfo['time'] / (plantInfo['phase'] - 1))) + + #TODO 缺少判断部分种子是否是通用0阶段图片 + if currentStage <= 0: + plant = BuildImage(background = g_sResourcePath / f"plant/basic/0.png") + await plant.resize(0, 35, 58) + else: + plant = BuildImage(background = g_sResourcePath / f"plant/{soilInfo[0]}/{currentStage}.png") + + return True, plant, False + + @classmethod + async def getUserSeedByUid(cls, uid: str) -> bytes: """获取用户种子仓库 Args: @@ -88,12 +157,194 @@ class CFarmManager: "是否可以上架交易行" ] + seed = await g_pSqlManager.getUserSeedByUid(uid) + + if seed == None: + result = await ImageTemplate.table_page( + "种子仓库", + "播种示例:@小真寻 播种 大白菜 [数量]", + column_name, + data_list, + ) + + return result.pic2bytes() + + sell = "" + for item in seed.split(','): + if '|' in item: + seedName, count = item.split('|', 1) # 分割一次,避免多竖线问题 + try: + plantInfo = g_pJsonManager.m_pPlant['plant'][seedName] # type: ignore + + icon = "" + icon_path = g_sResourcePath / f"plant/{seedName}/icon.png" + if icon_path.exists(): + icon = (icon_path, 33, 33) + + if plantInfo['again'] == True: + sell = "可以" + else: + sell = "不可以" + + data_list.append( + [ + icon, + seedName, + count, + plantInfo['experience'], + plantInfo['harvest'], + plantInfo['time'], + plantInfo['crop'], + plantInfo['again'], + sell + ] + ) + + except Exception as e: + continue + + result = await ImageTemplate.table_page( + "种子仓库", + "播种示例:@小真寻 播种 大白菜 [数量]", + column_name, + data_list, + ) + + return result.pic2bytes() + + @classmethod + async def sowing(cls, uid: str, name: str, num: int = -1) -> str: + """播种 + + Args: + uid (str): 用户Uid + name (str): 播种种子名称 + num (int, optional): 播种数量 + + Returns: + str: + """ + plant = await g_pSqlManager.getUserSeedByUid(uid) + + if plant == None: + return "你的种子仓库是空的,快去买点吧!" + + plantDict = {} + for item in plant.split(','): + if '|' in item: + seed_name, count = item.split('|', 1) + plantDict[seed_name] = int(count) + + isAll = False + if num == -1: + isAll = True + + soilNumber = await g_pSqlManager.getUserSoilByUid(uid) + + for i in range(1, soilNumber + 1): + if plantDict[name] > 0: + if isAll or num > 0: + soilName = f"soil{i}" + success, message = await g_pSqlManager.getUserSoilStatusBySoilID(uid, soilName) + if success: + # 更新种子数量 + num -= 1 + plantDict[name] -= 1 + if plantDict[name] == 0: + del plantDict[name] + + # 更新数据库 + await g_pSqlManager.updateUserSoilStatusByPlantName(uid, soilName, name) + + await g_pSqlManager.updateUserSeedByUid( + uid, + ','.join([f"{k}|{v}" for k, v in plantDict.items()]) + ) + + if num > 0: + return f"播种数量超出解锁土地数量,已将可播种土地成功播种{name}!仓库还剩下{plantDict[name]}个种子" + else: + return f"播种{name}成功!仓库还剩下{plantDict[name]}个种子" + + @classmethod + async def harvest(cls, uid: str) -> str: + """收获作物 + + Args: + uid (str): 用户Uid + + Returns: + str: 返回 + """ + + soilNumber = await g_pSqlManager.getUserLevelByUid(uid) + soilUnlock = g_pJsonManager.m_pLevel['soil'] # type: ignore + + plant = {} + + soilNames = [f"soil{i + 1}" for i, level in enumerate(soilUnlock) if soilNumber >= level] + soilStatuses = await asyncio.gather(*[ + g_pSqlManager.getUserSoilStatusBySoilID(uid, name) + for name in soilNames + ]) + + plant: Dict[str, int] = {} + harvest_records: List[str] = [] + + for (soil_name, (status, info)) in zip(soilNames, soilStatuses): + if not status: + soil_info = info.split(',') + plant_id = soil_info[0] + plant_info = g_pJsonManager.m_pPlant['plant'][plant_id] # type: ignore + + current_time = datetime.now() + mature_time = datetime.fromtimestamp(int(soil_info[2])) + + if current_time >= mature_time: + plant[plant_id] = plant.get(plant_id, 0) + plant_info['harvest'] + harvest_records.append(f"收获作物:{plant_id},数量为:{plant_info['harvest']}") + + # 批量更新数据库操作 + await g_pSqlManager.updateUserSoilStatusByPlantName(uid, soil_name, "", 4) + + if not plant: + return "可收获作物为0哦~ 不要试图拔苗助长" + else: + # 批量更新用户作物数据 + await g_pSqlManager.updateUserPlantByUid( + uid, + ','.join([f"{k}|{v}" for k, v in plant.items()]) + ) + + return "\n".join(harvest_records) + + @classmethod + async def getUserPlantByUid(cls, uid: str) -> bytes: + """获取用户作物仓库 + + Args: + uid (str): 用户Uid + + Returns: + bytes: 返回图片 + """ + + data_list = [] + column_name = [ + "-", + "作物名称", + "数量", + "单价", + "总价", + "是否可以上架交易行" + ] + plant = await g_pSqlManager.getUserPlantByUid(uid) if plant == None: result = await ImageTemplate.table_page( - "种子仓库", - "播种示例:@小真寻 播种 大白菜", + "作物仓库", + "播种示例:@小真寻 出售作物 大白菜 [数量]", column_name, data_list, ) @@ -122,11 +373,8 @@ class CFarmManager: icon, plantName, count, - plantInfo['experience'], - plantInfo['harvest'], - plantInfo['time'], - plantInfo['crop'], - plantInfo['again'], + plantInfo['price'], + count * int(plantInfo['price']), sell ] ) @@ -135,51 +383,12 @@ class CFarmManager: continue result = await ImageTemplate.table_page( - "种子商店", - "购买示例:@小真寻 购买种子 大白菜 5", + "作物仓库", + "播种示例:@小真寻 出售作物 大白菜 [数量]", column_name, data_list, ) return result.pic2bytes() - @classmethod - async def sowing(cls, uid: str, name: str, num: int = 1) -> str: - """播种 - - Args: - uid (str): 用户Uid - name (str): 播种种子名称 - num (int, optional): 播种数量 - - Returns: - str: - """ - plant = await g_pSqlManager.getUserPlantByUid(uid) - - if plant == None: - return "你的种子仓库是空的,快去买点吧!" - - for item in plant.split(','): - if '|' in item: - plantName, count = item.split('|', 1) # 分割一次,避免多竖线问题 - - #判断仓库是否有当前播种种子 - if plantName == name: - count = int(count) - - #获取用户解锁多少块地 - soilName = "" - soilNumber = await g_pSqlManager.getUserSoilByUid(uid) - #遍历地块,查看地块是否可以播种 - for i in arange(1, soilNumber + 1): - if count > 0: - soilName = f"soil{str(i)}" - #如果可以播种 - if await g_pSqlManager.getUserSoilStatusBySoilID(uid, soilName): - count -= 1 - await g_pSqlManager.updateUserSoilStatusBySowing(uid, soilName, plantName) - return f"播种{plantName}成功!" - return "播种失败" - g_pFarmManager = CFarmManager() diff --git a/farm/shop.py b/farm/shop.py index bb6b76c..ae1f751 100644 --- a/farm/shop.py +++ b/farm/shop.py @@ -9,11 +9,13 @@ from ..database import g_pSqlManager class CShopManager: @classmethod - async def getPlantShopImage(cls) -> bytes: - """by ATTomato + async def getSeedShopImage(cls) -> bytes: + """获取商店页面 + + TODO: 缺少翻页功能 Returns: - bytes: _description_ + bytes: 返回商店图片bytes """ data_list = [] @@ -68,7 +70,18 @@ class CShopManager: return result.pic2bytes() @classmethod - async def buyPlant(cls, uid: str, name: str, num: int = 1) -> str: + async def buySeed(cls, uid: str, name: str, num: int = 1) -> str: + """购买种子 + + Args: + uid (str): 用户Uid + name (str): 植物名称 + num (int, optional): 购买数量 + + Returns: + str: + """ + if num <= 0: return "请输入购买数量!" @@ -89,7 +102,7 @@ class CShopManager: if point < total: return "你的农场币不够哦~ 快速速氪金吧!" else: - p = await g_pSqlManager.getUserPlantByUid(uid) + p = await g_pSqlManager.getUserSeedByUid(uid) if not p == None: for item in p.split(','): @@ -102,10 +115,10 @@ class CShopManager: else: userPlants[name] = num - plant_list = [f"{k}|{v}" for k, v in userPlants.items()] + plantList = [f"{k}|{v}" for k, v in userPlants.items()] await g_pSqlManager.updateUserPointByUid(uid, point - total) - await g_pSqlManager.updateUserPlantByUid(uid, ','.join(plant_list)) + await g_pSqlManager.updateUserSeedByUid(uid, ','.join(plantList)) return f"成功购买{name},当前仓库数量为:{userPlants[name]},花费{total}农场币, 剩余{point - total}农场币" diff --git a/resource/background/gains.png b/resource/background/ripe.png similarity index 100% rename from resource/background/gains.png rename to resource/background/ripe.png diff --git a/resource/plant/胡萝卜/4.png b/resource/plant/胡萝卜/4.png index a96ab40..8507c1a 100644 Binary files a/resource/plant/胡萝卜/4.png and b/resource/plant/胡萝卜/4.png differ