mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-10-29 05:29:58 +08:00
add # 新增背景图的优化
This commit is contained in:
@@ -63,6 +63,7 @@ def build(root, output, version):
|
||||
for name, source in {
|
||||
"LICENSE": root / "LICENSE",
|
||||
"README.md": root / "docs/11-zhenxun-preview.md",
|
||||
"images/farm-preview.png": root / "images/farm-preview.png",
|
||||
"verify_package.py": root / "scripts/verify_zhenxun.py",
|
||||
".github/workflows/verify.yml": root / "release/zhenxun/verify.yml",
|
||||
}.items():
|
||||
|
||||
@@ -21,6 +21,41 @@ def apply_positions(root, metadata):
|
||||
metadata["placement"] = document
|
||||
|
||||
|
||||
def apply_decorations(root, metadata):
|
||||
document = json.loads((
|
||||
root / "src/farm_render/data/background_layout.json"
|
||||
).read_bytes())
|
||||
if (document["schema"] != 1 or document["canvas"] != metadata["canvas"]
|
||||
or document["anchor"] != "full_canvas_bottom_center"):
|
||||
raise ValueError("Unsupported background layout")
|
||||
prefix = "background/decorateIcon/"
|
||||
layouts = {}
|
||||
for theme in ("default", "spring", "summer", "autumn", "winter", "bee"):
|
||||
entries = []
|
||||
for definition in document["buildings"]:
|
||||
default = prefix + definition["sprite"]
|
||||
sprite = default.replace("decorate_default_", f"decorate_{theme}_")
|
||||
source_theme = theme
|
||||
if sprite not in metadata["images"]:
|
||||
sprite, source_theme = default, "default"
|
||||
image = metadata["images"][sprite]
|
||||
x, y, w, h = definition["rect"]
|
||||
if w <= 0 or h <= 0:
|
||||
raise ValueError("Invalid background rectangle")
|
||||
height = w * image["size"][1] / image["size"][0]
|
||||
if definition["layer"] not in ("background", "foreground"):
|
||||
raise ValueError("Invalid decoration layer")
|
||||
entries.append({
|
||||
"name": definition["name"], "sprite": sprite,
|
||||
"position": [x, y + h - height], "size": [w, height],
|
||||
"layer": definition["layer"], "source_theme": source_theme,
|
||||
"fallback": source_theme != theme,
|
||||
"basis": definition["basis"],
|
||||
})
|
||||
layouts[theme] = entries
|
||||
metadata["decorations"] = layouts
|
||||
|
||||
|
||||
def export(root):
|
||||
legacy = root / "legacy/zhenxun_plugin_farm"
|
||||
source = legacy / "resource"
|
||||
@@ -34,7 +69,8 @@ def export(root):
|
||||
paths += [source / "background/frame/frame.png"]
|
||||
paths += [source / (
|
||||
f"background/decorateIcon/decorate_{theme}_1.jpg"
|
||||
) for theme in ("default", "spring", "summer", "autumn", "winter")]
|
||||
) for theme in ("default", "spring", "summer", "autumn", "winter", "bee")]
|
||||
paths += list((source / "background/decorateIcon").glob("decorate_*.png"))
|
||||
layout = json.loads((legacy / "config/soil.json").read_bytes())
|
||||
catalogue = json.loads((
|
||||
root / "src/farm_core/data/plants.json"
|
||||
@@ -72,6 +108,7 @@ def export(root):
|
||||
item.external_attr = 0o100644 << 16
|
||||
bundle.writestr(item, content)
|
||||
apply_positions(root, metadata)
|
||||
apply_decorations(root, metadata)
|
||||
return output.getvalue(), (
|
||||
json.dumps(metadata, ensure_ascii=False, sort_keys=True, indent=2)
|
||||
+ "\n"
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
"""离线生成四季与蜂巢底图,以及同一农场状态的主题对照。"""
|
||||
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
|
||||
from ci_font import choose_font
|
||||
from farm_core import Identity
|
||||
from farm_render import FarmRenderer, RenderOptions
|
||||
from farm_render.canvas import Canvas
|
||||
from render_demo import demonstration
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
parser.add_argument("--font", type=Path)
|
||||
args = parser.parse_args()
|
||||
args.output.mkdir(parents=True, exist_ok=True)
|
||||
renderer = FarmRenderer(args.font or choose_font())
|
||||
who = Identity("preview", "local", "qq", "seasons")
|
||||
snapshot, now = demonstration()
|
||||
themes = (("spring", "春季"), ("summer", "夏季"), ("autumn", "秋季"),
|
||||
("winter", "冬季"), ("bee", "蜂巢 · 仅预览"))
|
||||
sheet = Image.new("RGB", (1536, 3 * 510), "#edf0eb")
|
||||
draw = ImageDraw.Draw(sheet)
|
||||
font = ImageFont.truetype(str(renderer.font_path), 24)
|
||||
for index, (theme, label) in enumerate(themes):
|
||||
options = RenderOptions(width=3072, theme=theme)
|
||||
image = renderer.assets.image(
|
||||
f"background/decorateIcon/decorate_{theme}_1.jpg", (3072, 1872),
|
||||
)
|
||||
canvas = Canvas(image)
|
||||
renderer._decorations(canvas, options, "background")
|
||||
renderer._decorations(canvas, options, "foreground")
|
||||
canvas.image.convert("RGB").save(
|
||||
args.output / f"background-{theme}.jpg", quality=92,
|
||||
)
|
||||
thumb = canvas.image.convert("RGB").resize((768, 468),
|
||||
Image.Resampling.LANCZOS)
|
||||
x, y = (index % 2) * 768, (index // 2) * 510
|
||||
draw.text((x+15, y+8), label, font=font, fill="#203e2c")
|
||||
sheet.paste(thumb, (x, y+40))
|
||||
result = renderer.render(
|
||||
who, snapshot, now,
|
||||
RenderOptions.high(theme=theme, format="PNG"),
|
||||
)
|
||||
(args.output / f"farm-{theme}-1536.png").write_bytes(result.content)
|
||||
sheet.save(args.output / "all-themes.jpg", quality=92)
|
||||
print(f"Generated 5 backgrounds, 5 farm previews: {args.output}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -10,7 +10,7 @@ from urllib.request import Request, urlopen
|
||||
from verify_zhenxun import read_package, verify_files
|
||||
|
||||
REPOSITORY = "Shu-Ying/zhenxun_plugin_farm"
|
||||
BRANCH = "farm-preview"
|
||||
BRANCH = "main"
|
||||
|
||||
|
||||
def github(method, path, payload, token, allow_missing=False):
|
||||
|
||||
Reference in New Issue
Block a user