feat✨: 新增土地资源坐标
refactor🎨: 移除部分全局变量
This commit is contained in:
parent
0185e2cb44
commit
2bf5ab8052
12
__init__.py
12
__init__.py
@ -2,9 +2,14 @@ from nonebot import get_driver
|
|||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
|
|
||||||
from zhenxun.configs.utils import PluginExtraData
|
from zhenxun.configs.utils import PluginExtraData
|
||||||
|
from zhenxun.utils.message import MessageUtils
|
||||||
|
|
||||||
from .command import diuse_farm, diuse_register
|
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(
|
__plugin_meta = PluginMetadata(
|
||||||
name="真寻的农场",
|
name="真寻的农场",
|
||||||
@ -26,11 +31,16 @@ driver = get_driver()
|
|||||||
@driver.on_startup
|
@driver.on_startup
|
||||||
async def start():
|
async def start():
|
||||||
# 初始化数据库
|
# 初始化数据库
|
||||||
|
# await g_pSqlManager.init()
|
||||||
|
|
||||||
await g_pSqlManager.init()
|
await g_pSqlManager.init()
|
||||||
|
|
||||||
# 初始化读取Json
|
# 初始化读取Json
|
||||||
|
# await g_pJsonManager.init()
|
||||||
await g_pJsonManager.init()
|
await g_pJsonManager.init()
|
||||||
|
|
||||||
|
# await g_pDrawImage.drawMyFarm("11223")
|
||||||
|
await g_pDrawImage.drawMyFarm("22")
|
||||||
|
|
||||||
# 析构函数
|
# 析构函数
|
||||||
@driver.on_shutdown
|
@driver.on_shutdown
|
||||||
|
|||||||
15
command.py
15
command.py
@ -5,7 +5,8 @@ from nonebot_plugin_uninfo import Uninfo
|
|||||||
|
|
||||||
from zhenxun.utils.message import MessageUtils
|
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(
|
diuse_register = on_alconna(
|
||||||
Alconna("开通农场"),
|
Alconna("开通农场"),
|
||||||
@ -23,7 +24,7 @@ async def _(session: Uninfo):
|
|||||||
if user:
|
if user:
|
||||||
await MessageUtils.build_message("你已经有啦").send(reply_to=True)
|
await MessageUtils.build_message("你已经有啦").send(reply_to=True)
|
||||||
else:
|
else:
|
||||||
info = {"uid": uid, "name": "测试", "level": 1, "point": 0}
|
info = {"uid": uid, "name": "测试", "exp": 0, "point": 100}
|
||||||
|
|
||||||
aaa = await g_pSqlManager.appendUserByUserInfo(info)
|
aaa = await g_pSqlManager.appendUserByUserInfo(info)
|
||||||
|
|
||||||
@ -50,7 +51,14 @@ diuse_farm = on_alconna(
|
|||||||
@diuse_farm.assign("$main")
|
@diuse_farm.assign("$main")
|
||||||
async def _(session: Uninfo):
|
async def _(session: Uninfo):
|
||||||
uid = str(session.user.id)
|
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()
|
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)
|
).finish(reply_to=True)
|
||||||
|
|
||||||
|
# result = await ShopManage.buy_prop(session.user.id, name.result, num.result)
|
||||||
|
|
||||||
uid = str(session.user.id)
|
uid = str(session.user.id)
|
||||||
point = await g_pSqlManager.getUserPointByUid(uid)
|
point = await g_pSqlManager.getUserPointByUid(uid)
|
||||||
|
|||||||
64
config.py
64
config.py
@ -9,24 +9,29 @@ g_sDBFilePath = DATA_PATH / "farm_db/farm.db"
|
|||||||
|
|
||||||
g_sResourcePath = Path(__file__).resolve().parent / "resource"
|
g_sResourcePath = Path(__file__).resolve().parent / "resource"
|
||||||
|
|
||||||
|
|
||||||
class CJsonManager:
|
class CJsonManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.m_pItem = None
|
self.m_pItem = None
|
||||||
self.m_pPlant = None
|
self.m_pPlant = None
|
||||||
|
self.m_pLevel = None
|
||||||
|
self.m_pSoil = None
|
||||||
|
|
||||||
@classmethod
|
async def init(self) -> bool:
|
||||||
async def init(cls) -> bool:
|
if not await self.initItem():
|
||||||
if not await cls.initItem():
|
|
||||||
return False
|
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 False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@classmethod
|
async def initItem(self) -> bool:
|
||||||
async def initItem(cls) -> bool:
|
|
||||||
current_file_path = Path(__file__)
|
current_file_path = Path(__file__)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -34,7 +39,7 @@ class CJsonManager:
|
|||||||
current_file_path.resolve().parent / "config/item.json",
|
current_file_path.resolve().parent / "config/item.json",
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
) as file:
|
) as file:
|
||||||
cls.m_pItem = json.load(file)
|
self.m_pItem = json.load(file)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@ -44,8 +49,7 @@ class CJsonManager:
|
|||||||
logger.warning(f"item.json JSON格式错误: {e}")
|
logger.warning(f"item.json JSON格式错误: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@classmethod
|
async def initPlant(self) -> bool:
|
||||||
async def initPlant(cls) -> bool:
|
|
||||||
current_file_path = Path(__file__)
|
current_file_path = Path(__file__)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -53,7 +57,7 @@ class CJsonManager:
|
|||||||
current_file_path.resolve().parent / "config/plant.json",
|
current_file_path.resolve().parent / "config/plant.json",
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
) as file:
|
) as file:
|
||||||
cls.m_pPlant = json.load(file)
|
self.m_pPlant = json.load(file)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@ -62,3 +66,41 @@ class CJsonManager:
|
|||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
logger.warning(f"plant.json JSON格式错误: {e}")
|
logger.warning(f"plant.json JSON格式错误: {e}")
|
||||||
return False
|
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
10
config/level.json
Normal 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
155
config/soil.json
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
75
database.py
75
database.py
@ -4,7 +4,7 @@ import aiosqlite
|
|||||||
|
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
|
|
||||||
from .config import g_sDBFilePath, g_sDBPath
|
from .config import CJsonManager, g_sDBFilePath, g_sDBPath
|
||||||
|
|
||||||
|
|
||||||
class CSqlManager:
|
class CSqlManager:
|
||||||
@ -42,7 +42,7 @@ class CSqlManager:
|
|||||||
CREATE TABLE user (
|
CREATE TABLE user (
|
||||||
uid INTEGER PRIMARY KEY AUTOINCREMENT,
|
uid INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
level INTEGER DEFAULT 1,
|
exp INTEGER DEFAULT 0,
|
||||||
point INTEGER DEFAULT 0
|
point INTEGER DEFAULT 0
|
||||||
);
|
);
|
||||||
""")
|
""")
|
||||||
@ -75,7 +75,7 @@ class CSqlManager:
|
|||||||
user_dict = {
|
user_dict = {
|
||||||
"uid": row[0],
|
"uid": row[0],
|
||||||
"name": row[1],
|
"name": row[1],
|
||||||
"level": row[2],
|
"exp": row[2],
|
||||||
"point": row[3],
|
"point": row[3],
|
||||||
}
|
}
|
||||||
results.append(user_dict)
|
results.append(user_dict)
|
||||||
@ -87,6 +87,14 @@ class CSqlManager:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def getUserPointByUid(cls, uid: str) -> int:
|
async def getUserPointByUid(cls, uid: str) -> int:
|
||||||
|
"""根据用户Uid获取用户农场币
|
||||||
|
|
||||||
|
Args:
|
||||||
|
uid (str): 用户Uid
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: 用户农场币
|
||||||
|
"""
|
||||||
if len(uid) <= 0:
|
if len(uid) <= 0:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
@ -100,6 +108,61 @@ class CSqlManager:
|
|||||||
logger.warning(f"查询失败: {e}")
|
logger.warning(f"查询失败: {e}")
|
||||||
return -1
|
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
|
@classmethod
|
||||||
async def appendUserByUserInfo(cls, info: list[dict]) -> bool:
|
async def appendUserByUserInfo(cls, info: list[dict]) -> bool:
|
||||||
"""添加用户信息
|
"""添加用户信息
|
||||||
@ -114,9 +177,9 @@ class CSqlManager:
|
|||||||
try:
|
try:
|
||||||
await cls.m_pDB.execute(
|
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()
|
await cls.m_pDB.commit()
|
||||||
|
|
||||||
@ -124,3 +187,5 @@ class CSqlManager:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"添加失败: {e}")
|
logger.warning(f"添加失败: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
g_pSqlManager = CSqlManager()
|
||||||
|
|||||||
36
drawImage.py
36
drawImage.py
@ -1,11 +1,43 @@
|
|||||||
|
from ast import arg
|
||||||
|
|
||||||
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils._build_image import BuildImage
|
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:
|
class CDrawImageManager:
|
||||||
|
|
||||||
@classmethod
|
@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")
|
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()
|
return img.pic2bytes()
|
||||||
|
|
||||||
|
g_pDrawImage = CDrawImageManager()
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
from .config import CJsonManager
|
# from .config import CJsonManager
|
||||||
from .database import CSqlManager
|
# from .database import CSqlManager
|
||||||
from .drawImage import CDrawImageManager
|
# 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)
|
||||||
|
|||||||
BIN
resource/soil/普通土地.png
Normal file
BIN
resource/soil/普通土地.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
BIN
resource/soil/缺水-普通土地.png
Normal file
BIN
resource/soil/缺水-普通土地.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
resource/soil/草土地.png
Normal file
BIN
resource/soil/草土地.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Loading…
Reference in New Issue
Block a user