diff --git a/scripts/harmonize-unit-sprites.py b/scripts/harmonize-unit-sprites.py index 36d3f85..68e52fc 100644 --- a/scripts/harmonize-unit-sprites.py +++ b/scripts/harmonize-unit-sprites.py @@ -44,25 +44,25 @@ class TemplateVariant: TEMPLATE_VARIANTS = ( - TemplateVariant("unit-shu-archer", "unit-rebel-archer", (54, 132, 82), 0.2, 1.05), - TemplateVariant("unit-shu-cavalry", "unit-ma-chao", (58, 126, 78), 0.18, 1.02), - TemplateVariant("unit-shu-infantry", "unit-rebel", (56, 132, 78), 0.24, 1.06), - TemplateVariant("unit-shu-officer", "unit-guan-yu", (58, 132, 82), 0.16, 1.02), - TemplateVariant("unit-shu-spearman", "unit-zhang-fei", (70, 122, 86), 0.14, 1.02), - TemplateVariant("unit-shu-strategist", "unit-zhuge-liang", (74, 138, 102), 0.16, 1.03, 1.02), - TemplateVariant("unit-wei-archer", "unit-rebel-archer", (70, 84, 118), 0.24, 1.02, 0.98), - TemplateVariant("unit-wei-cavalry", "unit-ma-chao", (72, 78, 114), 0.24, 1.0, 0.98), - TemplateVariant("unit-wei-infantry", "unit-rebel", (68, 78, 112), 0.26, 1.0, 0.98), - TemplateVariant("unit-wei-officer", "unit-cao-cao", (76, 74, 116), 0.18, 1.0, 0.98), - TemplateVariant("unit-wei-strategist", "unit-zhuge-liang", (78, 92, 140), 0.22, 1.0, 0.98), - TemplateVariant("unit-wu-archer", "unit-rebel-archer", (42, 112, 120), 0.24, 1.05), - TemplateVariant("unit-wu-cavalry", "unit-ma-chao", (42, 110, 118), 0.22, 1.04), - TemplateVariant("unit-wu-infantry", "unit-rebel", (42, 116, 118), 0.26, 1.05), - TemplateVariant("unit-wu-officer", "unit-lu-meng", (46, 116, 128), 0.18, 1.02), - TemplateVariant("unit-wu-strategist", "unit-zhuge-liang", (42, 118, 132), 0.22, 1.04), - TemplateVariant("unit-nanman-infantry", "unit-rebel", (118, 112, 46), 0.28, 1.08), - TemplateVariant("unit-nanman-officer", "unit-meng-huo", (126, 100, 48), 0.2, 1.07), - TemplateVariant("unit-nanman-shaman", "unit-zhuge-liang", (118, 114, 48), 0.26, 1.08), + TemplateVariant("unit-shu-archer", "unit-rebel-archer", (52, 108, 74), 0.18, 0.88, 0.98), + TemplateVariant("unit-shu-cavalry", "unit-ma-chao", (54, 104, 72), 0.16, 0.86, 0.98), + TemplateVariant("unit-shu-infantry", "unit-rebel", (54, 108, 72), 0.2, 0.88, 0.98), + TemplateVariant("unit-shu-officer", "unit-guan-yu", (56, 108, 76), 0.14, 0.86, 0.98), + TemplateVariant("unit-shu-spearman", "unit-zhang-fei", (68, 104, 82), 0.13, 0.86, 0.98), + TemplateVariant("unit-shu-strategist", "unit-zhuge-liang", (70, 112, 92), 0.14, 0.86, 0.99), + TemplateVariant("unit-wei-archer", "unit-rebel-archer", (68, 76, 104), 0.2, 0.86, 0.96), + TemplateVariant("unit-wei-cavalry", "unit-ma-chao", (70, 72, 102), 0.2, 0.84, 0.96), + TemplateVariant("unit-wei-infantry", "unit-rebel", (66, 72, 100), 0.22, 0.84, 0.96), + TemplateVariant("unit-wei-officer", "unit-cao-cao", (74, 70, 104), 0.16, 0.84, 0.96), + TemplateVariant("unit-wei-strategist", "unit-zhuge-liang", (74, 84, 116), 0.18, 0.84, 0.96), + TemplateVariant("unit-wu-archer", "unit-rebel-archer", (42, 98, 104), 0.2, 0.88, 0.98), + TemplateVariant("unit-wu-cavalry", "unit-ma-chao", (42, 96, 104), 0.18, 0.86, 0.98), + TemplateVariant("unit-wu-infantry", "unit-rebel", (42, 100, 104), 0.22, 0.88, 0.98), + TemplateVariant("unit-wu-officer", "unit-lu-meng", (46, 100, 110), 0.16, 0.86, 0.98), + TemplateVariant("unit-wu-strategist", "unit-zhuge-liang", (44, 102, 112), 0.18, 0.86, 0.98), + TemplateVariant("unit-nanman-infantry", "unit-rebel", (104, 96, 48), 0.22, 0.9, 0.98), + TemplateVariant("unit-nanman-officer", "unit-meng-huo", (108, 88, 50), 0.17, 0.88, 0.98), + TemplateVariant("unit-nanman-shaman", "unit-zhuge-liang", (104, 98, 52), 0.2, 0.88, 0.98), ) @@ -71,9 +71,10 @@ def main() -> None: cleanup_only = "--cleanup-only" in sys.argv optimize_only = "--optimize-only" in sys.argv stabilize_motion = "--stabilize-motion" in sys.argv - selected_modes = sum(1 for enabled in (generic_only, cleanup_only, optimize_only, stabilize_motion) if enabled) + tone_only = "--tone-only" in sys.argv + selected_modes = sum(1 for enabled in (generic_only, cleanup_only, optimize_only, stabilize_motion, tone_only) if enabled) if selected_modes > 1: - raise ValueError("Use only one of --generic-only, --cleanup-only, --optimize-only, or --stabilize-motion") + raise ValueError("Use only one of --generic-only, --cleanup-only, --optimize-only, --stabilize-motion, or --tone-only") if generic_only: sheets = load_current_base_sheets() @@ -92,6 +93,10 @@ def main() -> None: stabilize_current_motion_sheets() return + if tone_only: + tone_current_unit_pngs() + return + reference = Image.open(REFERENCE_SHEET).convert("RGBA") targets = reference_targets(reference) generated = 0 @@ -152,6 +157,15 @@ def optimize_current_unit_pngs() -> None: print(f"Optimized {optimized} unit PNGs with {PALETTE_COLORS}-color palettes") +def tone_current_unit_pngs() -> None: + toned = 0 + for source in sorted(UNIT_DIR.glob("unit-*.png")): + image = Image.open(source).convert("RGBA") + save_unit_png(stabilize_palette_image(image), source) + toned += 1 + print(f"Applied muted battlefield tone to {toned} unit PNGs") + + def stabilize_current_motion_sheets() -> None: reference = Image.open(REFERENCE_SHEET).convert("RGBA") targets = stable_reference_targets(reference_targets(reference)) @@ -291,11 +305,26 @@ def write_template_variants(sheets: dict[str, Image.Image]) -> None: def save_unit_png(image: Image.Image, path: Path) -> None: - image = image.convert("RGBA") + image = stabilize_palette_image(image.convert("RGBA")) indexed = image.quantize(colors=PALETTE_COLORS, method=Image.Quantize.FASTOCTREE, dither=Image.Dither.NONE) indexed.save(path, optimize=True) +def stabilize_palette_image(image: Image.Image) -> Image.Image: + image = image.convert("RGBA") + red, green, blue, alpha = image.split() + rgb = Image.merge("RGB", (red, green, blue)) + rgb = ImageEnhance.Color(rgb).enhance(0.76) + rgb = ImageEnhance.Contrast(rgb).enhance(0.97) + rgb = ImageEnhance.Brightness(rgb).enhance(0.98) + + luma = ImageOps.grayscale(rgb) + battlefield = ImageOps.colorize(luma, black=(22, 20, 22), white=(210, 194, 158), mid=(104, 91, 73)) + tone_mask = alpha.point(lambda value: min(46, round(value * 0.16))) + rgb = Image.composite(battlefield, rgb, tone_mask) + return Image.merge("RGBA", (*rgb.split(), alpha)) + + def template_variant_for(stem: str) -> TemplateVariant | None: for variant in TEMPLATE_VARIANTS: if stem.startswith(variant.prefix) and stem != variant.template: @@ -523,36 +552,36 @@ def colored_mask(alpha: Image.Image, color: tuple[int, int, int, int]) -> Image. def style_for_unit(stem: str) -> UnitStyle: lower = stem.lower() scale = 0.98 - saturation = 1.14 - contrast = 1.08 - brightness = 1.0 - edge_warmth = 1.0 - rim_color = (48, 12, 76) + saturation = 0.9 + contrast = 1.04 + brightness = 0.98 + edge_warmth = 0.68 + rim_color = (31, 25, 35) if any(token in lower for token in ("archer", "crossbow", "longbow")): scale = 0.94 - saturation = 1.12 + saturation = 0.88 elif any(token in lower for token in ("cavalry", "ma-chao", "ma-dai", "lu-bu")): scale = 1.03 - contrast = 1.1 + contrast = 1.05 elif any(token in lower for token in ("strategist", "shaman", "zhuge", "sima", "fa-zheng", "ma-liang", "yi-ji")): scale = 0.93 - brightness = 1.03 - rim_color = (38, 22, 86) + brightness = 0.99 + rim_color = (29, 28, 41) elif any(token in lower for token in ("leader", "officer", "meng-huo", "guan-yu", "zhang-fei", "jiang-wei")): scale = 1.01 - contrast = 1.1 - edge_warmth = 1.12 + contrast = 1.05 + edge_warmth = 0.78 if "nanman" in lower or "meng-huo" in lower: - saturation = 1.18 - rim_color = (58, 18, 63) + saturation = 0.92 + rim_color = (38, 28, 34) elif "wu-" in lower or "lu-meng" in lower: - rim_color = (28, 18, 72) + rim_color = (25, 31, 37) elif "wei-" in lower or "cao-cao" in lower or "sima" in lower: - rim_color = (43, 10, 78) + rim_color = (30, 28, 40) elif "shu-" in lower or any(token in lower for token in ("liu-bei", "guan-yu", "zhang-fei", "zhao-yun")): - rim_color = (34, 24, 72) + rim_color = (28, 30, 38) return UnitStyle(scale, saturation, contrast, brightness, edge_warmth, rim_color) diff --git a/src/assets/images/units/unit-cao-cao-actions.png b/src/assets/images/units/unit-cao-cao-actions.png index 484a3e7..bb1c666 100644 Binary files a/src/assets/images/units/unit-cao-cao-actions.png and b/src/assets/images/units/unit-cao-cao-actions.png differ diff --git a/src/assets/images/units/unit-cao-cao.png b/src/assets/images/units/unit-cao-cao.png index ba443b6..a5a96de 100644 Binary files a/src/assets/images/units/unit-cao-cao.png and b/src/assets/images/units/unit-cao-cao.png differ diff --git a/src/assets/images/units/unit-fa-zheng-actions.png b/src/assets/images/units/unit-fa-zheng-actions.png index efea8a0..94895c4 100644 Binary files a/src/assets/images/units/unit-fa-zheng-actions.png and b/src/assets/images/units/unit-fa-zheng-actions.png differ diff --git a/src/assets/images/units/unit-fa-zheng.png b/src/assets/images/units/unit-fa-zheng.png index 7cbfdff..dff3078 100644 Binary files a/src/assets/images/units/unit-fa-zheng.png and b/src/assets/images/units/unit-fa-zheng.png differ diff --git a/src/assets/images/units/unit-gong-zhi-actions.png b/src/assets/images/units/unit-gong-zhi-actions.png index c851d54..297516d 100644 Binary files a/src/assets/images/units/unit-gong-zhi-actions.png and b/src/assets/images/units/unit-gong-zhi-actions.png differ diff --git a/src/assets/images/units/unit-gong-zhi.png b/src/assets/images/units/unit-gong-zhi.png index eb9d85d..64deeda 100644 Binary files a/src/assets/images/units/unit-gong-zhi.png and b/src/assets/images/units/unit-gong-zhi.png differ diff --git a/src/assets/images/units/unit-guan-yu-actions.png b/src/assets/images/units/unit-guan-yu-actions.png index db4cfab..e0256c0 100644 Binary files a/src/assets/images/units/unit-guan-yu-actions.png and b/src/assets/images/units/unit-guan-yu-actions.png differ diff --git a/src/assets/images/units/unit-guan-yu.png b/src/assets/images/units/unit-guan-yu.png index 6fadf42..4133846 100644 Binary files a/src/assets/images/units/unit-guan-yu.png and b/src/assets/images/units/unit-guan-yu.png differ diff --git a/src/assets/images/units/unit-huang-quan-actions.png b/src/assets/images/units/unit-huang-quan-actions.png index 76dcbb5..1675771 100644 Binary files a/src/assets/images/units/unit-huang-quan-actions.png and b/src/assets/images/units/unit-huang-quan-actions.png differ diff --git a/src/assets/images/units/unit-huang-quan.png b/src/assets/images/units/unit-huang-quan.png index 2e723a7..cfbf161 100644 Binary files a/src/assets/images/units/unit-huang-quan.png and b/src/assets/images/units/unit-huang-quan.png differ diff --git a/src/assets/images/units/unit-huang-zhong-actions.png b/src/assets/images/units/unit-huang-zhong-actions.png index 6af3ff6..203485a 100644 Binary files a/src/assets/images/units/unit-huang-zhong-actions.png and b/src/assets/images/units/unit-huang-zhong-actions.png differ diff --git a/src/assets/images/units/unit-huang-zhong.png b/src/assets/images/units/unit-huang-zhong.png index f6ee287..c5c8bf1 100644 Binary files a/src/assets/images/units/unit-huang-zhong.png and b/src/assets/images/units/unit-huang-zhong.png differ diff --git a/src/assets/images/units/unit-jiang-wei-actions.png b/src/assets/images/units/unit-jiang-wei-actions.png index 2723b0a..eb5123e 100644 Binary files a/src/assets/images/units/unit-jiang-wei-actions.png and b/src/assets/images/units/unit-jiang-wei-actions.png differ diff --git a/src/assets/images/units/unit-jiang-wei.png b/src/assets/images/units/unit-jiang-wei.png index 927223c..24b0a40 100644 Binary files a/src/assets/images/units/unit-jiang-wei.png and b/src/assets/images/units/unit-jiang-wei.png differ diff --git a/src/assets/images/units/unit-li-yan-actions.png b/src/assets/images/units/unit-li-yan-actions.png index 7ba0a25..353b77c 100644 Binary files a/src/assets/images/units/unit-li-yan-actions.png and b/src/assets/images/units/unit-li-yan-actions.png differ diff --git a/src/assets/images/units/unit-li-yan.png b/src/assets/images/units/unit-li-yan.png index 2d670c5..ee3bdcf 100644 Binary files a/src/assets/images/units/unit-li-yan.png and b/src/assets/images/units/unit-li-yan.png differ diff --git a/src/assets/images/units/unit-liu-bei-actions.png b/src/assets/images/units/unit-liu-bei-actions.png index bc0ef92..04aeb59 100644 Binary files a/src/assets/images/units/unit-liu-bei-actions.png and b/src/assets/images/units/unit-liu-bei-actions.png differ diff --git a/src/assets/images/units/unit-liu-bei.png b/src/assets/images/units/unit-liu-bei.png index a4dc669..715caab 100644 Binary files a/src/assets/images/units/unit-liu-bei.png and b/src/assets/images/units/unit-liu-bei.png differ diff --git a/src/assets/images/units/unit-lu-bu-actions.png b/src/assets/images/units/unit-lu-bu-actions.png index 5dfae7a..662ad8e 100644 Binary files a/src/assets/images/units/unit-lu-bu-actions.png and b/src/assets/images/units/unit-lu-bu-actions.png differ diff --git a/src/assets/images/units/unit-lu-bu.png b/src/assets/images/units/unit-lu-bu.png index f244d39..ce613e5 100644 Binary files a/src/assets/images/units/unit-lu-bu.png and b/src/assets/images/units/unit-lu-bu.png differ diff --git a/src/assets/images/units/unit-lu-meng-actions.png b/src/assets/images/units/unit-lu-meng-actions.png index e988f37..f6f542e 100644 Binary files a/src/assets/images/units/unit-lu-meng-actions.png and b/src/assets/images/units/unit-lu-meng-actions.png differ diff --git a/src/assets/images/units/unit-lu-meng.png b/src/assets/images/units/unit-lu-meng.png index a6a56e4..979c3ef 100644 Binary files a/src/assets/images/units/unit-lu-meng.png and b/src/assets/images/units/unit-lu-meng.png differ diff --git a/src/assets/images/units/unit-ma-chao-actions.png b/src/assets/images/units/unit-ma-chao-actions.png index 34b6252..a123c82 100644 Binary files a/src/assets/images/units/unit-ma-chao-actions.png and b/src/assets/images/units/unit-ma-chao-actions.png differ diff --git a/src/assets/images/units/unit-ma-chao.png b/src/assets/images/units/unit-ma-chao.png index d185289..26e55ca 100644 Binary files a/src/assets/images/units/unit-ma-chao.png and b/src/assets/images/units/unit-ma-chao.png differ diff --git a/src/assets/images/units/unit-ma-dai-actions.png b/src/assets/images/units/unit-ma-dai-actions.png index e1eb8d3..bedd838 100644 Binary files a/src/assets/images/units/unit-ma-dai-actions.png and b/src/assets/images/units/unit-ma-dai-actions.png differ diff --git a/src/assets/images/units/unit-ma-dai.png b/src/assets/images/units/unit-ma-dai.png index 1af28bc..7e950e0 100644 Binary files a/src/assets/images/units/unit-ma-dai.png and b/src/assets/images/units/unit-ma-dai.png differ diff --git a/src/assets/images/units/unit-ma-liang-actions.png b/src/assets/images/units/unit-ma-liang-actions.png index 30268fb..c507241 100644 Binary files a/src/assets/images/units/unit-ma-liang-actions.png and b/src/assets/images/units/unit-ma-liang-actions.png differ diff --git a/src/assets/images/units/unit-ma-liang.png b/src/assets/images/units/unit-ma-liang.png index c08e8bf..cff66ae 100644 Binary files a/src/assets/images/units/unit-ma-liang.png and b/src/assets/images/units/unit-ma-liang.png differ diff --git a/src/assets/images/units/unit-meng-huo-actions.png b/src/assets/images/units/unit-meng-huo-actions.png index 9559ec4..4ae2ece 100644 Binary files a/src/assets/images/units/unit-meng-huo-actions.png and b/src/assets/images/units/unit-meng-huo-actions.png differ diff --git a/src/assets/images/units/unit-meng-huo.png b/src/assets/images/units/unit-meng-huo.png index 098e5ad..8f33a7b 100644 Binary files a/src/assets/images/units/unit-meng-huo.png and b/src/assets/images/units/unit-meng-huo.png differ diff --git a/src/assets/images/units/unit-nanman-infantry-actions.png b/src/assets/images/units/unit-nanman-infantry-actions.png index 455d3f4..4a3d040 100644 Binary files a/src/assets/images/units/unit-nanman-infantry-actions.png and b/src/assets/images/units/unit-nanman-infantry-actions.png differ diff --git a/src/assets/images/units/unit-nanman-infantry-jungle-actions.png b/src/assets/images/units/unit-nanman-infantry-jungle-actions.png index 455d3f4..4a3d040 100644 Binary files a/src/assets/images/units/unit-nanman-infantry-jungle-actions.png and b/src/assets/images/units/unit-nanman-infantry-jungle-actions.png differ diff --git a/src/assets/images/units/unit-nanman-infantry-jungle.png b/src/assets/images/units/unit-nanman-infantry-jungle.png index f387790..10e48f0 100644 Binary files a/src/assets/images/units/unit-nanman-infantry-jungle.png and b/src/assets/images/units/unit-nanman-infantry-jungle.png differ diff --git a/src/assets/images/units/unit-nanman-infantry-spear-actions.png b/src/assets/images/units/unit-nanman-infantry-spear-actions.png index 455d3f4..4a3d040 100644 Binary files a/src/assets/images/units/unit-nanman-infantry-spear-actions.png and b/src/assets/images/units/unit-nanman-infantry-spear-actions.png differ diff --git a/src/assets/images/units/unit-nanman-infantry-spear.png b/src/assets/images/units/unit-nanman-infantry-spear.png index f387790..10e48f0 100644 Binary files a/src/assets/images/units/unit-nanman-infantry-spear.png and b/src/assets/images/units/unit-nanman-infantry-spear.png differ diff --git a/src/assets/images/units/unit-nanman-infantry.png b/src/assets/images/units/unit-nanman-infantry.png index f387790..10e48f0 100644 Binary files a/src/assets/images/units/unit-nanman-infantry.png and b/src/assets/images/units/unit-nanman-infantry.png differ diff --git a/src/assets/images/units/unit-nanman-officer-actions.png b/src/assets/images/units/unit-nanman-officer-actions.png index 58d5639..30b61af 100644 Binary files a/src/assets/images/units/unit-nanman-officer-actions.png and b/src/assets/images/units/unit-nanman-officer-actions.png differ diff --git a/src/assets/images/units/unit-nanman-officer-bronze-actions.png b/src/assets/images/units/unit-nanman-officer-bronze-actions.png index 58d5639..30b61af 100644 Binary files a/src/assets/images/units/unit-nanman-officer-bronze-actions.png and b/src/assets/images/units/unit-nanman-officer-bronze-actions.png differ diff --git a/src/assets/images/units/unit-nanman-officer-bronze.png b/src/assets/images/units/unit-nanman-officer-bronze.png index fccb7f9..11bdae1 100644 Binary files a/src/assets/images/units/unit-nanman-officer-bronze.png and b/src/assets/images/units/unit-nanman-officer-bronze.png differ diff --git a/src/assets/images/units/unit-nanman-officer-warlord-actions.png b/src/assets/images/units/unit-nanman-officer-warlord-actions.png index 58d5639..30b61af 100644 Binary files a/src/assets/images/units/unit-nanman-officer-warlord-actions.png and b/src/assets/images/units/unit-nanman-officer-warlord-actions.png differ diff --git a/src/assets/images/units/unit-nanman-officer-warlord.png b/src/assets/images/units/unit-nanman-officer-warlord.png index fccb7f9..11bdae1 100644 Binary files a/src/assets/images/units/unit-nanman-officer-warlord.png and b/src/assets/images/units/unit-nanman-officer-warlord.png differ diff --git a/src/assets/images/units/unit-nanman-officer.png b/src/assets/images/units/unit-nanman-officer.png index fccb7f9..11bdae1 100644 Binary files a/src/assets/images/units/unit-nanman-officer.png and b/src/assets/images/units/unit-nanman-officer.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-actions.png b/src/assets/images/units/unit-nanman-shaman-actions.png index 846efe8..8aa1570 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-actions.png and b/src/assets/images/units/unit-nanman-shaman-actions.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-ember-actions.png b/src/assets/images/units/unit-nanman-shaman-ember-actions.png index 846efe8..8aa1570 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-ember-actions.png and b/src/assets/images/units/unit-nanman-shaman-ember-actions.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-ember.png b/src/assets/images/units/unit-nanman-shaman-ember.png index 761888e..f4e1d60 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-ember.png and b/src/assets/images/units/unit-nanman-shaman-ember.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-storm-actions.png b/src/assets/images/units/unit-nanman-shaman-storm-actions.png index 846efe8..8aa1570 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-storm-actions.png and b/src/assets/images/units/unit-nanman-shaman-storm-actions.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-storm.png b/src/assets/images/units/unit-nanman-shaman-storm.png index 761888e..f4e1d60 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-storm.png and b/src/assets/images/units/unit-nanman-shaman-storm.png differ diff --git a/src/assets/images/units/unit-nanman-shaman.png b/src/assets/images/units/unit-nanman-shaman.png index 761888e..f4e1d60 100644 Binary files a/src/assets/images/units/unit-nanman-shaman.png and b/src/assets/images/units/unit-nanman-shaman.png differ diff --git a/src/assets/images/units/unit-pang-tong-actions.png b/src/assets/images/units/unit-pang-tong-actions.png index 854afba..11ebe13 100644 Binary files a/src/assets/images/units/unit-pang-tong-actions.png and b/src/assets/images/units/unit-pang-tong-actions.png differ diff --git a/src/assets/images/units/unit-pang-tong.png b/src/assets/images/units/unit-pang-tong.png index 47e316c..6cec4e8 100644 Binary files a/src/assets/images/units/unit-pang-tong.png and b/src/assets/images/units/unit-pang-tong.png differ diff --git a/src/assets/images/units/unit-rebel-actions.png b/src/assets/images/units/unit-rebel-actions.png index 50e1497..d8af75a 100644 Binary files a/src/assets/images/units/unit-rebel-actions.png and b/src/assets/images/units/unit-rebel-actions.png differ diff --git a/src/assets/images/units/unit-rebel-archer-actions.png b/src/assets/images/units/unit-rebel-archer-actions.png index b24b347..684971d 100644 Binary files a/src/assets/images/units/unit-rebel-archer-actions.png and b/src/assets/images/units/unit-rebel-archer-actions.png differ diff --git a/src/assets/images/units/unit-rebel-archer-fire-actions.png b/src/assets/images/units/unit-rebel-archer-fire-actions.png index 35d303b..165036c 100644 Binary files a/src/assets/images/units/unit-rebel-archer-fire-actions.png and b/src/assets/images/units/unit-rebel-archer-fire-actions.png differ diff --git a/src/assets/images/units/unit-rebel-archer-fire.png b/src/assets/images/units/unit-rebel-archer-fire.png index f89d883..377fe3e 100644 Binary files a/src/assets/images/units/unit-rebel-archer-fire.png and b/src/assets/images/units/unit-rebel-archer-fire.png differ diff --git a/src/assets/images/units/unit-rebel-archer-veteran-actions.png b/src/assets/images/units/unit-rebel-archer-veteran-actions.png index 8f11e3c..dcb08ac 100644 Binary files a/src/assets/images/units/unit-rebel-archer-veteran-actions.png and b/src/assets/images/units/unit-rebel-archer-veteran-actions.png differ diff --git a/src/assets/images/units/unit-rebel-archer-veteran.png b/src/assets/images/units/unit-rebel-archer-veteran.png index 946fafa..a2f4719 100644 Binary files a/src/assets/images/units/unit-rebel-archer-veteran.png and b/src/assets/images/units/unit-rebel-archer-veteran.png differ diff --git a/src/assets/images/units/unit-rebel-archer.png b/src/assets/images/units/unit-rebel-archer.png index eed340a..70dd566 100644 Binary files a/src/assets/images/units/unit-rebel-archer.png and b/src/assets/images/units/unit-rebel-archer.png differ diff --git a/src/assets/images/units/unit-rebel-cavalry-actions.png b/src/assets/images/units/unit-rebel-cavalry-actions.png index f577302..14a81e4 100644 Binary files a/src/assets/images/units/unit-rebel-cavalry-actions.png and b/src/assets/images/units/unit-rebel-cavalry-actions.png differ diff --git a/src/assets/images/units/unit-rebel-cavalry-veteran-actions.png b/src/assets/images/units/unit-rebel-cavalry-veteran-actions.png index a151255..a6d6d08 100644 Binary files a/src/assets/images/units/unit-rebel-cavalry-veteran-actions.png and b/src/assets/images/units/unit-rebel-cavalry-veteran-actions.png differ diff --git a/src/assets/images/units/unit-rebel-cavalry-veteran.png b/src/assets/images/units/unit-rebel-cavalry-veteran.png index 20fc982..2cbbd41 100644 Binary files a/src/assets/images/units/unit-rebel-cavalry-veteran.png and b/src/assets/images/units/unit-rebel-cavalry-veteran.png differ diff --git a/src/assets/images/units/unit-rebel-cavalry.png b/src/assets/images/units/unit-rebel-cavalry.png index 6536457..e30e207 100644 Binary files a/src/assets/images/units/unit-rebel-cavalry.png and b/src/assets/images/units/unit-rebel-cavalry.png differ diff --git a/src/assets/images/units/unit-rebel-leader-actions.png b/src/assets/images/units/unit-rebel-leader-actions.png index 2cd57f1..c600448 100644 Binary files a/src/assets/images/units/unit-rebel-leader-actions.png and b/src/assets/images/units/unit-rebel-leader-actions.png differ diff --git a/src/assets/images/units/unit-rebel-leader-warlord-actions.png b/src/assets/images/units/unit-rebel-leader-warlord-actions.png index 7aaef3f..1311503 100644 Binary files a/src/assets/images/units/unit-rebel-leader-warlord-actions.png and b/src/assets/images/units/unit-rebel-leader-warlord-actions.png differ diff --git a/src/assets/images/units/unit-rebel-leader-warlord.png b/src/assets/images/units/unit-rebel-leader-warlord.png index ae196d0..058fade 100644 Binary files a/src/assets/images/units/unit-rebel-leader-warlord.png and b/src/assets/images/units/unit-rebel-leader-warlord.png differ diff --git a/src/assets/images/units/unit-rebel-leader.png b/src/assets/images/units/unit-rebel-leader.png index b225122..2a49031 100644 Binary files a/src/assets/images/units/unit-rebel-leader.png and b/src/assets/images/units/unit-rebel-leader.png differ diff --git a/src/assets/images/units/unit-rebel-ragged-actions.png b/src/assets/images/units/unit-rebel-ragged-actions.png index 57ec0b1..51ecb24 100644 Binary files a/src/assets/images/units/unit-rebel-ragged-actions.png and b/src/assets/images/units/unit-rebel-ragged-actions.png differ diff --git a/src/assets/images/units/unit-rebel-ragged.png b/src/assets/images/units/unit-rebel-ragged.png index caa9052..0931d64 100644 Binary files a/src/assets/images/units/unit-rebel-ragged.png and b/src/assets/images/units/unit-rebel-ragged.png differ diff --git a/src/assets/images/units/unit-rebel.png b/src/assets/images/units/unit-rebel.png index fe721c9..8a83f09 100644 Binary files a/src/assets/images/units/unit-rebel.png and b/src/assets/images/units/unit-rebel.png differ diff --git a/src/assets/images/units/unit-shu-archer-actions.png b/src/assets/images/units/unit-shu-archer-actions.png index 2cdc81b..6cb17d8 100644 Binary files a/src/assets/images/units/unit-shu-archer-actions.png and b/src/assets/images/units/unit-shu-archer-actions.png differ diff --git a/src/assets/images/units/unit-shu-archer-longbow-actions.png b/src/assets/images/units/unit-shu-archer-longbow-actions.png index 2cdc81b..6cb17d8 100644 Binary files a/src/assets/images/units/unit-shu-archer-longbow-actions.png and b/src/assets/images/units/unit-shu-archer-longbow-actions.png differ diff --git a/src/assets/images/units/unit-shu-archer-longbow.png b/src/assets/images/units/unit-shu-archer-longbow.png index 3ba5c56..0974883 100644 Binary files a/src/assets/images/units/unit-shu-archer-longbow.png and b/src/assets/images/units/unit-shu-archer-longbow.png differ diff --git a/src/assets/images/units/unit-shu-archer-veteran-actions.png b/src/assets/images/units/unit-shu-archer-veteran-actions.png index 2cdc81b..6cb17d8 100644 Binary files a/src/assets/images/units/unit-shu-archer-veteran-actions.png and b/src/assets/images/units/unit-shu-archer-veteran-actions.png differ diff --git a/src/assets/images/units/unit-shu-archer-veteran.png b/src/assets/images/units/unit-shu-archer-veteran.png index 3ba5c56..0974883 100644 Binary files a/src/assets/images/units/unit-shu-archer-veteran.png and b/src/assets/images/units/unit-shu-archer-veteran.png differ diff --git a/src/assets/images/units/unit-shu-archer.png b/src/assets/images/units/unit-shu-archer.png index 3ba5c56..0974883 100644 Binary files a/src/assets/images/units/unit-shu-archer.png and b/src/assets/images/units/unit-shu-archer.png differ diff --git a/src/assets/images/units/unit-shu-cavalry-actions.png b/src/assets/images/units/unit-shu-cavalry-actions.png index c524f29..dde4f61 100644 Binary files a/src/assets/images/units/unit-shu-cavalry-actions.png and b/src/assets/images/units/unit-shu-cavalry-actions.png differ diff --git a/src/assets/images/units/unit-shu-cavalry-scout-actions.png b/src/assets/images/units/unit-shu-cavalry-scout-actions.png index c524f29..dde4f61 100644 Binary files a/src/assets/images/units/unit-shu-cavalry-scout-actions.png and b/src/assets/images/units/unit-shu-cavalry-scout-actions.png differ diff --git a/src/assets/images/units/unit-shu-cavalry-scout.png b/src/assets/images/units/unit-shu-cavalry-scout.png index 5973ffb..87eacdf 100644 Binary files a/src/assets/images/units/unit-shu-cavalry-scout.png and b/src/assets/images/units/unit-shu-cavalry-scout.png differ diff --git a/src/assets/images/units/unit-shu-cavalry-white-actions.png b/src/assets/images/units/unit-shu-cavalry-white-actions.png index c524f29..dde4f61 100644 Binary files a/src/assets/images/units/unit-shu-cavalry-white-actions.png and b/src/assets/images/units/unit-shu-cavalry-white-actions.png differ diff --git a/src/assets/images/units/unit-shu-cavalry-white.png b/src/assets/images/units/unit-shu-cavalry-white.png index 5973ffb..87eacdf 100644 Binary files a/src/assets/images/units/unit-shu-cavalry-white.png and b/src/assets/images/units/unit-shu-cavalry-white.png differ diff --git a/src/assets/images/units/unit-shu-cavalry.png b/src/assets/images/units/unit-shu-cavalry.png index 5973ffb..87eacdf 100644 Binary files a/src/assets/images/units/unit-shu-cavalry.png and b/src/assets/images/units/unit-shu-cavalry.png differ diff --git a/src/assets/images/units/unit-shu-infantry-actions.png b/src/assets/images/units/unit-shu-infantry-actions.png index 6bcab7a..dd6f9f2 100644 Binary files a/src/assets/images/units/unit-shu-infantry-actions.png and b/src/assets/images/units/unit-shu-infantry-actions.png differ diff --git a/src/assets/images/units/unit-shu-infantry-banner-actions.png b/src/assets/images/units/unit-shu-infantry-banner-actions.png index 6bcab7a..dd6f9f2 100644 Binary files a/src/assets/images/units/unit-shu-infantry-banner-actions.png and b/src/assets/images/units/unit-shu-infantry-banner-actions.png differ diff --git a/src/assets/images/units/unit-shu-infantry-banner.png b/src/assets/images/units/unit-shu-infantry-banner.png index b2f77d1..c028d31 100644 Binary files a/src/assets/images/units/unit-shu-infantry-banner.png and b/src/assets/images/units/unit-shu-infantry-banner.png differ diff --git a/src/assets/images/units/unit-shu-infantry-guard-actions.png b/src/assets/images/units/unit-shu-infantry-guard-actions.png index 6bcab7a..dd6f9f2 100644 Binary files a/src/assets/images/units/unit-shu-infantry-guard-actions.png and b/src/assets/images/units/unit-shu-infantry-guard-actions.png differ diff --git a/src/assets/images/units/unit-shu-infantry-guard.png b/src/assets/images/units/unit-shu-infantry-guard.png index b2f77d1..c028d31 100644 Binary files a/src/assets/images/units/unit-shu-infantry-guard.png and b/src/assets/images/units/unit-shu-infantry-guard.png differ diff --git a/src/assets/images/units/unit-shu-infantry.png b/src/assets/images/units/unit-shu-infantry.png index b2f77d1..c028d31 100644 Binary files a/src/assets/images/units/unit-shu-infantry.png and b/src/assets/images/units/unit-shu-infantry.png differ diff --git a/src/assets/images/units/unit-shu-officer-actions.png b/src/assets/images/units/unit-shu-officer-actions.png index 6483ce5..7634f57 100644 Binary files a/src/assets/images/units/unit-shu-officer-actions.png and b/src/assets/images/units/unit-shu-officer-actions.png differ diff --git a/src/assets/images/units/unit-shu-officer-council-actions.png b/src/assets/images/units/unit-shu-officer-council-actions.png index 6483ce5..7634f57 100644 Binary files a/src/assets/images/units/unit-shu-officer-council-actions.png and b/src/assets/images/units/unit-shu-officer-council-actions.png differ diff --git a/src/assets/images/units/unit-shu-officer-council.png b/src/assets/images/units/unit-shu-officer-council.png index b5f7234..08f5632 100644 Binary files a/src/assets/images/units/unit-shu-officer-council.png and b/src/assets/images/units/unit-shu-officer-council.png differ diff --git a/src/assets/images/units/unit-shu-officer-vanguard-actions.png b/src/assets/images/units/unit-shu-officer-vanguard-actions.png index 6483ce5..7634f57 100644 Binary files a/src/assets/images/units/unit-shu-officer-vanguard-actions.png and b/src/assets/images/units/unit-shu-officer-vanguard-actions.png differ diff --git a/src/assets/images/units/unit-shu-officer-vanguard.png b/src/assets/images/units/unit-shu-officer-vanguard.png index b5f7234..08f5632 100644 Binary files a/src/assets/images/units/unit-shu-officer-vanguard.png and b/src/assets/images/units/unit-shu-officer-vanguard.png differ diff --git a/src/assets/images/units/unit-shu-officer.png b/src/assets/images/units/unit-shu-officer.png index b5f7234..08f5632 100644 Binary files a/src/assets/images/units/unit-shu-officer.png and b/src/assets/images/units/unit-shu-officer.png differ diff --git a/src/assets/images/units/unit-shu-spearman-actions.png b/src/assets/images/units/unit-shu-spearman-actions.png index e203232..ab244a6 100644 Binary files a/src/assets/images/units/unit-shu-spearman-actions.png and b/src/assets/images/units/unit-shu-spearman-actions.png differ diff --git a/src/assets/images/units/unit-shu-spearman-guard-actions.png b/src/assets/images/units/unit-shu-spearman-guard-actions.png index e203232..ab244a6 100644 Binary files a/src/assets/images/units/unit-shu-spearman-guard-actions.png and b/src/assets/images/units/unit-shu-spearman-guard-actions.png differ diff --git a/src/assets/images/units/unit-shu-spearman-guard.png b/src/assets/images/units/unit-shu-spearman-guard.png index 8b79193..ce0bc9e 100644 Binary files a/src/assets/images/units/unit-shu-spearman-guard.png and b/src/assets/images/units/unit-shu-spearman-guard.png differ diff --git a/src/assets/images/units/unit-shu-spearman-veteran-actions.png b/src/assets/images/units/unit-shu-spearman-veteran-actions.png index e203232..ab244a6 100644 Binary files a/src/assets/images/units/unit-shu-spearman-veteran-actions.png and b/src/assets/images/units/unit-shu-spearman-veteran-actions.png differ diff --git a/src/assets/images/units/unit-shu-spearman-veteran.png b/src/assets/images/units/unit-shu-spearman-veteran.png index 8b79193..ce0bc9e 100644 Binary files a/src/assets/images/units/unit-shu-spearman-veteran.png and b/src/assets/images/units/unit-shu-spearman-veteran.png differ diff --git a/src/assets/images/units/unit-shu-spearman.png b/src/assets/images/units/unit-shu-spearman.png index 8b79193..ce0bc9e 100644 Binary files a/src/assets/images/units/unit-shu-spearman.png and b/src/assets/images/units/unit-shu-spearman.png differ diff --git a/src/assets/images/units/unit-shu-strategist-actions.png b/src/assets/images/units/unit-shu-strategist-actions.png index 1d55b88..c849dbf 100644 Binary files a/src/assets/images/units/unit-shu-strategist-actions.png and b/src/assets/images/units/unit-shu-strategist-actions.png differ diff --git a/src/assets/images/units/unit-shu-strategist-field-actions.png b/src/assets/images/units/unit-shu-strategist-field-actions.png index 1d55b88..c849dbf 100644 Binary files a/src/assets/images/units/unit-shu-strategist-field-actions.png and b/src/assets/images/units/unit-shu-strategist-field-actions.png differ diff --git a/src/assets/images/units/unit-shu-strategist-field.png b/src/assets/images/units/unit-shu-strategist-field.png index fac6a8c..35fe4fc 100644 Binary files a/src/assets/images/units/unit-shu-strategist-field.png and b/src/assets/images/units/unit-shu-strategist-field.png differ diff --git a/src/assets/images/units/unit-shu-strategist-white-actions.png b/src/assets/images/units/unit-shu-strategist-white-actions.png index 1d55b88..c849dbf 100644 Binary files a/src/assets/images/units/unit-shu-strategist-white-actions.png and b/src/assets/images/units/unit-shu-strategist-white-actions.png differ diff --git a/src/assets/images/units/unit-shu-strategist-white.png b/src/assets/images/units/unit-shu-strategist-white.png index fac6a8c..35fe4fc 100644 Binary files a/src/assets/images/units/unit-shu-strategist-white.png and b/src/assets/images/units/unit-shu-strategist-white.png differ diff --git a/src/assets/images/units/unit-shu-strategist.png b/src/assets/images/units/unit-shu-strategist.png index fac6a8c..35fe4fc 100644 Binary files a/src/assets/images/units/unit-shu-strategist.png and b/src/assets/images/units/unit-shu-strategist.png differ diff --git a/src/assets/images/units/unit-sima-yi-actions.png b/src/assets/images/units/unit-sima-yi-actions.png index e5165df..dd7e8d5 100644 Binary files a/src/assets/images/units/unit-sima-yi-actions.png and b/src/assets/images/units/unit-sima-yi-actions.png differ diff --git a/src/assets/images/units/unit-sima-yi.png b/src/assets/images/units/unit-sima-yi.png index 83874d4..ebebdc9 100644 Binary files a/src/assets/images/units/unit-sima-yi.png and b/src/assets/images/units/unit-sima-yi.png differ diff --git a/src/assets/images/units/unit-wang-ping-actions.png b/src/assets/images/units/unit-wang-ping-actions.png index 0a2e9ef..16fd14d 100644 Binary files a/src/assets/images/units/unit-wang-ping-actions.png and b/src/assets/images/units/unit-wang-ping-actions.png differ diff --git a/src/assets/images/units/unit-wang-ping.png b/src/assets/images/units/unit-wang-ping.png index 39247a3..f8d7ffc 100644 Binary files a/src/assets/images/units/unit-wang-ping.png and b/src/assets/images/units/unit-wang-ping.png differ diff --git a/src/assets/images/units/unit-wei-archer-actions.png b/src/assets/images/units/unit-wei-archer-actions.png index 4e81138..3921113 100644 Binary files a/src/assets/images/units/unit-wei-archer-actions.png and b/src/assets/images/units/unit-wei-archer-actions.png differ diff --git a/src/assets/images/units/unit-wei-archer-crossbow-actions.png b/src/assets/images/units/unit-wei-archer-crossbow-actions.png index 4e81138..3921113 100644 Binary files a/src/assets/images/units/unit-wei-archer-crossbow-actions.png and b/src/assets/images/units/unit-wei-archer-crossbow-actions.png differ diff --git a/src/assets/images/units/unit-wei-archer-crossbow.png b/src/assets/images/units/unit-wei-archer-crossbow.png index 3965818..4d52261 100644 Binary files a/src/assets/images/units/unit-wei-archer-crossbow.png and b/src/assets/images/units/unit-wei-archer-crossbow.png differ diff --git a/src/assets/images/units/unit-wei-archer-veteran-actions.png b/src/assets/images/units/unit-wei-archer-veteran-actions.png index 4e81138..3921113 100644 Binary files a/src/assets/images/units/unit-wei-archer-veteran-actions.png and b/src/assets/images/units/unit-wei-archer-veteran-actions.png differ diff --git a/src/assets/images/units/unit-wei-archer-veteran.png b/src/assets/images/units/unit-wei-archer-veteran.png index 3965818..4d52261 100644 Binary files a/src/assets/images/units/unit-wei-archer-veteran.png and b/src/assets/images/units/unit-wei-archer-veteran.png differ diff --git a/src/assets/images/units/unit-wei-archer.png b/src/assets/images/units/unit-wei-archer.png index 3965818..4d52261 100644 Binary files a/src/assets/images/units/unit-wei-archer.png and b/src/assets/images/units/unit-wei-archer.png differ diff --git a/src/assets/images/units/unit-wei-cavalry-actions.png b/src/assets/images/units/unit-wei-cavalry-actions.png index ffbe181..b11645b 100644 Binary files a/src/assets/images/units/unit-wei-cavalry-actions.png and b/src/assets/images/units/unit-wei-cavalry-actions.png differ diff --git a/src/assets/images/units/unit-wei-cavalry-elite-actions.png b/src/assets/images/units/unit-wei-cavalry-elite-actions.png index ffbe181..b11645b 100644 Binary files a/src/assets/images/units/unit-wei-cavalry-elite-actions.png and b/src/assets/images/units/unit-wei-cavalry-elite-actions.png differ diff --git a/src/assets/images/units/unit-wei-cavalry-elite.png b/src/assets/images/units/unit-wei-cavalry-elite.png index f706868..c9cf168 100644 Binary files a/src/assets/images/units/unit-wei-cavalry-elite.png and b/src/assets/images/units/unit-wei-cavalry-elite.png differ diff --git a/src/assets/images/units/unit-wei-cavalry-iron-actions.png b/src/assets/images/units/unit-wei-cavalry-iron-actions.png index ffbe181..b11645b 100644 Binary files a/src/assets/images/units/unit-wei-cavalry-iron-actions.png and b/src/assets/images/units/unit-wei-cavalry-iron-actions.png differ diff --git a/src/assets/images/units/unit-wei-cavalry-iron.png b/src/assets/images/units/unit-wei-cavalry-iron.png index f706868..c9cf168 100644 Binary files a/src/assets/images/units/unit-wei-cavalry-iron.png and b/src/assets/images/units/unit-wei-cavalry-iron.png differ diff --git a/src/assets/images/units/unit-wei-cavalry.png b/src/assets/images/units/unit-wei-cavalry.png index f706868..c9cf168 100644 Binary files a/src/assets/images/units/unit-wei-cavalry.png and b/src/assets/images/units/unit-wei-cavalry.png differ diff --git a/src/assets/images/units/unit-wei-infantry-actions.png b/src/assets/images/units/unit-wei-infantry-actions.png index bfd0851..d21f212 100644 Binary files a/src/assets/images/units/unit-wei-infantry-actions.png and b/src/assets/images/units/unit-wei-infantry-actions.png differ diff --git a/src/assets/images/units/unit-wei-infantry-shield-actions.png b/src/assets/images/units/unit-wei-infantry-shield-actions.png index bfd0851..d21f212 100644 Binary files a/src/assets/images/units/unit-wei-infantry-shield-actions.png and b/src/assets/images/units/unit-wei-infantry-shield-actions.png differ diff --git a/src/assets/images/units/unit-wei-infantry-shield.png b/src/assets/images/units/unit-wei-infantry-shield.png index 595ad8b..82fdf1b 100644 Binary files a/src/assets/images/units/unit-wei-infantry-shield.png and b/src/assets/images/units/unit-wei-infantry-shield.png differ diff --git a/src/assets/images/units/unit-wei-infantry-veteran-actions.png b/src/assets/images/units/unit-wei-infantry-veteran-actions.png index bfd0851..d21f212 100644 Binary files a/src/assets/images/units/unit-wei-infantry-veteran-actions.png and b/src/assets/images/units/unit-wei-infantry-veteran-actions.png differ diff --git a/src/assets/images/units/unit-wei-infantry-veteran.png b/src/assets/images/units/unit-wei-infantry-veteran.png index 595ad8b..82fdf1b 100644 Binary files a/src/assets/images/units/unit-wei-infantry-veteran.png and b/src/assets/images/units/unit-wei-infantry-veteran.png differ diff --git a/src/assets/images/units/unit-wei-infantry.png b/src/assets/images/units/unit-wei-infantry.png index 595ad8b..82fdf1b 100644 Binary files a/src/assets/images/units/unit-wei-infantry.png and b/src/assets/images/units/unit-wei-infantry.png differ diff --git a/src/assets/images/units/unit-wei-officer-actions.png b/src/assets/images/units/unit-wei-officer-actions.png index 8537cdc..88b941e 100644 Binary files a/src/assets/images/units/unit-wei-officer-actions.png and b/src/assets/images/units/unit-wei-officer-actions.png differ diff --git a/src/assets/images/units/unit-wei-officer-gate-actions.png b/src/assets/images/units/unit-wei-officer-gate-actions.png index 8537cdc..88b941e 100644 Binary files a/src/assets/images/units/unit-wei-officer-gate-actions.png and b/src/assets/images/units/unit-wei-officer-gate-actions.png differ diff --git a/src/assets/images/units/unit-wei-officer-gate.png b/src/assets/images/units/unit-wei-officer-gate.png index 1593ace..9adb78f 100644 Binary files a/src/assets/images/units/unit-wei-officer-gate.png and b/src/assets/images/units/unit-wei-officer-gate.png differ diff --git a/src/assets/images/units/unit-wei-officer-iron-actions.png b/src/assets/images/units/unit-wei-officer-iron-actions.png index 8537cdc..88b941e 100644 Binary files a/src/assets/images/units/unit-wei-officer-iron-actions.png and b/src/assets/images/units/unit-wei-officer-iron-actions.png differ diff --git a/src/assets/images/units/unit-wei-officer-iron.png b/src/assets/images/units/unit-wei-officer-iron.png index 1593ace..9adb78f 100644 Binary files a/src/assets/images/units/unit-wei-officer-iron.png and b/src/assets/images/units/unit-wei-officer-iron.png differ diff --git a/src/assets/images/units/unit-wei-officer.png b/src/assets/images/units/unit-wei-officer.png index 1593ace..9adb78f 100644 Binary files a/src/assets/images/units/unit-wei-officer.png and b/src/assets/images/units/unit-wei-officer.png differ diff --git a/src/assets/images/units/unit-wei-strategist-actions.png b/src/assets/images/units/unit-wei-strategist-actions.png index f4108c8..2066141 100644 Binary files a/src/assets/images/units/unit-wei-strategist-actions.png and b/src/assets/images/units/unit-wei-strategist-actions.png differ diff --git a/src/assets/images/units/unit-wei-strategist-black-actions.png b/src/assets/images/units/unit-wei-strategist-black-actions.png index f4108c8..2066141 100644 Binary files a/src/assets/images/units/unit-wei-strategist-black-actions.png and b/src/assets/images/units/unit-wei-strategist-black-actions.png differ diff --git a/src/assets/images/units/unit-wei-strategist-black.png b/src/assets/images/units/unit-wei-strategist-black.png index 3a5d078..41ece7b 100644 Binary files a/src/assets/images/units/unit-wei-strategist-black.png and b/src/assets/images/units/unit-wei-strategist-black.png differ diff --git a/src/assets/images/units/unit-wei-strategist-blue-actions.png b/src/assets/images/units/unit-wei-strategist-blue-actions.png index f4108c8..2066141 100644 Binary files a/src/assets/images/units/unit-wei-strategist-blue-actions.png and b/src/assets/images/units/unit-wei-strategist-blue-actions.png differ diff --git a/src/assets/images/units/unit-wei-strategist-blue.png b/src/assets/images/units/unit-wei-strategist-blue.png index 3a5d078..41ece7b 100644 Binary files a/src/assets/images/units/unit-wei-strategist-blue.png and b/src/assets/images/units/unit-wei-strategist-blue.png differ diff --git a/src/assets/images/units/unit-wei-strategist.png b/src/assets/images/units/unit-wei-strategist.png index 3a5d078..41ece7b 100644 Binary files a/src/assets/images/units/unit-wei-strategist.png and b/src/assets/images/units/unit-wei-strategist.png differ diff --git a/src/assets/images/units/unit-wei-yan-actions.png b/src/assets/images/units/unit-wei-yan-actions.png index 0e75bcb..1fd1485 100644 Binary files a/src/assets/images/units/unit-wei-yan-actions.png and b/src/assets/images/units/unit-wei-yan-actions.png differ diff --git a/src/assets/images/units/unit-wei-yan.png b/src/assets/images/units/unit-wei-yan.png index f451386..af26586 100644 Binary files a/src/assets/images/units/unit-wei-yan.png and b/src/assets/images/units/unit-wei-yan.png differ diff --git a/src/assets/images/units/unit-wu-archer-actions.png b/src/assets/images/units/unit-wu-archer-actions.png index fbeba70..2338872 100644 Binary files a/src/assets/images/units/unit-wu-archer-actions.png and b/src/assets/images/units/unit-wu-archer-actions.png differ diff --git a/src/assets/images/units/unit-wu-archer-naval-actions.png b/src/assets/images/units/unit-wu-archer-naval-actions.png index fbeba70..2338872 100644 Binary files a/src/assets/images/units/unit-wu-archer-naval-actions.png and b/src/assets/images/units/unit-wu-archer-naval-actions.png differ diff --git a/src/assets/images/units/unit-wu-archer-naval.png b/src/assets/images/units/unit-wu-archer-naval.png index b27ec70..43e414d 100644 Binary files a/src/assets/images/units/unit-wu-archer-naval.png and b/src/assets/images/units/unit-wu-archer-naval.png differ diff --git a/src/assets/images/units/unit-wu-archer-river-actions.png b/src/assets/images/units/unit-wu-archer-river-actions.png index fbeba70..2338872 100644 Binary files a/src/assets/images/units/unit-wu-archer-river-actions.png and b/src/assets/images/units/unit-wu-archer-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-archer-river.png b/src/assets/images/units/unit-wu-archer-river.png index b27ec70..43e414d 100644 Binary files a/src/assets/images/units/unit-wu-archer-river.png and b/src/assets/images/units/unit-wu-archer-river.png differ diff --git a/src/assets/images/units/unit-wu-archer.png b/src/assets/images/units/unit-wu-archer.png index b27ec70..43e414d 100644 Binary files a/src/assets/images/units/unit-wu-archer.png and b/src/assets/images/units/unit-wu-archer.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-actions.png b/src/assets/images/units/unit-wu-cavalry-actions.png index 86811a2..cfb683b 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-actions.png and b/src/assets/images/units/unit-wu-cavalry-actions.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-elite-actions.png b/src/assets/images/units/unit-wu-cavalry-elite-actions.png index 86811a2..cfb683b 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-elite-actions.png and b/src/assets/images/units/unit-wu-cavalry-elite-actions.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-elite.png b/src/assets/images/units/unit-wu-cavalry-elite.png index 3f241ad..8f88e53 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-elite.png and b/src/assets/images/units/unit-wu-cavalry-elite.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-river-actions.png b/src/assets/images/units/unit-wu-cavalry-river-actions.png index 86811a2..cfb683b 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-river-actions.png and b/src/assets/images/units/unit-wu-cavalry-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-river.png b/src/assets/images/units/unit-wu-cavalry-river.png index 3f241ad..8f88e53 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-river.png and b/src/assets/images/units/unit-wu-cavalry-river.png differ diff --git a/src/assets/images/units/unit-wu-cavalry.png b/src/assets/images/units/unit-wu-cavalry.png index 3f241ad..8f88e53 100644 Binary files a/src/assets/images/units/unit-wu-cavalry.png and b/src/assets/images/units/unit-wu-cavalry.png differ diff --git a/src/assets/images/units/unit-wu-infantry-actions.png b/src/assets/images/units/unit-wu-infantry-actions.png index ab3f689..f179279 100644 Binary files a/src/assets/images/units/unit-wu-infantry-actions.png and b/src/assets/images/units/unit-wu-infantry-actions.png differ diff --git a/src/assets/images/units/unit-wu-infantry-marine-actions.png b/src/assets/images/units/unit-wu-infantry-marine-actions.png index ab3f689..f179279 100644 Binary files a/src/assets/images/units/unit-wu-infantry-marine-actions.png and b/src/assets/images/units/unit-wu-infantry-marine-actions.png differ diff --git a/src/assets/images/units/unit-wu-infantry-marine.png b/src/assets/images/units/unit-wu-infantry-marine.png index 1e61e97..d472ca2 100644 Binary files a/src/assets/images/units/unit-wu-infantry-marine.png and b/src/assets/images/units/unit-wu-infantry-marine.png differ diff --git a/src/assets/images/units/unit-wu-infantry-river-actions.png b/src/assets/images/units/unit-wu-infantry-river-actions.png index ab3f689..f179279 100644 Binary files a/src/assets/images/units/unit-wu-infantry-river-actions.png and b/src/assets/images/units/unit-wu-infantry-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-infantry-river.png b/src/assets/images/units/unit-wu-infantry-river.png index 1e61e97..d472ca2 100644 Binary files a/src/assets/images/units/unit-wu-infantry-river.png and b/src/assets/images/units/unit-wu-infantry-river.png differ diff --git a/src/assets/images/units/unit-wu-infantry.png b/src/assets/images/units/unit-wu-infantry.png index 1e61e97..d472ca2 100644 Binary files a/src/assets/images/units/unit-wu-infantry.png and b/src/assets/images/units/unit-wu-infantry.png differ diff --git a/src/assets/images/units/unit-wu-officer-actions.png b/src/assets/images/units/unit-wu-officer-actions.png index b68980b..4eb8859 100644 Binary files a/src/assets/images/units/unit-wu-officer-actions.png and b/src/assets/images/units/unit-wu-officer-actions.png differ diff --git a/src/assets/images/units/unit-wu-officer-harbor-actions.png b/src/assets/images/units/unit-wu-officer-harbor-actions.png index b68980b..4eb8859 100644 Binary files a/src/assets/images/units/unit-wu-officer-harbor-actions.png and b/src/assets/images/units/unit-wu-officer-harbor-actions.png differ diff --git a/src/assets/images/units/unit-wu-officer-harbor.png b/src/assets/images/units/unit-wu-officer-harbor.png index 318f67a..070f9d7 100644 Binary files a/src/assets/images/units/unit-wu-officer-harbor.png and b/src/assets/images/units/unit-wu-officer-harbor.png differ diff --git a/src/assets/images/units/unit-wu-officer-river-actions.png b/src/assets/images/units/unit-wu-officer-river-actions.png index b68980b..4eb8859 100644 Binary files a/src/assets/images/units/unit-wu-officer-river-actions.png and b/src/assets/images/units/unit-wu-officer-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-officer-river.png b/src/assets/images/units/unit-wu-officer-river.png index 318f67a..070f9d7 100644 Binary files a/src/assets/images/units/unit-wu-officer-river.png and b/src/assets/images/units/unit-wu-officer-river.png differ diff --git a/src/assets/images/units/unit-wu-officer.png b/src/assets/images/units/unit-wu-officer.png index 318f67a..070f9d7 100644 Binary files a/src/assets/images/units/unit-wu-officer.png and b/src/assets/images/units/unit-wu-officer.png differ diff --git a/src/assets/images/units/unit-wu-strategist-actions.png b/src/assets/images/units/unit-wu-strategist-actions.png index 915da5d..84521b6 100644 Binary files a/src/assets/images/units/unit-wu-strategist-actions.png and b/src/assets/images/units/unit-wu-strategist-actions.png differ diff --git a/src/assets/images/units/unit-wu-strategist-fire-actions.png b/src/assets/images/units/unit-wu-strategist-fire-actions.png index 915da5d..84521b6 100644 Binary files a/src/assets/images/units/unit-wu-strategist-fire-actions.png and b/src/assets/images/units/unit-wu-strategist-fire-actions.png differ diff --git a/src/assets/images/units/unit-wu-strategist-fire.png b/src/assets/images/units/unit-wu-strategist-fire.png index ae6b3df..467b976 100644 Binary files a/src/assets/images/units/unit-wu-strategist-fire.png and b/src/assets/images/units/unit-wu-strategist-fire.png differ diff --git a/src/assets/images/units/unit-wu-strategist-river-actions.png b/src/assets/images/units/unit-wu-strategist-river-actions.png index 915da5d..84521b6 100644 Binary files a/src/assets/images/units/unit-wu-strategist-river-actions.png and b/src/assets/images/units/unit-wu-strategist-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-strategist-river.png b/src/assets/images/units/unit-wu-strategist-river.png index ae6b3df..467b976 100644 Binary files a/src/assets/images/units/unit-wu-strategist-river.png and b/src/assets/images/units/unit-wu-strategist-river.png differ diff --git a/src/assets/images/units/unit-wu-strategist.png b/src/assets/images/units/unit-wu-strategist.png index ae6b3df..467b976 100644 Binary files a/src/assets/images/units/unit-wu-strategist.png and b/src/assets/images/units/unit-wu-strategist.png differ diff --git a/src/assets/images/units/unit-wu-yi-actions.png b/src/assets/images/units/unit-wu-yi-actions.png index 36329cf..b46bc4e 100644 Binary files a/src/assets/images/units/unit-wu-yi-actions.png and b/src/assets/images/units/unit-wu-yi-actions.png differ diff --git a/src/assets/images/units/unit-wu-yi.png b/src/assets/images/units/unit-wu-yi.png index 92ae4a0..ce1068b 100644 Binary files a/src/assets/images/units/unit-wu-yi.png and b/src/assets/images/units/unit-wu-yi.png differ diff --git a/src/assets/images/units/unit-yan-yan-actions.png b/src/assets/images/units/unit-yan-yan-actions.png index 6fd003a..0205cd0 100644 Binary files a/src/assets/images/units/unit-yan-yan-actions.png and b/src/assets/images/units/unit-yan-yan-actions.png differ diff --git a/src/assets/images/units/unit-yan-yan.png b/src/assets/images/units/unit-yan-yan.png index eeaf98b..892c56b 100644 Binary files a/src/assets/images/units/unit-yan-yan.png and b/src/assets/images/units/unit-yan-yan.png differ diff --git a/src/assets/images/units/unit-yi-ji-actions.png b/src/assets/images/units/unit-yi-ji-actions.png index 9abb5e1..aa89a2d 100644 Binary files a/src/assets/images/units/unit-yi-ji-actions.png and b/src/assets/images/units/unit-yi-ji-actions.png differ diff --git a/src/assets/images/units/unit-yi-ji.png b/src/assets/images/units/unit-yi-ji.png index 0ceb06b..c223705 100644 Binary files a/src/assets/images/units/unit-yi-ji.png and b/src/assets/images/units/unit-yi-ji.png differ diff --git a/src/assets/images/units/unit-zhang-fei-actions.png b/src/assets/images/units/unit-zhang-fei-actions.png index 322bbb2..1be2847 100644 Binary files a/src/assets/images/units/unit-zhang-fei-actions.png and b/src/assets/images/units/unit-zhang-fei-actions.png differ diff --git a/src/assets/images/units/unit-zhang-fei.png b/src/assets/images/units/unit-zhang-fei.png index be92b7d..8aaedb0 100644 Binary files a/src/assets/images/units/unit-zhang-fei.png and b/src/assets/images/units/unit-zhang-fei.png differ diff --git a/src/assets/images/units/unit-zhao-yun-actions.png b/src/assets/images/units/unit-zhao-yun-actions.png index 8ef4521..da2fca2 100644 Binary files a/src/assets/images/units/unit-zhao-yun-actions.png and b/src/assets/images/units/unit-zhao-yun-actions.png differ diff --git a/src/assets/images/units/unit-zhao-yun.png b/src/assets/images/units/unit-zhao-yun.png index aa83303..d807b42 100644 Binary files a/src/assets/images/units/unit-zhao-yun.png and b/src/assets/images/units/unit-zhao-yun.png differ diff --git a/src/assets/images/units/unit-zhuge-liang-actions.png b/src/assets/images/units/unit-zhuge-liang-actions.png index a6a9cf6..d715d3b 100644 Binary files a/src/assets/images/units/unit-zhuge-liang-actions.png and b/src/assets/images/units/unit-zhuge-liang-actions.png differ diff --git a/src/assets/images/units/unit-zhuge-liang.png b/src/assets/images/units/unit-zhuge-liang.png index 766f9d0..ca07770 100644 Binary files a/src/assets/images/units/unit-zhuge-liang.png and b/src/assets/images/units/unit-zhuge-liang.png differ diff --git a/src/game/data/unitAssets.ts b/src/game/data/unitAssets.ts index b9d34b7..0482fd4 100644 --- a/src/game/data/unitAssets.ts +++ b/src/game/data/unitAssets.ts @@ -5,6 +5,7 @@ export type UnitDirection = 'south' | 'east' | 'north' | 'west'; const unitWalkFrameCount = 4; export const unitSheetFrameSize = 313; const unitWalkFrameRate = 8; +const unitIdleFrameRate = 3; const unitSheetRows: Record = { south: 0, east: 1, @@ -96,7 +97,10 @@ export function ensureUnitAnimations(scene: Phaser.Scene, keys: Iterable key, frame: unitSheetRows[direction] * unitWalkFrameCount + frameIndex })); - const idleFrame = [{ key, frame: unitSheetRows[direction] * unitWalkFrameCount }]; + const idleFrames = [0, 1, 0, 3].map((frameIndex) => ({ + key, + frame: unitSheetRows[direction] * unitWalkFrameCount + frameIndex + })); const walkAnimationKey = `${key}-walk-${direction}`; const idleAnimationKey = `${key}-idle-${direction}`; @@ -112,9 +116,9 @@ export function ensureUnitAnimations(scene: Phaser.Scene, keys: Iterable if (!scene.anims.exists(idleAnimationKey)) { scene.anims.create({ key: idleAnimationKey, - frames: idleFrame, - frameRate: 1, - repeat: 0 + frames: idleFrames, + frameRate: unitIdleFrameRate, + repeat: -1 }); } }); diff --git a/src/game/scenes/BattleScene.ts b/src/game/scenes/BattleScene.ts index ffb897b..58ed2ed 100644 --- a/src/game/scenes/BattleScene.ts +++ b/src/game/scenes/BattleScene.ts @@ -1058,6 +1058,11 @@ type UnitView = { label: Phaser.GameObjects.Text; textureBase: string; direction: UnitDirection; + baseX: number; + baseY: number; + baseScaleX: number; + baseScaleY: number; + idleTween?: Phaser.Tweens.Tween; }; type UnitDirection = 'south' | 'east' | 'north' | 'west'; @@ -3183,8 +3188,18 @@ export class BattleScene extends Phaser.Scene { if (this.mapMask) { label.setMask(this.mapMask); } - const view = { sprite, label, textureBase, direction: 'south' as UnitDirection }; + const view = { + sprite, + label, + textureBase, + direction: 'south' as UnitDirection, + baseX: sprite.x, + baseY: sprite.y, + baseScaleX: sprite.scaleX, + baseScaleY: sprite.scaleY + }; this.unitViews.set(unit.id, view); + this.applyUnitTone(view); this.syncUnitMotion(unit, view); }); } @@ -3422,11 +3437,12 @@ export class BattleScene extends Phaser.Scene { return; } - view.sprite.setPosition(this.tileCenterX(unit.x), this.tileCenterY(unit.y)); - view.label.setPosition(view.sprite.x, view.sprite.y + this.layout.tileSize * 0.52); + this.setUnitBasePosition(view, this.tileCenterX(unit.x), this.tileCenterY(unit.y)); + view.label.setPosition(view.baseX, view.baseY + this.layout.tileSize * 0.52); const visible = this.isTileVisible(unit.x, unit.y); view.sprite.setVisible(visible); view.label.setVisible(visible); + this.syncUnitMotion(unit, view); } private isTileVisible(x: number, y: number) { @@ -3580,7 +3596,7 @@ export class BattleScene extends Phaser.Scene { const targetX = this.tileCenterX(x); const targetY = this.tileCenterY(y); if (!stayingInPlace) { - this.moveUnitView(unit, x, y, view); + this.moveUnitView(unit, x, y, view, 260, fromX, fromY); } this.showCommandMenu(unit, pointer?.x ?? targetX, pointer?.y ?? targetY); const isFinalAlly = this.remainingAllyCount() === 1; @@ -6630,8 +6646,9 @@ export class BattleScene extends Phaser.Scene { this.tweens.killTweensOf([view.sprite, view.label]); view.direction = direction; - view.sprite.setPosition(this.tileCenterX(unit.x), this.tileCenterY(unit.y)); - view.label.setPosition(view.sprite.x, view.sprite.y + this.layout.tileSize * 0.52); + this.setUnitBasePosition(view, this.tileCenterX(unit.x), this.tileCenterY(unit.y)); + this.resetUnitSpritePose(view); + view.label.setPosition(view.baseX, view.baseY + this.layout.tileSize * 0.52); if (unit.hp > 0) { view.sprite.setInteractive({ useHandCursor: true }); } @@ -6763,10 +6780,12 @@ export class BattleScene extends Phaser.Scene { if (!this.canAttack(enemy, target) && behavior !== 'hold') { const destination = this.chooseApproachTile(enemy, target); if (destination && (destination.x !== enemy.x || destination.y !== enemy.y)) { + const fromX = enemy.x; + const fromY = enemy.y; enemy.x = destination.x; enemy.y = destination.y; this.centerCameraOnTile(destination.x, destination.y); - await this.moveUnitViewAsync(enemy, destination.x, destination.y, this.unitViews.get(enemy.id), 260); + await this.moveUnitViewAsync(enemy, destination.x, destination.y, this.unitViews.get(enemy.id), 260, fromX, fromY); } } @@ -8423,7 +8442,9 @@ export class BattleScene extends Phaser.Scene { x: number, y: number, view = this.unitViews.get(unit.id), - duration = 260 + duration = 260, + fromX = unit.x, + fromY = unit.y ) { return new Promise((resolve) => { if (!view) { @@ -8431,12 +8452,17 @@ export class BattleScene extends Phaser.Scene { return; } + const startX = this.tileCenterX(fromX); + const startY = this.tileCenterY(fromY); const targetX = this.tileCenterX(x); const targetY = this.tileCenterY(y); - const direction = this.directionFromDelta(targetX - view.sprite.x, targetY - view.sprite.y); - const movementDistance = this.movementTileDistance(unit, x, y); + const direction = this.directionFromDelta(x - fromX, y - fromY); + const movementDistance = this.movementTileDistanceFrom(fromX, fromY, x, y); const movementDuration = this.movementDuration(duration, movementDistance); this.tweens.killTweensOf([view.sprite, view.label]); + this.setUnitBasePosition(view, startX, startY); + this.resetUnitSpritePose(view); + view.label.setPosition(startX, startY + this.layout.tileSize * 0.52); this.playMovementSound(unit, movementDuration, movementDistance); this.playUnitWalk(view, direction); this.tweens.add({ @@ -8446,6 +8472,7 @@ export class BattleScene extends Phaser.Scene { duration: movementDuration, ease: 'Sine.easeInOut', onComplete: () => { + this.setUnitBasePosition(view, targetX, targetY); this.syncUnitMotion(unit, view, direction); this.updateMiniMap(); resolve(); @@ -8591,6 +8618,7 @@ export class BattleScene extends Phaser.Scene { return; } view.sprite.postFX.clear(); + this.applyUnitTone(view); view.sprite.clearTint(); view.sprite.setAlpha(1); if (unit) { @@ -8935,7 +8963,7 @@ export class BattleScene extends Phaser.Scene { this.updateMiniMap(); soundDirector.playSelect(); - this.moveUnitView(unit, fromX, fromY, view, 180); + this.moveUnitView(unit, fromX, fromY, view, 180, toX, toY); this.clearMarkers(); this.showMoveRange(unit); this.renderUnitDetail( @@ -8950,18 +8978,25 @@ export class BattleScene extends Phaser.Scene { x: number, y: number, view = this.unitViews.get(unit.id), - duration = 260 + duration = 260, + fromX = unit.x, + fromY = unit.y ) { if (!view) { return; } + const startX = this.tileCenterX(fromX); + const startY = this.tileCenterY(fromY); const targetX = this.tileCenterX(x); const targetY = this.tileCenterY(y); - const direction = this.directionFromDelta(targetX - view.sprite.x, targetY - view.sprite.y); - const movementDistance = this.movementTileDistance(unit, x, y); + const direction = this.directionFromDelta(x - fromX, y - fromY); + const movementDistance = this.movementTileDistanceFrom(fromX, fromY, x, y); const movementDuration = this.movementDuration(duration, movementDistance); this.tweens.killTweensOf([view.sprite, view.label]); + this.setUnitBasePosition(view, startX, startY); + this.resetUnitSpritePose(view); + view.label.setPosition(startX, startY + this.layout.tileSize * 0.52); this.playMovementSound(unit, movementDuration, movementDistance); this.playUnitWalk(view, direction); this.tweens.add({ @@ -8971,6 +9006,7 @@ export class BattleScene extends Phaser.Scene { duration: movementDuration, ease: 'Sine.easeInOut', onComplete: () => { + this.setUnitBasePosition(view, targetX, targetY); this.syncUnitMotion(unit, view, direction); this.updateMiniMap(); } @@ -8985,7 +9021,11 @@ export class BattleScene extends Phaser.Scene { } private movementTileDistance(unit: UnitData, x: number, y: number) { - return Math.max(1, Math.abs(x - unit.x) + Math.abs(y - unit.y)); + return this.movementTileDistanceFrom(unit.x, unit.y, x, y); + } + + private movementTileDistanceFrom(fromX: number, fromY: number, x: number, y: number) { + return Math.max(1, Math.abs(x - fromX) + Math.abs(y - fromY)); } private movementDuration(baseDuration: number, tileDistance: number) { @@ -8996,19 +9036,18 @@ export class BattleScene extends Phaser.Scene { } private playMovementSound(unit: UnitData, duration: number, tileDistance = 1) { - const mountedClasses: UnitClassKey[] = ['cavalry']; - const isMounted = mountedClasses.includes(unit.classKey); + const isMounted = this.isMountedUnit(unit); const key = isMounted ? 'horse-gallop' : 'footstep-walk'; const pulseCount = isMounted - ? Math.max(2, Math.min(9, tileDistance * 2)) + ? Math.max(3, Math.min(10, tileDistance * 2 + 1)) : Math.max(2, Math.min(8, tileDistance + 1)); - const interval = Math.max(isMounted ? 74 : 96, duration / Math.max(1, pulseCount - 0.25)); + const interval = Math.max(isMounted ? 72 : 108, duration / Math.max(1, pulseCount - 0.25)); for (let index = 0; index < pulseCount; index += 1) { this.time.delayedCall(Math.round(index * interval), () => { soundDirector.playEffect(key, { - volume: isMounted ? 0.36 : 0.32, - rate: isMounted ? 1.02 + (index % 2) * 0.1 : 0.95 + (index % 2) * 0.12, + volume: isMounted ? 0.24 : 0.18, + rate: isMounted ? 0.98 + (index % 2) * 0.12 : 0.9 + (index % 2) * 0.12, stopAfterMs: Math.round(Math.min(isMounted ? 210 : 260, interval + 80)) }); }); @@ -9024,18 +9063,22 @@ export class BattleScene extends Phaser.Scene { private playUnitWalk(view: UnitView, direction: UnitDirection) { view.direction = direction; + this.stopUnitIdle(view); view.sprite.setFlipX(false); view.sprite.play(`${view.textureBase}-walk-${direction}`, true); } - private playUnitIdle(view: UnitView, direction: UnitDirection) { + private playUnitIdle(unit: UnitData, view: UnitView, direction: UnitDirection) { view.direction = direction; + this.stopUnitIdle(view); view.sprite.setFlipX(false); view.sprite.play(`${view.textureBase}-idle-${direction}`, true); + this.startUnitIdleMotion(unit, view, direction); } private stopUnitWalk(view: UnitView, direction: UnitDirection) { view.direction = direction; + this.stopUnitIdle(view); view.sprite.stop(); this.setUnitDirectionFrame(view, direction); } @@ -9051,7 +9094,7 @@ export class BattleScene extends Phaser.Scene { return; } - this.playUnitIdle(view, direction); + this.playUnitIdle(unit, view, direction); } private setUnitDirectionFrame(view: UnitView, direction: UnitDirection) { @@ -9059,6 +9102,60 @@ export class BattleScene extends Phaser.Scene { view.sprite.setFlipX(false); } + private setUnitBasePosition(view: UnitView, x: number, y: number) { + view.baseX = x; + view.baseY = y; + view.sprite.setPosition(x, y); + } + + private resetUnitSpritePose(view: UnitView) { + view.sprite.setPosition(view.baseX, view.baseY); + view.sprite.setScale(view.baseScaleX, view.baseScaleY); + view.sprite.setAngle(0); + } + + private stopUnitIdle(view: UnitView) { + view.idleTween?.stop(); + view.idleTween = undefined; + this.tweens.killTweensOf(view.sprite); + this.resetUnitSpritePose(view); + } + + private startUnitIdleMotion(unit: UnitData, view: UnitView, direction: UnitDirection) { + const mounted = this.isMountedUnit(unit); + const seed = this.hashString(unit.id) % 160; + const sway = direction === 'west' ? -1 : 1; + const bob = mounted ? 2.1 : 1.35; + const duration = mounted ? 520 + seed * 0.45 : 880 + seed * 0.8; + const angle = mounted ? 0.45 * sway : 0.65 * sway; + const scaleX = view.baseScaleX * (mounted ? 1.012 : 0.992); + const scaleY = view.baseScaleY * (mounted ? 0.988 : 1.014); + + view.idleTween = this.tweens.add({ + targets: view.sprite, + y: view.baseY - bob, + angle, + scaleX, + scaleY, + duration, + ease: 'Sine.easeInOut', + yoyo: true, + repeat: -1, + delay: seed + }); + } + + private applyUnitTone(view: UnitView) { + const tone = view.sprite.postFX.addColorMatrix(); + tone.saturate(-0.32); + tone.contrast(0.03, true); + tone.brightness(0.97, true); + } + + private isMountedUnit(unit: UnitData) { + return unit.classKey === 'cavalry'; + } + private unitFrameIndex(direction: UnitDirection, frame = 0) { return unitFrameRows[direction] * 4 + frame; } @@ -9240,6 +9337,7 @@ export class BattleScene extends Phaser.Scene { } view.sprite.postFX.clear(); + this.applyUnitTone(view); view.sprite.clearTint(); view.sprite.setAlpha(1); this.syncUnitMotion(unit, view);