feat: comedy overhaul start, profile page, bot setup docs, auth improvements
Rewrites announcer commentary (HYPE_LINES, DEEP_INTROS, ROUND_HYPE) with modern edgy humor. Adds BOT_SETUP.md, bot SDK, customization engine, profile page character display, persistent auth, rate limit tweaks. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
4a35e1e0b5
commit
559782c8ce
@@ -9,9 +9,18 @@ export { getBotColors } from './palette'
|
||||
export { generateJudgeSpriteSheet, JUDGE_ANIMATIONS, JUDGE_MAX_FRAMES, JUDGE_ROWS } from './judge'
|
||||
export { archetypes, rollArchetype } from './archetypes'
|
||||
|
||||
export interface SpriteCustomization {
|
||||
archetype?: string
|
||||
primaryColor?: string // hsl(h, s%, l%) format
|
||||
secondaryColor?: string // hsl(h, s%, l%) format
|
||||
forceVisor?: boolean
|
||||
forceMohawk?: boolean
|
||||
forceHorns?: boolean
|
||||
}
|
||||
|
||||
export function generateSpriteSheet(
|
||||
seed: string, tier: number, primaryColor: string, secondaryColor: string,
|
||||
archetypeOverride?: string,
|
||||
archetypeOverride?: string, customization?: SpriteCustomization,
|
||||
): string {
|
||||
const canvas = document.createElement('canvas')
|
||||
canvas.width = FRAME_SIZE * MAX_FRAMES
|
||||
@@ -19,7 +28,10 @@ export function generateSpriteSheet(
|
||||
const ctx = canvas.getContext('2d')!
|
||||
ctx.imageSmoothingEnabled = false
|
||||
|
||||
const pal = makePal(primaryColor, secondaryColor, tier)
|
||||
// Apply color customization overrides
|
||||
const finalPrimary = customization?.primaryColor || primaryColor
|
||||
const finalSecondary = customization?.secondaryColor || secondaryColor
|
||||
const pal = makePal(finalPrimary, finalSecondary, tier)
|
||||
|
||||
let sh = 0
|
||||
for (let i = 0; i < seed.length; i++) sh = ((sh << 5) - sh + seed.charCodeAt(i)) | 0
|
||||
@@ -28,8 +40,9 @@ export function generateSpriteSheet(
|
||||
|
||||
// Character archetype -- determined by seed for consistent variety, or forced by override
|
||||
const archetypeRoll = rng()
|
||||
const arch = archetypeOverride
|
||||
? (archetypes.find(a => a.name === archetypeOverride) || rollArchetype(archetypeRoll))
|
||||
const effectiveArchetype = customization?.archetype || archetypeOverride
|
||||
const arch = effectiveArchetype
|
||||
? (archetypes.find(a => a.name === effectiveArchetype) || rollArchetype(archetypeRoll))
|
||||
: rollArchetype(archetypeRoll)
|
||||
|
||||
// Consume rng in same order as original for determinism
|
||||
@@ -38,9 +51,9 @@ export function generateSpriteSheet(
|
||||
const hornsRoll = rng()
|
||||
const specialRoll = rng()
|
||||
|
||||
const hasVisor = visorRoll > 0.5 && tier >= 2 && (arch.canHaveVisor ?? false)
|
||||
const hasMohawk = mohawkRoll > 0.5 && tier >= 3 && (arch.canHaveMohawk ?? true)
|
||||
const hasHorns = hornsRoll > 0.6 && tier >= 4 && !hasMohawk && (arch.canHaveHorns ?? true)
|
||||
const hasVisor = customization?.forceVisor ?? (visorRoll > 0.5 && tier >= 2 && (arch.canHaveVisor ?? false))
|
||||
const hasMohawk = customization?.forceMohawk ?? (mohawkRoll > 0.5 && tier >= 3 && (arch.canHaveMohawk ?? true))
|
||||
const hasHorns = customization?.forceHorns ?? (hornsRoll > 0.6 && tier >= 4 && !hasMohawk && (arch.canHaveHorns ?? true))
|
||||
const specialType: 'fire' | 'electric' = specialRoll > 0.5 ? 'fire' : 'electric'
|
||||
|
||||
// Dimensions: base + archetype overrides
|
||||
|
||||
Reference in New Issue
Block a user