refactor: reorganize Harmony and Victory guide sections

Eliminated duplication between Harmony and Victory tabs:

**Harmony Tab** (focus: what ARE harmonies and how to FORM them):
- Renamed title to "Mathematical Progressions" (clearer focus)
- Updated intro to focus on patterns, not winning
- Removed "Important Rules" section (moved to Victory)
- Kept: 3 harmony types, formation strategies, quick reference

**Victory Tab** (focus: how to WIN):
- Expanded harmony victory section with placement requirements:
  - Must be in enemy territory
  - Must be in straight line
  - Must be adjacent/touching
  - Must form progression
  - Must survive one turn
- Added reference to Harmony tab for progression details
- Kept: Exhaustion victory, strategy tips

Benefits:
- Clear separation of concerns
- No duplication
- Better learning flow
- Matches SPEC.md simplified rules

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock
2025-11-02 19:38:06 -06:00
parent 399c027003
commit fb629c44ea
4 changed files with 97 additions and 84 deletions

View File

@@ -142,7 +142,10 @@
"Bash(__NEW_LINE__ sed -n '68,73p' CaptureSection.tsx.bak)",
"WebFetch(domain:hub.docker.com)",
"Bash(gcloud auth:*)",
"Bash(gcloud config list:*)"
"Bash(gcloud config list:*)",
"WebFetch(domain:www.boardspace.net)",
"WebFetch(domain:www.gamecabinet.com)",
"WebFetch(domain:en.wikipedia.org)"
],
"deny": [],
"ask": []

View File

@@ -343,38 +343,6 @@ export function HarmonySection({ useNativeAbacusNumbers }: { useNativeAbacusNumb
</div>
</div>
{/* Rules Section */}
<div
className={css({
mt: '24px',
p: '16px',
bg: 'rgba(239, 68, 68, 0.1)',
borderLeft: '4px solid #ef4444',
borderRadius: '4px',
})}
>
<p className={css({ fontSize: '16px', fontWeight: 'bold', color: '#991b1b', mb: '12px' })}>
{t('harmony.rulesTitle')}
</p>
<ul className={css({ fontSize: '14px', color: '#7f1d1d', lineHeight: '1.8', pl: '20px' })}>
<li>
<strong>{t('harmony.enemyTerritoryTitle')}</strong> {t('harmony.enemyTerritory')}
</li>
<li>
<strong>{t('harmony.straightLineTitle')}</strong> {t('harmony.straightLine')}
</li>
<li>
<strong>{t('harmony.adjacentTitle')}</strong> {t('harmony.adjacent')}
</li>
<li>
<strong>{t('harmony.survivalTitle')}</strong> {t('harmony.survival')}
</li>
<li>
<strong>{t('harmony.victoryTitle')}</strong> {t('harmony.victoryRule')}
</li>
</ul>
</div>
{/* Strategy Section */}
<div className={css({ mt: '24px' })}>
<h3

View File

@@ -58,10 +58,51 @@ export function VictorySection({ useNativeAbacusNumbers }: { useNativeAbacusNumb
<span>👑</span>
<span>{t('victory.harmony')}</span>
</h4>
<p className={css({ fontSize: '15px', lineHeight: '1.6', color: '#374151', mb: '12px' })}>
<p className={css({ fontSize: '15px', lineHeight: '1.6', color: '#374151', mb: '16px' })}>
{t('victory.harmonyDesc')}
</p>
{/* Requirements Section */}
<div
className={css({
mb: '16px',
p: '16px',
bg: 'rgba(251, 191, 36, 0.1)',
borderLeft: '4px solid #f59e0b',
borderRadius: '4px',
})}
>
<p
className={css({
fontSize: '16px',
fontWeight: 'bold',
color: '#92400e',
mb: '12px',
})}
>
{t('victory.requirementsTitle')}
</p>
<ul
className={css({ fontSize: '14px', color: '#78350f', lineHeight: '1.8', pl: '20px' })}
>
<li>
<strong>{t('victory.enemyTerritoryTitle')}</strong> {t('victory.enemyTerritory')}
</li>
<li>
<strong>{t('victory.straightLineTitle')}</strong> {t('victory.straightLine')}
</li>
<li>
<strong>{t('victory.adjacentTitle')}</strong> {t('victory.adjacent')}
</li>
<li>
<strong>{t('victory.progressionTitle')}</strong> {t('victory.progression')}
</li>
<li>
<strong>{t('victory.survivalTitle')}</strong> {t('victory.survival')}
</li>
</ul>
</div>
{/* Visual example of winning harmony */}
<div
className={css({
@@ -109,13 +150,13 @@ export function VictorySection({ useNativeAbacusNumbers }: { useNativeAbacusNumb
<div
className={css({
p: '12px',
bg: '#f0fdf4',
bg: '#dbeafe',
borderRadius: '6px',
border: '1px solid #86efac',
border: '1px solid #93c5fd',
})}
>
<p className={css({ fontSize: '13px', color: '#15803d' })}>
{t('victory.harmonyNote')}
<p className={css({ fontSize: '13px', color: '#1e40af' })}>
💡 {t('victory.harmonyNote')}
</p>
</div>
</div>
@@ -141,31 +182,32 @@ export function VictorySection({ useNativeAbacusNumbers }: { useNativeAbacusNumb
</div>
</div>
<h3
className={css({
fontSize: { base: '18px', md: '20px' },
fontWeight: 'bold',
color: '#7c2d12',
mb: '12px',
mt: '32px',
})}
>
{t('victory.strategyTitle')}
</h3>
<ul
className={css({
fontSize: '14px',
lineHeight: '1.8',
pl: '20px',
color: '#374151',
})}
>
<li>{t('victory.tip1')}</li>
<li>{t('victory.tip2')}</li>
<li>{t('victory.tip3')}</li>
<li>{t('victory.tip4')}</li>
<li>{t('victory.tip5')}</li>
</ul>
<div className={css({ mt: '32px' })}>
<h3
className={css({
fontSize: { base: '18px', md: '20px' },
fontWeight: 'bold',
color: '#7c2d12',
mb: '12px',
})}
>
{t('victory.strategyTitle')}
</h3>
<ul
className={css({
fontSize: '14px',
lineHeight: '1.8',
pl: '20px',
color: '#374151',
})}
>
<li>{t('victory.tip1')}</li>
<li>{t('victory.tip2')}</li>
<li>{t('victory.tip3')}</li>
<li>{t('victory.tip4')}</li>
<li>{t('victory.tip5')}</li>
</ul>
</div>
</div>
)
}

View File

@@ -178,24 +178,24 @@
"pyramidEx3Note": "<strong>Face selection:</strong> Black chooses face 36 → 36 ÷ 9 = 4 (multiple) → Capture succeeds! Note: Black could also use face 4 with a helper 5 for sum (4 + 5 = 9), showing multiple valid approaches."
},
"harmony": {
"title": "Harmonies: The Coolest Way to Win",
"intro": "A Harmony is how you win the game. Get 3 of your pieces into enemy territory in a straight line. Their values must form a mathematical pattern.",
"title": "Harmonies: Mathematical Progressions",
"intro": "A Harmony is a special arrangement of 3 pieces whose values form a mathematical pattern.",
"introDetail": "Think of it like a number sequence. There are 3 types of patterns you can make:",
"arithmetic": "1. Arithmetic (Easiest)",
"arithmeticDesc": "The middle number is exactly between the other two. Equal spacing.",
"arithmeticFormula": "Middle × 2 = First + Last",
"arithmeticTip": "Small circles (2-9) work great here. Look for equal gaps! Example: 6, 9, 12",
"arithmeticCaption": "White pieces 6, 9, 12 in a row in enemy territory form an arithmetic progression",
"arithmeticCaption": "White pieces 6, 9, 12 in a row form an arithmetic progression",
"geometric": "2. Geometric (Multiply by Same Number)",
"geometricDesc": "Multiply by the same number each time. Equal ratios.",
"geometricFormula": "Middle² = First × Last",
"geometricTip": "Square numbers work great! Example: 4, 8, 16 (multiply by 2 each time)",
"geometricCaption": "White pieces 4, 8, 16 in a row in enemy territory form a geometric progression",
"geometricCaption": "White pieces 4, 8, 16 in a row form a geometric progression",
"harmonic": "3. Harmonic (Tricky!)",
"harmonicDesc": "Based on musical harmonies. Hardest to spot.",
"harmonicFormula": "2 × First × Last = Middle × (First + Last)",
"harmonicTip": "These are rare. Just memorize these combos: 3-4-6, 4-6-12, 6-8-12, 6-10-15",
"harmonicCaption": "White pieces 6, 8, 12 in a row in enemy territory form a harmonic progression",
"harmonicCaption": "White pieces 6, 8, 12 in a row form a harmonic progression",
"howToCheck": "How to check:",
"example": "Example:",
"check": "Check:",
@@ -203,18 +203,7 @@
"equal": "(equal!)",
"ratios": "Ratios:",
"strategyTip": "Strategy tip:",
"rulesTitle": "⚠️ Important Rules",
"enemyTerritoryTitle": "Must be in enemy territory:",
"enemyTerritory": "All 3 pieces must be on opponent's side (White: rows 5-8, Black: rows 1-4)",
"straightLineTitle": "Must be in a line:",
"straightLine": "Row, column, or diagonal. No scattered pieces!",
"adjacentTitle": "Must be touching:",
"adjacent": "The 3 pieces must be next to each other with no gaps",
"survivalTitle": "Must survive one turn:",
"survival": "After you declare harmony, opponent gets ONE turn to break it",
"victoryTitle": "Then you win:",
"victoryRule": "If it survives, you win on your next turn!",
"strategyTitle": "How to Win with Harmonies",
"strategyTitle": "How to Build Harmonies",
"startWith2Title": "Start with 2, then add the 3rd",
"startWith2": "Get 2 pieces deep first. Figure out which 3rd piece completes the pattern. Then push that piece forward. They might not see it coming!",
"useCommonTitle": "Use common numbers",
@@ -230,13 +219,24 @@
"victory": {
"title": "How to Win",
"harmony": "Victory #1: Harmony (Progression)",
"harmonyDesc": "Form a mathematical progression with 3 pieces in enemy territory. If it survives your opponent's next turn, you win!",
"harmonyDesc": "This is the primary way to win. Form a mathematical progression with 3 of your pieces in enemy territory. If it survives your opponent's next turn, you win!",
"requirementsTitle": "Requirements",
"enemyTerritoryTitle": "Must be in enemy territory:",
"enemyTerritory": "All 3 pieces must be on opponent's side (White: rows 5-8, Black: rows 1-4)",
"straightLineTitle": "Must be in a line:",
"straightLine": "Row, column, or diagonal. No scattered pieces!",
"adjacentTitle": "Must be touching:",
"adjacent": "The 3 pieces must be next to each other with no gaps",
"progressionTitle": "Must form a progression:",
"progression": "Values must form arithmetic, geometric, or harmonic progression (see Harmony tab)",
"survivalTitle": "Must survive one turn:",
"survival": "After you declare harmony, opponent gets ONE turn to break it. If they can't, you win!",
"exampleTitle": "Example: White Wins!",
"exampleCaption": "White pieces 4, 8, 16 form a geometric progression in enemy territory. Black cannot break it - White wins!",
"harmonyNote": "This is the primary victory condition in Rithmomachia",
"exampleCaption": "White pieces 4, 8, 16 form a geometric progression in enemy territory (rows 5-8). Black cannot break it - White wins!",
"harmonyNote": "See the Harmony tab for details on the three types of progressions and how to form them",
"exhaustion": "Victory #2: Exhaustion",
"exhaustionDesc": "If your opponent has no legal moves at the start of their turn, they lose.",
"strategyTitle": "Quick Tips",
"strategyTitle": "Winning Strategies",
"tip1": "Control the center - easier to push forward",
"tip2": "Small pieces are fast - circles can slip into enemy side quickly",
"tip3": "Big pieces are powerful - harder to capture",