diff --git a/assets/voice/level02.mp3 b/assets/voice/level02.mp3 new file mode 100644 index 0000000..026621e Binary files /dev/null and b/assets/voice/level02.mp3 differ diff --git a/assets/voice/level03.mp3 b/assets/voice/level03.mp3 new file mode 100644 index 0000000..01d855e Binary files /dev/null and b/assets/voice/level03.mp3 differ diff --git a/assets/voice/level04.mp3 b/assets/voice/level04.mp3 new file mode 100644 index 0000000..b6a231d Binary files /dev/null and b/assets/voice/level04.mp3 differ diff --git a/assets/voice/level05.mp3 b/assets/voice/level05.mp3 new file mode 100644 index 0000000..9afda8f Binary files /dev/null and b/assets/voice/level05.mp3 differ diff --git a/assets/voice/level06.mp3 b/assets/voice/level06.mp3 new file mode 100644 index 0000000..df43bcd Binary files /dev/null and b/assets/voice/level06.mp3 differ diff --git a/assets/voice/level07.mp3 b/assets/voice/level07.mp3 new file mode 100644 index 0000000..b463c91 Binary files /dev/null and b/assets/voice/level07.mp3 differ diff --git a/assets/voice/level08.mp3 b/assets/voice/level08.mp3 new file mode 100644 index 0000000..57c8e30 Binary files /dev/null and b/assets/voice/level08.mp3 differ diff --git a/assets/voice/level09.mp3 b/assets/voice/level09.mp3 new file mode 100644 index 0000000..e4c272b Binary files /dev/null and b/assets/voice/level09.mp3 differ diff --git a/assets/voice/level10.mp3 b/assets/voice/level10.mp3 new file mode 100644 index 0000000..31dadf7 Binary files /dev/null and b/assets/voice/level10.mp3 differ diff --git a/src/scenes/LevelSelectScene.js b/src/scenes/LevelSelectScene.js index 44dc2b6..949d9c6 100644 --- a/src/scenes/LevelSelectScene.js +++ b/src/scenes/LevelSelectScene.js @@ -199,10 +199,23 @@ export default class LevelSelectScene extends Phaser.Scene { ) .on('pointerout', () => this._hideTooltip()); } else { + // Hover name tag for CLEARED nodes: a small level-name pill that fades + // in above the badge while the pointer is over it (the 'current' + // node already wears its name pill permanently, so no tag there). + // Created before setInteractive so it sits ahead of the node in the + // display list; depth DEPTH.tooltip (10) puts it over node and tag. + const nameTag = state === 'done' ? createPill(this, p.x, p.y, level.name, PILL_STYLE).setDepth(DEPTH.tooltip).setAlpha(0) : null; + if (nameTag) this._groups.tags.push(nameTag); // rebuilt/destroyed with the campaign group node .setInteractive({ useHandCursor: true, hitArea, hitAreaCallback: hitTest }) - .on('pointerover', () => this._tweenNodeSize(node, nw * NODE_HOVER, nh * NODE_HOVER)) - .on('pointerout', () => this._tweenNodeSize(node, nw, nh)) + .on('pointerover', () => { + this._tweenNodeSize(node, nw * NODE_HOVER, nh * NODE_HOVER); + if (nameTag) this._showNameTag(nameTag, p.x, p.y - nh * 0.78); + }) + .on('pointerout', () => { + this._tweenNodeSize(node, nw, nh); + if (nameTag) this._hideNameTag(nameTag); + }) .on('pointerdown', () => { this._tweenNodeSize(node, nw * 0.92, nh * 0.92, 70); this.time.delayedCall(80, () => { @@ -376,6 +389,23 @@ export default class LevelSelectScene extends Phaser.Scene { } } + // Hover name tag for cleared nodes: fade in (a little pop) while hovered, + // fade out when the pointer leaves. Non-blocking - the click's + // pointerdown/scene transition below are never gated on this tween, so an + // overlapping node's pointerover can't interrupt a still-running fade-in. + _showNameTag(tag, x, y) { + tag.setPosition(x, y); + tag.setAlpha(0); + this.tweens.killTweensOf(tag); + this.tweens.add({ targets: tag, alpha: 1, duration: 100, ease: 'Quad.easeOut' }); + } + + _hideNameTag(tag) { + if (!tag.active) return; + this.tweens.killTweensOf(tag); + this.tweens.add({ targets: tag, alpha: 0, duration: 100, ease: 'Quad.easeIn' }); + } + _drawPager() { const g = this._pager; g.clear();