Expand campaign visual assets

This commit is contained in:
2026-06-25 10:52:16 +09:00
parent 30291fe0fa
commit 03ca89e03f
18 changed files with 254 additions and 300 deletions

View File

@@ -1,108 +1,6 @@
import Phaser from 'phaser';
import guanYuPortraitUrl from '../../assets/images/portraits/guan-yu.png';
import jiangWeiPortraitUrl from '../../assets/images/portraits/jiang-wei.png';
import liuBeiPortraitUrl from '../../assets/images/portraits/liu-bei.png';
import simaYiPortraitUrl from '../../assets/images/portraits/sima-yi.png';
import zhaoYunPortraitUrl from '../../assets/images/portraits/zhao-yun.png';
import zhangFeiPortraitUrl from '../../assets/images/portraits/zhang-fei.png';
import zhugeLiangPortraitUrl from '../../assets/images/portraits/zhuge-liang.png';
import titleBackgroundUrl from '../../assets/images/taoyuan-oath-title.png';
import caoCaoActionSheetUrl from '../../assets/images/units/unit-cao-cao-actions.png';
import caoCaoUnitSheetUrl from '../../assets/images/units/unit-cao-cao.png';
import faZhengActionSheetUrl from '../../assets/images/units/unit-fa-zheng-actions.png';
import faZhengUnitSheetUrl from '../../assets/images/units/unit-fa-zheng.png';
import gongZhiActionSheetUrl from '../../assets/images/units/unit-gong-zhi-actions.png';
import gongZhiUnitSheetUrl from '../../assets/images/units/unit-gong-zhi.png';
import guanYuActionSheetUrl from '../../assets/images/units/unit-guan-yu-actions.png';
import guanYuUnitSheetUrl from '../../assets/images/units/unit-guan-yu.png';
import huangQuanActionSheetUrl from '../../assets/images/units/unit-huang-quan-actions.png';
import huangQuanUnitSheetUrl from '../../assets/images/units/unit-huang-quan.png';
import huangZhongActionSheetUrl from '../../assets/images/units/unit-huang-zhong-actions.png';
import huangZhongUnitSheetUrl from '../../assets/images/units/unit-huang-zhong.png';
import jiangWeiActionSheetUrl from '../../assets/images/units/unit-jiang-wei-actions.png';
import jiangWeiUnitSheetUrl from '../../assets/images/units/unit-jiang-wei.png';
import liYanActionSheetUrl from '../../assets/images/units/unit-li-yan-actions.png';
import liYanUnitSheetUrl from '../../assets/images/units/unit-li-yan.png';
import liuBeiActionSheetUrl from '../../assets/images/units/unit-liu-bei-actions.png';
import liuBeiUnitSheetUrl from '../../assets/images/units/unit-liu-bei.png';
import luBuActionSheetUrl from '../../assets/images/units/unit-lu-bu-actions.png';
import luBuUnitSheetUrl from '../../assets/images/units/unit-lu-bu.png';
import luMengActionSheetUrl from '../../assets/images/units/unit-lu-meng-actions.png';
import luMengUnitSheetUrl from '../../assets/images/units/unit-lu-meng.png';
import maChaoActionSheetUrl from '../../assets/images/units/unit-ma-chao-actions.png';
import maChaoUnitSheetUrl from '../../assets/images/units/unit-ma-chao.png';
import maDaiActionSheetUrl from '../../assets/images/units/unit-ma-dai-actions.png';
import maDaiUnitSheetUrl from '../../assets/images/units/unit-ma-dai.png';
import maLiangActionSheetUrl from '../../assets/images/units/unit-ma-liang-actions.png';
import maLiangUnitSheetUrl from '../../assets/images/units/unit-ma-liang.png';
import mengHuoActionSheetUrl from '../../assets/images/units/unit-meng-huo-actions.png';
import mengHuoUnitSheetUrl from '../../assets/images/units/unit-meng-huo.png';
import pangTongActionSheetUrl from '../../assets/images/units/unit-pang-tong-actions.png';
import pangTongUnitSheetUrl from '../../assets/images/units/unit-pang-tong.png';
import rebelArcherActionSheetUrl from '../../assets/images/units/unit-rebel-archer-actions.png';
import rebelArcherUnitSheetUrl from '../../assets/images/units/unit-rebel-archer.png';
import rebelCavalryActionSheetUrl from '../../assets/images/units/unit-rebel-cavalry-actions.png';
import rebelCavalryUnitSheetUrl from '../../assets/images/units/unit-rebel-cavalry.png';
import rebelLeaderActionSheetUrl from '../../assets/images/units/unit-rebel-leader-actions.png';
import rebelLeaderUnitSheetUrl from '../../assets/images/units/unit-rebel-leader.png';
import rebelActionSheetUrl from '../../assets/images/units/unit-rebel-actions.png';
import rebelUnitSheetUrl from '../../assets/images/units/unit-rebel.png';
import nanmanInfantryActionSheetUrl from '../../assets/images/units/unit-nanman-infantry-actions.png';
import nanmanInfantryUnitSheetUrl from '../../assets/images/units/unit-nanman-infantry.png';
import nanmanOfficerActionSheetUrl from '../../assets/images/units/unit-nanman-officer-actions.png';
import nanmanOfficerUnitSheetUrl from '../../assets/images/units/unit-nanman-officer.png';
import nanmanShamanActionSheetUrl from '../../assets/images/units/unit-nanman-shaman-actions.png';
import nanmanShamanUnitSheetUrl from '../../assets/images/units/unit-nanman-shaman.png';
import shuArcherActionSheetUrl from '../../assets/images/units/unit-shu-archer-actions.png';
import shuArcherUnitSheetUrl from '../../assets/images/units/unit-shu-archer.png';
import shuCavalryActionSheetUrl from '../../assets/images/units/unit-shu-cavalry-actions.png';
import shuCavalryUnitSheetUrl from '../../assets/images/units/unit-shu-cavalry.png';
import shuInfantryActionSheetUrl from '../../assets/images/units/unit-shu-infantry-actions.png';
import shuInfantryUnitSheetUrl from '../../assets/images/units/unit-shu-infantry.png';
import shuOfficerActionSheetUrl from '../../assets/images/units/unit-shu-officer-actions.png';
import shuOfficerUnitSheetUrl from '../../assets/images/units/unit-shu-officer.png';
import shuSpearmanActionSheetUrl from '../../assets/images/units/unit-shu-spearman-actions.png';
import shuSpearmanUnitSheetUrl from '../../assets/images/units/unit-shu-spearman.png';
import shuStrategistActionSheetUrl from '../../assets/images/units/unit-shu-strategist-actions.png';
import shuStrategistUnitSheetUrl from '../../assets/images/units/unit-shu-strategist.png';
import simaYiActionSheetUrl from '../../assets/images/units/unit-sima-yi-actions.png';
import simaYiUnitSheetUrl from '../../assets/images/units/unit-sima-yi.png';
import wangPingActionSheetUrl from '../../assets/images/units/unit-wang-ping-actions.png';
import wangPingUnitSheetUrl from '../../assets/images/units/unit-wang-ping.png';
import weiArcherActionSheetUrl from '../../assets/images/units/unit-wei-archer-actions.png';
import weiArcherUnitSheetUrl from '../../assets/images/units/unit-wei-archer.png';
import weiCavalryActionSheetUrl from '../../assets/images/units/unit-wei-cavalry-actions.png';
import weiCavalryUnitSheetUrl from '../../assets/images/units/unit-wei-cavalry.png';
import weiInfantryActionSheetUrl from '../../assets/images/units/unit-wei-infantry-actions.png';
import weiInfantryUnitSheetUrl from '../../assets/images/units/unit-wei-infantry.png';
import weiOfficerActionSheetUrl from '../../assets/images/units/unit-wei-officer-actions.png';
import weiOfficerUnitSheetUrl from '../../assets/images/units/unit-wei-officer.png';
import weiStrategistActionSheetUrl from '../../assets/images/units/unit-wei-strategist-actions.png';
import weiStrategistUnitSheetUrl from '../../assets/images/units/unit-wei-strategist.png';
import weiYanActionSheetUrl from '../../assets/images/units/unit-wei-yan-actions.png';
import weiYanUnitSheetUrl from '../../assets/images/units/unit-wei-yan.png';
import wuArcherActionSheetUrl from '../../assets/images/units/unit-wu-archer-actions.png';
import wuArcherUnitSheetUrl from '../../assets/images/units/unit-wu-archer.png';
import wuCavalryActionSheetUrl from '../../assets/images/units/unit-wu-cavalry-actions.png';
import wuCavalryUnitSheetUrl from '../../assets/images/units/unit-wu-cavalry.png';
import wuInfantryActionSheetUrl from '../../assets/images/units/unit-wu-infantry-actions.png';
import wuInfantryUnitSheetUrl from '../../assets/images/units/unit-wu-infantry.png';
import wuOfficerActionSheetUrl from '../../assets/images/units/unit-wu-officer-actions.png';
import wuOfficerUnitSheetUrl from '../../assets/images/units/unit-wu-officer.png';
import wuStrategistActionSheetUrl from '../../assets/images/units/unit-wu-strategist-actions.png';
import wuStrategistUnitSheetUrl from '../../assets/images/units/unit-wu-strategist.png';
import wuYiActionSheetUrl from '../../assets/images/units/unit-wu-yi-actions.png';
import wuYiUnitSheetUrl from '../../assets/images/units/unit-wu-yi.png';
import yanYanActionSheetUrl from '../../assets/images/units/unit-yan-yan-actions.png';
import yanYanUnitSheetUrl from '../../assets/images/units/unit-yan-yan.png';
import yiJiActionSheetUrl from '../../assets/images/units/unit-yi-ji-actions.png';
import yiJiUnitSheetUrl from '../../assets/images/units/unit-yi-ji.png';
import zhangFeiActionSheetUrl from '../../assets/images/units/unit-zhang-fei-actions.png';
import zhangFeiUnitSheetUrl from '../../assets/images/units/unit-zhang-fei.png';
import zhaoYunActionSheetUrl from '../../assets/images/units/unit-zhao-yun-actions.png';
import zhaoYunUnitSheetUrl from '../../assets/images/units/unit-zhao-yun.png';
import zhugeLiangActionSheetUrl from '../../assets/images/units/unit-zhuge-liang-actions.png';
import zhugeLiangUnitSheetUrl from '../../assets/images/units/unit-zhuge-liang.png';
import { portraitAssets } from '../data/portraitAssets';
import { storyBackgroundAssets } from '../data/storyAssets';
type UnitDirection = 'south' | 'east' | 'north' | 'west';
@@ -118,56 +16,37 @@ const unitSheetRows: Record<UnitDirection, number> = {
west: 3
};
const sourceUnitSheets = [
{ key: 'unit-liu-bei', url: liuBeiUnitSheetUrl, actionKey: 'unit-liu-bei-actions', actionUrl: liuBeiActionSheetUrl },
{ key: 'unit-guan-yu', url: guanYuUnitSheetUrl, actionKey: 'unit-guan-yu-actions', actionUrl: guanYuActionSheetUrl },
{ key: 'unit-zhang-fei', url: zhangFeiUnitSheetUrl, actionKey: 'unit-zhang-fei-actions', actionUrl: zhangFeiActionSheetUrl },
{ key: 'unit-rebel', url: rebelUnitSheetUrl, actionKey: 'unit-rebel-actions', actionUrl: rebelActionSheetUrl },
{ key: 'unit-rebel-archer', url: rebelArcherUnitSheetUrl, actionKey: 'unit-rebel-archer-actions', actionUrl: rebelArcherActionSheetUrl },
{ key: 'unit-rebel-cavalry', url: rebelCavalryUnitSheetUrl, actionKey: 'unit-rebel-cavalry-actions', actionUrl: rebelCavalryActionSheetUrl },
{ key: 'unit-rebel-leader', url: rebelLeaderUnitSheetUrl, actionKey: 'unit-rebel-leader-actions', actionUrl: rebelLeaderActionSheetUrl },
{ key: 'unit-lu-bu', url: luBuUnitSheetUrl, actionKey: 'unit-lu-bu-actions', actionUrl: luBuActionSheetUrl },
{ key: 'unit-cao-cao', url: caoCaoUnitSheetUrl, actionKey: 'unit-cao-cao-actions', actionUrl: caoCaoActionSheetUrl },
{ key: 'unit-lu-meng', url: luMengUnitSheetUrl, actionKey: 'unit-lu-meng-actions', actionUrl: luMengActionSheetUrl },
{ key: 'unit-meng-huo', url: mengHuoUnitSheetUrl, actionKey: 'unit-meng-huo-actions', actionUrl: mengHuoActionSheetUrl },
{ key: 'unit-zhao-yun', url: zhaoYunUnitSheetUrl, actionKey: 'unit-zhao-yun-actions', actionUrl: zhaoYunActionSheetUrl },
{ key: 'unit-zhuge-liang', url: zhugeLiangUnitSheetUrl, actionKey: 'unit-zhuge-liang-actions', actionUrl: zhugeLiangActionSheetUrl },
{ key: 'unit-jiang-wei', url: jiangWeiUnitSheetUrl, actionKey: 'unit-jiang-wei-actions', actionUrl: jiangWeiActionSheetUrl },
{ key: 'unit-sima-yi', url: simaYiUnitSheetUrl, actionKey: 'unit-sima-yi-actions', actionUrl: simaYiActionSheetUrl },
{ key: 'unit-ma-liang', url: maLiangUnitSheetUrl, actionKey: 'unit-ma-liang-actions', actionUrl: maLiangActionSheetUrl },
{ key: 'unit-yi-ji', url: yiJiUnitSheetUrl, actionKey: 'unit-yi-ji-actions', actionUrl: yiJiActionSheetUrl },
{ key: 'unit-gong-zhi', url: gongZhiUnitSheetUrl, actionKey: 'unit-gong-zhi-actions', actionUrl: gongZhiActionSheetUrl },
{ key: 'unit-huang-zhong', url: huangZhongUnitSheetUrl, actionKey: 'unit-huang-zhong-actions', actionUrl: huangZhongActionSheetUrl },
{ key: 'unit-wei-yan', url: weiYanUnitSheetUrl, actionKey: 'unit-wei-yan-actions', actionUrl: weiYanActionSheetUrl },
{ key: 'unit-pang-tong', url: pangTongUnitSheetUrl, actionKey: 'unit-pang-tong-actions', actionUrl: pangTongActionSheetUrl },
{ key: 'unit-fa-zheng', url: faZhengUnitSheetUrl, actionKey: 'unit-fa-zheng-actions', actionUrl: faZhengActionSheetUrl },
{ key: 'unit-wu-yi', url: wuYiUnitSheetUrl, actionKey: 'unit-wu-yi-actions', actionUrl: wuYiActionSheetUrl },
{ key: 'unit-yan-yan', url: yanYanUnitSheetUrl, actionKey: 'unit-yan-yan-actions', actionUrl: yanYanActionSheetUrl },
{ key: 'unit-li-yan', url: liYanUnitSheetUrl, actionKey: 'unit-li-yan-actions', actionUrl: liYanActionSheetUrl },
{ key: 'unit-huang-quan', url: huangQuanUnitSheetUrl, actionKey: 'unit-huang-quan-actions', actionUrl: huangQuanActionSheetUrl },
{ key: 'unit-ma-chao', url: maChaoUnitSheetUrl, actionKey: 'unit-ma-chao-actions', actionUrl: maChaoActionSheetUrl },
{ key: 'unit-ma-dai', url: maDaiUnitSheetUrl, actionKey: 'unit-ma-dai-actions', actionUrl: maDaiActionSheetUrl },
{ key: 'unit-wang-ping', url: wangPingUnitSheetUrl, actionKey: 'unit-wang-ping-actions', actionUrl: wangPingActionSheetUrl },
{ key: 'unit-shu-infantry', url: shuInfantryUnitSheetUrl, actionKey: 'unit-shu-infantry-actions', actionUrl: shuInfantryActionSheetUrl },
{ key: 'unit-shu-spearman', url: shuSpearmanUnitSheetUrl, actionKey: 'unit-shu-spearman-actions', actionUrl: shuSpearmanActionSheetUrl },
{ key: 'unit-shu-archer', url: shuArcherUnitSheetUrl, actionKey: 'unit-shu-archer-actions', actionUrl: shuArcherActionSheetUrl },
{ key: 'unit-shu-cavalry', url: shuCavalryUnitSheetUrl, actionKey: 'unit-shu-cavalry-actions', actionUrl: shuCavalryActionSheetUrl },
{ key: 'unit-shu-strategist', url: shuStrategistUnitSheetUrl, actionKey: 'unit-shu-strategist-actions', actionUrl: shuStrategistActionSheetUrl },
{ key: 'unit-shu-officer', url: shuOfficerUnitSheetUrl, actionKey: 'unit-shu-officer-actions', actionUrl: shuOfficerActionSheetUrl },
{ key: 'unit-wei-infantry', url: weiInfantryUnitSheetUrl, actionKey: 'unit-wei-infantry-actions', actionUrl: weiInfantryActionSheetUrl },
{ key: 'unit-wei-archer', url: weiArcherUnitSheetUrl, actionKey: 'unit-wei-archer-actions', actionUrl: weiArcherActionSheetUrl },
{ key: 'unit-wei-cavalry', url: weiCavalryUnitSheetUrl, actionKey: 'unit-wei-cavalry-actions', actionUrl: weiCavalryActionSheetUrl },
{ key: 'unit-wei-strategist', url: weiStrategistUnitSheetUrl, actionKey: 'unit-wei-strategist-actions', actionUrl: weiStrategistActionSheetUrl },
{ key: 'unit-wei-officer', url: weiOfficerUnitSheetUrl, actionKey: 'unit-wei-officer-actions', actionUrl: weiOfficerActionSheetUrl },
{ key: 'unit-wu-infantry', url: wuInfantryUnitSheetUrl, actionKey: 'unit-wu-infantry-actions', actionUrl: wuInfantryActionSheetUrl },
{ key: 'unit-wu-archer', url: wuArcherUnitSheetUrl, actionKey: 'unit-wu-archer-actions', actionUrl: wuArcherActionSheetUrl },
{ key: 'unit-wu-cavalry', url: wuCavalryUnitSheetUrl, actionKey: 'unit-wu-cavalry-actions', actionUrl: wuCavalryActionSheetUrl },
{ key: 'unit-wu-strategist', url: wuStrategistUnitSheetUrl, actionKey: 'unit-wu-strategist-actions', actionUrl: wuStrategistActionSheetUrl },
{ key: 'unit-wu-officer', url: wuOfficerUnitSheetUrl, actionKey: 'unit-wu-officer-actions', actionUrl: wuOfficerActionSheetUrl },
{ key: 'unit-nanman-infantry', url: nanmanInfantryUnitSheetUrl, actionKey: 'unit-nanman-infantry-actions', actionUrl: nanmanInfantryActionSheetUrl },
{ key: 'unit-nanman-shaman', url: nanmanShamanUnitSheetUrl, actionKey: 'unit-nanman-shaman-actions', actionUrl: nanmanShamanActionSheetUrl },
{ key: 'unit-nanman-officer', url: nanmanOfficerUnitSheetUrl, actionKey: 'unit-nanman-officer-actions', actionUrl: nanmanOfficerActionSheetUrl }
];
type UnitSheetAsset = {
key: string;
url: string;
actionKey: string;
actionUrl: string;
};
const unitSheetModules = import.meta.glob('../../assets/images/units/unit-*.png', {
eager: true,
import: 'default'
}) as Record<string, string>;
function textureKeyFromPath(path: string) {
const fileName = path.split('/').pop() ?? path;
return fileName.replace(/\.png$/i, '');
}
const unitSheetUrls = Object.fromEntries(
Object.entries(unitSheetModules).map(([path, url]) => [textureKeyFromPath(path), url])
);
const sourceUnitSheets: UnitSheetAsset[] = Object.entries(unitSheetUrls)
.filter(([key]) => !key.endsWith('-actions'))
.map(([key, url]) => ({
key,
url,
actionKey: `${key}-actions`,
actionUrl: unitSheetUrls[`${key}-actions`]
}))
.filter((sheet): sheet is UnitSheetAsset => Boolean(sheet.actionUrl))
.sort((left, right) => left.key.localeCompare(right.key));
const animatedUnitSheets = sourceUnitSheets.map(({ key }) => ({ key }));
@@ -179,13 +58,7 @@ export class BootScene extends Phaser.Scene {
preload() {
this.load.image('title-taoyuan', titleBackgroundUrl);
this.load.image('story-militia', storyBackgroundAssets['story-militia']);
this.load.image('portrait-liu-bei', liuBeiPortraitUrl);
this.load.image('portrait-guan-yu', guanYuPortraitUrl);
this.load.image('portrait-zhang-fei', zhangFeiPortraitUrl);
this.load.image('portrait-zhuge-liang', zhugeLiangPortraitUrl);
this.load.image('portrait-zhao-yun', zhaoYunPortraitUrl);
this.load.image('portrait-jiang-wei', jiangWeiPortraitUrl);
this.load.image('portrait-sima-yi', simaYiPortraitUrl);
Object.entries(portraitAssets).forEach(([key, url]) => this.load.image(`portrait-${key}`, url));
sourceUnitSheets.forEach(({ key, url, actionKey, actionUrl }) => {
this.load.spritesheet(key, url, {