mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-11-06 12:40:04 +08:00
add # 新增开垦、升级土地功能
This commit is contained in:
@@ -55,7 +55,10 @@ class FarmService:
|
||||
|
||||
def operation(repository, now):
|
||||
created = repository.register(name)
|
||||
return self._result(repository, created=created)
|
||||
return self._result(
|
||||
repository, created=created,
|
||||
plot_count=len(repository.plots()),
|
||||
)
|
||||
|
||||
return await self._execute(
|
||||
identity, operation_id, "register", {"name": name}, operation,
|
||||
|
||||
@@ -0,0 +1,480 @@
|
||||
{
|
||||
"initial_plot_count": 6,
|
||||
"expansion": {
|
||||
"rows": [
|
||||
{
|
||||
"ordinal": 7,
|
||||
"required_level": 5,
|
||||
"coin_cost": 10000
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"required_level": 7,
|
||||
"coin_cost": 20000
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"required_level": 9,
|
||||
"coin_cost": 30000
|
||||
},
|
||||
{
|
||||
"ordinal": 10,
|
||||
"required_level": 11,
|
||||
"coin_cost": 50000
|
||||
},
|
||||
{
|
||||
"ordinal": 11,
|
||||
"required_level": 13,
|
||||
"coin_cost": 70000
|
||||
},
|
||||
{
|
||||
"ordinal": 12,
|
||||
"required_level": 15,
|
||||
"coin_cost": 90000
|
||||
},
|
||||
{
|
||||
"ordinal": 13,
|
||||
"required_level": 17,
|
||||
"coin_cost": 120000
|
||||
},
|
||||
{
|
||||
"ordinal": 14,
|
||||
"required_level": 19,
|
||||
"coin_cost": 150000
|
||||
},
|
||||
{
|
||||
"ordinal": 15,
|
||||
"required_level": 21,
|
||||
"coin_cost": 180000
|
||||
},
|
||||
{
|
||||
"ordinal": 16,
|
||||
"required_level": 23,
|
||||
"coin_cost": 230000
|
||||
},
|
||||
{
|
||||
"ordinal": 17,
|
||||
"required_level": 25,
|
||||
"coin_cost": 300000
|
||||
},
|
||||
{
|
||||
"ordinal": 18,
|
||||
"required_level": 27,
|
||||
"coin_cost": 500000
|
||||
},
|
||||
{
|
||||
"ordinal": 19,
|
||||
"required_level": 29,
|
||||
"coin_cost": 850000
|
||||
},
|
||||
{
|
||||
"ordinal": 20,
|
||||
"required_level": 31,
|
||||
"coin_cost": 1100000
|
||||
},
|
||||
{
|
||||
"ordinal": 21,
|
||||
"required_level": 33,
|
||||
"coin_cost": 1300000
|
||||
},
|
||||
{
|
||||
"ordinal": 22,
|
||||
"required_level": 35,
|
||||
"coin_cost": 1500000
|
||||
},
|
||||
{
|
||||
"ordinal": 23,
|
||||
"required_level": 37,
|
||||
"coin_cost": 1700000
|
||||
},
|
||||
{
|
||||
"ordinal": 24,
|
||||
"required_level": 39,
|
||||
"coin_cost": 2000000
|
||||
}
|
||||
]
|
||||
},
|
||||
"upgrades": [
|
||||
{
|
||||
"land_type": "red",
|
||||
"name": "红土地",
|
||||
"from_land_type": "normal",
|
||||
"rows": [
|
||||
{
|
||||
"ordinal": 1,
|
||||
"required_level": 28,
|
||||
"coin_cost": 200000
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"required_level": 29,
|
||||
"coin_cost": 220000
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"required_level": 30,
|
||||
"coin_cost": 240000
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"required_level": 31,
|
||||
"coin_cost": 260000
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"required_level": 32,
|
||||
"coin_cost": 290000
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"required_level": 33,
|
||||
"coin_cost": 320000
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"required_level": 34,
|
||||
"coin_cost": 350000
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"required_level": 35,
|
||||
"coin_cost": 380000
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"required_level": 36,
|
||||
"coin_cost": 410000
|
||||
},
|
||||
{
|
||||
"ordinal": 10,
|
||||
"required_level": 37,
|
||||
"coin_cost": 440000
|
||||
},
|
||||
{
|
||||
"ordinal": 11,
|
||||
"required_level": 38,
|
||||
"coin_cost": 480000
|
||||
},
|
||||
{
|
||||
"ordinal": 12,
|
||||
"required_level": 39,
|
||||
"coin_cost": 520000
|
||||
},
|
||||
{
|
||||
"ordinal": 13,
|
||||
"required_level": 40,
|
||||
"coin_cost": 560000
|
||||
},
|
||||
{
|
||||
"ordinal": 14,
|
||||
"required_level": 41,
|
||||
"coin_cost": 600000
|
||||
},
|
||||
{
|
||||
"ordinal": 15,
|
||||
"required_level": 42,
|
||||
"coin_cost": 650000
|
||||
},
|
||||
{
|
||||
"ordinal": 16,
|
||||
"required_level": 43,
|
||||
"coin_cost": 700000
|
||||
},
|
||||
{
|
||||
"ordinal": 17,
|
||||
"required_level": 44,
|
||||
"coin_cost": 770000
|
||||
},
|
||||
{
|
||||
"ordinal": 18,
|
||||
"required_level": 45,
|
||||
"coin_cost": 900000
|
||||
},
|
||||
{
|
||||
"ordinal": 19,
|
||||
"required_level": 47,
|
||||
"coin_cost": 1500000
|
||||
},
|
||||
{
|
||||
"ordinal": 20,
|
||||
"required_level": 49,
|
||||
"coin_cost": 2000000
|
||||
},
|
||||
{
|
||||
"ordinal": 21,
|
||||
"required_level": 51,
|
||||
"coin_cost": 3000000
|
||||
},
|
||||
{
|
||||
"ordinal": 22,
|
||||
"required_level": 53,
|
||||
"coin_cost": 4000000
|
||||
},
|
||||
{
|
||||
"ordinal": 23,
|
||||
"required_level": 55,
|
||||
"coin_cost": 5500000
|
||||
},
|
||||
{
|
||||
"ordinal": 24,
|
||||
"required_level": 57,
|
||||
"coin_cost": 6800000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"land_type": "black",
|
||||
"name": "黑土地",
|
||||
"from_land_type": "red",
|
||||
"rows": [
|
||||
{
|
||||
"ordinal": 1,
|
||||
"required_level": 40,
|
||||
"coin_cost": 500000
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"required_level": 41,
|
||||
"coin_cost": 600000
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"required_level": 42,
|
||||
"coin_cost": 700000
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"required_level": 43,
|
||||
"coin_cost": 800000
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"required_level": 44,
|
||||
"coin_cost": 900000
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"required_level": 45,
|
||||
"coin_cost": 1000000
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"required_level": 46,
|
||||
"coin_cost": 2000000
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"required_level": 47,
|
||||
"coin_cost": 2200000
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"required_level": 48,
|
||||
"coin_cost": 2400000
|
||||
},
|
||||
{
|
||||
"ordinal": 10,
|
||||
"required_level": 49,
|
||||
"coin_cost": 2600000
|
||||
},
|
||||
{
|
||||
"ordinal": 11,
|
||||
"required_level": 50,
|
||||
"coin_cost": 2800000
|
||||
},
|
||||
{
|
||||
"ordinal": 12,
|
||||
"required_level": 51,
|
||||
"coin_cost": 3000000
|
||||
},
|
||||
{
|
||||
"ordinal": 13,
|
||||
"required_level": 52,
|
||||
"coin_cost": 4000000
|
||||
},
|
||||
{
|
||||
"ordinal": 14,
|
||||
"required_level": 53,
|
||||
"coin_cost": 4200000
|
||||
},
|
||||
{
|
||||
"ordinal": 15,
|
||||
"required_level": 54,
|
||||
"coin_cost": 4400000
|
||||
},
|
||||
{
|
||||
"ordinal": 16,
|
||||
"required_level": 55,
|
||||
"coin_cost": 4600000
|
||||
},
|
||||
{
|
||||
"ordinal": 17,
|
||||
"required_level": 56,
|
||||
"coin_cost": 4800000
|
||||
},
|
||||
{
|
||||
"ordinal": 18,
|
||||
"required_level": 57,
|
||||
"coin_cost": 5000000
|
||||
},
|
||||
{
|
||||
"ordinal": 19,
|
||||
"required_level": 59,
|
||||
"coin_cost": 6000000
|
||||
},
|
||||
{
|
||||
"ordinal": 20,
|
||||
"required_level": 61,
|
||||
"coin_cost": 6200000
|
||||
},
|
||||
{
|
||||
"ordinal": 21,
|
||||
"required_level": 63,
|
||||
"coin_cost": 6400000
|
||||
},
|
||||
{
|
||||
"ordinal": 22,
|
||||
"required_level": 65,
|
||||
"coin_cost": 6600000
|
||||
},
|
||||
{
|
||||
"ordinal": 23,
|
||||
"required_level": 67,
|
||||
"coin_cost": 6800000
|
||||
},
|
||||
{
|
||||
"ordinal": 24,
|
||||
"required_level": 69,
|
||||
"coin_cost": 7000000
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"land_type": "gold",
|
||||
"name": "金土地",
|
||||
"from_land_type": "black",
|
||||
"rows": [
|
||||
{
|
||||
"ordinal": 1,
|
||||
"required_level": 58,
|
||||
"coin_cost": 4000000
|
||||
},
|
||||
{
|
||||
"ordinal": 2,
|
||||
"required_level": 59,
|
||||
"coin_cost": 4200000
|
||||
},
|
||||
{
|
||||
"ordinal": 3,
|
||||
"required_level": 60,
|
||||
"coin_cost": 4400000
|
||||
},
|
||||
{
|
||||
"ordinal": 4,
|
||||
"required_level": 61,
|
||||
"coin_cost": 4600000
|
||||
},
|
||||
{
|
||||
"ordinal": 5,
|
||||
"required_level": 62,
|
||||
"coin_cost": 4800000
|
||||
},
|
||||
{
|
||||
"ordinal": 6,
|
||||
"required_level": 63,
|
||||
"coin_cost": 5000000
|
||||
},
|
||||
{
|
||||
"ordinal": 7,
|
||||
"required_level": 64,
|
||||
"coin_cost": 5200000
|
||||
},
|
||||
{
|
||||
"ordinal": 8,
|
||||
"required_level": 65,
|
||||
"coin_cost": 5400000
|
||||
},
|
||||
{
|
||||
"ordinal": 9,
|
||||
"required_level": 66,
|
||||
"coin_cost": 5600000
|
||||
},
|
||||
{
|
||||
"ordinal": 10,
|
||||
"required_level": 67,
|
||||
"coin_cost": 5800000
|
||||
},
|
||||
{
|
||||
"ordinal": 11,
|
||||
"required_level": 68,
|
||||
"coin_cost": 6000000
|
||||
},
|
||||
{
|
||||
"ordinal": 12,
|
||||
"required_level": 69,
|
||||
"coin_cost": 6200000
|
||||
},
|
||||
{
|
||||
"ordinal": 13,
|
||||
"required_level": 70,
|
||||
"coin_cost": 6600000
|
||||
},
|
||||
{
|
||||
"ordinal": 14,
|
||||
"required_level": 71,
|
||||
"coin_cost": 7000000
|
||||
},
|
||||
{
|
||||
"ordinal": 15,
|
||||
"required_level": 72,
|
||||
"coin_cost": 7400000
|
||||
},
|
||||
{
|
||||
"ordinal": 16,
|
||||
"required_level": 73,
|
||||
"coin_cost": 7800000
|
||||
},
|
||||
{
|
||||
"ordinal": 17,
|
||||
"required_level": 74,
|
||||
"coin_cost": 8200000
|
||||
},
|
||||
{
|
||||
"ordinal": 18,
|
||||
"required_level": 75,
|
||||
"coin_cost": 8600000
|
||||
},
|
||||
{
|
||||
"ordinal": 19,
|
||||
"required_level": 77,
|
||||
"coin_cost": 9500000
|
||||
},
|
||||
{
|
||||
"ordinal": 20,
|
||||
"required_level": 79,
|
||||
"coin_cost": 10400000
|
||||
},
|
||||
{
|
||||
"ordinal": 21,
|
||||
"required_level": 81,
|
||||
"coin_cost": 11300000
|
||||
},
|
||||
{
|
||||
"ordinal": 22,
|
||||
"required_level": 83,
|
||||
"coin_cost": 12200000
|
||||
},
|
||||
{
|
||||
"ordinal": 23,
|
||||
"required_level": 85,
|
||||
"coin_cost": 13100000
|
||||
},
|
||||
{
|
||||
"ordinal": 24,
|
||||
"required_level": 87,
|
||||
"coin_cost": 14000000
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -33,6 +33,20 @@ def receipt_text(receipt: Receipt) -> str:
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def plot_ids_text(snapshot: Snapshot) -> str:
|
||||
"""无图片能力时按实际快照返回地块编号。"""
|
||||
owned = sorted(plot.slot for plot in snapshot.plots)
|
||||
remaining = sorted(set(range(1, 31)) - set(owned))
|
||||
return '\n'.join((
|
||||
'地块编号',
|
||||
f'已开垦({len(owned)}块):' + ('、'.join(map(str, owned)) or '无'),
|
||||
f'待开垦({len(remaining)}块):'
|
||||
+ ('、'.join(map(str, remaining)) or '无'),
|
||||
'前两排交错编号,之后逐排推进。',
|
||||
'发送「农场详述」查看各地块的作物信息。',
|
||||
))
|
||||
|
||||
|
||||
def snapshot_text(snapshot: Snapshot) -> str:
|
||||
account = snapshot.account
|
||||
lines = [
|
||||
|
||||
@@ -42,7 +42,7 @@ class SQLiteRepository:
|
||||
)
|
||||
self._db.executemany(
|
||||
"INSERT INTO plots(identity, slot) VALUES (?, ?)",
|
||||
[(self._identity, slot) for slot in range(1, 4)],
|
||||
[(self._identity, slot) for slot in range(1, 7)],
|
||||
)
|
||||
self.asset(Asset.POINT, 500)
|
||||
return True
|
||||
|
||||
@@ -8282,46 +8282,46 @@
|
||||
"x": 1352,
|
||||
"y": 552
|
||||
},
|
||||
{
|
||||
"x": 1462,
|
||||
"y": 611
|
||||
},
|
||||
{
|
||||
"x": 1572,
|
||||
"y": 670
|
||||
},
|
||||
{
|
||||
"x": 1682,
|
||||
"y": 729
|
||||
},
|
||||
{
|
||||
"x": 1792,
|
||||
"y": 788
|
||||
},
|
||||
{
|
||||
"x": 1902,
|
||||
"y": 847
|
||||
},
|
||||
{
|
||||
"x": 1237,
|
||||
"y": 606
|
||||
},
|
||||
{
|
||||
"x": 1462,
|
||||
"y": 611
|
||||
},
|
||||
{
|
||||
"x": 1350,
|
||||
"y": 665
|
||||
},
|
||||
{
|
||||
"x": 1572,
|
||||
"y": 670
|
||||
},
|
||||
{
|
||||
"x": 1457,
|
||||
"y": 724
|
||||
},
|
||||
{
|
||||
"x": 1682,
|
||||
"y": 729
|
||||
},
|
||||
{
|
||||
"x": 1567,
|
||||
"y": 783
|
||||
},
|
||||
{
|
||||
"x": 1792,
|
||||
"y": 788
|
||||
},
|
||||
{
|
||||
"x": 1677,
|
||||
"y": 842
|
||||
},
|
||||
{
|
||||
"x": 1902,
|
||||
"y": 847
|
||||
},
|
||||
{
|
||||
"x": 1787,
|
||||
"y": 901
|
||||
|
||||
@@ -14,8 +14,11 @@ class RenderOptions:
|
||||
quality: int = 75 # 有损编码质量,不代表分辨率。
|
||||
method: int = 2 # WebP 编码力度,0最快,6最慢。
|
||||
theme: str = "default" # 显式主题,不读取隐含季节或全局配置。
|
||||
show_plot_ids: bool = False # 编号图显示全部地块及开垦状态。
|
||||
|
||||
def __post_init__(self):
|
||||
if type(self.show_plot_ids) is not bool:
|
||||
raise ValueError("Invalid plot ID option")
|
||||
for value, low, high in (
|
||||
(self.width, 256, 3072), (self.quality, 1, 95),
|
||||
(self.method, 0, 6),
|
||||
@@ -48,7 +51,7 @@ class RenderOptions:
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class PlotView:
|
||||
slot: int # 旧布局的1到30地块编号。
|
||||
slot: int # 1到30地块编号,对应统一位置表的slot-1项。
|
||||
state: str # empty/growing/ripe/withered。
|
||||
sprite: str = "" # 包内受控素材名,不来自用户路径。
|
||||
stage: int = 0 # 本季展示阶段。
|
||||
|
||||
@@ -70,6 +70,8 @@ class FarmRenderer:
|
||||
self._pests(canvas, scene, options)
|
||||
self._decorations(canvas, options, "foreground")
|
||||
self._panel(canvas, scene, options, avatar)
|
||||
if options.show_plot_ids:
|
||||
self._plot_ids(canvas, scene, options)
|
||||
composed = perf_counter()
|
||||
content = canvas.encode(codec, options.quality, options.method)
|
||||
encoded = perf_counter()
|
||||
@@ -92,6 +94,43 @@ class FarmRenderer:
|
||||
def _scale(value, options):
|
||||
return round(value * options.width / 3072)
|
||||
|
||||
def _plot_ids(self, canvas, scene, options):
|
||||
s = lambda n: self._scale(n, options)
|
||||
owned = {plot.slot for plot in scene.plots}
|
||||
soil_w, soil_h = self.assets.metadata['soil_size']
|
||||
size = max(1, s(40))
|
||||
for slot, pos in enumerate(self.assets.metadata['positions'], 1):
|
||||
x = s(pos['x'] + soil_w/2)
|
||||
y = s(pos['y'] + soil_h/2)
|
||||
color = '#fff2ca' if slot in owned else '#d5e8bc'
|
||||
canvas.rectangle(
|
||||
(x-s(38), y-s(30), x+s(38), y+s(30)),
|
||||
'#493b22', radius=s(30),
|
||||
)
|
||||
canvas.rectangle(
|
||||
(x-s(36), y-s(28), x+s(36), y+s(28)),
|
||||
color, radius=s(28),
|
||||
)
|
||||
label = str(slot)
|
||||
width = canvas.measure_text(label, self.font_path, size)
|
||||
box = font(self.font_path, size).getbbox(label)
|
||||
canvas.text(
|
||||
(round(x-width/2), round(y-(box[1]+box[3])/2)),
|
||||
label, self.font_path, size, '#392917',
|
||||
)
|
||||
canvas.rectangle(
|
||||
(s(76), s(1676), s(2996), s(1836)),
|
||||
'#fff2ca', radius=s(24),
|
||||
)
|
||||
for y, text, text_size in (
|
||||
(1694, '地块编号 · 浅色:已开垦 | 绿色:待开垦', 46),
|
||||
(1760, '前两排交错编号,之后逐排推进。作物信息:农场详述', 40),
|
||||
):
|
||||
canvas.text(
|
||||
(s(116), s(y)), text, self.font_path,
|
||||
max(1, s(text_size)), '#392917',
|
||||
)
|
||||
|
||||
def _base(self, scene, options):
|
||||
slots = frozenset(p.slot for p in scene.plots)
|
||||
key = ("base", options.theme, options.width, slots)
|
||||
|
||||
Reference in New Issue
Block a user