feat: improve first-session combat and visual assets

This commit is contained in:
2026-07-18 22:11:50 +09:00
parent 4a2a0dfb19
commit f29956b90e
82 changed files with 3640 additions and 839 deletions

View File

@@ -19,7 +19,8 @@ FRAME = 128
MICRO_FRAME = 32
SCALE = 4
COLS = 5
ROWS = 6
SEED_ROWS = 6
ROWS = 8
SOURCE_FRAMES = {
4: ("attack", "attack-v2.png"),
16: ("hit", "hit-v2.png"),
@@ -29,6 +30,16 @@ SOURCE_FRAMES = {
27: ("bean", "bean-v2.png"),
28: ("salve", "salve-v2.png"),
29: ("wine", "wine-v2.png"),
30: ("confusion", "confusion-v2.png"),
31: ("benevolent-command", "benevolent-command-v2.png"),
32: ("azure-dragon-strike", "azure-dragon-strike-v2.png"),
33: ("changban-roar", "changban-roar-v2.png"),
34: ("single-rider-rescue", "single-rider-rescue-v2.png"),
35: ("east-wind-fire", "east-wind-fire-v2.png"),
36: ("hundred-pace-pierce", "hundred-pace-pierce-v2.png"),
37: ("western-cavalry-charge", "western-cavalry-charge-v2.png"),
38: ("qilin-stratagem", "qilin-stratagem-v2.png"),
39: ("burn", "burn-v2.png"),
}
REPLACEMENT_FRAMES: dict[int, tuple[str, Callable[[Image.Image], Image.Image]]] = {
10: ("axe", lambda atlas: compose_axe_icon(atlas)),
@@ -44,11 +55,12 @@ def main() -> None:
raise FileNotFoundError(f"missing seed atlas: {seed_path}")
seed_atlas = Image.open(seed_path).convert("RGBA")
expected_size = (COLS * FRAME, ROWS * FRAME)
if seed_atlas.size != expected_size:
raise ValueError(f"seed atlas must be {expected_size}, got {seed_atlas.size}: {seed_path}")
expected_seed_size = (COLS * FRAME, SEED_ROWS * FRAME)
if seed_atlas.size != expected_seed_size:
raise ValueError(f"seed atlas must be {expected_seed_size}, got {seed_atlas.size}: {seed_path}")
atlas = seed_atlas.copy()
atlas = Image.new("RGBA", (COLS * FRAME, ROWS * FRAME), (0, 0, 0, 0))
atlas.alpha_composite(seed_atlas, (0, 0))
for index, (name, filename) in SOURCE_FRAMES.items():
tile = source_icon(SOURCE_DIR / filename)
@@ -149,10 +161,11 @@ def micro_atlas_frame(atlas: Image.Image, index: int) -> Image.Image:
def write_contact_sheet(seed_atlas: Image.Image, atlas: Image.Image, micro_atlas: Image.Image) -> None:
card_width = 500
card_height = 220
sheet = Image.new("RGB", (card_width * 4, 40 + card_height * 2), (8, 14, 20))
draw = ImageDraw.Draw(sheet)
draw.text((14, 13), "Battle UI V2 action/item icons - before, HQ, runtime sizes", fill=(232, 220, 183))
labels = list(SOURCE_FRAMES.items())
sheet_rows = math.ceil(len(labels) / 4)
sheet = Image.new("RGB", (card_width * 4, 40 + card_height * sheet_rows), (8, 14, 20))
draw = ImageDraw.Draw(sheet)
draw.text((14, 13), "Battle UI V2 action/item/signature/status icons - before, HQ, runtime sizes", fill=(232, 220, 183))
runtime_sizes = (14, 20, 30, 34, 52, 70)
for position, (index, (name, _filename)) in enumerate(labels):