735 lines
26 KiB
Markdown
735 lines
26 KiB
Markdown
# Avatar System
|
|
|
|
## Overview
|
|
|
|
Mii-style avatar system with full customization and level-based unlockable accessories. The system supports four rendering modes optimized for different game types, with smooth animations and real-time accessory rendering.
|
|
|
|
## Architecture
|
|
|
|
The avatar system consists of several modules:
|
|
|
|
| Module | File | Purpose |
|
|
|--------|------|---------|
|
|
| AvatarData | `avatarData.js` | Customization options and guest avatars |
|
|
| AvatarSystem | `avatarSystem.js` | Main API for creation, rendering, accessories |
|
|
| AvatarRenderer | `avatarRenderer.js` | Canvas 2D rendering engine |
|
|
| AvatarAnimations | `animations.js` | Animation definitions per mode |
|
|
| AvatarAccessories | `accessories.js` | Unlockable accessories catalog |
|
|
| AccessoryRenderer | `accessoryRenderer.js` | Accessory rendering on avatars |
|
|
|
|
---
|
|
|
|
## Customization Options
|
|
|
|
### Face Shape (8 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `round` | Round | Circular face with soft jawline |
|
|
| `oval` | Oval | Classic elongated oval shape |
|
|
| `square` | Square | Strong angular jawline |
|
|
| `heart` | Heart | Wide forehead, pointed chin |
|
|
| `long` | Long | Narrow, elongated face |
|
|
| `wide` | Wide | Broader face shape |
|
|
| `angular` | Angular | Defined cheekbones, sharp features |
|
|
| `soft` | Soft | Rounded features throughout |
|
|
|
|
### Skin Tone (20 options)
|
|
|
|
| ID | Name | Hex Code |
|
|
|----|------|----------|
|
|
| `fair1` | Porcelain | `#FFECD1` |
|
|
| `fair2` | Ivory | `#FFE4C4` |
|
|
| `fair3` | Peach | `#FFDAB9` |
|
|
| `fair4` | Cream | `#FFD5B5` |
|
|
| `light1` | Light Beige | `#F5D0A9` |
|
|
| `light2` | Warm Beige | `#E8C49A` |
|
|
| `light3` | Sand | `#DEB887` |
|
|
| `medium1` | Golden | `#D4A373` |
|
|
| `medium2` | Honey | `#C9A06A` |
|
|
| `medium3` | Caramel | `#BC8F5F` |
|
|
| `medium4` | Toffee | `#B07D4B` |
|
|
| `tan1` | Tan | `#A67B5B` |
|
|
| `tan2` | Bronze | `#996B4D` |
|
|
| `tan3` | Cinnamon | `#8B6D4C` |
|
|
| `brown1` | Chestnut | `#7D5A3C` |
|
|
| `brown2` | Cocoa | `#6F4E37` |
|
|
| `brown3` | Espresso | `#5D4532` |
|
|
| `dark1` | Mocha | `#4E3B2D` |
|
|
| `dark2` | Ebony | `#3D2B1F` |
|
|
| `dark3` | Onyx | `#2C1F15` |
|
|
|
|
### Eye Shape (12 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `round` | Round | Large, circular eyes |
|
|
| `almond` | Almond | Classic almond shape |
|
|
| `oval` | Oval | Soft oval shape |
|
|
| `narrow` | Narrow | Slim, elongated eyes |
|
|
| `wide` | Wide | Broad, expressive eyes |
|
|
| `droopy` | Droopy | Downturned outer corners |
|
|
| `upturned` | Upturned | Lifted outer corners |
|
|
| `cat` | Cat | Sharp upturned cat-eye |
|
|
| `sleepy` | Sleepy | Heavy-lidded, relaxed look |
|
|
| `surprised` | Surprised | Wide open, alert |
|
|
| `angry` | Angry | Angled inward brow line |
|
|
| `happy` | Happy | Slightly squinted, joyful |
|
|
|
|
### Eye Color (16 options)
|
|
|
|
| ID | Name | Hex Code |
|
|
|----|------|----------|
|
|
| `brown` | Brown | `#634E34` |
|
|
| `darkBrown` | Dark Brown | `#3D2314` |
|
|
| `hazel` | Hazel | `#8B7355` |
|
|
| `green` | Green | `#3D7A3D` |
|
|
| `blue` | Blue | `#4682B4` |
|
|
| `lightBlue` | Light Blue | `#87CEEB` |
|
|
| `gray` | Gray | `#708090` |
|
|
| `amber` | Amber | `#B8860B` |
|
|
| `violet` | Violet | `#8B008B` |
|
|
| `emerald` | Emerald | `#50C878` |
|
|
| `iceBlue` | Ice Blue | `#A5D8E6` |
|
|
| `gold` | Gold | `#DAA520` |
|
|
| `red` | Red | `#8B0000` |
|
|
| `black` | Black | `#1A1A1A` |
|
|
| `honey` | Honey | `#C9A06A` |
|
|
| `turquoise` | Turquoise | `#40E0D0` |
|
|
|
|
**Total Eye Combinations**: 12 shapes x 16 colors = **192 unique eye options**
|
|
|
|
### Eyebrow Shape (10 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `natural` | Natural | Balanced, standard arch |
|
|
| `arched` | Arched | High dramatic arch |
|
|
| `straight` | Straight | Flat, horizontal brows |
|
|
| `thick` | Thick | Full, bold brows |
|
|
| `thin` | Thin | Delicate, fine brows |
|
|
| `angry` | Angry | Angled down toward center |
|
|
| `worried` | Worried | Angled up toward center |
|
|
| `bushy` | Bushy | Wild, untamed look |
|
|
| `sleek` | Sleek | Thin with elegant arch |
|
|
| `curved` | Curved | Pronounced curved shape |
|
|
|
|
### Nose Shape (8 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `button` | Button | Small, rounded tip |
|
|
| `pointed` | Pointed | Narrow with defined tip |
|
|
| `roman` | Roman | Prominent bridge curve |
|
|
| `snub` | Snub | Short with slight upturn |
|
|
| `wide` | Wide | Broader nostril base |
|
|
| `narrow` | Narrow | Thin, elongated bridge |
|
|
| `aquiline` | Aquiline | Pronounced curved bridge |
|
|
| `flat` | Flat | Low bridge, wide base |
|
|
|
|
### Mouth Shape (10 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `smile` | Smile | Gentle upward curve |
|
|
| `neutral` | Neutral | Relaxed, straight line |
|
|
| `grin` | Grin | Wide smile showing teeth |
|
|
| `smirk` | Smirk | Asymmetric half-smile |
|
|
| `pout` | Pout | Full lips, slight downturn |
|
|
| `open` | Open | Slightly parted lips |
|
|
| `small` | Small | Petite, compact mouth |
|
|
| `wide` | Wide | Broader mouth width |
|
|
| `thin` | Thin | Narrow lip fullness |
|
|
| `full` | Full | Plump, pronounced lips |
|
|
|
|
### Ear Shape (6 options)
|
|
|
|
| ID | Name | Description |
|
|
|----|------|-------------|
|
|
| `normal` | Normal | Standard ear shape and size |
|
|
| `small` | Small | Compact, closer to head |
|
|
| `large` | Large | Prominent, larger ears |
|
|
| `pointed` | Pointed | Elf-like pointed tips |
|
|
| `round` | Round | Soft, rounded lobes |
|
|
| `flat` | Flat | Close-set against head |
|
|
|
|
### Hair Style (30 options)
|
|
|
|
| ID | Name | Length | Coverage |
|
|
|----|------|--------|----------|
|
|
| `short-messy` | Short Messy | Short | 0.30 |
|
|
| `short-neat` | Short Neat | Short | 0.25 |
|
|
| `short-curly` | Short Curly | Short | 0.35 |
|
|
| `medium-straight` | Medium Straight | Medium | 0.50 |
|
|
| `medium-wavy` | Medium Wavy | Medium | 0.55 |
|
|
| `long-straight` | Long Straight | Long | 0.70 |
|
|
| `long-wavy` | Long Wavy | Long | 0.75 |
|
|
| `ponytail` | Ponytail | Medium | 0.40 |
|
|
| `pigtails` | Pigtails | Medium | 0.45 |
|
|
| `bun` | Bun | Long | 0.35 |
|
|
| `mohawk` | Mohawk | Short | 0.20 |
|
|
| `afro` | Afro | Medium | 0.80 |
|
|
| `buzz` | Buzz Cut | Short | 0.15 |
|
|
| `bald` | Bald | None | 0.00 |
|
|
| `sidepart` | Side Part | Short | 0.30 |
|
|
| `spiky` | Spiky | Short | 0.35 |
|
|
| `slicked` | Slicked Back | Short | 0.25 |
|
|
| `bob` | Bob | Medium | 0.50 |
|
|
| `pixie` | Pixie | Short | 0.35 |
|
|
| `braids` | Braids | Long | 0.60 |
|
|
| `dreads` | Dreads | Long | 0.70 |
|
|
| `undercut` | Undercut | Short | 0.25 |
|
|
| `fauxhawk` | Faux Hawk | Short | 0.30 |
|
|
| `mullet` | Mullet | Medium | 0.45 |
|
|
| `bowl` | Bowl Cut | Medium | 0.55 |
|
|
| `combover` | Comb Over | Short | 0.20 |
|
|
| `bangs` | Bangs | Medium | 0.50 |
|
|
| `sidesweep` | Side Sweep | Medium | 0.45 |
|
|
| `topknot` | Top Knot | Long | 0.30 |
|
|
| `cornrows` | Cornrows | Medium | 0.40 |
|
|
|
|
### Hair Color (20 options)
|
|
|
|
| ID | Name | Hex Code | Type |
|
|
|----|------|----------|------|
|
|
| `black` | Black | `#1A1A1A` | Natural |
|
|
| `darkBrown` | Dark Brown | `#2C1810` | Natural |
|
|
| `brown` | Brown | `#4A3728` | Natural |
|
|
| `lightBrown` | Light Brown | `#7A5A3A` | Natural |
|
|
| `auburn` | Auburn | `#8B4513` | Natural |
|
|
| `ginger` | Ginger | `#B5651D` | Natural |
|
|
| `strawberry` | Strawberry | `#C67171` | Natural |
|
|
| `blonde` | Blonde | `#D4B896` | Natural |
|
|
| `platinum` | Platinum | `#E8E4C9` | Natural |
|
|
| `white` | White | `#F0F0F0` | Natural |
|
|
| `gray` | Gray | `#808080` | Natural |
|
|
| `red` | Red | `#CC0000` | Fantasy |
|
|
| `blue` | Blue | `#0066CC` | Fantasy |
|
|
| `purple` | Purple | `#7B2D8E` | Fantasy |
|
|
| `green` | Green | `#228B22` | Fantasy |
|
|
| `pink` | Pink | `#FF69B4` | Fantasy |
|
|
| `teal` | Teal | `#008B8B` | Fantasy |
|
|
| `orange` | Orange | `#FF6600` | Fantasy |
|
|
| `silver` | Silver | `#C0C0C0` | Fantasy |
|
|
| `rainbow` | Rainbow | Gradient | Fantasy |
|
|
|
|
### Facial Hair (10 options)
|
|
|
|
| ID | Name | Coverage | Description |
|
|
|----|------|----------|-------------|
|
|
| `none` | None | - | Clean shaven |
|
|
| `stubble` | Stubble | Light | 5 o'clock shadow |
|
|
| `goatee` | Goatee | Chin | Chin beard only |
|
|
| `mustache` | Mustache | Upper lip | Classic mustache |
|
|
| `fullBeard` | Full Beard | Full face | Complete beard coverage |
|
|
| `shortBeard` | Short Beard | Full face | Trimmed full beard |
|
|
| `soulPatch` | Soul Patch | Chin center | Small chin patch |
|
|
| `mutton` | Mutton Chops | Sides | Sideburn-connected style |
|
|
| `handlebar` | Handlebar | Upper lip | Curled mustache tips |
|
|
| `vandyke` | Van Dyke | Chin + mustache | Goatee with mustache |
|
|
|
|
### Body Type (6 options)
|
|
|
|
| ID | Name | Width Ratio | Height Ratio |
|
|
|----|------|-------------|--------------|
|
|
| `slim` | Slim | 0.80 | 1.00 |
|
|
| `average` | Average | 1.00 | 1.00 |
|
|
| `athletic` | Athletic | 1.10 | 1.00 |
|
|
| `stocky` | Stocky | 1.20 | 0.95 |
|
|
| `tall` | Tall | 0.95 | 1.15 |
|
|
| `short` | Short | 1.00 | 0.85 |
|
|
|
|
### Clothing Style (4 options)
|
|
|
|
| ID | Name | Has Collar | Sleeve Length | Special |
|
|
|----|------|------------|---------------|---------|
|
|
| `casual` | Casual | No | Short | - |
|
|
| `sporty` | Sporty | No | Short | Stripes |
|
|
| `formal` | Formal | Yes | Long | Buttons |
|
|
| `scifi` | Sci-Fi | Yes | Long | Glow effects |
|
|
|
|
### Clothing Color (20 preset colors)
|
|
|
|
```
|
|
#E74C3C #E67E22 #F1C40F #2ECC71 #1ABC9C
|
|
#3498DB #9B59B6 #34495E #95A5A6 #ECF0F1
|
|
#C0392B #D35400 #F39C12 #27AE60 #16A085
|
|
#2980B9 #8E44AD #2C3E50 #7F8C8D #BDC3C7
|
|
```
|
|
|
|
---
|
|
|
|
## Earned Accessories
|
|
|
|
### Rarity System
|
|
|
|
| Rarity | Color | Level Range | Hex Code |
|
|
|--------|-------|-------------|----------|
|
|
| Common | Gray | 1-15 | `#9D9D9D` |
|
|
| Uncommon | Green | 16-30 | `#1EFF00` |
|
|
| Rare | Blue | 31-50 | `#0070DD` |
|
|
| Epic | Purple | 51-70 | `#A335EE` |
|
|
| Legendary | Orange | 71-90 | `#FF8000` |
|
|
| Mythic | Gold | 91-100 | `#E6CC80` |
|
|
|
|
### Eyewear (15 items)
|
|
|
|
| ID | Name | Unlock Level | Rarity | Has Effect | Description |
|
|
|----|------|--------------|--------|------------|-------------|
|
|
| `sunglasses-classic` | Classic Sunglasses | 5 | Common | No | Timeless shades for any occasion |
|
|
| `aviator` | Aviator Glasses | 10 | Common | No | Top Gun approved eyewear |
|
|
| `nerd-glasses` | Nerd Glasses | 15 | Common | No | Intelligence +100 (cosmetic only) |
|
|
| `3d-glasses` | 3D Glasses | 20 | Uncommon | No | See the world in a whole new dimension |
|
|
| `goggles` | Goggles | 25 | Uncommon | No | Ready for adventure or science experiments |
|
|
| `monocle` | Monocle | 30 | Uncommon | No | Distinguished and sophisticated |
|
|
| `star-glasses` | Star Glasses | 35 | Rare | No | You are a star! |
|
|
| `heart-glasses` | Heart Glasses | 40 | Rare | No | Spread the love wherever you go |
|
|
| `sport-visor` | Sport Visor | 45 | Rare | No | Professional gamer gear |
|
|
| `vr-headset` | VR Headset | 50 | Epic | No | Immerse yourself in virtual worlds |
|
|
| `cyber-visor` | Cyber Visor | 55 | Epic | No | Sleek futuristic eye protection |
|
|
| `x-ray-specs` | X-Ray Specs | 60 | Epic | Yes | See through walls... probably |
|
|
| `laser-eyes` | Laser Eyes | 70 | Legendary | Yes | Pew pew! Lasers shoot from your eyes |
|
|
| `diamond-glasses` | Diamond Glasses | 80 | Legendary | No | Pure crystallized luxury |
|
|
| `cosmic-lenses` | Cosmic Lenses | 90 | Mythic | Yes | Gaze upon the infinite universe |
|
|
|
|
### Headwear (20 items)
|
|
|
|
| ID | Name | Unlock Level | Rarity | Has Effect | Description |
|
|
|----|------|--------------|--------|------------|-------------|
|
|
| `baseball-cap` | Baseball Cap | 3 | Common | No | A classic casual cap |
|
|
| `backwards-cap` | Backwards Cap | 8 | Common | No | Cool kids wear it backwards |
|
|
| `beanie` | Beanie | 12 | Common | No | Cozy knitted headwear |
|
|
| `party-hat` | Party Hat | 18 | Uncommon | No | Every day is a celebration! |
|
|
| `chef-hat` | Chef Hat | 22 | Uncommon | No | Master of the kitchen |
|
|
| `crown-bronze` | Bronze Crown | 25 | Uncommon | No | A humble crown for rising royalty |
|
|
| `hard-hat` | Hard Hat | 26 | Uncommon | No | Safety first on the job site |
|
|
| `wizard-hat` | Wizard Hat | 30 | Rare | No | Channel your inner sorcerer |
|
|
| `pirate-hat` | Pirate Hat | 35 | Rare | No | Arrr! Set sail for adventure |
|
|
| `santa-hat` | Santa Hat | 38 | Rare | No | Ho ho ho! Spread holiday cheer |
|
|
| `crown-silver` | Silver Crown | 40 | Rare | No | A noble crown for dedicated players |
|
|
| `graduation-cap` | Graduation Cap | 42 | Rare | No | Scholar of the gaming arts |
|
|
| `bunny-ears` | Bunny Ears | 45 | Rare | No | Hop into the fun! |
|
|
| `devil-horns` | Devil Horns | 48 | Rare | No | A little mischief never hurt anyone |
|
|
| `halo` | Halo | 52 | Epic | Yes | An angelic golden ring of light |
|
|
| `top-hat` | Top Hat | 56 | Epic | No | Dapper and distinguished |
|
|
| `crown-gold` | Gold Crown | 60 | Epic | No | True royalty in golden splendor |
|
|
| `viking-helmet` | Viking Helmet | 62 | Epic | No | Conquer games like a Norse warrior |
|
|
| `crown-diamond` | Diamond Crown | 80 | Legendary | Yes | A magnificent crown of pure diamonds |
|
|
| `crown-cosmic` | Cosmic Crown | 100 | Mythic | Yes | The ultimate crown, forged from stardust |
|
|
|
|
### Effects/Auras (10 items)
|
|
|
|
| ID | Name | Unlock Level | Rarity | Effect Type | Color | Description |
|
|
|----|------|--------------|--------|-------------|-------|-------------|
|
|
| `sparkle-trail` | Sparkle Trail | 15 | Uncommon | Particles | `#FFD700` | Leave a trail of golden sparkles |
|
|
| `fire-aura` | Fire Aura | 25 | Rare | Glow | `#FF4500` | Surrounded by fierce flames |
|
|
| `lightning-crackle` | Lightning Crackle | 35 | Rare | Electric | `#00BFFF` | Electricity crackles around you |
|
|
| `rainbow-glow` | Rainbow Glow | 45 | Epic | Glow | Rainbow | Radiate all colors of the spectrum |
|
|
| `star-particles` | Star Particles | 55 | Epic | Particles | `#FFFF00` | Tiny stars orbit around you |
|
|
| `ice-crystals` | Ice Crystals | 65 | Legendary | Particles | `#87CEEB` | Frozen crystals shimmer around you |
|
|
| `shadow-effect` | Shadow Effect | 70 | Legendary | Shadow | `#2F2F4F` | Darkness follows your every move |
|
|
| `golden-glow` | Golden Glow | 75 | Legendary | Glow | `#FFD700` | Bathe in pure golden light |
|
|
| `void-aura` | Void Aura | 85 | Mythic | Void | `#4B0082` | The void itself surrounds you |
|
|
| `cosmic-trail` | Cosmic Trail | 95 | Mythic | Cosmic | Cosmic | Trail galaxies and nebulae in your wake |
|
|
|
|
**Total Accessories**: 15 + 20 + 10 = **45 unlockable items**
|
|
|
|
---
|
|
|
|
## Rendering Modes
|
|
|
|
### HEAD_ONLY (64x64 pixels)
|
|
|
|
**Best for**: Cockpit views, flying games (Flappy Bird style), maze games, puzzle games
|
|
|
|
**Shows**: Face, hair, ears, accessories (eyewear, headwear, effects)
|
|
|
|
**Animations** (5):
|
|
| ID | Name | Frames | Duration | Loop | Description |
|
|
|----|------|--------|----------|------|-------------|
|
|
| `bob` | Bob | 3 | 150ms | Yes | Gentle up/down bobbing motion |
|
|
| `flap` | Flap | 2 | 80ms | Yes | Flapping motion with head squash/stretch |
|
|
| `blink` | Blink | 3 | 60ms | No | Eye blink animation |
|
|
| `celebrate` | Celebrate | 4 | 100ms | No | Happy bouncing celebration |
|
|
| `hurt` | Hurt | 2 | 80ms | No | Damage reaction shake |
|
|
|
|
### HEAD_AND_SHOULDERS (64x96 pixels)
|
|
|
|
**Best for**: Driving games, conversation scenes, submarine games, portrait views
|
|
|
|
**Shows**: Head, neck, shoulders, clothing collar
|
|
|
|
**Animations** (6):
|
|
| ID | Name | Frames | Duration | Loop | Description |
|
|
|----|------|--------|----------|------|-------------|
|
|
| `idle` | Idle | 3 | 400ms | Yes | Subtle breathing motion |
|
|
| `turn-left` | Turn Left | 2 | 100ms | No | Head turns to the left |
|
|
| `turn-right` | Turn Right | 2 | 100ms | No | Head turns to the right |
|
|
| `look-up` | Look Up | 2 | 100ms | No | Head tilts upward |
|
|
| `celebrate` | Celebrate | 3 | 120ms | No | Bounce and smile celebration |
|
|
| `hurt` | Hurt | 2 | 100ms | No | Recoil damage reaction |
|
|
|
|
### UPPER_BODY (64x128 pixels)
|
|
|
|
**Best for**: Racing games, shooting games, hoverboard games, action sequences
|
|
|
|
**Shows**: Head, neck, shoulders, torso, arms, hands
|
|
|
|
**Animations** (8):
|
|
| ID | Name | Frames | Duration | Loop | Description |
|
|
|----|------|--------|----------|------|-------------|
|
|
| `idle` | Idle | 3 | 400ms | Yes | Breathing with subtle arm sway |
|
|
| `wave` | Wave | 4 | 120ms | No | Friendly arm wave gesture |
|
|
| `point` | Point | 3 | 100ms | No | Pointing forward gesture |
|
|
| `steer-left` | Steer Left | 2 | 80ms | No | Leaning left for racing/steering |
|
|
| `steer-right` | Steer Right | 2 | 80ms | No | Leaning right for racing/steering |
|
|
| `shoot` | Shoot | 3 | 60ms | No | Arm extends forward shooting motion |
|
|
| `celebrate` | Celebrate | 4 | 120ms | No | Arms up victory celebration |
|
|
| `hurt` | Hurt | 2 | 100ms | No | Recoil backwards damage reaction |
|
|
|
|
### FULL_BODY (64x160 pixels)
|
|
|
|
**Best for**: Platformers, RPGs, sports games, adventure games, fighting games
|
|
|
|
**Shows**: Complete character with head, body, arms, legs, shoes
|
|
|
|
**Animations** (12):
|
|
| ID | Name | Frames | Duration | Loop | Description |
|
|
|----|------|--------|----------|------|-------------|
|
|
| `idle` | Idle | 3 | 400ms | Yes | Standing with breathing motion |
|
|
| `walk` | Walk Cycle | 4 | 100ms | Yes | Walking with arm/leg swing |
|
|
| `run` | Run Cycle | 6 | 60ms | Yes | Running with full body movement |
|
|
| `jump` | Jump | 3 | 100ms | No | Crouch, leap, stretch sequence |
|
|
| `fall` | Fall | 2 | 150ms | Yes | Arms up, legs down falling pose |
|
|
| `crouch` | Crouch | 2 | 80ms | No | Duck down into crouch position |
|
|
| `celebrate` | Celebrate | 6 | 100ms | No | Jump and arm wave celebration |
|
|
| `attack` | Attack | 4 | 60ms | No | Punch or swing attack motion |
|
|
| `hurt` | Hurt | 3 | 80ms | No | Stagger backwards damage reaction |
|
|
| `climb` | Climb | 4 | 120ms | Yes | Climbing ladder/wall motion |
|
|
| `swim` | Swim | 4 | 150ms | Yes | Swimming stroke animation |
|
|
| `fly` | Fly | 4 | 100ms | Yes | Superhero flying pose |
|
|
|
|
---
|
|
|
|
## API Reference
|
|
|
|
### Creating Avatars
|
|
|
|
```javascript
|
|
// Create avatar with custom options
|
|
const avatar = AvatarSystem.create({
|
|
faceShape: 'round',
|
|
skinTone: '#FFD5B8',
|
|
eyes: { shape: 'round', color: '#4A90D9' },
|
|
eyebrows: 'natural',
|
|
nose: 'button',
|
|
mouth: 'smile',
|
|
ears: 'normal',
|
|
hair: { style: 'short-messy', color: '#3D2314' },
|
|
facialHair: 'none',
|
|
body: { type: 'average' },
|
|
clothing: { style: 'casual', shirtColor: '#3498DB', pantsColor: '#2C3E50' }
|
|
});
|
|
|
|
// Create default avatar
|
|
const defaultAvatar = AvatarSystem.createDefault();
|
|
|
|
// Get random guest avatar
|
|
const guestAvatar = AvatarSystem.getGuestAvatar();
|
|
```
|
|
|
|
### Loading and Saving
|
|
|
|
```javascript
|
|
// Load user's saved avatar
|
|
const avatar = await AvatarSystem.loadUserAvatar(userId);
|
|
|
|
// Save avatar
|
|
AvatarSystem.saveAvatar(avatar);
|
|
|
|
// Clear cache
|
|
AvatarSystem.clearCache(userId); // Clear specific user
|
|
AvatarSystem.clearCache(); // Clear all
|
|
```
|
|
|
|
### Rendering
|
|
|
|
```javascript
|
|
// Render to canvas context
|
|
AvatarSystem.render(avatar, 'FULL_BODY', ctx, x, y, {
|
|
scale: 1,
|
|
animation: 'walk',
|
|
frame: 0
|
|
});
|
|
|
|
// Render to offscreen canvas
|
|
const canvas = AvatarSystem.renderToCanvas(avatar, 'HEAD_ONLY', { scale: 2 });
|
|
|
|
// Render to data URL (for images)
|
|
const dataUrl = AvatarSystem.renderToDataURL(avatar, 'HEAD_AND_SHOULDERS');
|
|
|
|
// Get mode dimensions
|
|
const size = AvatarSystem.getModeSize('FULL_BODY');
|
|
// Returns: { width: 64, height: 160 }
|
|
```
|
|
|
|
### Animation Control
|
|
|
|
```javascript
|
|
// Start animation
|
|
AvatarSystem.startAnimation(avatarId, 'walk', {
|
|
loop: true,
|
|
mode: 'FULL_BODY',
|
|
onComplete: () => console.log('Animation finished')
|
|
});
|
|
|
|
// Stop animation
|
|
AvatarSystem.stopAnimation(avatarId);
|
|
|
|
// Get current animation state
|
|
const state = AvatarSystem.getAnimationState(avatarId);
|
|
// Returns: { animation: 'walk', frame: 2, complete: false, transforms: {...} }
|
|
|
|
// Check if animating
|
|
const isAnimating = AvatarSystem.isAnimating(avatarId);
|
|
|
|
// Get animation frame transforms directly
|
|
const transforms = AvatarSystem.animate(avatar, 'run', frameNumber);
|
|
```
|
|
|
|
### Accessory Management
|
|
|
|
```javascript
|
|
// Equip accessory
|
|
AvatarSystem.equipAccessory(avatar, 'headwear', 'crown-gold');
|
|
AvatarSystem.equipAccessory(avatar, 'eyewear', 'sunglasses-classic');
|
|
AvatarSystem.equipAccessory(avatar, 'effect', 'sparkle-trail');
|
|
|
|
// Unequip accessory
|
|
AvatarSystem.unequipAccessory(avatar, 'headwear');
|
|
|
|
// Unlock/award accessory
|
|
const newlyUnlocked = AvatarSystem.unlockAccessory(avatar, 'vr-headset');
|
|
// Returns: true if newly unlocked, false if already owned
|
|
|
|
// Check if avatar has accessory
|
|
const hasItem = AvatarSystem.hasAccessory(avatar, 'crown-gold');
|
|
|
|
// Get earned accessories (full objects)
|
|
const earned = AvatarSystem.getEarnedAccessories(avatar);
|
|
// Returns: { eyewear: [...], headwear: [...], effects: [...] }
|
|
|
|
// Get equipped accessories (full objects)
|
|
const equipped = AvatarSystem.getEquippedAccessories(avatar);
|
|
// Returns: { eyewear: {...}, headwear: {...}, effect: {...} }
|
|
|
|
// Get full accessory catalog
|
|
const catalog = AvatarSystem.getAccessoryCatalog();
|
|
```
|
|
|
|
### Level Unlocks
|
|
|
|
```javascript
|
|
// Check what unlocks at a specific level
|
|
const newItems = AvatarSystem.checkLevelUnlocks(avatar, 50);
|
|
// Returns: Array of newly unlocked accessory objects
|
|
|
|
// Add XP and check for level ups
|
|
const result = AvatarSystem.addXP(avatar, 500);
|
|
// Returns: { newLevel: 12, leveledUp: true, unlockedItems: [...] }
|
|
|
|
// Get XP progress info
|
|
const xpInfo = AvatarSystem.getXPInfo(avatar);
|
|
// Returns: { level, totalXP, currentLevelXP, xpNeededForLevel, progress }
|
|
```
|
|
|
|
### Game Integration
|
|
|
|
```javascript
|
|
// Export avatar for use in a game
|
|
const gameAvatar = AvatarSystem.exportForGame(avatar, 'FULL_BODY');
|
|
// Returns object with render() and animate() methods
|
|
|
|
// Use in game loop
|
|
gameAvatar.render(ctx, x, y, { animation: 'run', frame: frameNum });
|
|
const animInfo = gameAvatar.getAnimationInfo('run');
|
|
|
|
// Export minimal data for network transmission
|
|
const minimal = AvatarSystem.exportMinimal(avatar);
|
|
|
|
// Import from minimal data
|
|
const fullAvatar = AvatarSystem.importMinimal(minimalData, userId);
|
|
|
|
// Create sprite sheet for performance
|
|
const spriteSheet = AvatarSystem.createSpriteSheet(avatar, 'FULL_BODY', ['idle', 'walk', 'run']);
|
|
// Returns: { canvas, frameWidth, frameHeight, getFrameRect(animId, frame) }
|
|
```
|
|
|
|
### Utility Functions
|
|
|
|
```javascript
|
|
// Clone avatar
|
|
const cloned = AvatarSystem.clone(avatar);
|
|
|
|
// Update base properties
|
|
AvatarSystem.updateBase(avatar, { hair: { style: 'afro', color: '#000000' } });
|
|
|
|
// Validate avatar data
|
|
const isValid = AvatarSystem.validate(avatarData);
|
|
|
|
// Compare avatars
|
|
const areEqual = AvatarSystem.equals(avatar1, avatar2);
|
|
|
|
// Get all customization options
|
|
const options = AvatarSystem.getCustomizationOptions();
|
|
// Returns: { faceShapes, skinTones, eyeShapes, eyeColors, ... }
|
|
|
|
// Check if guest avatar
|
|
const isGuest = AvatarSystem.isGuest(avatar);
|
|
|
|
// Convert guest to registered user
|
|
const userAvatar = AvatarSystem.convertGuestToUser(guestAvatar, newUserId);
|
|
|
|
// Get version info
|
|
const version = AvatarSystem.getVersion();
|
|
```
|
|
|
|
---
|
|
|
|
## Guest Avatars
|
|
|
|
10 pre-defined guest avatars are available for non-logged-in users. Each has a unique appearance:
|
|
|
|
| ID | Name | Skin Tone | Hair Style | Eye Color | Clothing Color |
|
|
|----|------|-----------|------------|-----------|----------------|
|
|
| `guest_1` | Guest Blue | Medium | Short Messy | Blue | `#3498DB` |
|
|
| `guest_2` | Guest Red | Light | Long Straight | Brown | `#E74C3C` |
|
|
| `guest_3` | Guest Green | Tan | Buzz Cut | Dark Brown | `#2ECC71` |
|
|
| `guest_4` | Guest Purple | Fair | Bob | Green | `#9B59B6` |
|
|
| `guest_5` | Guest Orange | Brown | Afro | Amber | `#E67E22` |
|
|
| `guest_6` | Guest Teal | Dark | Dreads | Dark Brown | `#1ABC9C` |
|
|
| `guest_7` | Guest Gray | Light | Undercut | Gray | `#95A5A6` |
|
|
| `guest_8` | Guest Yellow | Medium | Spiky | Hazel | `#F1C40F` |
|
|
| `guest_9` | Guest Navy | Tan | Comb Over | Brown | `#2C3E50` |
|
|
| `guest_10` | Guest Pink | Fair | Pigtails | Light Blue | `#FF69B4` |
|
|
|
|
```javascript
|
|
// Get random guest avatar
|
|
const guest = AvatarSystem.getGuestAvatar();
|
|
|
|
// Or use AvatarData directly
|
|
const guestData = AvatarData.getRandomGuestAvatar();
|
|
```
|
|
|
|
---
|
|
|
|
## XP and Leveling System
|
|
|
|
### XP Per Level Formula
|
|
|
|
```
|
|
XP needed for level N = 100 + (N - 1) * 50
|
|
```
|
|
|
|
| Level | XP Needed | Cumulative XP |
|
|
|-------|-----------|---------------|
|
|
| 1 | 100 | 100 |
|
|
| 2 | 150 | 250 |
|
|
| 3 | 200 | 450 |
|
|
| 5 | 300 | 1,000 |
|
|
| 10 | 550 | 3,500 |
|
|
| 25 | 1,300 | 18,250 |
|
|
| 50 | 2,550 | 68,000 |
|
|
| 75 | 3,800 | 148,500 |
|
|
| 100 | 5,050 | 259,750 |
|
|
|
|
### Unlock Schedule
|
|
|
|
All accessories unlock by reaching specific levels:
|
|
|
|
- **Levels 3-15**: 6 Common items
|
|
- **Levels 18-30**: 8 Uncommon items
|
|
- **Levels 35-48**: 10 Rare items
|
|
- **Levels 50-62**: 8 Epic items
|
|
- **Levels 65-80**: 6 Legendary items
|
|
- **Levels 85-100**: 4 Mythic items
|
|
|
|
---
|
|
|
|
## Accessory Animation Rules
|
|
|
|
Accessories follow specific animation behavior:
|
|
|
|
```javascript
|
|
{
|
|
headwear: {
|
|
followHead: true, // Moves with head
|
|
bounceMultiplier: 1.2, // Extra bounce on jumps
|
|
rotationDamping: 0.8 // Slightly less rotation than head
|
|
},
|
|
eyewear: {
|
|
followHead: true, // Moves with head
|
|
bounceMultiplier: 1.0, // Same bounce as head
|
|
rotationDamping: 1.0 // Matches head rotation exactly
|
|
},
|
|
effects: {
|
|
independent: true, // Own animation cycle
|
|
particleSpeed: 1.0 // Particle emission rate
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Performance Tips
|
|
|
|
### Sprite Caching
|
|
|
|
For games with many avatars or frequent redraws:
|
|
|
|
```javascript
|
|
// Pre-render to sprite cache
|
|
const cache = AvatarRenderer.createSpriteCache(avatars, 'HEAD_ONLY', 1);
|
|
|
|
// Render from cache (much faster)
|
|
AvatarRenderer.renderFromCache(ctx, cache, avatarId, x, y);
|
|
```
|
|
|
|
### Sprite Sheets
|
|
|
|
For animation-heavy games:
|
|
|
|
```javascript
|
|
const sheet = AvatarSystem.createSpriteSheet(avatar, 'FULL_BODY', ['idle', 'walk', 'run', 'jump']);
|
|
|
|
// In game loop
|
|
const rect = sheet.getFrameRect('walk', currentFrame);
|
|
ctx.drawImage(sheet.image, rect.x, rect.y, rect.width, rect.height, destX, destY, rect.width, rect.height);
|
|
```
|
|
|
|
### Batch Rendering
|
|
|
|
For many avatars on screen:
|
|
|
|
```javascript
|
|
AvatarRenderer.renderBatch(ctx, avatars, 'HEAD_ONLY', positions);
|
|
// Automatically skips off-screen avatars
|
|
```
|
|
|
|
---
|
|
|
|
## File Dependencies
|
|
|
|
Load order matters. Include scripts in this order:
|
|
|
|
```html
|
|
<script src="/assets/avatar/avatarData.js"></script>
|
|
<script src="/assets/avatar/animations.js"></script>
|
|
<script src="/assets/avatar/avatarRenderer.js"></script>
|
|
<script src="/assets/avatar/accessories.js"></script>
|
|
<script src="/assets/avatar/accessoryRenderer.js"></script>
|
|
<script src="/assets/avatar/avatarSystem.js"></script>
|
|
```
|
|
|
|
Or use the asset manager which handles loading automatically.
|