Skip to content

feat(assets): migrate 41 Azurel portraits from repo root into emissary asset tree - #8

Merged
potemkin666 merged 5 commits into
mainfrom
copilot/implement-merman-emotions
Apr 20, 2026
Merged

feat(assets): migrate 41 Azurel portraits from repo root into emissary asset tree#8
potemkin666 merged 5 commits into
mainfrom
copilot/implement-merman-emotions

Conversation

Copilot AI commented Apr 20, 2026

Copy link
Copy Markdown
Contributor

41 real Azurel portrait PNGs were uploaded directly to main root. This PR moves them to their correct location, expands the emotion system to cover all 41, and cleans up the scaffolding that existed for the old 8-placeholder approach.

Asset migration

  • All 41 PNGs moved from repo root → src/renderer/src/assets/emissary/ with kebab-case filenames (blowing bubbles.pngblowing-bubbles.png, sad (1).pngsad-1.png, etc.)
  • Deleted the 7 stale placeholder PNGs (smug, distressed, excited, flexing, laughing, waving, thinking)

Emotion system expansion

  • EmissaryEmotion union type expanded from 8 → 41 variants, one per portrait
  • getEmissaryEmotion() remapped: each of the 19 animation states now resolves to a distinct portrait rather than collapsing into 8 buckets

EmissaryFigure — glob import

Replaced 8 individual static imports with a Vite build-time glob so new portraits are picked up automatically:

const _emotionModules = import.meta.glob('../assets/emissary/*.png', {
  eager: true,
  import: 'default',
}) as Record<string, string>

Cleanup

  • Removed scripts/fetch-emissary-art.sh and the fetch:art npm script — art is committed directly, no download step needed

Copilot AI and others added 5 commits April 20, 2026 21:03
- Add 4 placeholder PNG assets in src/renderer/src/assets/emissary/
  (laughing.png, waving.png, crying.png, smug.png)
- Add EmissaryEmotion type and getEmissaryEmotion() to fishtank-lib/emissary.ts
  mapping animation + status + weather → one of the 4 emotions
- Create EmissaryFigure.tsx component: PNG image + glow halo ring + drop-shadow
- Update Fishtank.tsx to use EmissaryFigure instead of the emoji orb
- Replace .fishtank-emissary-orb with .fishtank-emissary-halo + .fishtank-emissary-img
  styles in index.css (halo breath animation, hover scale + glow)
- Add vite-env.d.ts with PNG module declaration
- Build passes, all 71 tests pass

Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/6fe30914-7263-4b62-a413-8ce9114f8d92

Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com>
…ted, distressed

Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/d9784947-4de4-4c66-9324-323c013ceb14

Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com>
…m run fetch:art

Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/5b9b52ab-30a5-4ace-a26b-3437940b0775

Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com>
…gs now confirmed

Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/047099b9-ef86-424e-97a1-0d5f7e565653

Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com>
…ion to full set

Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/2c0de118-dcd8-4015-85e0-72dab8757929

Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com>
@potemkin666
potemkin666 marked this pull request as ready for review April 20, 2026 22:30
Copilot AI review requested due to automatic review settings April 20, 2026 22:30
@potemkin666
potemkin666 merged commit e5fea65 into main Apr 20, 2026
1 check passed
@potemkin666
potemkin666 deleted the copilot/implement-merman-emotions branch April 20, 2026 22:31

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR migrates Azurel portrait assets into the renderer emissary asset tree and updates the Fishtank UI/emotion-selection logic to use PNG portraits (via a Vite glob) instead of the prior emoji/orb placeholder approach.

Changes:

  • Added an expanded EmissaryEmotion type and getEmissaryEmotion() to select a portrait based on animation/status/weather.
  • Replaced the inlined Emissary UI block in Fishtank.tsx with a new EmissaryFigure component that renders the portrait + halo + label and loads portraits via import.meta.glob.
  • Updated CSS for the new halo + portrait layout and added vite-env.d.ts typing for Vite/client + asset imports.

Reviewed changes

Copilot reviewed 5 out of 47 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/renderer/src/vite-env.d.ts Adds Vite/client reference + asset module declarations for images.
src/renderer/src/screens/fishtank-lib/index.ts Re-exports EmissaryEmotion and getEmissaryEmotion from emissary.
src/renderer/src/screens/fishtank-lib/emissary.ts Adds EmissaryEmotion union and mapping function from animation/status/weather → portrait emotion.
src/renderer/src/screens/Fishtank.tsx Switches emissary rendering from emoji/orb to EmissaryFigure driven by getEmissaryEmotion().
src/renderer/src/index.css Replaces orb styles with halo + portrait styles and z-index layering tweaks for label.
src/renderer/src/components/EmissaryFigure.tsx New component that loads portraits via Vite glob and renders halo + PNG + label.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +4 to +9
type EmissaryEmotion,
ANIMATIONS,
ANIMATION_LABELS,
ANIMATION_EMOJIS,
getEmissaryStyle,
getEmissaryEmotion,

Copilot AI Apr 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ANIMATION_EMOJIS is still being re-exported here, but it no longer appears to be used anywhere in the repo after swapping to EmissaryFigure (search shows only its definition + this export). Consider removing the export (and the constant) to avoid dead code and keep the public surface of fishtank-lib minimal.

Copilot uses AI. Check for mistakes.
Comment on lines +176 to +180
waving: 'waving-hello',
stretching: 'idle-sitting',
gazing: 'yearning',
flirty: 'flirting',
fearful: 'shock',

Copilot AI Apr 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description says each animation state now resolves to a distinct portrait, but this mapping still reuses emotions across multiple animations (e.g. stretching and napping both map to idle-sitting, and there are other repeats further down). Either adjust the mapping to use unique portraits per animation, or update the PR description/comment so it matches the intended behavior.

Copilot uses AI. Check for mistakes.
Comment on lines +49 to +55
<div
onClick={onClick}
role="button"
tabIndex={0}
aria-label={`Click ${name} to interact`}
onKeyDown={onKeyDown}
className="fishtank-emissary"

Copilot AI Apr 20, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EmissaryFigure renders a div with role="button"/tabIndex={0}, but it doesn’t provide default keyboard activation behavior (Enter/Space) unless every caller remembers to pass an onKeyDown handler. Since the component itself declares button semantics, consider handling Enter/Space internally (and still calling any passed onKeyDown) so the component is accessible by default.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants