diff --git a/frontend/textbooks/algebra_9_ch3.html b/frontend/textbooks/algebra_9_ch3.html
index c77bb51..99f1252 100644
--- a/frontend/textbooks/algebra_9_ch3.html
+++ b/frontend/textbooks/algebra_9_ch3.html
@@ -1741,21 +1741,204 @@ function buildP13(){
}
function buildFinal3(){
- const root = document.getElementById('final3-body');
- root.innerHTML = `
-
- `;
+
+ /* Часть Б — 5 боссов */
+ html += `
+
+
+
5 интегрированных задач. Каждая комбинирует несколько тем главы 3. За каждого побеждённого босса — +10 XP . Победишь всех — +50 XP бонус и ачивка «Мастер дробно-рациональных»!
+
+
`;
+
+ html += '
';
+
+ html += `
+
Прогресс по боссам
+
0 / 5 боссов побеждено
+
+
+
Мастер дробно-рациональных
+
Глава 3 пройдена! Все 5 боссов повержены. +50 XP бонус.
+
Дальше: Глава 4
+
+
`;
+
+ html += secNav('p13', null);
+
+ box.innerHTML = html;
+ renderMath(box);
+
+ /* Боссы */
+ const BOSSES = [
+ {
+ n:1, color:'#10b981',
+ title:'Циклоп Уравнений',
+ tag:'§ 10 + § 13',
+ q:'Реши уравнение $\\dfrac{x^2 - 9}{x - 3} = 0$. Сколько корней у уравнения?',
+ ans:1,
+ hint:'$x^2 - 9 = 0 \\Rightarrow x = \\pm 3$. ОДЗ: $x \\ne 3$. Значит $x = 3$ — посторонний. Остаётся $x = -3$. Итого:
1 корень .'
+ },
+ {
+ n:2, color:'#0891b2',
+ title:'Гарпия Систем',
+ tag:'§ 11 + § 12',
+ q:'Сколько решений у системы $\\begin{cases} x^2 + y^2 = 25 \\\\ y = x + 1 \\end{cases}$?',
+ ans:2,
+ hint:'Подставим: $x^2 + (x+1)^2 = 25 \\Rightarrow 2x^2 + 2x - 24 = 0 \\Rightarrow x^2 + x - 12 = 0 \\Rightarrow x = 3$ или $x = -4$.
2 решения .'
+ },
+ {
+ n:3, color:'#7c3aed',
+ title:'Сирена Окружности',
+ tag:'§ 12 + основы',
+ q:'Найди радиус $R$ окружности $x^2 + y^2 - 6x + 4y - 12 = 0$.',
+ ans:5,
+ hint:'Выделим полные квадраты: $(x-3)^2 + (y+2)^2 = 12 + 9 + 4 = 25 \\Rightarrow R^2 = 25 \\Rightarrow R = 5$.'
+ },
+ {
+ n:4, color:'#dc2626',
+ title:'Минотавр Интервалов',
+ tag:'§ 13 + § 10',
+ q:'Реши $\\dfrac{x(x-4)}{x+2} \\ge 0$. Сколько
целых значений $x$ из отрезка $[-5;\\ 5]$ удовлетворяют неравенству?',
+ ans:4,
+ hint:'Корни числителя $0, 4$ (закрашены), корень знаменателя $-2$ (выколота). Знак справа $(x=10)$: $+$. Чередование: $-, +, -, +$. Решение: $(-2;\\ 0] \\cup [4;\\ +\\infty)$. Целые в $[-5;5]$: $\\{-1, 0, 4, 5\\}$ —
4 значения .'
+ },
+ {
+ n:5, color:'#f59e0b',
+ title:'Мастер Глубин',
+ tag:'§§ 10–13 — синтез',
+ q:'Сколько решений у системы $\\begin{cases} (x-1)^2 + (y-2)^2 = 25 \\\\ y = x + 1 \\end{cases}$?',
+ ans:2,
+ hint:'Подставим $y = x + 1$: $(x-1)^2 + (x-1)^2 = 25 \\Rightarrow 2(x-1)^2 = 25 \\Rightarrow (x-1)^2 = 12{,}5$. Корней
2 (квадратное с $D > 0$).'
+ },
+ ];
+
+ const cont = document.getElementById('ch3-bosses-container');
+ const STATE_KEY = 'algebra9_ch3_bosses';
+ const BOSS_STATE = (function(){
+ try{ const s = localStorage.getItem(STATE_KEY); if(s) return JSON.parse(s); }catch(e){}
+ return BOSSES.map(()=>({defeated:false}));
+ })();
+ function saveBosses(){ try{ localStorage.setItem(STATE_KEY, JSON.stringify(BOSS_STATE)); }catch(e){} }
+
+ cont.innerHTML = BOSSES.map((b, idx)=>{
+ return '
'
+ +'
'
+ +'
'
+ +'
Босс '+b.n+': '+b.title+'
'
+ +'
'+b.tag+'
'
+ +'
'
+ +'
'+b.q+'
'
+ +'
'
+ +'ответ = '
+ +' '
+ +'Атаковать '
+ +'Подсказка '
+ +'
'
+ +'
'
+ +'
';
+ }).join('');
+ renderMath(cont);
+
+ function refreshOverall(){
+ const won = BOSS_STATE.filter(s => s.defeated).length;
+ const txt = document.getElementById('ch3-boss-overall');
+ const fill = document.getElementById('ch3-boss-overall-fill');
+ if(txt) txt.textContent = won + ' / ' + BOSSES.length + ' боссов побеждено';
+ if(fill) fill.style.width = (won * 100 / BOSSES.length) + '%';
+ if(won >= BOSSES.length){
+ const reward = document.getElementById('ch3-final-reward');
+ if(reward && reward.style.display === 'none'){
+ reward.style.display = 'block';
+ if(!STATE.achievements.has('ch3_done')){
+ achievement('ch3_done','Мастер дробно-рациональных');
+ addXp(50, 'ch3-bonus');
+ bumpProgress('final3', 30);
+ if(window.confetti){ try{ confetti(); }catch(e){} }
+ }
+ }
+ }
+ }
+
+ BOSSES.forEach((b, idx)=>{
+ const card = document.getElementById('boss3-'+b.n+'-card');
+ const goBtn = document.getElementById('boss3-'+b.n+'-go');
+ const hintBtn = document.getElementById('boss3-'+b.n+'-hint');
+ const ansInp = document.getElementById('boss3-'+b.n+'-ans');
+ if(BOSS_STATE[idx].defeated){
+ card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ ansInp.disabled = true;
+ }
+ goBtn.addEventListener('click', ()=>{
+ if(BOSS_STATE[idx].defeated) return;
+ const fb = document.getElementById('boss3-'+b.n+'-fb');
+ const val = parseInt(ansInp.value, 10);
+ if(isNaN(val)){ feedback(fb, false, '✗ Введи целое число.'); return; }
+ if(val === b.ans){
+ BOSS_STATE[idx].defeated = true; saveBosses();
+ feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint);
+ addXp(10, 'boss-ch3-'+b.n);
+ bumpProgress('final3', 18);
+ goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
+ ansInp.disabled = true;
+ card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
+ refreshOverall();
+ } else {
+ feedback(fb, false, '✗ Промах. Попробуй ещё. Подсказка доступна.');
+ }
+ });
+ hintBtn.addEventListener('click', ()=>{
+ const fb = document.getElementById('boss3-'+b.n+'-fb');
+ fb.className = 'feedback ok';
+ fb.innerHTML = '
Подсказка: '+b.hint;
+ fb.style.display = 'block';
+ fb.style.background = 'var(--warn-bg)';
+ fb.style.color = '#92400e';
+ fb.style.borderLeftColor = 'var(--warn)';
+ renderMath(fb);
+ });
+ ansInp.addEventListener('keydown', e=>{ if(e.key === 'Enter') goBtn.click(); });
+ });
+
+ refreshOverall();
}
/* ===== Search ===== */