> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwacks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ما الذي يجمعه اختبار اللعب

> الفيديو ونوافذ الأداء والاستثناءات ونماذج الملاحظات من بناء اختبار لعب في Unreal.

لا يعمل أيٌّ مما يلي إلا إذا شغّله الاختبار في Protokite **وسمح به اللاعب**، ولكلٍّ منه عقد Blueprint
آمنة في كل بناء: فمع عدم وجود اختبار لعب قائم تجيب بـfalse أو بفراغ أو بـTurned Off ولا تغيّر شيئًا.
أما إعداد البناء نفسه ففي صفحة [إضافة Unreal](/ar/protokite/unreal-plugin).

<h2 id="what-the-player-allowed">
  ما الذي سمح به اللاعب
</h2>

يسأل البناء لاعبه عمّا يجوز لاختبار اللعب أن يجمعه قبل أن يجمع شيئًا، وإجابته هي التي تقرّر ما تفعله
بقية هذه الصفحة:

| إجابته                            | تسجيل الفيديو | التحليلات الثقيلة والاستثناءات |
| --------------------------------- | ------------- | ------------------------------ |
| سجّلوا شاشتي واجمعوا بيانات اللعب | يعمل          | تعمل                           |
| سجّلوا شاشتي وحدها                | يعمل          | مُطفأة                         |
| اجمعوا بيانات اللعب وحدها         | مُطفأ         | تعمل                           |
| لا تجمعوا شيئًا                   | مُطفأ         | مُطفأة، ولا تبدأ جلسة أصلًا    |

وتجيب **Flock Is Playtest Feature Enabled** عن الأمرين معًا أصلًا: فميزة يشغّلها الاختبار ويستثنيها
اللاعب تُقرأ مُطفأة في كل موضع. وتعطي **Flock Get Playtest Consent** الإجابة نفسها، أما السؤال وكيف
تطرحه لعبتك بشاشاتها والإعداد الذي يوقفه ففي صفحة
[إضافة Unreal](/ar/protokite/unreal-plugin#what-the-player-is-asked).

<Note>
  **ولا يدخل نموذج الملاحظات في تلك الإجابة.** فهو لا يُرسل إلا حين يملؤه اللاعب ويضغط «إرسال»، وذلك
  فعله هو في الحالين — ونموذجٌ تعذّر على تشغيل سابق إرساله يُرسل لاحقًا مهما كانت إجابته بعد ذلك.
</Note>

<h2 id="video-recording">
  تسجيل الفيديو
</h2>

تُسجَّل شاشة اللعبة منذ اللحظة التي يُحمّل فيها الاختبار، بتسجيل واحد لكل تشغيل، في ملف WebM يشغّله
المتصفّح. ولا يُسجَّل الوقت الذي تكون فيه اللعبة في الخلفية. وتضبط إعدادات **Video Recording** في
**Flock Playtest Settings** المقاس ومعدّل الإطارات ومعدّل البتّ — ‏1280×720 و30 إطارًا في الثانية
و**Video Bitrate (kbps)** بقيمة 2000 افتراضيًا — وحدّين أيهما جاء أولًا: **Recording Length Limit
(Minutes)** بقيمة 60، و**Recording Size Limit (MB)** بقيمة 1536.

ويُرفع التسجيل إلى جلسته:

* حين ينهيه حدّ الطول أو حدّ الحجم؛
* حين تطلب اللعبة ذلك، عبر **Flock Stop And Upload Playtest Recording** أو زر **Upload your recording**
  في نموذج الملاحظات؛
* حين توقفه اللعبة نهائيًا، عبر **Flock Stop Video Recording**؛
* وفي بداية تشغيل لاحق، لكل ما لم يستطع تشغيل سابق إرساله: رفع فاشل، أو خروج، أو انهيار.

<Note>
  **الخروج من اللعبة لا يرفع.** فلا يمكن إرسال تسجيل كامل أثناء الإغلاق، ولذلك يُحفظ ويرسله التشغيل
  التالي. ويُحذف التسجيل بعد رفعه، كما يحذف التشغيل التالي تسجيلًا لم تبدأ له جلسة اختبار قط، إذ لا
  سبيل إلى إرساله أبدًا.
</Note>

وتنتظر التسجيلات تحت `Saved/FlockPlaytest/Recordings/`، ضمن **Recordings Disk Budget (MB)** بقيمة 4096. وحين تضيق المساحة تُحذف أقدم مقاطع الاختبار أولًا، وتُحذف التسجيلات المنتظرة للرفع أخيرًا.

ولا تعرض على اللاعب طريقةً لإرسال تسجيله إلا ما دامت **Flock Can Send Playtest Recording** صحيحة. فهي
كاذبة حين لا تكون جلسة قد بدأت للتسجيل، والضغط على زر حينها سيوقف التسجيل ولن يرسل شيئًا. ولتخبر
اللاعب بما جرى، اربط **On Recording Upload Finished**: يُطلق مرة واحدة حين ينتهي تسجيل التشغيل —
مرفوعًا، أو غير مرفوع مع السبب، بما في ذلك تعذّر بدء الرفع من أصله. ولا يُطلق أثناء إغلاق اللعبة.

<h2 id="heavy-analytics">
  التحليلات الثقيلة
</h2>

ترسل الإضافة ما يلي عبر تحليلات حزمة Flock، ضمن فئة `playtest`، وتُقرأ في **Dashboards → Game
Metrics**:

* ‏`performance_window` لكل عشر ثوانٍ من اللعب: وسيط زمن الإطار والنسبتان المئويتان 95 و99 منه،
  والتلعثمات، والذاكرة المستخدَمة وذروتها؛
* ‏`level_loaded` لكل مرحلة يحمّلها نسخة اللعبة هذه، ومعها المرحلة السابقة، ومدة التحميل إن كان
  تحميلًا حاجزًا؛
* وأحداثك أنت، عبر **Flock Record Playtest Event**. وابنِ خصائصها بعقد Set Command.

ولا يُرسل شيء ما دام **Analytics Enabled** في حزمة Flock مُطفأً؛ ويقول السجل ذلك مرة واحدة. وانظر
[التحليلات والأحداث](/ar/guides/analytics-and-events) لتعرف كيف تتكامل الفئة مع لوحات المعلومات.

<h2 id="exceptions">
  الاستثناءات
</h2>

تبقى الاستثناءات من شأن حزمة Flock. فهي تلتقط أسطر الأخطاء، وفشل التحققات، وأخطاء Blueprint مثل
Accessed None، والانهيارات، بإعداداتها هي تحت **Analytics | Exceptions**، وتبلّغ عنها في **Diagnostics
→ Errors**. ولا يشغّل مفتاح الاستثناءات في اختبار اللعب ذلك ولا يطفئه؛ وحين يطلب الاختبار الاستثناءات
ويكون **Analytics Capture Exceptions** مُطفأً، يحذّر السجل مرة واحدة عند بدء الجلسة.

وللتحقّق من وصول الاستثناءات إلى لوحة التحكم، اكتب `Flock.RaiseTestException error` أو
`Flock.RaiseTestException blueprint 100` في طرفية بناء Development. فمئة حالة من العطل نفسه تصل بلاغًا
واحدًا، ثم بلاغ تكرار واحدًا يعدّ التسعة والتسعين الباقية بعد أن تُغلق نافذة التكرار.

<h2 id="the-feedback-form">
  نموذج الملاحظات
</h2>

حين ينشر الاختبار نموذجًا، يفتحه اللاعبون بمفتاح **Feedback Form Key** (‏F9 افتراضيًا؛ واضبطه على none
لتعطيل المفتاح)، أو تفتحه لعبتك عبر **Flock Open Feedback Form** — من قائمة الإيقاف المؤقت مثلًا.
وتحقّق من **Flock Can Open Feedback Form** أولًا: فهي كاذبة حين لا ينشر الاختبار نموذجًا، فتستطيع لعبتك
إخفاء مدخلها الخاص بدل أن تعرض ما لا وجود له.

<Frame caption="نموذج منشور، مبني من اختبار اللعب: كل أسئلته، والزر الذي يرسل التسجيل.">
  <img src="https://mintcdn.com/qwacks/RxrocMaSLzLhfHdV/images/protokite/unreal/feedback-form.png?fit=max&auto=format&n=RxrocMaSLzLhfHdV&q=85&s=32bf7b24d3a02c36176b80a8073ee07c" alt="نموذج ملاحظات فوق اللعبة، فيه تقييم واختيار وإجابات نصية وزر «ارفع تسجيلك»" width="1296" height="759" data-path="images/protokite/unreal/feedback-form.png" />
</Frame>

وما دام النموذج مفتوحًا يظهر المؤشر وتذهب الكتابة إليه؛ وإغلاقه أو إرساله يعيد الأمرين إلى ما كانا
عليه. و**Pause The Game While The Form Is Open** مُطفأ افتراضيًا، لأن الإيقاف المؤقت لا يفعل شيئًا في
لعبة متعددة اللاعبين ويضيّع ما كان لاعب فردي على وشك وصفه.

وكل سؤال يأتي من الاختبار، فتحرير النموذج في Protokite يغيّر ما يراه اللاعبون بلا بناء جديد. وتُفحص
الإجابات قبل إرسالها، مع عرض كل مشكلة عند سؤالها. والنموذج الذي يتعذّر إرساله يُحفظ ويرسله تشغيل لاحق،
وإرساله مرة أخرى في الجلسة نفسها يحلّ محلّ الإجابات السابقة.

<h3 id="a-form-of-your-own">
  نموذج من عندك
</h3>

تسلّم **Flock Get Feedback Form** واجهتك الأسئلة: معرّف كل سؤال ونوعه وعنوانه ونصّه المساعد وخياراته
وهل يحتاج إلى إجابة. وسجّل الإجابات بـ**Set Feedback Text Answer** و**Set Feedback Rating Answer**
(من 1 إلى 5) و**Set Feedback Checkbox Answer** و**Set Feedback Chosen Option**، وافحصها بـ**Find
Feedback Form Problems**، وأرسلها بـ**Flock Send Feedback Form Answers**.

وقارن نوع السؤال بعقد **Flock Feedback Question Kind** بدل كتابته، وعامِل نوعًا لا تعرفه معاملة النص،
فهكذا يقرؤه الخادم.

<Warning>
  قاعدتان يسهل إغفالهما. **اضبط كل مربع اختيار**، مؤشَّرًا كان أو غير مؤشَّر: فالخادم يعدّ المربع غير
  المؤشَّر إجابةً، ومربعًا مطلوبًا لم يُضبط قط يُعدّ ناقصًا. و**الخيار المختار يجب أن يطابق حرفًا
  بحرف** — فالخادم يقارن الخيارات تمامًا، و`crash` ليست `Crash`.
</Warning>

<h2 id="blueprint-nodes">
  عقد Blueprint
</h2>

جميعها تحت **Flock | Playtest**. وكل عقدة تستدلّ على اختبار اللعب من الرسم الذي استدعاها.

| العقدة                                                                                                               | تجيب أو تفعل                                |
| -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- |
| Flock Get Playtest Status وFlock Is Playtest Ready وFlock Describe Playtest Status                                   | هل يجوز تشغيل عمل الاختبار، ولمَ لا         |
| Flock Is Playtest Feature Enabled، مع Flock Playtest Feature Video Recording / Exception Capturing / Heavy Analytics | هل يشغّل الاختبار ميزةً ما                  |
| Flock Get Playtest Consent وFlock Get Players Consent Answer وFlock Describe Playtest Consent                        | ما الذي سمح اللاعب لهذا الاختبار بجمعه      |
| Flock Set Playtest Consent وFlock Ask For Playtest Consent وFlock Is Consent Question Open                           | الإجابة من شاشاتك أنت، وطرح السؤال من جديد  |
| Flock Get Playtest Session Id وFlock End Playtest Session                                                            | جلسة Protokite لهذا التشغيل                 |
| Flock Record Playtest Event                                                                                          | تسجّل حدثًا من أحداث اختبار اللعب الخاصة بك |
| Flock Is Recording Video وFlock Stop Video Recording                                                                 | تسجيل هذا التشغيل                           |
| Flock Can Send Playtest Recording وFlock Stop And Upload Playtest Recording                                          | إرسال التسجيل الآن                          |
| Flock Can Open Feedback Form وFlock Open / Close Feedback Form وFlock Is Feedback Form Open                          | النموذج المدمج                              |
| Flock Get Feedback Form وSet Feedback … Answer وFind Feedback Form Problems وFlock Send Feedback Form Answers        | نموذج من عندك                               |

<h2 id="trying-it-in-the-editor">
  تجريبه في المحرّر
</h2>

**قبل وجود أي اختبار لعب**، أشّر على **Record Video In Play In Editor** في **Project Settings → Plugins
→ Flock Playtest Local Settings** واضغط Play، أو اكتب `FlockPlaytest.RecordTestVideo 30` في طرفية بناء
Development. وتُحفظ مقاطع الاختبار تحت `Saved/FlockPlaytest/Recordings/TestVideos/` ولا تُرفع أبدًا.

**وأمام اختبار لعب حقيقي**، اضغط Play بالإعدادات المذكورة في صفحة الإعداد وسجّل الدخول بـ
`Flock.LoginWithDevice`. ثم، في طرفية بناء Development:

| أمر الطرفية                                                  | يفعل                                                                                                                          |
| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| `FlockPlaytest.AnswerConsent <answer>`                       | يجيب عمّا يجوز جمعه: `video_and_play_data` أو `video_only` أو `play_data_only` أو `nothing`، أو `not_answered` ليُسأل من جديد |
| `FlockPlaytest.OpenFeedbackForm [seconds]`                   | يفتح النموذج، بعد انتظار إن حدّدته                                                                                            |
| `FlockPlaytest.SendTestFeedback [seconds]`                   | يملأ النموذج المنشور ويرسله، للتحقّق من وصول الإجابات إلى Protokite                                                           |
| `FlockPlaytest.StopVideoRecordingAndUploadIt [seconds]`      | يوقف التسجيل ويرفعه                                                                                                           |
| `FlockPlaytest.StopVideoRecording`                           | يوقف التسجيل؛ وكأي تسجيل منتهٍ، يُرفع متى كانت له جلسة                                                                        |
| `Flock.RaiseTestException [error\|blueprint] [times]`        | يثير عطلًا تبلّغ عنه حزمة Flock                                                                                               |
| `FlockPlaytest.SelfTest [closed playtest's Game Version ID]` | يفحص اختبار اللعب كله أمام Protokite                                                                                          |

وأوقات الانتظار موجودة لأن كل أمر في `-ExecCmds` يُنفَّذ في الإطار الأول، قبل أن يكون قد سُجِّل شيء أو
بدأت جلسة.

<h2 id="checking-a-playtest-build">
  فحص بناء اختبار اللعب
</h2>

يفحص `FlockPlaytest.SelfTest` كل ما يفعله بناء اختبار اللعب أمام Protokite الحقيقي دفعةً واحدة، ويسجّل
سطرًا لكل خطوة وعدًّا في النهاية: `Playtest self-test finished: 16 passed, 0 failed, 1 skipped.`
وأبنية Development فقط.

ويقف كل فحص إلى جوار طلب يجب أن يرفضه Protokite: مفتاح واجهة خاطئ، ومفتاح مفقود، وإصدار لا اختبار لعب
مرتبط به، وبدء جلسة لا يسمّي لاعبًا، ونموذج تنقصه إجابة مطلوبة أو يختار خيارًا ليس في القائمة، ونموذج
ورابط رفع ونهاية جلسة لجلسة غير موجودة. فالفحص الذي ينجح دائمًا لا يميّز بناءً سليمًا من بناء معطوب،
ولذلك لا يمرّ الرفض إلا بحالة HTTP الخاصة به، ومع النموذج بالسؤال الذي يسمّيه.

وهو لا يسجّل دخول أحد، فسجّل الدخول أولًا. ومن سكربت:

```
UnrealEditor-Cmd.exe MyGame.uproject -game -windowed -ExecCmds="Flock.LoginWithDevice, FlockPlaytest.SelfTest, Flock.QuitAfterSeconds 90" -log
```

* **ينهي جلسة التشغيل بوصفها خطوته الأخيرة**، فشغّله في تشغيل مستقل. وأي جلسة كان ينبغي لرفضٍ أن يمنعها
  تُنهى فورًا، فلا يترك الفحص شيئًا مفتوحًا.
* **يترك أثرًا في لوحاتك:** نموذجًا مملوءًا على جلسته، وحدث `playtest_self_test` واحدًا، وعطل Blueprint
  واحدًا أُثير مرتين ليُعدّ تكراره، وتسجيل التشغيل.
* **وتُتخطّى خطوة، مع ذكر السبب،** حين لا يكون أحد قد أجاب عمّا يجوز لاختبار اللعب جمعه (أجب أولًا بـ
  `FlockPlaytest.AnswerConsent video_and_play_data`)؛ وحين لا يشغّل الاختبار ميزتها؛ وحين لا يكون في البناء مُرمِّز فيديو،
  وهو كل منصة عدا Windows بنواة 64 بت؛ وحين لا يستطيع التشغيل الرسم (‏`-nullrhi`)، إذ لا يُسجَّل شيء؛
  وحين يكون **Analytics Cache Failed Events** مُطفأً، إذ لا يمكن مراقبة بلاغ يُرسل لحظة إنشائه؛ ولاختبار
  مغلق ما لم تسمِّ واحدًا.

<h2 id="what-stays-on-the-players-machine">
  ما الذي يبقى على جهاز اللاعب
</h2>

| المجلد تحت `Saved/FlockPlaytest/` | يحوي                                                 | حتى                                          |
| --------------------------------- | ---------------------------------------------------- | -------------------------------------------- |
| `Recordings/Playtest/`            | تسجيلات اختبار اللعب، ومع كلٍّ منها جلسته            | يُرفع، أو يُحذف لإفساح مساحة، والأحدث أخيرًا |
| `Recordings/TestVideos/`          | مقاطع الاختبار                                       | تُحذف لإفساح مساحة، والأقدم أولًا            |
| `FeedbackForms/`                  | إجابات تعذّر إرسالها                                 | تُرسل، أو يرفضها الخادم                      |
| `device_id.txt`                   | معرّف الجهاز لهذا التثبيت، حين لا يتوفّر معرّف Steam | يبقى، ليظلّ التثبيت الواحد لاعبًا واحدًا     |
| `playtest_consent.json`           | ما الذي سمح اللاعب لهذا الاختبار بجمعه               | يبقى، ليُسأل مرة واحدة لا في كل تشغيل        |
