- 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
5.2 KiB
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:
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:
- Identify current tier from profile
- Determine next tier from progression path
- Calculate OPS delta needed (next_target - current_target)
- Distribute delta across ratings:
- Increase positive outcomes (hits, walks)
- Decrease negative outcomes (strikeouts, outs)
- Maintain player's characteristic style (spray charts, power/contact balance)
- Update profile:
- Set new
tiercode - Update
target_opsto new tier target - Add entry to
tier_history - Update
ratingswith new values
- Set new
- Submit to database via
pd-cards custom submit
CLI Commands
# 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.