From 384ce7725c02cd372e9ad5449c7be8ce5664c0cb Mon Sep 17 00:00:00 2001 From: Wickedness Date: Wed, 24 Jun 2026 15:23:26 +0900 Subject: [PATCH] Improve level-up animation and unit audio assets --- package.json | 1 + scripts/generate-sfx.mjs | 78 ++++++++++++ scripts/verify-flow.mjs | 10 +- src/assets/audio/sfx/level-up.wav | Bin 0 -> 98828 bytes src/game/audio/SoundDirector.ts | 4 + src/game/audio/audioAssets.ts | 2 + src/game/scenes/BattleScene.ts | 202 ++++++++++++++++++++++-------- src/game/scenes/BootScene.ts | 65 +++++++++- 8 files changed, 308 insertions(+), 54 deletions(-) create mode 100644 scripts/generate-sfx.mjs create mode 100644 src/assets/audio/sfx/level-up.wav diff --git a/package.json b/package.json index 55c3ed7..9ff2cf8 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "debug": "vite --host 0.0.0.0 --debug", "build": "tsc && vite build", "generate:audio": "node scripts/generate-bgm.mjs", + "generate:sfx": "node scripts/generate-sfx.mjs", "preview": "vite preview --host 0.0.0.0", "verify:flow": "node scripts/verify-flow.mjs" }, diff --git a/scripts/generate-sfx.mjs b/scripts/generate-sfx.mjs new file mode 100644 index 0000000..9c5bce8 --- /dev/null +++ b/scripts/generate-sfx.mjs @@ -0,0 +1,78 @@ +import { mkdir, writeFile } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; + +const sampleRate = 44100; +const outputPath = join('src', 'assets', 'audio', 'sfx', 'level-up.wav'); + +function envelope(time, start, duration) { + const local = time - start; + if (local < 0 || local > duration) { + return 0; + } + const attack = 0.018; + const release = 0.22; + if (local < attack) { + return local / attack; + } + if (local > duration - release) { + return Math.max(0, (duration - local) / release); + } + return 1; +} + +function tone(time, frequency, start, duration, gain, wave = 'sine') { + const amp = envelope(time, start, duration) * gain; + if (amp <= 0) { + return 0; + } + const phase = Math.PI * 2 * frequency * (time - start); + if (wave === 'triangle') { + return amp * (2 / Math.PI) * Math.asin(Math.sin(phase)); + } + return amp * Math.sin(phase); +} + +function sampleAt(time) { + const notes = [ + { start: 0, frequency: 523.25, gain: 0.22, duration: 0.52 }, + { start: 0.09, frequency: 659.25, gain: 0.2, duration: 0.56 }, + { start: 0.18, frequency: 783.99, gain: 0.18, duration: 0.62 }, + { start: 0.31, frequency: 1046.5, gain: 0.16, duration: 0.7 } + ]; + + const chord = notes.reduce((sum, note) => sum + tone(time, note.frequency, note.start, note.duration, note.gain), 0); + const shimmer = + tone(time, 1318.51, 0.42, 0.36, 0.055, 'triangle') + + tone(time, 1567.98, 0.52, 0.28, 0.042, 'triangle'); + return Math.max(-0.92, Math.min(0.92, chord + shimmer)); +} + +function wavBuffer(samples) { + const bytesPerSample = 2; + const dataSize = samples.length * bytesPerSample; + const buffer = Buffer.alloc(44 + dataSize); + buffer.write('RIFF', 0); + buffer.writeUInt32LE(36 + dataSize, 4); + buffer.write('WAVE', 8); + buffer.write('fmt ', 12); + buffer.writeUInt32LE(16, 16); + buffer.writeUInt16LE(1, 20); + buffer.writeUInt16LE(1, 22); + buffer.writeUInt32LE(sampleRate, 24); + buffer.writeUInt32LE(sampleRate * bytesPerSample, 28); + buffer.writeUInt16LE(bytesPerSample, 32); + buffer.writeUInt16LE(16, 34); + buffer.write('data', 36); + buffer.writeUInt32LE(dataSize, 40); + + samples.forEach((sample, index) => { + buffer.writeInt16LE(Math.round(sample * 32767), 44 + index * bytesPerSample); + }); + return buffer; +} + +await mkdir(dirname(outputPath), { recursive: true }); +const duration = 1.12; +const samples = Array.from({ length: Math.floor(sampleRate * duration) }, (_, index) => sampleAt(index / sampleRate)); +await writeFile(outputPath, wavBuffer(samples)); +console.log(`Generated ${outputPath}`); diff --git a/scripts/verify-flow.mjs b/scripts/verify-flow.mjs index f2acfc9..e84689a 100644 --- a/scripts/verify-flow.mjs +++ b/scripts/verify-flow.mjs @@ -101,7 +101,15 @@ try { 'unit-rebel-actions', 'unit-rebel-archer-actions', 'unit-rebel-cavalry-actions', - 'unit-rebel-leader-actions' + 'unit-rebel-leader-actions', + 'unit-shu-cavalry', + 'unit-shu-cavalry-actions', + 'unit-wei-infantry', + 'unit-wei-infantry-actions', + 'unit-wu-archer', + 'unit-wu-archer-actions', + 'unit-nanman-officer', + 'unit-nanman-officer-actions' ].every((key) => textures?.exists(key)); }); if (!actionTexturesLoaded) { diff --git a/src/assets/audio/sfx/level-up.wav b/src/assets/audio/sfx/level-up.wav new file mode 100644 index 0000000000000000000000000000000000000000..a64fc665c1a05f6984c1154cf60567274d51996b GIT binary patch literal 98828 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 x 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 h<s%u;&b? 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 SKm4;ibWa# literal 0 HcmV?d00001 diff --git a/src/game/audio/SoundDirector.ts b/src/game/audio/SoundDirector.ts index 42fe4db..2102c41 100644 --- a/src/game/audio/SoundDirector.ts +++ b/src/game/audio/SoundDirector.ts @@ -99,6 +99,10 @@ class SoundDirector { } playLevelUp() { + if (this.playEffect('level-up', { volume: 0.36, stopAfterMs: 1200 })) { + return; + } + this.playEffect('exp-gain', { volume: 0.42, rate: 1.08, stopAfterMs: 820 }); this.playTone(520, 0.08, 0.035, 'triangle'); window.setTimeout(() => this.playTone(720, 0.09, 0.04, 'triangle'), 82); diff --git a/src/game/audio/audioAssets.ts b/src/game/audio/audioAssets.ts index b9bf9bc..aa78094 100644 --- a/src/game/audio/audioAssets.ts +++ b/src/game/audio/audioAssets.ts @@ -8,6 +8,7 @@ import combatImpactUrl from '../../assets/audio/sfx/combat-impact.mp3'; import expGainUrl from '../../assets/audio/sfx/exp-gain.mp3'; import footstepWalkUrl from '../../assets/audio/sfx/footstep-walk.mp3'; import horseGallopUrl from '../../assets/audio/sfx/horse-gallop.mp3'; +import levelUpUrl from '../../assets/audio/sfx/level-up.wav'; import strategyCastUrl from '../../assets/audio/sfx/strategy-cast.mp3'; import swordSlashUrl from '../../assets/audio/sfx/sword-slash.mp3'; import uiSelectUrl from '../../assets/audio/sfx/ui-select.mp3'; @@ -27,6 +28,7 @@ export const effectTracks = { 'strategy-cast': strategyCastUrl, 'cart-roll': cartRollUrl, 'exp-gain': expGainUrl, + 'level-up': levelUpUrl, 'footstep-walk': footstepWalkUrl, 'horse-gallop': horseGallopUrl } as const; diff --git a/src/game/scenes/BattleScene.ts b/src/game/scenes/BattleScene.ts index ef8624b..a08edac 100644 --- a/src/game/scenes/BattleScene.ts +++ b/src/game/scenes/BattleScene.ts @@ -929,6 +929,23 @@ const unitTextureByClass: Partial> = { rebelLeader: 'unit-rebel-leader' }; +const coreAllyTextureIds = new Set(['liu-bei', 'guan-yu', 'zhang-fei']); + +const earlyRebelTexturePrefixes = ['rebel-', 'pursuit-']; + +const wuTexturePrefixes = [ + 'jing-defense-wu-', + 'jing-rear-', + 'jing-collapse-', + 'maicheng-wu-', + 'yiling-' +]; + +const nanmanTexturePrefixes = [ + 'nanzhong-', + 'menghuo-' +]; + const unitFrameRows: Record = { south: 0, east: 1, @@ -1128,6 +1145,7 @@ type ResultGaugeAnimation = { valueText: Phaser.GameObjects.Text; levelText: Phaser.GameObjects.Text; eventText: Phaser.GameObjects.Text; + unit?: UnitData; levelPrefix: string; previousLevel: number; previousExp: number; @@ -4797,6 +4815,7 @@ export class BattleScene extends Phaser.Scene { valueText: characterValueText, levelText: characterLevelText, eventText: characterEventText, + unit, levelPrefix: 'Lv ', previousLevel, previousExp, @@ -5001,7 +5020,7 @@ export class BattleScene extends Phaser.Scene { this.showGrowthEventText(animation.eventText, `Lv ${animation.level} 달성!`); this.flashResultGauge(animation); soundDirector.playLevelUp(); - await this.delay(180); + await this.playResultLevelUpCelebration(animation); await this.animateGrowthGauge(animation.fill, animation.valueText, 0, animation.exp / animation.next, 0, animation.exp, animation.next, false, duration); return; } @@ -5027,17 +5046,61 @@ export class BattleScene extends Phaser.Scene { this.tweens.add({ targets: flash, alpha: 0, - scaleX: 1.04, - scaleY: 1.16, + x: flash.x + 10, duration: 520, ease: 'Sine.easeOut' }); - this.tweens.add({ - targets: [animation.levelText, animation.valueText], - scale: 1.14, - duration: 120, - yoyo: true, - ease: 'Sine.easeOut' + this.flashTextColor(animation.levelText, '#fff2b8'); + this.flashTextColor(animation.valueText, '#fff2b8'); + } + + private async playResultLevelUpCelebration(animation: ResultGaugeAnimation) { + if (!animation.unit) { + await this.delay(180); + return; + } + + const { x, y, width, height, depth } = animation.flashArea; + const spriteX = Math.min(x + width - 46, animation.valueText.x + 34); + const spriteY = y + height / 2 + 4; + const sprite = this.trackResultObject( + this.add.sprite(spriteX, spriteY, this.unitActionTexture(animation.unit), this.unitActionFrameIndex('south', 'attack')) + ); + sprite.setDisplaySize(58, 58); + sprite.setDepth(depth + 4); + await this.playUnitCelebrationFrames(sprite); + } + + private flashTextColor(text: Phaser.GameObjects.Text, color: string, duration = 360) { + const previousColor = typeof text.style.color === 'string' ? text.style.color : '#f0e4c8'; + text.setColor(color); + this.time.delayedCall(duration, () => { + if (text.active) { + text.setColor(previousColor); + } + }); + } + + private playUnitCelebrationFrames(sprite: Phaser.GameObjects.Sprite) { + const baseY = sprite.y; + const poses: UnitActionPose[] = ['attack', 'item', 'strategy', 'attack', 'item']; + return new Promise((resolve) => { + poses.forEach((pose, index) => { + this.time.delayedCall(index * 120, () => { + if (!sprite.active) { + return; + } + sprite.setFrame(this.unitActionFrameIndex('south', pose)); + sprite.setY(baseY + (index % 2 === 0 ? -5 : 3)); + }); + }); + this.time.delayedCall(poses.length * 120 + 80, () => { + if (sprite.active) { + sprite.setY(baseY); + sprite.setFrame(this.unitActionFrameIndex('south', 'item')); + } + resolve(); + }); }); } @@ -7061,11 +7124,10 @@ export class BattleScene extends Phaser.Scene { private showGrowthEventText(text: Phaser.GameObjects.Text, label: string) { text.setText(label); text.setAlpha(1); - text.setScale(0.9); + text.setScale(1); this.tweens.add({ targets: text, y: text.y - 12, - scale: 1.16, alpha: 0, duration: 780, ease: 'Sine.easeOut' @@ -7078,19 +7140,13 @@ export class BattleScene extends Phaser.Scene { this.tweens.add({ targets: flash, alpha: 0, - scaleX: 1.03, - scaleY: 1.12, + x: flash.x + 10, duration: 520, ease: 'Sine.easeOut', onComplete: () => flash.destroy() }); - this.tweens.add({ - targets: [view.levelText, view.valueText], - scale: 1.16, - duration: 130, - yoyo: true, - ease: 'Sine.easeOut' - }); + this.flashTextColor(view.levelText, '#fff2b8'); + this.flashTextColor(view.valueText, '#fff2b8'); } private createGrowthCelebrationSprite(unit: UnitData, x: number, y: number, depth: number) { @@ -7113,22 +7169,7 @@ export class BattleScene extends Phaser.Scene { } private playGrowthCelebration(sprite: Phaser.GameObjects.Sprite) { - return new Promise((resolve) => { - this.tweens.add({ - targets: sprite, - y: sprite.y - 18, - scale: 1.16, - angle: 3, - duration: 160, - yoyo: true, - repeat: 2, - ease: 'Sine.easeInOut', - onComplete: () => { - sprite.setAngle(0); - resolve(); - } - }); - }); + return this.playUnitCelebrationFrames(sprite); } private combatPortraitKey(unit: UnitData) { @@ -7429,13 +7470,7 @@ export class BattleScene extends Phaser.Scene { onComplete: () => { target.setScale(Phaser.Math.Clamp(toRatio, 0, 1), 1); text.setText(`${toValue} / ${next}`); - this.tweens.add({ - targets: text, - scale: 1.18, - duration: 120, - yoyo: true, - ease: 'Sine.easeOut' - }); + this.flashTextColor(text, '#fff2b8'); resolve(); } }); @@ -7464,13 +7499,7 @@ export class BattleScene extends Phaser.Scene { target.setScale(Phaser.Math.Clamp(toRatio, 0, 1), 1); text.setText(`${toValue} / ${next}`); if (leveled) { - this.tweens.add({ - targets: text, - scale: 1.18, - duration: 120, - yoyo: true, - ease: 'Sine.easeOut' - }); + this.flashTextColor(text, '#fff2b8'); } resolve(); } @@ -8094,6 +8123,11 @@ export class BattleScene extends Phaser.Scene { } private unitTextureKey(unit: UnitData) { + const factionTexture = this.unitFactionTextureKey(unit); + if (factionTexture) { + return factionTexture; + } + if ( unit.id.startsWith('northern-first-cavalry') || unit.id.startsWith('northern-second-cavalry') || @@ -8124,6 +8158,72 @@ export class BattleScene extends Phaser.Scene { return unitTexture[unit.id] ?? unitTextureByClass[unit.classKey] ?? 'unit-rebel'; } + private unitFactionTextureKey(unit: UnitData) { + if (unit.faction === 'ally') { + if (coreAllyTextureIds.has(unit.id)) { + return undefined; + } + return this.unitTextureForClass('shu', unit.classKey); + } + + if (earlyRebelTexturePrefixes.some((prefix) => unit.id.startsWith(prefix))) { + return undefined; + } + if (nanmanTexturePrefixes.some((prefix) => unit.id.startsWith(prefix))) { + return this.unitTextureForClass('nanman', unit.classKey); + } + if (wuTexturePrefixes.some((prefix) => unit.id.startsWith(prefix))) { + return this.unitTextureForClass('wu', unit.classKey); + } + + return this.unitTextureForClass('wei', unit.classKey); + } + + private unitTextureForClass(style: 'shu' | 'wei' | 'wu' | 'nanman', classKey: UnitClassKey) { + if (style === 'shu') { + if (classKey === 'spearman') { + return 'unit-shu-spearman'; + } + if (classKey === 'archer') { + return 'unit-shu-archer'; + } + if (classKey === 'cavalry') { + return 'unit-shu-cavalry'; + } + if (classKey === 'strategist' || classKey === 'quartermaster') { + return 'unit-shu-strategist'; + } + if (classKey === 'rebelLeader') { + return 'unit-shu-officer'; + } + return 'unit-shu-infantry'; + } + + if (style === 'nanman') { + if (classKey === 'archer' || classKey === 'strategist' || classKey === 'quartermaster') { + return 'unit-nanman-shaman'; + } + if (classKey === 'rebelLeader' || classKey === 'cavalry') { + return 'unit-nanman-officer'; + } + return 'unit-nanman-infantry'; + } + + if (classKey === 'archer') { + return `unit-${style}-archer`; + } + if (classKey === 'cavalry') { + return `unit-${style}-cavalry`; + } + if (classKey === 'strategist' || classKey === 'quartermaster') { + return `unit-${style}-strategist`; + } + if (classKey === 'rebelLeader') { + return `unit-${style}-officer`; + } + return `unit-${style}-infantry`; + } + private unitActionTexture(unit: UnitData) { const base = this.unitTextureKey(unit); const actionKey = `${base}-actions`; @@ -9115,6 +9215,8 @@ export class BattleScene extends Phaser.Scene { name: unit.name, faction: unit.faction, classKey: unit.classKey, + textureBase: this.unitViews.get(unit.id)?.textureBase ?? this.unitTextureKey(unit), + actionTexture: this.unitActionTexture(unit), ai: unit.faction === 'enemy' ? this.enemyBehavior(unit) : null, attackRange: this.attackRange(unit), level: unit.level, diff --git a/src/game/scenes/BootScene.ts b/src/game/scenes/BootScene.ts index da52494..6fb90bd 100644 --- a/src/game/scenes/BootScene.ts +++ b/src/game/scenes/BootScene.ts @@ -48,7 +48,7 @@ const unitSheetRows: Record = { west: 3 }; -const unitSheets = [ +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 }, @@ -58,6 +58,30 @@ const unitSheets = [ { key: 'unit-rebel-leader', url: rebelLeaderUnitSheetUrl, actionKey: 'unit-rebel-leader-actions', actionUrl: rebelLeaderActionSheetUrl } ]; +const generatedUnitSheets = [ + { key: 'unit-shu-infantry', sourceKey: 'unit-guan-yu', actionKey: 'unit-shu-infantry-actions', sourceActionKey: 'unit-guan-yu-actions', tint: 0x2f7fba, alpha: 0.32 }, + { key: 'unit-shu-spearman', sourceKey: 'unit-zhang-fei', actionKey: 'unit-shu-spearman-actions', sourceActionKey: 'unit-zhang-fei-actions', tint: 0x4aa878, alpha: 0.3 }, + { key: 'unit-shu-archer', sourceKey: 'unit-rebel-archer', actionKey: 'unit-shu-archer-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x4b9bd5, alpha: 0.36 }, + { key: 'unit-shu-cavalry', sourceKey: 'unit-rebel-cavalry', actionKey: 'unit-shu-cavalry-actions', sourceActionKey: 'unit-rebel-cavalry-actions', tint: 0x488fc4, alpha: 0.36 }, + { key: 'unit-shu-strategist', sourceKey: 'unit-liu-bei', actionKey: 'unit-shu-strategist-actions', sourceActionKey: 'unit-liu-bei-actions', tint: 0x75b7d8, alpha: 0.28 }, + { key: 'unit-shu-officer', sourceKey: 'unit-guan-yu', actionKey: 'unit-shu-officer-actions', sourceActionKey: 'unit-guan-yu-actions', tint: 0x3f91c8, alpha: 0.36 }, + { key: 'unit-wei-infantry', sourceKey: 'unit-rebel', actionKey: 'unit-wei-infantry-actions', sourceActionKey: 'unit-rebel-actions', tint: 0x8b3030, alpha: 0.42 }, + { key: 'unit-wei-archer', sourceKey: 'unit-rebel-archer', actionKey: 'unit-wei-archer-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x9d3c3c, alpha: 0.4 }, + { key: 'unit-wei-cavalry', sourceKey: 'unit-rebel-cavalry', actionKey: 'unit-wei-cavalry-actions', sourceActionKey: 'unit-rebel-cavalry-actions', tint: 0x7a3540, alpha: 0.44 }, + { key: 'unit-wei-strategist', sourceKey: 'unit-rebel-archer', actionKey: 'unit-wei-strategist-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x7f5a8e, alpha: 0.38 }, + { key: 'unit-wei-officer', sourceKey: 'unit-rebel-leader', actionKey: 'unit-wei-officer-actions', sourceActionKey: 'unit-rebel-leader-actions', tint: 0x8f3940, alpha: 0.44 }, + { key: 'unit-wu-infantry', sourceKey: 'unit-rebel', actionKey: 'unit-wu-infantry-actions', sourceActionKey: 'unit-rebel-actions', tint: 0x0b8b86, alpha: 0.42 }, + { key: 'unit-wu-archer', sourceKey: 'unit-rebel-archer', actionKey: 'unit-wu-archer-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x169b91, alpha: 0.4 }, + { key: 'unit-wu-cavalry', sourceKey: 'unit-rebel-cavalry', actionKey: 'unit-wu-cavalry-actions', sourceActionKey: 'unit-rebel-cavalry-actions', tint: 0x087b86, alpha: 0.44 }, + { key: 'unit-wu-strategist', sourceKey: 'unit-rebel-archer', actionKey: 'unit-wu-strategist-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x3aa57e, alpha: 0.38 }, + { key: 'unit-wu-officer', sourceKey: 'unit-rebel-leader', actionKey: 'unit-wu-officer-actions', sourceActionKey: 'unit-rebel-leader-actions', tint: 0x168f83, alpha: 0.44 }, + { key: 'unit-nanman-infantry', sourceKey: 'unit-rebel', actionKey: 'unit-nanman-infantry-actions', sourceActionKey: 'unit-rebel-actions', tint: 0x8b6c2f, alpha: 0.42 }, + { key: 'unit-nanman-shaman', sourceKey: 'unit-rebel-archer', actionKey: 'unit-nanman-shaman-actions', sourceActionKey: 'unit-rebel-archer-actions', tint: 0x6e8a3a, alpha: 0.42 }, + { key: 'unit-nanman-officer', sourceKey: 'unit-rebel-leader', actionKey: 'unit-nanman-officer-actions', sourceActionKey: 'unit-rebel-leader-actions', tint: 0x9a6a2e, alpha: 0.46 } +]; + +const animatedUnitSheets = [...sourceUnitSheets, ...generatedUnitSheets].map(({ key }) => ({ key })); + export class BootScene extends Phaser.Scene { constructor() { super('BootScene'); @@ -90,7 +114,7 @@ export class BootScene extends Phaser.Scene { this.load.image(key, url); }); - unitSheets.forEach(({ key, url, actionKey, actionUrl }) => { + sourceUnitSheets.forEach(({ key, url, actionKey, actionUrl }) => { this.load.spritesheet(key, url, { frameWidth: unitSheetFrameSize, frameHeight: unitSheetFrameSize @@ -105,6 +129,7 @@ export class BootScene extends Phaser.Scene { create() { this.createPetalTexture(); this.createEquipmentIconTextures(); + this.createGeneratedUnitSheets(); this.createUnitAnimations(); this.scene.start('TitleScene'); } @@ -369,8 +394,42 @@ export class BootScene extends Phaser.Scene { graphics.strokePath(); } + private createGeneratedUnitSheets() { + generatedUnitSheets.forEach((sheet) => { + this.createTintedUnitSheet(sheet.key, sheet.sourceKey, sheet.tint, sheet.alpha); + this.createTintedUnitSheet(sheet.actionKey, sheet.sourceActionKey, sheet.tint, sheet.alpha); + }); + } + + private createTintedUnitSheet(targetKey: string, sourceKey: string, tint: number, alpha: number) { + if (this.textures.exists(targetKey) || !this.textures.exists(sourceKey)) { + return; + } + + const sourceImage = this.textures.get(sourceKey).getSourceImage() as CanvasImageSource & { width: number; height: number }; + const canvas = document.createElement('canvas'); + canvas.width = sourceImage.width; + canvas.height = sourceImage.height; + const context = canvas.getContext('2d'); + if (!context) { + return; + } + + context.drawImage(sourceImage, 0, 0); + context.globalCompositeOperation = 'source-atop'; + context.globalAlpha = alpha; + context.fillStyle = `#${tint.toString(16).padStart(6, '0')}`; + context.fillRect(0, 0, canvas.width, canvas.height); + context.globalCompositeOperation = 'source-over'; + context.globalAlpha = 1; + this.textures.addSpriteSheet(targetKey, canvas as unknown as HTMLImageElement, { + frameWidth: unitSheetFrameSize, + frameHeight: unitSheetFrameSize + }); + } + private createUnitAnimations() { - unitSheets.forEach(({ key }) => { + animatedUnitSheets.forEach(({ key }) => { (['south', 'east', 'north', 'west'] as UnitDirection[]).forEach((direction) => { const frames = Array.from({ length: unitWalkFrameCount }, (_, frameIndex) => ({ key,