# فاز ۱۲ — داستان‌های بیشتر (۳۴ در ۵ زبان) + شمارنده‌ی قصه‌های خوانده‌شده در اتاق جوایز

**نسخه: 1.8.0** · تاریخ: 1404/07/03 (2026-09-25)
درخواست کاربر: «داستان‌های بیشتر + نمایش شمارنده‌ی قصه‌های خوانده‌شده در اتاق جوایز»

---

## ۱. چه چیزی اضافه شد و چرا

دو مشکل فاز ۱۱:

1. **کمبود محتوا**: در پک‌های en/nl/ar/tr فقط ۲ داستان بود — یعنی نشانِ
   «قصه‌خوان» (آستانه‌ی ۵ خواندن) در این زبان‌ها **غیرقابل‌کسب** بود.
2. **گشایش دیرهنگام**: اولین داستانِ پک‌های لاتین از حروف انتهای الفبا استفاده
   می‌کرد (مثلاً en از t/s در «The cat…» با ترتیب ۱۹-۲۰ از ۲۶) — کودکی که
   نیمه‌ی راه را رفته بود هنوز هیچ داستانی نداشت.

راه‌حل: ۲۳ داستان جدید (۱۱ → **۳۴**) + در هر پک یک داستانِ **زودگشایش** که فقط
با «نیمه‌ی اول الفبا + تسلط حروف کانونی همان داستان» باز می‌شود.

## ۲. نردبان سختی — وضعیت نهایی هر پک (مرتب با maxOrderUsed)

| پک | تعداد | نردبان (نام داستان ← بیشینه‌ی ترتیب حروف استفاده‌شده) |
|---|---|---|
| fa | **۶** | تابِ بابا(۱۵) < تاجِ دَجاج(۱۶) < سیبِ شیر(۳۲) < موزِ ماما(۳۲) < کلاغِ گرسنه(۳۲) < هندوانه‌ی هُدهُد(۳۲) |
| en | **۷** | I like cake(۱۳) < The cat with a cap(۲۰) < Ben has a ball(۲۱) < Dino the dog(۲۱) < Sam sees an apple(۲۳) < The fast fish(۲۳) < The yellow yak(۲۵) |
| nl | **۷** | Kim en de hen(۱۴) < De banaan van Bo(۲۰) < Muis eet kaas(۲۱) < Kees en de koe(۲۱) < Het ei van de vogel(۲۳) < De vis zwemt(۲۶) < De zak van Zus(۲۶) |
| ar | **۷** | تُفّاحُ بابا(۲۳) < مَوز ماما(۲۸) < السَمَك الصَغير(۲۸) < بَطَّة تَسبَح(۲۸) < جَمَلُ جَدّي(۲۸) < قِطّي يَلعَب(۲۸) < نَحلةٌ و زَهرَة(۲۸) |
| tr | **۷** | Ali ve kalem(۱۶) < Kedi süt içer(۲۷) < Balık ve balon(۲۸) < Şekerli kurabiye(۲۸) < Elifin kalemi(۲۹) < Ördek gölde(۲۹) < Zürafa zıplar(۲۹) |

**داستان‌های زودگشایشِ جدید** (نیمه‌ی اول الفبا — طراحی‌شده، نه اتفاقی):

- **fa — «تاجِ دَجاج»**: فقط حروف ≤۱۶ (دجاج/تاج/سَرخ/شاد/جَست) — کانونی: ج، د
- **en — «I like cake»**: فقط a..m («I make a cake. A big cake! I like cake.») — کانونی: K
- **nl — «Kim en de hen»**: بدون t/o/v/z («Kijk! Een hen. De hen kan een ei leggen.») — کانونی: K، H
- **ar — «تُفّاحُ بابا»**: بدون حروف ۲۴-۲۸ جز لِ فعل‌ها («بابا أَكَلَ تُفّاحاً. بابا فَرِحَ. بابا شَكَرَ.») — کانونی: ب
- **tr — «Ali ve kalem»**: فقط حروف ≤۱۶ («Ali bak! Ali kalem aldı. Ali elma aldı.») — کانونی: L

> نکته‌ی زبان‌شناسی: در انگلیسی/هلندی حروف پرکاربرد (t، s، r، n، o) در **انتهای**
> الفبا و در عربی «ال/ل» و م/ن/و/ه/ی در انتهای آن‌اند — برای همین سقفِ عربی (۲۳)
> و انگلیسی-هلندی (۱۳-۱۴ با حذف عامدانه‌ی آن حروف) به‌دست آمد، نه عددی دلخواه.

همه‌ی جمله‌ها با همان پارسر فاز ۱۰ (`parseWordText` با `min:1`، واریانت‌های
آ↔ا، ة↔ت، حرکت‌ها، ترکی‌آگاهی I→ı/İ→i) راستی‌آزمایی می‌شوند — ۳۴/۳۴ معتبر.

## ۳. شمارنده‌ی «قصه‌های خوانده‌شده» در اتاق جوایز

`roomScreen` حالا async است و کنار «کل ستاره‌ها» و «حروفِ کشف‌شده»:

```
📖 قصه‌های خوانده‌شده: ۱ / ۶
[████░░░░░░░░░░]  ← نوار پیشرفت (room-progress)
```

- **منطق خالص و تست‌شده**: `Stories.readStats(stories, storyReads)` → `{read, total}` —
  فقط خواندنِ داستان‌های «موجود» شمرده می‌شود (اگر روزی داستانی از داده حذف شود،
  خوانده‌ی قدیمی‌اش شمارنده را جلو نمی‌زند؛ read ≤ total همیشه).
- best-effort: اگر فایل داستان‌ها نیامد (آفلاین/۴۰۴)، ردیف مخفی می‌ماند و اتاق
  جوایز مثل قبل کار می‌کند.
- دسترس‌پذیر: `role="progressbar"` با `aria-valuenow/min/max`.
- i18n: `room.storiesRead` در هر ۵ زبان (قصه‌های خوانده‌شده · Stories read ·
  Gelezen verhaaltjes · القِصَصُ المَقروءَة · Okunan masallar).

## ۴. ماژول‌های تغییر‌یافته

| فایل | تغییر |
|---|---|
| `client/data/stories/{fa,en,nl,ar,tr}.json` | ۱۱ → ۳۴ داستان (نسخه‌ی داده 1.1.0) |
| `client/js/core/stories.js` | + `readStats(stories, storyReads)` — خالص |
| `client/js/ui/screens/roomScreen.js` | async + شمارنده + نوار پیشرفت |
| `client/assets/css/components.css` | `.room-stories` / `.room-progress` / `.room-progress-fill` |
| `client/data/i18n/ui-*.json` ×۵ | + `room.storiesRead` |
| `tests/story.test.js` | +۳ تست (شمار دقیق، نردبان زودگشایش، readStats) |

## ۵. تست‌ها

- **واحد story.test.js: ۱۷/۱۷** — از جمله:
  - «هر پک ≥ آستانه‌ی نشانِ ۵تایی» (fa:۶ · بقیه:۷ = ۳۴ کل)
  - «اولین داستان هر پک زودگشایش است» (fa≤۱۵ · en≤۱۳ · nl≤۱۴ · ar≤۲۳ · tr≤۱۶)
  - readStats: تقاطع با موجودها، بدون دوباره‌شماری، ورودی تهی
- **E2E اپ (استپ جدید)**: بعد از خواندن «تابِ بابا» → اتاق جوایز →
  «۱ / ۶» دیده می‌شود + عرض نوار > 0 — **22/22**
- e2e-packs **6/6** · e2e-admin **11/11** · مجموع واحد **178/178**

## ۶. نکته‌ی داده

فایل‌های داستان با اسکریپتِ موقت merge شدند (نه دستی) و بعد از هر merge،
`Stories.validate` روی هر ۵ پک اجرا شد — جمله‌های جدید فقط وقتی پذیرفته شدند
که با حروف همان پک تجزیه می‌شدند (مثلاً «Zoë» در nl رد شد: ë جزو الفبا نیست).
