add # 新增偷菜功能

This commit is contained in:
2026-10-21 17:57:55 +08:00
parent dd47ab70c4
commit c7d97e294a
17 changed files with 495 additions and 30 deletions
+2 -1
View File
@@ -56,7 +56,8 @@ def detail_rows(renderer, identity, snapshot, now, page):
continue
ripe = plot.mature_at is not None and plot.mature_at <= now
pests = plot.maturity_pests if ripe else plot.pest_count
amount = boosted(plant.harvest, plot.yield_bonus)*(100-5*pests)//100
amount = max(0, boosted(plant.harvest, plot.yield_bonus)
*(100-5*pests)//100-plot.stolen_count)
info = metadata['plants'].get(plant.name)
total = len(set(info['phase'].split(','))) if info else None
stage = ('成熟' if ripe else
+10 -4
View File
@@ -118,17 +118,21 @@ class RenderService:
return await asyncio.shield(task)
async def warehouse(self, rows, snapshot, kind, page, pages,
image_format='AUTO'):
image_format='AUTO', high=False):
if self._closed:
raise RuntimeError('Render service closed')
key = ('warehouse', rows, snapshot, kind, page, pages, image_format)
key = ('warehouse', rows, snapshot, kind, page, pages,
image_format, high)
cached = self.renderer.results.get(key)
if cached is not None:
return cached
task = self._pending.get(key)
if task is None:
if len(self._pending) >= self._max_pending:
raise RuntimeError('Render queue full')
task = asyncio.create_task(self._run_function(
render_warehouse, self.renderer, rows, snapshot, kind,
page, pages, image_format,
page, pages, image_format, high,
))
self._pending[key] = task
@@ -138,7 +142,9 @@ class RenderService:
done.exception()
task.add_done_callback(finished)
return await asyncio.shield(task)
content = await asyncio.shield(task)
self.renderer.results.put(key, content, len(content))
return content
async def _run_function(self, function, *args):
started = perf_counter()
+24 -12
View File
@@ -110,15 +110,25 @@ def warehouse_text(rows, snapshot, kind, page, pages):
def render_warehouse(renderer, rows, snapshot, kind, page, pages,
image_format='AUTO'):
options = RenderOptions(format=image_format, quality=80)
image_format='AUTO', high=False):
options = RenderOptions(width=1024 if high else 768,
format=image_format, quality=85 if high else 70)
codec = options.codec()
scale = options.width/1024
s = lambda n: round(n*scale)
canvas = Canvas(renderer.assets.image('webgl/shop-board.png',
(1024, 1536)))
patch = canvas.image.crop((300, 340, 880, 445))
canvas.image.paste(patch.resize((824, 930)), (100, 320))
canvas.rectangle((105, 322, 919, 1249), '#fff1cf', radius=15)
(s(1024), s(1536))))
patch = canvas.image.crop(tuple(s(n) for n in (300, 340, 880, 445)))
canvas.image.paste(patch.resize((s(824), s(930))), (s(100), s(320)))
def rectangle(box, color, radius):
canvas.rectangle(tuple(s(n) for n in box), color, radius=s(radius))
rectangle((105, 322, 919, 1249), '#fff1cf', 15)
def text(value, xy, size=26, color='#603817', width=760):
size = max(1, s(size))
xy = tuple(s(n) for n in xy)
width = s(width)
value = canvas.fit_text(value, renderer.font_path, size, width)
box = font(renderer.font_path, size).getbbox(value)
canvas.text((xy[0], xy[1]-box[1]), value,
@@ -136,7 +146,7 @@ def render_warehouse(renderer, rows, snapshot, kind, page, pages,
for index, row in enumerate(chunk):
if row.group != group:
group = row.group
canvas.rectangle((123, y, 899, y+43), '#d8e5b6', radius=7)
rectangle((123, y, 899, y+43), '#d8e5b6', 7)
count = sum(r.group == group for r in rows)
label = f'{group}({count}种)'
if group == '已锁定':
@@ -144,12 +154,13 @@ def render_warehouse(renderer, rows, snapshot, kind, page, pages,
text(label, (140, y+8), 24, '#607d30')
y += 49
if index % 2 == 0:
canvas.rectangle((123, y, 899, y+55), '#fff8e4', radius=5)
rectangle((123, y, 899, y+55), '#fff8e4', 5)
icon = f'plant/{row.name}/icon.png'
if icon in renderer.assets.metadata['images']:
image = renderer.assets.image(icon)
image.thumbnail((44, 46), Image.Resampling.LANCZOS)
canvas.paste(image, (158-image.width//2, y+27-image.height//2))
image.thumbnail((s(44), s(46)), Image.Resampling.LANCZOS)
canvas.paste(image, (s(158)-image.width//2,
s(y+27)-image.height//2))
else:
text('?', (149, y+15), 26)
text(f'#{row.plant_id}', (193, y+19), 21, '#607d30', 82)
@@ -186,6 +197,7 @@ def render_warehouse(renderer, rows, snapshot, kind, page, pages,
x = round((1024-canvas.measure_text(nav, renderer.font_path, 23))/2)
text(nav, (x, 1424), 23, width=510)
content = canvas.encode(codec, options.quality, options.method)
logger.info('farm warehouse kind=%s page=%s bytes=%s codec=%s',
kind, page, len(content), codec)
logger.info('farm warehouse kind=%s page=%s bytes=%s codec=%s width=%s '
'quality=%s', kind, page, len(content), codec,
options.width, options.quality)
return content