paper-dynasty-card-creation/docs/CUSTOM_CARD_TIERS.md
Cal Corum 1de8b1db2f Add custom card profiles, S3 upload with timestamp cache-busting, and CLI enhancements
- Add Sippie Swartzel custom batter profile (0.820 OPS, SS/RF, no HR power)
- Update Kalin Young profile (0.891 OPS, All-Star rarity)
- Update Admiral Ball Traits profile with innings field
- Fix S3 cache-busting to include Unix timestamp for same-day updates
- Add pd_cards/core/upload.py and scouting.py modules
- Add custom card submission scripts and documentation
- Add uv.lock for dependency tracking
2026-01-25 21:57:35 -06:00

173 lines
5.2 KiB
Markdown

# Custom Card Tier System
Custom cards are rewards earned by Paper Dynasty players. Players earn their initial card and subsequent upgrades through gameplay achievements.
## Progression Path
Cards progress through tiers in this order:
```
Low Starter → Mid Starter → High Starter →
Low All-Star → Mid All-Star → High All-Star →
Low MVP → Mid MVP → High MVP →
Low HoF → Mid HoF → High HoF →
(Legendary tiers follow .x20/.x50/.x80 pattern)
```
## Target OPS by Tier
### Batters
| Tier | Code | Target OPS | Notes |
|------|------|------------|-------|
| Low Starter | L-STR | 0.820 | Entry-level custom card |
| Mid Starter | M-STR | 0.850 | First upgrade |
| High Starter | H-STR | 0.880 | |
| Low All-Star | L-AS | 0.920 | |
| Mid All-Star | M-AS | 0.950 | |
| High All-Star | H-AS | 0.980 | |
| Low MVP | L-MVP | 1.025 | |
| Mid MVP | M-MVP | 1.075 | |
| High MVP | H-MVP | 1.150 | |
| Low Hall of Fame | L-HOF | 1.220 | |
| Mid Hall of Fame | M-HOF | 1.250 | |
| High Hall of Fame | H-HOF | 1.280 | |
| Legendary+ | LEG-1 | 1.320 | Further upgrades follow pattern |
| Legendary++ | LEG-2 | 1.350 | |
| Legendary+++ | LEG-3 | 1.380 | |
**Pattern for Legendary+:** Each subsequent tier adds +0.030 OPS following the .x20/.x50/.x80 pattern.
### Pitchers (OPS Allowed)
Pitchers use inverted logic - lower OPS allowed = better pitcher. **Starting pitchers and relievers have separate progressions** - relievers are held to a higher standard (lower OPS) at each tier.
#### Starting Pitchers
| Tier | Code | Target OPS | Notes |
|------|------|------------|-------|
| Low Starter | L-STR | 0.580 | Entry-level custom card |
| Mid Starter | M-STR | 0.560 | |
| High Starter | H-STR | 0.540 | |
| Low All-Star | L-AS | 0.520 | |
| Mid All-Star | M-AS | 0.500 | |
| High All-Star | H-AS | 0.485 | |
| Low MVP | L-MVP | 0.460 | |
| Mid MVP | M-MVP | 0.435 | |
| High MVP | H-MVP | 0.410 | |
| Low Hall of Fame | L-HOF | 0.390 | |
| Mid Hall of Fame | M-HOF | 0.370 | |
| High Hall of Fame | H-HOF | 0.350 | |
**Beyond H-HOF:** Decrease OPS by 0.015 per upgrade (0.335 → 0.320 → 0.305...)
#### Relief Pitchers
| Tier | Code | Target OPS | Notes |
|------|------|------------|-------|
| Low Starter | L-STR | 0.540 | Entry-level custom card |
| Mid Starter | M-STR | 0.515 | |
| High Starter | H-STR | 0.490 | |
| Low All-Star | L-AS | 0.465 | |
| Mid All-Star | M-AS | 0.440 | |
| High All-Star | H-AS | 0.415 | |
| Low MVP | L-MVP | 0.380 | |
| Mid MVP | M-MVP | 0.360 | |
| High MVP | H-MVP | 0.340 | |
| Low Hall of Fame | L-HOF | 0.320 | |
| Mid Hall of Fame | M-HOF | 0.300 | |
| High Hall of Fame | H-HOF | 0.280 | |
**Beyond H-HOF:** Decrease OPS by 0.020 per upgrade (0.260 → 0.240 → 0.220...)
## YAML Profile Schema
Each custom card profile should include tier tracking:
```yaml
name: Player Name
player_type: batter # or pitcher
pitcher_role: starter # starter or reliever (pitchers only)
hand: R
# Tier tracking
tier: H-STR # Current tier code
tier_history: # Upgrade history
- tier: L-STR
date: 2025-01-15
reason: Initial card creation
- tier: M-STR
date: 2025-03-20
reason: Season 5 championship reward
- tier: H-STR
date: 2025-06-10
reason: MVP award
target_ops: 0.880 # Should match tier target (use SP or RP table for pitchers)
cardset_id: 29
player_id: 12345
batting_card_id: 6789 # or pitching_card_id for pitchers
# ... rest of profile
```
## Upgrade Process
When upgrading a card:
1. **Identify current tier** from profile
2. **Determine next tier** from progression path
3. **Calculate OPS delta** needed (next_target - current_target)
4. **Distribute delta** across ratings:
- Increase positive outcomes (hits, walks)
- Decrease negative outcomes (strikeouts, outs)
- Maintain player's characteristic style (spray charts, power/contact balance)
5. **Update profile**:
- Set new `tier` code
- Update `target_ops` to new tier target
- Add entry to `tier_history`
- Update `ratings` with new values
6. **Submit to database** via `pd-cards custom submit`
## CLI Commands
```bash
# Preview current tier status
pd-cards custom preview kalin_young
# Upgrade a player to next tier
pd-cards custom upgrade kalin_young --reason "Season 6 reward"
# Upgrade to specific tier
pd-cards custom upgrade kalin_young --to-tier M-AS --reason "Special event"
# List all players by tier
pd-cards custom list --by-tier
```
## OPS Calculation Reference
For batters, Combined OPS uses the formula:
```
combined_ops = (ops_vL + ops_vR + min(ops_vL, ops_vR)) / 3
```
For pitchers (OPS allowed):
```
combined_ops = (ops_vL + ops_vR + max(ops_vL, ops_vR)) / 3
```
This weights the weaker split more heavily for batters (penalizes platoon weaknesses) and the stronger split for pitchers (rewards same-side dominance).
## Maintaining Player Identity
When upgrading, preserve the player's characteristic profile:
- **Power hitters**: Increase HR/XBH proportionally
- **Contact hitters**: Increase singles, reduce strikeouts
- **Patient hitters**: Increase walks
- **Speedsters**: Improve baserunning stats alongside OPS
- **Defensive specialists**: May upgrade defense alongside OPS
Avoid creating "generic good players" - each upgrade should feel like a natural evolution of the player's established style.