Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/web-ui/public/agent-companion-pets/openbitfun-girl/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Feiling (绯翎)

![Idle, wave, and pointer-look preview](preview.gif)

Feiling is an original chibi adaptation of the OpenBitFun Girl character, with a
small, softly oval face, a compact black-and-ivory bell skirt, and tiny legs with
rounded shoes. Her name combines crimson and feather imagery to evoke Bifang.
Silver hair and OpenBitFun ornaments preserve the character's identity: both the
outer outline and the inner opening of each logo are rounded six-sided hexagons.
The artwork was created with AI image generation from the character illustration,
the official brand mark, and the requested short-legged proportions.

The built-in picker lists this pet immediately after the default blue-golden
cat. Feiling keeps the `openbitfun-girl` package ID and paths so saved selections
continue to work after the display-name change. The earlier OpenBitFun Bifang
mascot remains a separate preset.

## Sprite contract

- `spriteVersionNumber: 2`; lossless WebP with transparency.
- Atlas: 1536 × 2288 pixels, 8 columns × 11 rows, 192 × 208 pixels per cell.
- Rows 0–8: idle, running-right, running-left, waving, jumping, failed, waiting,
working (`running`), and review. Frame counts: 6, 8, 8, 4, 5, 8, 6, 6, 6.
- Rows 9–10: 16 look directions clockwise from up in 22.5-degree steps.
- The asymmetric hair ornament stays on the character's left; leftward and
rightward running were authored separately.

The package uses the existing shared pet renderer and adds no host command,
protocol change, or configuration migration. `pet.json` can also be used to
import the package as a v2 pet.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"id": "openbitfun-girl",
"displayName": "绯翎",
"description": "Feiling, a silver-haired short-legged companion with a softly oval face and hollow rounded-hexagon ornaments.",
"spriteVersionNumber": 2,
"spritesheetPath": "spritesheet.webp"
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import girlManifest from '../../../../public/agent-companion-pets/openbitfun-girl/pet.json';

const invoke = vi.fn();

Expand Down Expand Up @@ -46,4 +47,24 @@ describe('AgentCompanionPetService built-in presets', () => {
});
expect(invoke).not.toHaveBeenCalled();
});

it('lists Feiling second and resolves its packaged v2 layout without host access', async () => {
const { listAgentCompanionPets, resolveAgentCompanionPet } = await import('./AgentCompanionPetService');
const pets = await listAgentCompanionPets();
const girl = pets[1];

expect(pets.slice(0, 3).map(pet => pet.id)).toEqual([
'blue-golden', 'openbitfun-girl', 'deepseek-goldwhale',
]);
expect(girl).toMatchObject({
...girlManifest,
source: 'preset',
spritesheetPath: `/agent-companion-pets/${girlManifest.id}/${girlManifest.spritesheetPath}`,
spritesheetMimeType: 'image/webp',
});
const resolved = await resolveAgentCompanionPet(girl);
expect(resolved.src).toBe(girl.spritesheetPath);
expect(resolved.layout).toMatchObject({ version: 2, columns: 8, rows: 11, supportsLook: true });
expect(invoke).not.toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ const BUILTIN_PETS: AgentCompanionPetSelection[] = [
{
...DEFAULT_AGENT_COMPANION_PET,
},
{
id: 'openbitfun-girl',
displayName: BUILTIN_PET_DISPLAY_NAMES.openbitfunGirl,
description: 'Feiling, a silver-haired short-legged companion with a softly oval face and hollow rounded-hexagon ornaments.',
source: 'preset',
packagePath: `${BUILTIN_PET_BASE}/openbitfun-girl`,
spritesheetPath: `${BUILTIN_PET_BASE}/openbitfun-girl/spritesheet.webp`,
spritesheetMimeType: 'image/webp',
spriteVersionNumber: 2,
},
{
id: 'deepseek-goldwhale',
displayName: BUILTIN_PET_DISPLAY_NAMES.goldWhale,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"displayNames": {
"blueGolden": "困困",
"openbitfunGirl": "绯翎",
"goldWhale": "大肥鱼",
"gugugaga": "咕咕嘎嘎",
"jiyi": "吉伊"
Expand Down
Loading