القلب (Core)
إعدادات عامة تضبط طريقة المحاكاة والمستوى وتوزيع النقاط.
المفتاح القيمة الوحدة الشرح combat_mode simultaneous تعداد أسلوب محاكاة القتال (مثال: متزامن/دُفعات). hp_mode base_plus_formula تعداد طريقة اشتقاق نقاط الصحة الأساسية قبل الإضافات. level 1 رقم ثابت المستوى الحالي للمقاتل/اللاعب. unassigned_points 0 رقم ثابت نقاط لم تُوزّع بعد على الصفات الأساسية. الصفات الأساسية (Attributes)
الصفات الأساسية؛ تبنى عليها الإحصاءات المشتقة.
المفتاح القيمة الوحدة الشرح agility 5 رقم ثابت الرشاقة: ترفع الدقة والتفادي وسرعة الهجوم عادةً. intelligence 5 رقم ثابت الذكاء: يُستعمل عادةً لمهارات/سحر (قد يؤثّر لاحقًا). luck 5 رقم ثابت الحظ: يؤثّر على الأحداث العشوائية (نِسَب حرج/إسقاطات). strength 5 رقم ثابت القوة: تزيد الهجوم ونقاط الصحة المشتقة. vitality 5 رقم ثابت الحيوية: تزيد الدفاع ونقاط الصحة المشتقة. القيم الابتدائية (Base Stats)
قيم ابتدائية تُستخدم كنقطة انطلاق لكل الحسابات.
المفتاح القيمة الوحدة الشرح attack 20 رقم ثابت الهجوم الابتدائي قبل المعاملات/الزيادات. defense 10 رقم ثابت الدفاع الابتدائي قبل نموذج التحويل. hp 900 رقم ثابت الصحة الأساسية قبل المعادلات الإضافية. accuracy 0.6 نسبة الدقة الابتدائية (احتمال إصابة الهدف). evasion 0.2 نسبة التفادي الابتدائي (احتمال تفادي الضربات). attack_speed 0.25 هجمة/ث سرعة الهجوم (عدد الهجمات/ث). الحدود القصوى (Caps)
سقوف لحماية التوازن ومنع تجاوزات القيم.
المفتاح القيمة الوحدة الشرح accuracy_max 0.95 نسبة سقف الدقة حتى لا تتجاوز حدًا منطقيًا. attack_speed_max 2.5 هجمة/ث سقف سرعة الهجوم (هجمة/ث). evasion_max 0.6 نسبة سقف التفادي. level_max 140 رقم ثابت أقصى مستوى مسموح. المعاملات (Coefficients)
ثوابت تحويل تربط الصفات بالمخرجات النهائية.
المفتاح القيمة الوحدة الشرح accuracy_per_agility 0.003 نسبة لكل نقطة زيادة الدقة لكل نقطة رشاقة. attack_per_strength 4 ثابت لكل نقطة زيادة الهجوم لكل نقطة قوة. attack_speed_per_agility 0.006 هجمة/ث لكل نقطة زيادة سرعة الهجوم لكل نقطة رشاقة. defense_per_vitality 2 ثابت لكل نقطة زيادة الدفاع لكل نقطة حيوية. evasion_per_agility 0.002 نسبة لكل نقطة زيادة التفادي لكل نقطة رشاقة. نموذج الدفاع (Defense Model)
تحويل DEF الخام إلى فاعلية دفاعية مع تناقص العائد. الصيغة الموصى بها لوغاريتمية. كل زيادة في DEF تُفيد لكن بشكل أبطأ كلما ارتفعت القيمة.
المفتاح القيمة الوحدة الشرح type log تعداد نوع تحويل الدفاع (لوغاريتمي لتناقص العائد). K 200.0 رقم ثابت ثابت يضبط انحناء التحويل لضبط الإحساس بالصلابة. formula DEF_eff = K * ln(1 + defense / K) نص الصيغة: DEF_eff = K · ln(1 + DEF / K). معادلة نقاط الصحة (HP Formula)
اشتقاق الصحة النهائية من HP الأساسي + زيادات ثابتة/نسبية + مساهمة STR وVIT.
المفتاح القيمة الوحدة الشرح hp_flat_bonus 0 رقم ثابت زيادة ثابتة تضاف مباشرة للصحة. hp_bonus 0 نسبة زيادة نسبية تُضرب في الصحة الأساسية. hp_per_strength 10 ثابت لكل نقطة مقدار ما تضيفه كل نقطة قوة للصحة. hp_per_vitality 75 ثابت لكل نقطة مقدار ما تضيفه كل نقطة حيوية للصحة. formula HP_total = bases.hp * (1 + hp_bonus) + hp_flat_bonus + strength*hp_per_strength + vitality*hp_per_vitality نص الصيغة: HP_total = (HP_base · (1 + hp_bonus)) + hp_flat + STR·hp/STR + VIT·hp/VIT. الرتب (Ranks)
تقسيم المستويات إلى فئات واضحة لتأثير الضبط والتوازن.
المفتاح القيمة الوحدة الشرح E من 1 إلى 5 رقم ثابت – رقم ثابت فئة للمستويات المبتدئة. D من 6 إلى 15 رقم ثابت – رقم ثابت فئة أعلى قليلًا من E. C من 16 إلى 30 رقم ثابت – رقم ثابت فئة متوسطة أدنى. B من 31 إلى 50 رقم ثابت – رقم ثابت فئة متوسطة. A من 51 إلى 75 رقم ثابت – رقم ثابت فئة متقدمة. S من 76 إلى 105 رقم ثابت – رقم ثابت فئة خبيرة. SS من 106 إلى 140 رقم ثابت – رقم ثابت فئة نخبة. التقدّم (Progression)
قِيَم زيادة المستوى: نقاط تلقائية/حرّة ومكافآت موارد لكل مستوى.
المفتاح القيمة الوحدة الشرح auto_points_each_attr_per_level 1 ثابت لكل مستوى نقاط تلقائية تُضاف لكل صفة عند كل مستوى (بدون تدخل اللاعب). free_points_per_level 3 ثابت لكل مستوى نقاط حرّة يمنحها كل مستوى ليقوم اللاعب بتوزيعها كما يشاء. gold 1000 رقم ثابت ذهب يُكتسب ضمن مسار التقدّم لكل مستوى (إن كان مفعّلًا). mana_stone 100 رقم ثابت أحجار مانا تُمنح ضمن مسار التقدّم. jewels 20 رقم ثابت جواهر تُمنح ضمن مسار التقدّم. keys 1 رقم ثابت مفاتيح تُمنح ضمن مسار التقدّم. الموارد الابتدائية (Starting Resources)
ما يبدأ به اللاعب من عملات/موارد عند إنشاء الشخصية/الموسم.
المفتاح القيمة الوحدة الشرح gold 2500 رقم ثابت الذهب الابتدائي عند بدء اللعبة/الموسم. mana_stone 500 رقم ثابت أحجار المانا الابتدائية. keys 10 رقم ثابت عدد المفاتيح الابتدائي. jewels 100 رقم ثابت الجواهر الابتدائية. الأسماء المختصرة (Aliases)
تطبيع الأسماء: اختصار ↔ الاسم الكامل.
المفتاح الاسم الكامل الوحدة الشرح ATK attack — اختصار الهجوم (attack). DEF defense — اختصار الدفاع (defense). HP hp — اختصار نقاط الصحة (hp). ACC accuracy — اختصار الدقة (accuracy). EVA evasion — اختصار التفادي (evasion). AS attack_speed — اختصار سرعة الهجوم (attack_speed). STR strength — القوة. VIT vitality — الحيوية. AGI agility — الرشاقة. INT intelligence — الذكاء. LCK luck — الحظ.
المرحلة 1 — نموذج البيانات وهيكلة التخزين
1) نموذج البيانات (Schematics)
أ. BattleConfig (إعدادات المعركة العامة)
- الغرض: تعريف الثوابت والقواعد العامة خارج بطاقات الكيانات (خصوصًا ثابت K).
- الحقول المقترحة:
id: معرف فريد (uuid).k: رقم (مثل 200) لتحويل DEF إلى DEF_eff (لا يُكرر داخل الكيانات).time_origin: مرجع الزمن t=0.objective: واحد فقط:kill_boss | survive_T | clear_all | ...win_condition: تنتهي المعركة فور HP=0 لأي طرف.environment: كائن اختياري لعوامل الساحة (ضرر مستمر، عتبات زمنية…).i18n:{ "ar": {...}, "en": {...} }لأي نص واجهاتي عام (ثنائي اللغة إلزاميًا).
مبدأ رياضي مرجعي داخل BattleConfig:
- DEFeff=K⋅ln(1+DEF/K)DEF_{eff} = K \cdot \ln(1 + DEF/K)DEFeff=K⋅ln(1+DEF/K)
- نستخدمه فقط أثناء المحاكاة، لا يُكتب داخل بطاقات الكيانات.
ب. Entity (النموذج الموحّد للكيان Hunter/Monster)
- المفاتيح برمجياً بالإنجليزية، وكل نص واجهاتي له صيغتان
ar/en. لا ثوابت توازن داخل البطاقة. - بنية عليا:
id,type(hunter|monster),name{ar,en},title{ar,en},family{ar,en},species{ar,en},rank{band, mod, label{ar,en}},style,role,tags[]. (مطابقة لأمثلة الوثيقة)stats:hp_max,atk,def,HPS،rate(أفعال/ث)،range_m،projectile_speed،damage_type،eva،aim،resist{...}،mitigation_passive،regen_hps،mana{mc,mr}.
behavior:target_rule+emergency_rules[](شرط → فعل → حتى). قواعد الأولوية/الكسر مذكورة في المرجع.
abilities[]:name{ar,en},category(offensive/defensive/healing/buff)،cooldown_s،cost{mana,stamina}،effects[]حيث كل تأثير:target(self|enemy|area),affects(مسار الحقل:attack.atkمثلًا),op(set|add|mul|penetrate_def|mitigate),value,window{start_s,duration_s},taunt,notes{ar,en}.
ui{short_desc{ar,en}, lore{ar,en}},meta{version, author}.
ملاحظات محاكاة يجب أن تنعكس في صحة البيانات:
- المقذوفات: تأثير الضربة يبدأ بعد tarr=rangemprojectile_speedt_{arr} = \frac{range_m}{projectile\_speed}tarr=projectile_speedrangem عند وجود سرعة مقذوف.
- عامل إصابة حتمي: Fhit=clamp(AIM⋅(1−EVA),0,1)F_{hit} = clamp(AIM \cdot (1 – EVA), 0, 1)Fhit=clamp(AIM⋅(1−EVA),0,1) (لا RNG).
- ترتيب التأثيرات على نفس المقياس:
set → add → mul. وتطبيق ما بعد الضربة:resist,mitigation_passive,mitigate.- نوافذ الأحداث (Event Windows) هي حجر الأساس لتقسيم الزمن إلى فترات ثابتة.
ج. Swarm (ضمن الكيان أو السيناريو)
- إن كان العدو سربًا:
{ enabled, N0, lambda_per_s, M }مع الصيغة N(t)=N0+⌊∫0tλ(τ) dτ⌋N(t) = N_0 + \lfloor \int_0^t \lambda(\tau)\,d\tau \rfloorN(t)=N0+⌊∫0tλ(τ)dτ⌋. - توزيع AoE على min(N(t),M)\min(N(t), M)min(N(t),M)، والضربة المفردة تتبع
target_rule. بلا tick، بل فترات بين تغيّرات الحالة.
2) قواعد تحقق (Validation Rules)
- ثنائية اللغة إلزامية لأي نص واجهاتي يظهر للاعب (
name/title/ui/notes/...). - منع وجود
kداخل أي بطاقة كيان (يتواجد حصراً في BattleConfig). - التحقق من
abilities[*].effects[*].windowوأنها موجبة/ضمن زمن المعركة، وأنopمن المجموعة المعتمدة. - توافق منطقي للمقذوفات: إن كانت
projectile_speed=0يجب أن يكونrange_mصغيرًا (اشتباك قريب) أو نعالجها كضربة آنية. (الوثيقة تذكر فقط الحساب الزمني؛ سنوثّق كيف نعامل السرعة 0 كـ Melee آنية). - التزام هرمية السلوك والاستهداف في الحقول (
behavior).
3) قرارات التخزين (WordPress)
لا يوجد خيار أ – تم رفضه
الخيار (ب): جداول مخصصة للأداء الكبير
- جداول:
gates_entities(أعمدة أساسية + عمود JSON)gates_entity_tax(اختياري)،gates_battle_configs
- المزايا: أداء أعلى مع آلاف الكيانات واستعلامات تحليلية.
- القيود: تعقيد أعلى في أدوات الإدارة والنسخ الاحتياطي.
توصيتي للانطلاق: نبدأ بـ الخيار (أ) (CPT + Options). عند ثبات النموذج وظهور حاجة لأداء أعلى، نوفّر مسار ترقية إلى الخيار (ب) دون تغيير تنسيق JSON (Backward-compatible).
4) الاستيراد/التصدير والإصدارات
- تنسيق تبادل: JSON مطابق للوثيقة (حقول ثابتة، المفاتيح بالإنجليزية، نصوص
ar/en). - إصدار المخطط: حقل
schema_versionعلى مستوى BattleConfig والكيان (meta.versionموجود بالفعل في الأمثلة). - زرّ Export/Import لكل من BattleConfig والكيانات (JSON واحد أو حزمة).
5) مخرجات هذه المرحلة (جاهزة لاعتمادك)
- وثيقة نهائية لمخطط JSON (BattleConfig + Entity + Swarm) مع أمثلة قياسية من المرجع.
- مصفوفة قواعد تحقق (i18n، عدم تكرار K، صحة نوافذ التأثيرات…).
- قرار تخزين مفصل (CPT + Options) مع خطة ترقية لاحقة للجداول المخصصة.
6) معايير القبول (Acceptance)
- كل حقل مذكور أعلاه موجود ومطابق للأمثلة والنصوص الحسابية في الوثيقة.
- تحقق صارم لثنائية اللغة في أي نص يظهر للاعب.
- عدم وجود أي ثابت توازن (مثل K) داخل بطاقات الكيانات.
- توثيق واضح لآلية السرب وAoE في النموذج.
المرحلة 3: واجهة الإدارة ثنائية اللغة
الهدف هنا وضع مواصفة UX/UI كاملة لشاشات لوحة التحكم، التدفّقات، الرسائل، والتحقق—لتصبح مرجع التنفيذ لاحقًا.
1) الهيكلة العامة (Information Architecture)
- عنصر قائمة رئيسي: Battle Simulator.
- Battle Configs (قائمة + إنشاء/تحرير)
- Entities (قائمة + إنشاء/تحرير)
- Test Runs (تشغيل تجريبي + عرض النتائج)
- Import / Export
- Settings (خيارات عامة للواجهة فقط)
- مبدّل اللغة: زر علوي ثابت
العربية | Englishيبدّل كل النصوص الواجهاتية فورًا (RTL/LTR تلقائي). - قواعد نمطية عامة:
- الوحدات ثابتة: الثواني (s)، الأمتار (m)، المعدلات (…·s⁻¹).
- التقارير تُقرَّب إلى 3 منازل عشرية.
- الحقول الرقمية تعرض تلميح الدقّة المقبولة (decimal).
- أي نص يظهر للاعب يجب إدخاله بـ العربية والإنجليزية.
- تذكير ثابت أعلى الشاشات: «ثابت K يُدار من Battle Config فقط».
- زر حفظ وزر حفظ كمسودة مع تحذير عند مغادرة دون حفظ.
2) شاشات Battle Configs
2.1 قائمة Battle Configs
- أعمدة: الاسم (ar/en)، الهدف Objective، آخر تعديل، عدد الـRuns.
- إجراءات: تحرير | نسخ متماثل | تصدير JSON | حذف (مع تحذير).
- بحث وتصفية حسب الهدف.
2.2 نموذج إنشاء/تحرير Battle Config
تبويبات:
- Basics
Title (ar)،Title (en)Objective(قائمة منسدلة: kill_boss / survive_T / clear_all / …)Time origin (t=0)(رقمي اختياري، الافتراضي 0)
- Balance
K(decimal) مع وصف مختصر لصيغة تحويل DEF→DEF_eff كمرجع للمدير.- تنبيه: «ممنوع تكرار K في الكيانات.»
- Environment (اختياري)
- محرر JSON مبسّط (قواعد ضرر بيئي/مفاتيح زمنية)، مع زر تحقق.
- Win Condition
- خيارات جاهزة (إيقاف فوري عند HP=0 لأي طرف، حدود زمن…)، أو JSON مبسّط.
التحقق ورسائل الأخطاء:
- (ar) «الاسم العربي مطلوب.» / (en) “English title is required.”
- (ar) «الهدف مطلوب.» / (en) “Objective is required.”
- (ar) «قيمة K غير صالحة.» / (en) “Invalid K value.”
- (ar) «ترميز البيئة غير صالح JSON.» / (en) “Environment JSON is invalid.”
نجاح الحفظ (توسّط):
- (ar) «تم الحفظ.» / (en) “Saved.”
3) شاشات Entities
3.1 قائمة Entities
- فلاتر علوية: النوع (Hunter/Monster)، الدور، الأسلوب، الرتبة (band/mod)، الوسوم.
- أعمدة: الاسم (ar/en)، النوع، الدور، الرتبة، تاريخ التحديث.
- إجراءات: تحرير | نسخ | تصدير | حذف.
- شريط أدوات: إضافة كيان.
3.2 نموذج إنشاء/تحرير Entity
تبويبات منظمة:
A) Basics
Type: Hunter | MonsterStyle،Role،Rank (band/mod)Tags(وسوم متعددة)- تحقق: كل القيم من القوائم المنسّقة، وعدم ترك
Typeفارغًا.
B) Stats
- حقول رقمية:
hp_max,atk,def,rate(أفعال/ث),range_m,projectile_speed,eva,aim,resist{…},mitigation_passive,regen_hps,HPS(إن كان له شفاء نشط),mana{mc,mr}. - مساعدات إدخال:
- Tooltip للمقذوفات: لو
projectile_speed > 0فسيؤخَّر الأثر بـt_arr = range_m / projectile_speed. - إذا
projectile_speed = 0يُعامل كهجوم آني (Melee).
- Tooltip للمقذوفات: لو
- تحقق:
- أرقام ≥ 0 حيث يلزم.
evaوaimضمن [0,1].- إن تم تزويد مقاومات، تعرض مفاتيح مقبولة فقط (مثلاً: physical, magic …).
C) Behavior
Target rule: قائمة (weakest_first, boss_first, nearest, lowest_hp, ranged_first, taunter_first…).- Emergency Rules (جدول فرعي):
- صفوف: الاسم (ar/en)، الشرط، الفعل، حتى (until).
- منشئ شروط (Condition Builder):
- قوالب:
self_hp_lte_pct,enemy_count_gte,time_gte,ally_hp_lte_pct…
- قوالب:
- منشئ أفعال (Action Builder):
- قوالب: تبديل target_rule، تفعيل kite، تبديل سلوك مؤقّت…
- منشئ انتهاء (Until): بزمن/شرط مقابل.
- أولوية التطبيق معروضة نصيًا: قدرات نشطة > طوارئ > استراتيجية مسبقة > افتراضي.
D) Abilities
- جدول قدرات: الاسم (ar/en)، الفئة (offensive/defensive/healing/buff)،
cooldown_s,cost (mana/stamina),taunt(نعم/لا). - زر تحرير التأثيرات لكل قدرة.
D-1) محرر Effects (نافذة منبثقة)
- Effect Builder:
target: self | enemy | areaaffects: قائمة مسارات مُقيَّدة (مثال:attack.atk,stats.def,stats.eva,stats.aim,resist.physical, …).op: set | add | mul | penetrate_def | mitigatevalue: رقمwindow:start_sوduration_s(≥0)
- مساعدات:
- تذكير بترتيب التطبيق:
set → add → mul، ثم بعد الضربة:resist / mitigation_passive / mitigate.
- تذكير بترتيب التطبيق:
- تحقق:
- لا نوافذ سالبة أو مدة صفرية بلا معنى.
opضمن المجموعة المسموحة فقط.affectsمسار معروف؛ وإلا خطأ إملائي.
E) Swarm (اختياري)
enabled،N0،lambda_per_s(معدل انبثاق)،M(حد الاشتباك).- ملاحظة واجهة: «توزيع AoE على
min(N(t), M)، والضربة المفردة تتبع Target Rule.» - تحقق: القيم ≥ 0، و
M≥ 1 إن تم التمكين.
F) i18n
- حقول إلزامية باللغتين:
name,title,family,species,rank_label,short_desc,lore. - مؤشّر إكمال يظهر ✅ عند تعبئة كل الحقول للغتين.
G) Meta
version،author، ملاحظات داخلية (غير ظاهرة للاعب).
رسائل التحقق الشائعة (نماذج)
- (ar) «جميع الحقول الواجهاتية يجب تعبئتها بالعربية والإنجليزية.»
- (en) “All player-facing texts must be provided in both Arabic and English.”
- (ar) «قيمة غير صالحة لـ (aim): يجب أن تكون بين 0 و1.»
- (en) “Invalid value for (eva): must be between 0 and 1.”
نجاح الحفظ
- (ar) «تم حفظ الكيان.» / (en) “Entity saved.”
- تحذير علوي ثابت: «لا تُدرِج K داخل الكيان.»
4) Test Runs (تشغيل تجريبي)
4.1 إعداد التشغيل
- اختيار Battle Config (قائمة منسدلة).
- اختيار الجانب الأيسر (Player/Allies): مُنتقي كيانات متعدد، مع الحصص (العدد) إن لزم.
- اختيار الجانب الأيمن (Enemies): مُنتقي كيانات متعدد، مع الحصص/السرب.
- أزرار: تشغيل | تشغيل + حفظ النتائج | إعادة تعيين.
- خيار «إيقاف عند الحسم الأول» مفعل افتراضيًا.
تحقق قبل التشغيل
- وجود Config مختار.
- على الأقل كيان واحد في كل جانب.
- i18n مكتمل للكيانات المختارة (عرض تحذير إن ناقص).
4.2 عرض النتائج
A) الملخّص (Result)
- الحالة: فوز/خسارة/تعادل.
- زمن الحسم (s).
- HP/MC النهائية لكل جانب (إجمالية ومتوسط/كيان).
- زر تصدير JSON للنتيجة.
B) نوافذ الأحداث (Windows)
- جدول:
#،t_start،t_end، السبب (ability_window | projectile_arrival | swarm_change | target_switch | objective_hit | death)، ولقطة ثوابت النافذة (ATK/DEF_eff/m/… مختصر). - ترقيم صفحات. زر تصدير CSV.
C) سجل المعركة (Log)
- جدول: الزمن
t، الفاعل → الهدف، النوع (hit/heal/apply/expire/death/objective/note)، والقيم: (F_hit، ضرر خام، resist/mitigate، الضرر الفعلي، HP_after…). - فلاتر سريعة: «إظهار hits فقط»، «إظهار الوفيات»، «حسب الكيان».
- أزرار: نسخ، تصدير CSV/JSON.
رسائل
- (ar) «تم تنفيذ التشغيل.» / (en) “Run executed.”
- (ar) «لا توجد نوافذ أحداث—تحقق من نوافذ التأثيرات.» / (en) “No event windows—check effects’ windows.”
5) Import / Export
- Export:
- Battle Config: JSON
- Entity: JSON (مع i18n/abilities/effects/behavior/swarm/meta)
- Run Results: JSON + CSV للـwindows/log.
- Import:
- اختيار نوع المستند (Config / Entity / Package).
- Dry-run Validator يعرض الأخطاء قبل الإدخال.
- رسائل خطأ استيراد (عينة):
- (ar) «حقل مفقود: name.en» / (en) “Missing field: name.ar”
- (ar) «قيمة op غير مدعومة: …» / (en) “Unsupported op: …”
6) Settings (واجهة عامة فقط)
- الدقّة الافتراضية للعرض (عدد المنازل العشرية).
- تمكين «تحذيرات صارمة» عند فقدان نصوص إحدى اللغتين.
- التحكم بالوحدات الظاهرة (لا تغيّر الحسابات).
7) الأذونات والأدوار (WP Capabilities)
- BattleSim Admin: كل شيء.
- BattleSim Designer: إدارة Config/Entity/Abilities/Behavior/Import-Export، تشغيل تجارب.
- BattleSim Analyst: قراءة الكيانات، تشغيل تجارب، تصدير النتائج فقط.
- كل شاشة تتحقق من capability المناسب وتخفي الأزرار غير المسموح بها.
8) حالات الحافة (Edge Cases) ومعالجات UX
- قدرة بلا أي Effect: تحذير أصفر عند الحفظ.
- Effect نافذة مدتها 0: يمنع الحفظ إلا عند سبب مبرّر (مع خيار «أفهم المخاطر»).
- Swarm مفعّل دون قيم: يمنع الحفظ.
- projectile_speed>0 مع range_m=0: تحذير (لن يؤثر التأخير).
- eva=1 أو aim=0: F_hit=0 → تحذير بأن الهجمات لن تصيب.
- مزدوج اللغة ناقص: يمنع النشر (يمكن حفظ مسودة).
9) نصوص جاهزة للرسائل (عينات مختصرة)
- نجاح عام:
- ar: «تم الحفظ.» | en: “Saved.”
- خطأ عام:
- ar: «تعذر الحفظ. تحقق من الحقول.» | en: “Save failed. Please check fields.”
- تحذير K:
- ar: «لا تضف K داخل الكيان. K يُدار من Battle Config فقط.»
- en: “Do not put K on entities. K lives in Battle Config only.”
- تحقق i18n:
- ar: «النصوص الظاهرة للاعب مطلوبة بالعربية والإنجليزية.»
- en: “Player-facing texts are required in both Arabic and English.”
10) معايير القبول لهذه المرحلة
- كل الشاشات المذكورة موصوفة بوضوح (حقول، تبويبات، أزرار، رسائل).
- تغطية كاملة للتحقق (الأرقام، النوافذ، القيود، i18n، السرب…).
- تدفّقات تشغيل واضحة من الاختيار إلى عرض Result/Windows/Log مع إمكانيات التصدير.
- أدوار وصلاحيات محددة وواضحة.
- لا تعارض مع المراحل السابقة (K مركزي، ثنائية اللغة، نموذج نوافذ الأحداث).
المرحلة 4: محرّر Battle Config
الغاية: توثيق شاشة إدخال/تحرير الإعدادات العامة للمعركة بطريقة دقيقة، قابلة للتنفيذ لاحقًا كما هي.
1) بنية الشاشة (UX)
- العنوان أعلى الصفحة: Battle Config
- أزرار ثابتة أعلى اليمين: حفظ، حفظ كمسودة، تصدير JSON، حذف
- شريط تحذير دائم: «ثابت K يُدار من Battle Config فقط — لا تضفه داخل الكيانات.»
- مبدّل اللغة أعلى يسار: العربية | English (يؤثر على نصوص الواجهة فقط؛ لا يغيّر المفاتيح)
تبويبات الصفحة
- Basics
- Balance
- Objective & Win Condition
- Environment
- Validation & Preview (معاينة سريعة)
- Meta
2) الحقول والتفاصيل
(A) Basics
- Title (ar): حقل نصي إلزامي
- Title (en): حقل نصي إلزامي
- Time origin (t=0): رقم عشري (افتراضي 0.000)، وحدة: ثانية
- Schema version (مقروء فقط): يُملأ تلقائيًا (مثلاً
1.0)
تحقق Basics
- كلا العنوانين مطلوبان.
- Time origin يقبل أرقامًا عشرية ±، مع تقريب بالعرض إلى 3 منازل (التخزين يحتفظ بالدقة الكاملة).
(B) Balance
- K (Defense Scaling Constant): رقم عشري موجب؛ مثال شائع: 200.0000
شرح مختصر أسفل الحقل (قراءة فقط):- تحويل الدفاع:
DEF_eff = K * ln(1 + DEF / K) - معامل التخفيف:
m = ATK / (ATK + DEF_eff)
- تحويل الدفاع:
- Notes (ar/en اختياري): ملاحظات للمصمم (لا تُعرض للاعب).
تحقق Balance
- K > 0 إلزامي.
- ظهور تنبيه أصفر إذا تغيّر K عن القيمة الأخيرة المستعملة في تجارب محفوظة (قد تُعاد معايرة النتائج).
(C) Objective & Win Condition
- Objective (قائمة منسدلة — عنصر واحد):
kill_bosssurvive_T(يظهر معه حقل T (seconds))clear_allcustom(يوفّر JSON مبسّط)
- Win Condition Presets (radio):
- Instant KO: تنتهي المعركة فور وصول HP لأي طرف إلى 0
- Both Must Fall: النجاح يتطلب إسقاط كل أعداء الطرف الخصم
- Timed Survival: النجاح يتحقق عند بلوغ الزمن T دون فشل
- Custom JSON: محرر مبسّط
- Draw Policy (قائمة):
no_draw(تعاد المعركة حتى يتحقق الفوز/الخسارة)draw_on_time(تعادل عند تجاوز زمن معيّن)draw_on_stall(تعادل عند عدم تغيّر صحة الأطراف لفترة Δt)
تحقق Objective & Win
- عند اختيار
survive_Tيجب إدخال T > 0. - «Custom JSON» يخضع لمخطط (schema) داخلي؛ الزر تحقّق يرفض المفاتيح غير المعروفة ويعرض المسارات الصحيحة.
- التوليفة غير المنطقية (مثلاً
kill_boss+ Draw on time بلا قيمة زمن) تُمنع مع رسالة واضحة.
(D) Environment
- Environment JSON (اختياري): محرر JSON مع تمييز صياغي (syntax highlight) وأزرار:
- تحقّق (Validate)
- قالب (Insert Template)
- تعليمات (Tooltip للمفاتيح المتاحة)
- قالب مقترح:
{
"global_dot": { "type": "flat", "dps": 5.0, "start_s": 0, "duration_s": 9999 },
"time_gates": [
{ "t": 30.0, "apply": [{ "target": "all_enemies", "affects": "stats.def", "op": "mul", "value": 0.9 }] }
],
"zone": {
"radius_m": 6.0,
"penalty": { "target": "player", "affects": "stats.atk", "op": "mul", "value": 0.8 }
}
}
-
- global_dot: ضرر/شفاء بيئي عام بمرور الزمن
- time_gates: أحداث عند لحظات محددة (تعديلات مؤقتة ضمن نوافذ)
- zone: مؤثرات مساحة (اختياري)
تحقق Environment
- JSON صالح فقط.
- القيم الزمنية ≥ 0.
opضمن {set,add,mul,penetrate_def,mitigate}.affectsمسار معروف (تظهر قائمة بالمسارات المسموحة عند التركيز على الحقل).- في حالة zone يجب أن تكون الحقول (مثل radius_m) ≥ 0.
(E) Validation & Preview
- زر فحص شامل (Run All Checks):
- i18n: عناوين موجودة بالعربية والإنجليزية.
- K > 0.
- Objective/Win: توليفة متسقة.
- Environment JSON: وفق المخطط.
- Preview Cards (قراءة فقط):
- Defense curve: معاينة حسابية لنقاط نموذجية (DEF=0,100,200,400,800) تعرض DEF_eff و m مقابل ATK=ثابت (لتثقيف المصمم — عرضٌ فقط، لا حفظ).
- Event Windows Impact: قائمة نصية قصيرة كيف ستولّد time_gates نوافذ أحداث (مثال: “Gate @30.0s → window split”).
ملاحظة: Preview Cards لا تشغّل محاكاة ولا تعتمد أي كيان — هي توضيحية فقط لمعادلات الـConfig.
(F) Meta
- Label (ar/en): تسمية وصفية داخلية.
- Changelog: حقل نصي متعدد الأسطر (ar/en) لأسباب التعديل.
- Created/Updated: حقول مقروءة فقط.
3) التفاعلات والتدفّقات
إنشاء جديد
- يدخل المستخدم Basics ثم Balance (K).
- يختار Objective & Win Condition.
- يملأ Environment (اختياري) ويضغط تحقّق.
- ينتقل إلى Validation & Preview ويضغط Run All Checks.
- حفظ: إذا نجح الفحص، تُحفظ الإعدادات.
تحرير موجود
- فتح أي Config من القائمة → تعديلات → حفظ.
- عند تغيير K أو Objective:
- يظهر تحذير تأثير رجعي: «قد تختلف نتائج الاختبارات السابقة مع هذا التغيير.»
الاستيراد/التصدير
- تصدير JSON: يصدّر كل حقول الـConfig الحالية.
- استيراد JSON: شاشة Import العامة تسمح بتحميل Config؛ عند نجاح التحقق، يمكن الدمج أو الاستبدال.
4) رسائل التحقق والأخطاء (عربية/إنجليزية)
نجاح
- ar: «تم الحفظ.» · en: “Saved.”
أخطاء إلزامية
- Title (ar):
- ar: «العنوان العربي مطلوب.» · en: “Arabic title is required.”
- Title (en):
- ar: «العنوان الإنجليزي مطلوب.» · en: “English title is required.”
- K:
- ar: «قيمة K يجب أن تكون رقمًا موجبًا.» · en: “K must be a positive number.”
- Objective:
- ar: «الهدف مطلوب.» · en: “Objective is required.”
- Survive_T بدون T:
- ar: «يجب تحديد T بالثواني.» · en: “T (seconds) is required.”
أخطاء JSON
- Environment:
- ar: «JSON غير صالح: …» · en: “Invalid JSON: …”
- ar: «قيمة op غير مدعومة: …» · en: “Unsupported op: …”
- ar: «مسار affects غير معروف: …» · en: “Unknown affects path: …”
تحذيرات
- تغيير K:
- ar: «تحذير: تغيير K قد يؤثر على نتائج سابقة.» · en: “Warning: Changing K may affect prior runs.”
- Objective + Draw Policy غير متسقة:
- ar: «التوليفة المختارة غير منطقية. عدّل سياسة التعادل أو الهدف.»
- en: “Inconsistent selection. Adjust draw policy or objective.”
5) قيود وقواعد مخفية (Business Rules)
- K مركزي هنا فقط. يمنع ظهور أي حقل K في نماذج الكيانات.
- يَنتج عن Environment أحداث تقطيع للزمن (نوافذ) فقط إذا تضمّن time_gates/zone أو تأثيرات لها نوافذ زمنية.
- لا يُسمح بأي RNG من خلال الـConfig؛ كل ما هنا يظل حتميًا ويُفسَّر محرك المحاكاة لاحقًا.
- الوحدات ثابتة (s, m, …·s⁻¹) وتنعكس في التلميحات.
6) الربط مع قاعدة البيانات (من دون كود)
- الحقول تُخزَّن في جدول gates_battle_configs كما صممناه بالمرحلة 2:
k,time_origin,objective,win_condition (json),environment (json),title_ar,title_en,schema_version, الطوابع الزمنية.
- زر تحقّق لبيانات JSON يستدعي مُتحقق المخطط (Schema) داخلي (قابل للتوسّع).
- زر تصدير JSON يعيد نفس المفاتيح بالإنجليزية للنقل السلس بين البيئات.
7) حالات الحافة (Edge Cases)
- K صغير جدًا (مثل 0.001): تحذير بأن المنحنى سيصبح شبه خطّي (يُعرض في Preview).
- K كبير جدًا (مثل 10000): تحذير بأن تأثير الدفاع سيصبح ضعيفًا جدًا (يُعرض في Preview).
- Objective = custom وWin Condition = preset: يمنع الحفظ إلا إذا كانت القيم منسجمة (إما Custom بالكامل، أو Preset بالكامل).
- Environment يحوي نافذة زمنية خارج المدى (مدة سالبة/بداية أكبر من النهاية): يُرفض مع تحديد الموضع.
8) أمثلة إدخالات جاهزة (Templates)
Template: Boss Kill
- Title ar/en
- K = 200
- Objective = kill_boss
- Win = Instant KO
- Environment = فارغ
Template: Survival 60s + Zone Penalty
- Title ar/en
- K = 180
- Objective = survive_T (T=60)
- Win = Timed Survival
- Environment:
{
"zone": {
"radius_m": 5.0,
"penalty": { "target": "player", "affects": "stats.atk", "op": "mul", "value": 0.85 }
}
}
9) معايير القبول (Acceptance)
- كل الحقول المذكورة موجودة وتعمل بالضبط كما وصفت.
- التحقق ثنائي اللغة للعناوين، وتحقق عددي لـK، وارتباط منطقي لـObjective/Win.
- محرر Environment يفرض المخطط (ops/affects/نوافذ زمنية) ويعطي رسائل مفهومة.
- Preview Cards تعرض منحنى الدفاع والتقطيع الزمني المتوقع دون تشغيل محاكاة.
- التصدير/الاستيراد لملف JSON متوافق مع مخطط الجداول من المرحلة 2.
المرحلة 5: محرّر الكيانات (Entity Editor)
1) هدف الشاشة
تمكين المصمّم من إنشاء/تحرير بطاقة كيان موحّدة (Hunter/Monster) وفق المرجع: المفاتيح برمجيًا بالإنجليزية، وكل نص واجهاتي ثنائي اللغة، ولا ثوابت توازن داخل البطاقة.
2) تبويبات الشاشة
- Basics — النوع، الأسلوب، الدور، الرتبة، الوسوم. (تظهر الحقول كما في نموذج المسرد)
- Stats — الحقول العددية القياسية (hp_max, atk, def, rate, range_m, projectile_speed, eva, aim, resist{…}, mitigation_passive, regen_hps, HPS, mana{mc,mr}).
- Behavior — قاعدة الاستهداف + قواعد الطوارئ.
- Abilities — القدرات + محرّر التأثيرات Effects (target/affects/op/value/window/taunt/notes).
- Swarm (اختياري) — enabled, N0, λ، M وحد الاشتباك.
- i18n — كل النصوص الظاهرة للاعب (ar/en) إلزاميّة.
- Meta — version, author… (معلومة داخلية).
مذكّر أعلى الشاشة: «ثابت K مركزي في Battle Config فقط — يُحظر وضعه هنا.»
3) تفاصيل كل تبويب + التحقق
A) Basics
- Type: hunter | monster
- Style / Role: قوائم مسندة للمسرد (melee/ranged/caster/hybrid/support … / fighter/archer/mage…).
- Rank:
band(E..SSS) +mod(base/+/++). - Tags: متعددة.
- تحقق: يجب اختيار Type؛ القيم من القوائم المُعرّفة.
B) Stats
- الحقول: كما في أمثلة الصيّاد/الوحش (hp_max/atk/def/HPS/rate/range_m/projectile_speed/damage_type/eva/aim/resist.*/mitigation_passive/regen_hps/mana{mc,mr}).
- معلومة: المقذوفات تؤخر الأثر:
t_arr = range_m / projectile_speed(عند سرعة>0). - تحقق:
- القيم ≥ 0 حيث يلزم؛
evaوaimفي [0..1]. - إذا projectile_speed=0 مع range_m كبير، تحذير (عادةً melee آنية).
resist.*ضمن [0..1] وبمفاتيح معرّفة (physical/magic/fire/cold/poison…).
- القيم ≥ 0 حيث يلزم؛
C) Behavior
- Target Rule: weakest_first | boss_first | nearest | lowest_hp | ranged_first | taunter_first.
- Emergency Rules (قائمة قابلـة للإضافة):
name{ar,en}،condition{…}(مثل self_hp_lte_pct/enemy_count_gte/time_lt_s…) ثمaction{…}(تبديل target_rule/retreat/enable_kite …) وuntil{…}. (نماذج مذكورة في الأمثلة)
- هرمية التطبيق/كسر التعادل تُعرض نصيًا: قدرات نشطة > طوارئ > استراتيجية مسبقة > افتراضي؛ كسر التعادل: الأقرب، ثم أقل HP، ثم ID أصغر.
D) Abilities
- حقول القدرة:
name{ar,en},category(offensive/defensive/healing/buff),cooldown_s,cost{mana,stamina},taunt,notes{ar,en}. - محرّر Effects لكل قدرة:
target: self | enemy | areaaffects: مسارات مضبوطة (مثال:attack.atk,stats.eva,stats.mitigation_passive,resist.magic…). (مطابقة للأمثلة)op: set | add | mul | penetrate_def | mitigate (وترتيب التطبيق set→add→mul).value: رقمwindow:{start_s, duration_s}(≥0) — التأثيرات تعمل فقط داخل نافذتها.
- تحقق:
- لا نوافذ سالبة؛ مدة 0 تُرفض إلا لسبب موثّق (مثل لقطة آنية).
opخارج المجموعة = خطأ.affectsخارج المسارات المعتمدة = خطأ إملائي.
- أمثلة جاهزة داخل الواجهة: “Arc Bolt”, “Arcane Barrier”, “Ground Shatter” مطابقة للمرجع لتسريع الإدخال.
E) Swarm (اختياري)
- الحقول:
enabled,N0,lambda_per_s,M. - التوزيع: AoE على
min(N(t), M)، ضربة مفردة تتبع Target Rule، تقطيع الزمن بين تغيّرات حالة/وصول. - تحقق: قيم ≥0 و
M ≥ 1عند التمكين.
F) i18n
- إلزام: جميع الحقول الواجهاتية (name/title/family/species/rank_label/short_desc/lore/ability names/notes) بالعربية والإنجليزية؛ وإلا يمنع الحفظ (مسودة مسموحة).
G) Meta
version,author، ملاحظات داخلية (لا تظهر للاعب).
4) مساعدات واجهة أساسية
- Tooltips رياضية:
- تذكير بـ
F_hit = clamp(AIM×(1−EVA))(لا RNG). - بعد الاحتساب:
DPS_raw = ATK × m، ثم التخفيفات (resist/mitigation_passive/mitigate).
- تذكير بـ
- Projectile Helper: يعرض
t_arrالمتوقع عند إدخال range/speed. - Ops Ordering: لاصقة جانبية توضّح
set→add→mul، ثم طبقات ما بعد الضربة.
5) عرض معاينات صغيرة (Preview Cards — للكيان فقط)
- Hit Profile (نصي): يعرض F_hit المتوقّع من (aim/eva) ونبذة عن تأثير resist/mitigation.
- Range/Projectile: يُظهر الزمن التقريبي لأول وصول ضربة إن كانت سرعة مقذوف>0.
هذه المعاينات تعليمية، لا تُشغّل محاكاة ولا تُثبَّت في النتائج.
6) رسائل التحقق (نماذج)
- عام:
- ar: «كل النصوص الواجهاتية مطلوبة بالعربية والإنجليزية.» · en: “All player-facing texts are required in both Arabic and English.”
- Stats:
- ar: «القيم aim/eva يجب أن تكون بين 0 و1.» · en: “aim/eva must be between 0 and 1.”
- Effects:
- ar: «op غير مدعوم.» · en: “Unsupported op.”
- ar: «نافذة التأثير يجب أن تكون قيمًا غير سالبة.» · en: “Effect window must be non-negative.”
- Swarm:
- ar: «حدّ الاشتباك M يجب أن يكون ≥ 1 عند التمكين.» · en: “Engagement cap M must be ≥ 1 when enabled.”
7) حالات الحافة (Edge Cases)
- aim=0 أو eva=1 ⇒ F_hit=0 (تنبيه أن الهجمات لن تصيب).
- قدرة بلا Effects ⇒ تحذير أصفر عند الحفظ.
- Effect بمدة 0 ⇒ يُرفض إلا إذا كان Instant بنص مبرّر.
- projectile_speed>0 وrange=0 ⇒ تنبيه (التأخير = 0).
- سرب مفعّل بلا قيم ⇒ يمنع الحفظ.
8) ربط قاعدة البيانات (بدون كود)
- التخزين حسب المرحلة 2 (الخيار ب):
- gates_entities: stats_json, swarm_json, meta_json، وفهارس type/style/role/rank.
- gates_entity_locales: صفّان ar/en لكل كيان (name/title/family/species/rank_label/short_desc/lore).
- gates_abilities / gates_effects / gates_behaviors / gates_emergency_rules كما ذُكر أعلاه (ops، windows…).
9) معايير القبول (Acceptance)
- بطاقات الكيان تحفظ وتسترجع جميع الحقول المذكورة، وتُطابق أمثلة Hunter/Monster في المرجع حرفيًا من حيث البنية.
- التحقق يمنع فقدان أي نص واجهاتي لأحد اللغتين.
- ترتيب العمليات والـops والـwindows مطابق للملحق A1/A2.
- سياسات السرب وAoE تُطبّق كما في «Swarm Modeling».
- لا وجود لأي ثابت توازن (مثل K) داخل الكيان.
المرحلة 6: نواة المحاكاة (الرياضيات الأساسية)
1) مبادئ رياضية ملزِمة
- تحويل الدفاع: DEFeff=K⋅ln (1+DEFK)DEF_{eff} = K \cdot \ln\!\big(1+\tfrac{DEF}{K}\big)DEFeff=K⋅ln(1+KDEF).
- معامل التخفيف: m=ATKATK+DEFeffm = \tfrac{ATK}{ATK + DEF_{eff}}m=ATK+DEFeffATK.
- ضرر/ثانية (مستمر): DPS(t)=ATK(t)⋅m(t)DPS(t) = ATK(t)\cdot m(t)DPS(t)=ATK(t)⋅m(t).
- تطور الصحة: dHP/dt=−D(t)+H(t)⇒HP(t)=HP0−∫D(t) dt+∫H(t) dtdHP/dt=-D(t)+H(t)\Rightarrow HP(t)=HP_0-\int D(t)\,dt+\int H(t)\,dtdHP/dt=−D(t)+H(t)⇒HP(t)=HP0−∫D(t)dt+∫H(t)dt.
- زمن قتل لفترة ثابتة: TTK=HPremDPSTTK = \tfrac{HP_{rem}}{DPS}TTK=DPSHPrem.
- وصول المقذوف: tarr=rangemprojectile_speedt_{arr}=\tfrac{range_m}{projectile\_speed}tarr=projectile_speedrangem.
- عامل إصابة حتمي (لا RNG): Fhit=clamp(AIM⋅(1−EVA),0,1)F_{hit}=clamp(AIM\cdot(1-EVA),0,1)Fhit=clamp(AIM⋅(1−EVA),0,1).
- ترتيب التأثيرات على نفس المقياس:
set → add → mul؛ ثم بعد الضربة:resist[type],mitigation_passive,mitigate. - اختراق الدفاع قبل حساب mmm.
2) نموذج «نوافذ الأحداث» (Event Windows)
- تقسيم الزمن إلى فترات تكون فيها القيم ثابتة (بدء/انتهاء تأثير، وصول مقذوف، تغير السرب، تبدّل هدف…). داخل كل نافذة نجري التكامل التحليلي ونُوقف فور تحقق شرط النهاية أو الهدف.
- مصادر إنشاء النوافذ:
- قدرات/تأثيرات ضمن نافذتها
{start_s,duration_s}. - وصول مقذوف عند tarr>0t_{arr}>0tarr>0.
- السرب: وصول/خروج أفراد وفق N(t)=N0+⌊∫0tλ(τ)dτ⌋N(t)=N_0+\lfloor\int_0^t\lambda(\tau)d\tau\rfloorN(t)=N0+⌊∫0tλ(τ)dτ⌋ وحد الاشتباك MMM.
- تبدّل الهدف/الهرمية حسب A3.
- قدرات/تأثيرات ضمن نافذتها
3) خوارزمية التشغيل (Pseudo-steps)
المدخلات: BattleConfig (يحتوي KKK, objective, environment)، مجموعتا كيانات (Player/Enemy) مع لقطات ثابتة، زمن البدء t0t_0t0.
- تجهيز الخط الزمني للأحداث
- اجمع كل نقاط البدء/الانتهاء من تأثيرات القدرات، نقاط وصول المقذوفات، تغيّرات السرب، وبوابات البيئة؛ فرُزها تصاعديًا لتوليد مقاطع [ti,ti+1)[t_i, t_{i+1})[ti,ti+1).
- لكل نافذة [ti,ti+1)[t_i,t_{i+1})[ti,ti+1):
a) احسب DEFeffDEF_{eff}DEFeff لكل هدف، طبق penetrate_def (إن وُجد)، ثم mmm.
b) طبّق تأثيرات نفس المقياس بترتيبset→add→mul.
c) احسب FhitF_{hit}Fhit الحتمي ثم DPSrawDPS_{raw}DPSraw. طبّق Resist/Mitigations ضربيًا لإخراج DPS_finalDPS\_{final}DPS_final.
d) سرب/AoE: قسّم ناتج AoE على min(N(ti),M)\min(N(t_i),M)min(N(ti),M)، والضربة المفردة تتبع قاعدة الاستهداف.
e) تكامل صحي: ΔHP=−DPS_final⋅Δt+HPS⋅ΔtΔHP = -DPS\_{final}\cdotΔt + HPS\cdotΔtΔHP=−DPS_final⋅Δt+HPS⋅Δt لكل كيان ضمن النافذة (مع تسجيل القيم المحسوبة في سجل النافذة).
f) تحقق شرط النهاية لحظيًا: إذا HP≤0HP\le 0HP≤0 لأي طرف ⇒ نهاية فورية (تُسجَّل حالة فوز/تعادل حسب القاعدة العالمية). - تحديث الاستهداف بنهاية النافذة (A3)، وكسر التعادل: الأقرب، ثم الأقل HP، ثم ID أصغر.
- الموارد والتبريد: خصم الكلفة لحظة التفعيل، يبدأ التبريد فورًا، ولا تفعيل دون موارد، والتأثير لا يعمل إلا داخل نافذته.
- إخراج النتائج: نتيجة موحّدة (حالة، زمن الحسم، HP/MC نهائية)، جدول النوافذ مع السبب، وسجلّ أحداث مختصر (hits/heals/apply/expire/death/objective).
ملحوظة: المنهج حتمي بالكامل—لا توليد عشوائي—ومتسق مع أمثلة الفصل 9 التي سنستخدمها كاختبارات قبول عددي.
4) تفاصيل حسابية دقيقة
- التطبيق المكاني للـAoE مع السرب: إذا كان تأثير قدرة على
areaيعطي تعزيز/خفض للهجوم، يُوزَّع أثر الضرر الناتج فقط على min(N,M)\min(N,M)min(N,M) عند الحساب النهائي، بينما تأثيرات الـstats/aim/evaتُطبّق لكل هدف ضمن النطاق وفق نوافذها. - المقذوفات: لا ضرر قبل tarrt_{arr}tarr؛ بعد الوصول تُعامل الضربة وفق القواعد نفسها داخل نافذتها.
- الدروع/التخفيف:
resist[type]وmitigation_passiveوmitigateتضرب DPSDPSDPS بالترتيب كطبقات لاحقة لما قبل الضربة. - إيقاف فوري: إن حدثت ضربة متبادلة آنية تُسقط الطرفين معًا ⇒ تعادل آني وفق الشرط العالمي.
5) الاستهداف والسلوك (ملخص تنفيذي)
- الهرمية: قدرات نشطة > طوارئ > استراتيجية مسبقة > افتراضي؛ والقواعد المدعومة مذكورة صراحة (weakest_first, boss_first, nearest, lowest_hp, ranged_first, taunter_first).
6) بنية النتائج (Output Contract)
- result:
{ state: "win|lose|draw", t_decide, hp_final_by_side, mc_final_by_side }. (تطابق القاعدة العالمية للنهاية). - windows[]:
{ idx, t_start, t_end, reason, constants_snapshot }حيث اللقطة تتضمن قيم ATK/DEF_eff/m ورايات التأثيرات الجارية. - log[] (مختصر):
{ t, actor, target?, event_type, payload }(تضمّن: F_hit, DPS_raw, resist/mitigate, damage_final, HP_after…، وكذلك تعليمات AoE/Swarm).
7) الاستقرار العددي وحالات الحافة
- قيود:
- K>0K>0K>0، وقيود 0≤EVA,AIM≤10\le EVA,AIM\le10≤EVA,AIM≤1، والمقاومات ضمن [0,1][0,1][0,1].
- عندما projectile_speed=0projectile\_speed=0projectile_speed=0 مع rangem>0range_m>0rangem>0 ⇒ التأثير آني (تحذير واجهة).
- Δt صفري: إذا تشارك حدثان نفس الطابع الزمني، طبّق ترتيب: انتهاء النوافذ ← حصول الضربات المؤجلة (وصول مقذوف) ← بدء النوافذ الجديدة؛ ثم فحص شرط النهاية.
- TTK: لا يُستخدم إلا داخل نافذة ثابتة القيم؛ وإلا نرجع للتكامل على النوافذ.
8) اختبارات مرجعية (Acceptance Tests)
نعتمد أمثلة الفصل 9 حرفيًا ونقارن بقيمهم:
- 9.1 Kill Boss (فشل) — أرقام DEFeff,m,DPSDEF_{eff}, m, DPSDEFeff,m,DPS والتكامل حتى t=10t=10t=10 ثم الإكمال حتى TkillT_{kill}Tkill مقابل TdeathT_{death}Tdeath. يجب أن تُعيد: Tkill≈17.9258sT_{kill}\approx17.9258sTkill≈17.9258s, Tdeath≈16.6667sT_{death}\approx16.6667sTdeath≈16.6667s ⇒ فشل.
- 9.2 Survive 60s — يثبت الفشل دون تعديلات ويعرض سيناريوهات إنقاذ (رفع HHH, درع مؤقت, تقليل الطفرة).
- 9.3 Clear All (AoE+DoT+Swarm) — مع N0=2,λ=0.5,M=4N_0=2, \lambda=0.5, M=4N0=2,λ=0.5,M=4 والحسابات المعروضة يجب أن تنتهي قبل 20s.
- 9.4 تعادل آني — سقوط متزامن ⇒ تعادل.
9) معايير القبول لهذه المرحلة
- تطابق الخوارزمية مع A1/A2/A3/A4 (الترتيب، النوافذ، الاستهداف، الموارد) دون أي انحراف.
- احترام القاعدة العالمية للنهاية وهدف واحد للمعركة.
- دعم السرب وAoE وفق N(t)N(t)N(t) وMMM والتوزيع على min(N,M)\min(N,M)min(N,M).
- إعادة إنتاج الأمثلة العددية لقسم 9 ضمن هامش خطأ عددي صغير جدًا (≤1e−3 للقيم المستقرة).
المرحلة 7: المقذوفات ونوافذ الأحداث
ما الذي نبنيه هنا؟
مولِّد «الخطّ الزمني» الذي يقسم المعركة إلى نوافذ أحداث ثابتة القيم ويأخذ بالاعتبار:
- وصول المقذوفات (تأخير الأثر بـ tarr=rangem/projectile_speedt_{arr}=range_m / projectile\_speedtarr=rangem/projectile_speed).
- بدء/انتهاء نوافذ التأثيرات داخل القدرات
{start_s, duration_s}. - تغيّرات السرب (وصول/خروج) وحدّ الاشتباك MMM وتوزيع AoE على min(N(t),M)\min(N(t), M)min(N(t),M).
- تبدّل الهدف وفق هرميّة السلوك.
- القاعدة العالمية للنهاية (إيقاف فوري عند HP=0 لأي طرف).
1) تعريف «نافذة الحدث»
نافذة [ti,ti+1)[t_i, t_{i+1})[ti,ti+1) هي فترة تكون خلالها قيم الحساب (مثل ATK، DEFeffDEF_{eff}DEFeff، mmm، التفعيلات الجارية) ثابتة؛ نُجري التكامل الصحي داخلها ونوقف فور تحقّق الهدف أو شرط النهاية.
أسباب إنشاء/إنهاء نافذة:
- بداية/نهاية تأثير قدرة وفق نافذتها.
- لحظة وصول مقذوف (إن كان tarr>0t_{arr}>0tarr>0).
- تغيّر حالة السرب (زيادة N(t)N(t)N(t) بوصول فرد جديد أو خروجه) أو تجاوز حدّ الاشتباك MMM.
- تبدّل الهدف (بفعل طارئ/قدرة مثل Taunt أو قواعد الهرمية).
2) جدول ترتيب الأحداث المتزامنة (Tie-breaking @ نفس الطابع الزمني)
عند تساوي الطابع الزمني لعدّة أحداث، يُطبّق هذا الترتيب داخل الطابع نفسه:
- انتهاء نوافذ التأثيرات القائمة.
- وصول المقذوفات المؤجلة (يصبح الضرر/الأثر قابلًا للتطبيق).
- بدء نوافذ التأثيرات الجديدة.
- تحديث السرب (تغيير NNN وفق λ\lambdaλ) وتثبيت min(N,M)\min(N,M)min(N,M) لأغراض توزيع الـAoE.
- Resolve الاستهداف حسب الهرمية (قدرات نشطة > طوارئ > استراتيجية مسبقة > افتراضي)، وكسر التعادل: الأقرب ثم الأقل HP ثم ID أصغر.
- فحص شرط النهاية العالمي (إن هبطت HP لأي طرف إلى 0 ⇒ إيقاف فوري).
النتيجة: لا يحدث خلط حسابي؛ كل شيء يُرسَى قبل التكامل داخل النافذة التالية. والنهج كله «زمن مستمر بفترات ثابتة البارامترات».
3) خوارزمية توليد الخطّ الزمني (وصف تنفيذي)
المدخلات:
- BattleConfig (يحمل K، الهدف، البيئة)، لقطات كيانات الجانبين (stats/behavior/abilities/…)، وأي time_gates من البيئة.
الخطوات:
- جمع نقاط المرشّحات الزمنية:
- لكل Effect: أضف tstartt_{start}tstart وtend=tstart+durationt_{end}=t_{start}+durationtend=tstart+duration.
- لكل قذيفة: احسب tarr=rangem/projectile_speedt_{arr}=range_m/projectile\_speedtarr=rangem/projectile_speed إن كانت السرعة > 0.
- للسرب: أضف لحظات وصول/خروج الأفراد وفق λ\lambdaλ (أو تغيّرها إن كانت قطعة-قطعة) وحدّ MMM.
- للبيئة: time_gates أو zone triggers (إن وُجدت ضمن الـEnvironment).
- فرز النقاط تصاعديًا، ودمج المتطابقة (مع حفظ «أنواع» الأحداث لكل طابع).
- توليد النوافذ كسلسلة فترات [ti,ti+1)[t_i, t_{i+1})[ti,ti+1). لكل نافذة:
- طبّق حالة التأثيرات الجارية (داخل نوافذها)، واعتبر المقذوفات الواصلة فقط، وقِس min(N,M)\min(N,M)min(N,M) للأذى المساحي.
- ثبّت الهدف الحالي بعد حلّ الهرمية/الطوارئ.
- احسب ثوابت النافذة (ATK, DEFeffDEF_{eff}DEFeff, mmm, F_hit …) وسجّل لقطة constants_snapshot.
- نفّذ التكامل الصحي: ΔHP=(−DPS+HPS)⋅ΔtΔHP = (-DPS + HPS)\cdot ΔtΔHP=(−DPS+HPS)⋅Δt لكل كيان.
- فحص النهاية: إذا تحقّق شرط الهدف/النهاية ⇒ سجّل result وأوقف.
- الإخراج:
- windows[] بعلّة كل نافذة (ability_window / projectile_arrival / swarm_change / target_switch / objective_hit / death).
- log[] مختصر للأحداث داخل النوافذ (hits/heals/apply/expire/death/objective) مع الأرقام الفعلية بعد التخفيفات.
4) قواعد المقذوفات (Projectiles)
- إذا projectile_speed = 0 ⇒ الضربة «آنية» (لا تأخير).
- إذا projectile_speed > 0 ⇒ لا ضرر قبل tarrt_{arr}tarr؛ الأثر يبدأ في نافذة بعدها.
- يمكن لعدة قذائف الوصول في نفس اللحظة؛ تُعالَج وفق ترتيب الطابع الزمني المذكور أعلاه، ثم يُفحص شرط النهاية.
5) قواعد السرب وAoE
- نموذج السرب: N(t)=N0+⌊∫0tλ(τ) dτ⌋N(t)=N_0+\lfloor\int_0^t \lambda(\tau)\,d\tau\rfloorN(t)=N0+⌊∫0tλ(τ)dτ⌋ مع حدّ اشتباك MMM.
- توزيع AoE: يقسم الضرر على min(N(t),M)\min(N(t), M)min(N(t),M) داخل النافذة، بينما الضربة المفردة تتبع target_rule.
- قصّ النوافذ: كل تغيّر في NNN أو في min(N,M)\min(N,M)min(N,M) يفرض نقطة قطع جديدة.
6) الارتباط بترتيب العمليات
داخل كل نافذة، تطبيق الترتيب الملزِم:
حساب DEFeffDEF_{eff}DEFeff → اختراق الدفاع (إن وُجد) → mmm → F_hit (حتمي) → DPSrawDPS_{raw}DPSraw → مقاومات/تخفيفات (ضربيًا) → توزيع AoE (إن وجد).
7) تسجيل النتيجة والسجلّ (Output Contract)
- result: الحالة + زمن الحسم + HP/MC النهائية (تقارير تُقرّب إلى 3 منازل ووحدات s/m/m·s⁻¹).
- windows[]:
{ idx, t_start, t_end, reason, constants_snapshot }. - log[]:
{ t, actor, target?, event_type, payload }مع حقول مثل FhitF_{hit}Fhit، DPSrawDPS_{raw}DPSraw، resist/mitigate، الضرر الفعلي، HP_after…
8) حالات حافة مهمّة
- تزامن تسديدات تُسقط الطرفين ⇒ «تعادل آني» حسب الشرط العالمي.
- لا تتولّد أي نوافذ (خطأ إدخال مثل كل المدد = 0): تحذير واجهة «لا توجد نوافذ أحداث—تحقق من نوافذ التأثيرات». (متوافق مع تصميم الإدارة)
- Booster قصير جدًّا (نافذة 0.0–0.0): لا يُطبَّق إلا إن كانت حالة «لحظية» مبررة؛ وإلا يُرفض في التحقق. (متوافق مع المراحل السابقة)
9) معايير القبول لهذه المرحلة
- توليد نوافذ يغطي كل الأسباب المذكورة (قدرات/مقذوف/سرب/استهداف/بيئة) ويوقف فور تحقق الهدف/النهاية.
- احترام ترتيب أحداث الطابع الزمني الواحد كما فُصِّل أعلاه.
- تطبيق توزيع AoE على min(N,M)\min(N,M)min(N,M) داخل النافذة، والضربة المفردة وفق target_rule.
- توثيق constants_snapshot في كل نافذة (ATK/DEF_eff/m/F_hit/… ثابتة).
المرحلة 8: ترتيب الضربات والتطبيق الحتمي (Deterministic Hit)
1) جوهر «الضربة الحتمية»
- بدون RNG: عامل الإصابة ثابت لكل نافذة:
Fhit=clamp(AIM×(1−EVA),0,1)F_{hit} = \text{clamp}(AIM \times (1 – EVA), 0, 1)Fhit=clamp(AIM×(1−EVA),0,1). - سلسلة الاحتساب داخل النافذة (Order of Ops):
- حساب DEFeffDEF_{eff}DEFeff من DEFDEFDEF باستخدام KKK
- تطبيق penetrate_def (إن وُجد) قبل mmm
- m=ATKATK+DEFeffm = \frac{ATK}{ATK + DEF_{eff}}m=ATK+DEFeffATK
- تثبيت FhitF_{hit}Fhit
- ترتيب تأثيرات نفس المقياس: set → add → mul
- DPSraw=ATK×mDPS_{raw} = ATK \times mDPSraw=ATK×m
- طبقات ما بعد الضربة: resist[type] ثم mitigation_passive ثم mitigate (ضربيًا)
- إن وُجدت مقذوفات، يبدأ الأثر بعد tarrt_{arr}tarr
- مع السرب/AoE: قسّم على min(N(t),M)\min(N(t), M)min(N(t),M).
تتقيد هذه الخطوات بقاعدة «النوافذ الزمنية الثابتة» وتُستخدم داخل كل نافذة [ti,ti+1)[t_i,t_{i+1})[ti,ti+1).
2) تعريف كل عملية (op) وكيف تُطبَّق
جميع الـops تُقاس على «مسارات» affects معروفة (مثال:
attack.atk,stats.eva,resist.magic)، ضمن نافذة{start_s, duration_s}فقط.
- set
يثبت قيمة الحقل مباشرة داخل النافذة قبل أي add/mul على نفس الحقل. مثال:stats.eva set 0.12ثم إضافات/مضاعفات لاحقة. - add
جمع جبري فوق نتيجة set (إن وُجد)، مع السماح بالقيم السالبة لبعض الحقول (مثل تقليل EVA). مثال موثق:stats.eva add -0.06ضمن نافذة قدرة. - mul
مضاعف نسبي يُطبق آخرًا على نفس الحقل. مثال موثق: تعزيزattack.atk mul 1.20أو1.25ضمن نافذة قصيرة. - penetrate_def
يطبَّق قبل حساب mmm: يؤثر على الدفاع المُستخدم لاشتقاق DEFeffDEF_{eff}DEFeff ثم mmm. (المواصفة تنص أن اختراق الدفاع يسبق حساب معامل التخفيف). - mitigate
طبقة «بعد الضربة» تُطبَّق ضربيًا مع resist ثم mitigation_passive (بهذا الترتيب)، لتنتج DPSfinalDPS_{final}DPSfinal.
3) كيفية دمج الطبقات (قبل/بعد الضربة)
- قبل الضربة (pre-hit): كل ما يؤثر على ATK/DEF/AIM/EVA ومساراتها (بـ set/add/mul) + penetrate_def ثم حساب mmm وFhitF_{hit}Fhit وDPSrawDPS_{raw}DPSraw.
- بعد الضربة (post-hit): مقاومات النوع
resist[type]ثمmitigation_passiveثمmitigate→ ضرب متسلسل يخرج DPSfinalDPS_{final}DPSfinal.
4) مقذوفات ووقت الوصول
- لا ضرر قبل وصول المقذوف: يبدأ الأثر فقط بعد tarr=rangemprojectile_speedt_{arr} = \frac{range_m}{projectile\_speed}tarr=projectile_speedrangem إن كانت السرعة > 0.
- أمثلة جاهزة في الوثيقة تُظهر قدرات بمدى وسرعة (مثل Arc Bolt مع نافذة تعزيز قصيرة).
5) AoE مع السرب
- عند ضرب منطقة، قسّم ناتج الضرر على min(N(t),M)\min(N(t), M)min(N(t),M) داخل النافذة. الضربة المفردة ما تزال تتبع
target_rule.
6) أمثلة رقمية مصغّرة (داخل نافذة واحدة)
الهدف من الأمثلة: توحيد التفسير في الاختبارات، الأرقام مأخوذة من قواعد الوثيقة والأمثلة التوضيحية.
مثال A — تعزيز هجوم + خفض تفادي (Ground Shatter)
- تأثيران متزامنان في النافذة:
attack.atk mul 1.20 (0–0.7s)وstats.eva add -0.06 (0–4s). - التطبيق: اضبط EVA الجديدة (set→add→mul على EVA إن وُجدت)، ثم احسب FhitF_{hit}Fhit، ثم احسب mmm من DEFeffDEF_{eff}DEFeff فـ DPSrawDPS_{raw}DPSraw → طبقات ما بعد الضربة.
مثال B — اندفاعة سحرية قصيرة (Arc Bolt)
- تأثير:
attack.atk mul 1.25 (0–0.5s)+ مقذوف بسرعة 50 م/ث ومدى 16 م ⇒ tarr=0.32st_{arr}=0.32starr=0.32s. الأثر يبدأ عند 0.32s حتى 0.5s داخل النافذة المعزَّزة.
مثال C — طبقات ما بعد الضربة
- إذا كان
resist.magic = 0.10وmitigation_passive = 0.05وقدرة تُطبقmitigate = 0.20داخل النافذة، فإنّ:
DPSfinal=DPSraw×(1−0.10)×(1−0.05)×(1−0.20)DPS_{final} = DPS_{raw} \times (1-0.10) \times (1-0.05) \times (1-0.20)DPSfinal=DPSraw×(1−0.10)×(1−0.05)×(1−0.20). (الترتيب ضربي كما نصّت المواصفة).
7) قواعد التحقق الخاصة بالضربة الحتمية
- قيود القيم: 0≤AIM,EVA≤10 \le AIM, EVA \le 10≤AIM,EVA≤1؛ مقاومات النوع ضمن [0,1][0,1][0,1].
- نوافذ التأثيرات غير سالبة، وتعمل فقط داخل
{start_s, duration_s}؛ تُنشئ نقاط قطع زمنية للنوافذ. - لا K خارج الـConfig: يمنع أي محاولة لتضمين KKK في بطاقة كيان.
8) مخرجات مُوحَّدة للتتبّع (داخل الـLog/Windows)
- لكل نافذة: نسجّل constants_snapshot يتضمن ATK,DEFeff,m,FhitATK, DEF_{eff}, m, F_{hit}ATK,DEFeff,m,Fhit ورايات التأثيرات الفعالة.
- في log: أحداث
hit/heal/apply/expire/death/objectiveمع payload يحوي: FhitF_{hit}Fhit، DPSrawDPS_{raw}DPSraw، معاملات ما بعد الضربة المطبقة، الضرر الفعلي، وHP_after.
9) معايير القبول لهذه المرحلة
- التطبيق يطابق A1 حرفيًا (التسلسل، مواقع الاختراق، طبقات ما بعد الضربة، المقذوف، AoE).
- جميع الـops تعمل فقط داخل نوافذها الزمنية وبالمسارات المسموحة.
- F_hit حتمي ويُستخدم كما هو دون عشوائية.
- تسجيل لقطات ثابتة لكل نافذة مع أرقام واضحة لـ ATK,DEFeff,m,FhitATK, DEF_{eff}, m, F_{hit}ATK,DEFeff,m,Fhit.
المرحلة 9: محاكاة الأسراب وضرر المناطق (Swarm & AoE)
1) الهدف
تعريف سلوك «السرب» رياضيًا وبنيويًا ليعمل بانسجام مع نموذج «نوافذ الأحداث» وترتيب الضربة الحتمي، مع قواعد توزيع ضرر المناطق (AoE) وحدّ الاشتباك M، ودمج ذلك في النتائج (windows/log/result).
2) نموذج السرب (Mathematical Model)
- عدد الأفراد بمرور الزمن:
N(t)=N0+⌊∫0tλ(τ) dτ⌋−E(t)N(t) = N_0 + \left\lfloor \int_{0}^{t} \lambda(\tau)\, d\tau \right\rfloor – E(t)N(t)=N0+⌊∫0tλ(τ)dτ⌋−E(t)
حيث:- N0N_0N0: عدد البداية.
- λ(t)\lambda(t)λ(t): معدل انضمام (spawn) قطعـي (piecewise) أو ثابت.
- E(t)E(t)E(t): عدد الخارجين/القتلى حتى الزمن ttt (يُحدّث من التكامل الصحي في كل نافذة).
- حدّ الاشتباك MMM: أقصى عدد يمكن أن يتلقى/يصدر الضرر المتزامن من السرب (تمثّل «كم خصمًا فعّالًا يشتبك فعليًا الآن»).
أي تغيّر في NNN أو MMM أو min(N,M)\min(N,M)min(N,M) يُنشئ نقطة قطع في الخط الزمني (Window Boundary).
3) قواعد الاشتباك والتوزيع
3.1 الضربات المفردة (Single-target)
- تتبع قاعدة الاستهداف (target_rule) كالمعتاد؛ السرب لا يُغيّر القاعدة بل يوسّع «مجال الاختيار» ليكون من بين الأفراد النشطين فقط (حتى MMM إن كان له أثر).
3.2 ضرر المناطق (AoE)
- عند حدث ضرر منطقة بقيمة DAoED_{AoE}DAoE في نافذة مدتها Δt\Delta tΔt:
- احسب عدد المتأثرين: Kengage=min(N(t),M)K_{engage} = \min(N(t), M)Kengage=min(N(t),M).
- التوزيع بالتساوي: الضرر الفعلي لكل فرد متأثر:
Dper=DAoEKengageD_{per} = \frac{D_{AoE}}{K_{engage}}Dper=KengageDAoE (أو 000 إذا Kengage=0K_{engage}=0Kengage=0). - يطبّق لكل هدف مسار ما بعد الضربة (resist/mitigations) بحسب نوع الضرر لدى ذلك الهدف (قد تختلف مقاومات الأفراد).
- إذا احتاج التصميم «توزيعًا مرجّحًا»، يمكن لاحقًا إضافة أوزان (قرب/أولوية)؛ الافتراضي الآن توزيع متساوٍ.
3.3 تداخل AoE متعدد
- إذا تداخلت قدرات AoE في نفس النافذة:
- تُحسب كل قدرة مستقلّةً (قد تختلف مسارات post-hit)، ثم تُجمع التأثيرات على كل فرد.
- الترتيب داخل الطابع الزمني يحترم ترتيب «انتهاء النوافذ ← وصول المقذوفات ← بدء النوافذ» قبل التكامل الصحي.
4) إنشاء نقاط الزمن (Windows) الخاصة بالسرب
تُضاف إلى «قائمة المرشّحات الزمنية»:
- وصول أفراد جدد حسب تكامل λ\lambdaλ (أو جدول أزمنة محدد).
- انتهاء أفراد (عند موتهم داخل النافذة؛ ينعكس في نهاية النافذة التالية كنقطة قطع إن بدّل min(N,M)\min(N,M)min(N,M)).
- تغيّر MMM إذا أثّرَت قدرة/بيئة على حدّ الاشتباك (نادر، لكن مدعوم).
- تغيّر حالة منطقة (دخول/خروج مجموعة ضمن نطاق AoE بيئي شبه ثابت).
5) اندماج السرب مع بقية القواعد
- المقذوفات: لا يتلقّى الفرد ضررًا من القدرة ذات المقذوف قبل tarrt_{arr}tarr. إذا كانت AoE بمقذوف، تصل «المنطقة» مع المقذوف نفسه.
- الاستهداف: عند تغيير الهدف بسبب طارئ/Taunt، لا تُنشئ نقطة قطع إضافية إلا إذا أثّر ذلك في توزيع AoE (مثال: تغيير موضع/مجموعة ضمن النطاق).
- الترتيب داخل النافذة:
- حساب DEFeffDEF_{eff}DEFeff والـpenetrate_def
- mmm و FhitF_{hit}Fhit
- DPSrawDPS_{raw}DPSraw
- طبقات ما بعد الضربة
- توزيع AoE على KengageK_{engage}Kengage
- تكامل الصحة
- تحديث E(t)E(t)E(t) (الموتى) إن وُجدوا
6) أمثلة تنفيذية صغيرة (Within one window)
مثال 1 — AoE بسيط
- نافذة [ti,ti+1)[t_i,t_{i+1})[ti,ti+1) مدتها 1.0s1.0s1.0s، N=6N=6N=6, M=4M=4M=4 ⇒ Kengage=4K_{engage}=4Kengage=4.
- قدرة AoE تُنتج DAoE=400D_{AoE}=400DAoE=400 (بعد كل طبقات post-hit).
- لكل فرد متأثر: Dper=100D_{per}=100Dper=100.
- نفرضان فردين يملكان مقاومة نوعية أعلى؛ الضرر النهائي لكل فرد يُحسب مستقلًا حسب مقاومته.
مثال 2 — Spawn أثناء AoE
- عند t=0.3st=0.3st=0.3s: يصل فرد جديد ⇒ NNN من 3 إلى 4 وM=5M=5M=5.
- نقطة قطع عند 0.3s؛ في الجزء الأول Kengage=min(3,5)=3K_{engage}=\min(3,5)=3Kengage=min(3,5)=3، في الجزء الثاني Kengage=4K_{engage}=4Kengage=4.
- يعاد توزيع الضرر لكل جزء بمدته الخاصة (تكامل قطعي).
مثال 3 — Death يُقلِّص NNN
- خلال النافذة، سقط فردان بفعل الضرر المتراكم:
- نغلق النافذة عند لحظة الموت المتزامن/الأسبق (إن أثّر في KengageK_{engage}Kengage).
- النافذة التالية تُحسب بـ NnewN_{new}Nnew المُحدّث.
7) التحقق (Validation)
- مدخلات السرب:
enabledمنطقي،N0 ≥ 0,lambda_per_s ≥ 0, وM ≥ 1عند التمكين.
- اتساق الزمن: نقاط الانضمام/الخروج تقع ضمن المدة الإجمالية للمعركة؛ أي زمن ناقص يُرفض.
- سلامة التوزيع: عند Kengage=0K_{engage}=0Kengage=0 (لا أحد ضمن المدى/الاشتباك)، لا يُوزّع AoE (يبقى صفرًا).
- التداخل: لا يُسمح بتعريفَين متعارضين لنفس اللحظة (مثال: خروج ودخول نفس الفرد بنفس الـID في آن واحد).
8) الأداء وقابلية التوسع
- توليد نقاط الزمن يتم رياضيًا من λ\lambdaλ وΔN\Delta NΔN بدل Loop على كل «فرد» متخيل.
- تجميع الحسابات:
- نحسب طبقات ما قبل الضربة مرة واحدة لكل نافذة، ثم نطبّق تجميعًا vectorized لتوزيع AoE.
- الــlog يُسجّل أحداثًا مُلخّصة (مثل: “AoE hit x4 @ window #7”) مع إمكان تفعيل «تفصيل فردي» عند الحاجة (وضع تصحيح).
- تقسيم السجل (partitioning) بحسب
run_idلتسريع القراءة/الحذف.
9) مخرجات التقرير
- في windows:
reason="swarm_change"عند نقاط spawn/exit أو تغيّر KengageK_{engage}Kengage.constants_snapshotيضمّ NNN, MMM, KengageK_{engage}Kengage إلى جانب ATK/DEF_eff/m/F_hit…
- في log:
- أحداث
hit (AoE)معpayload:{ k_engage, d_aoe_total, d_per_before_resists, per_target_resists[], per_target_damage[], deaths[] }. - إن كانت الخصوصية مطلوبة/الأداء: نسجل ملخصًا (الإجمالي وعدد المتأثرين) مع خيار كتابة تفصيلي عند وضع التصحيح.
- أحداث
10) حالات الحافة المهمّة
- M=1M=1M=1: AoE يساوي عمليًا «ضرب فرد واحد في كل لحظة» (يتقلّب مع تغيّر الهدف/المسافة).
- λ=0\lambda=0λ=0 وN0=0N_0=0N0=0: سرب معطّل؛ لا تُنشأ نقاط زمن خاصة بالسرب.
- تعادل آني: إذا قسّم AoE ضررًا أنهى الطرفين معًا داخل نفس الطابع ⇒ تعادل وفق القاعدة العالمية.
- انفجارات قصيرة جدًا: نافذة AoE Δt→0\Delta t \rightarrow 0Δt→0 تُرفض إلا كمؤثر لحظي مبرَّر (متسق مع سياسات التحقق في المراحل السابقة).
11) معايير القبول لهذه المرحلة
- تنفيذ N(t)N(t)N(t) وMMM كما هو مذكور، وإنشاء نقاط قطع عندما تتغيّر min(N,M)\min(N,M)min(N,M).
- توزيع AoE بالتساوي على KengageK_{engage}Kengage داخل كل نافذة، مع احترام طبقات post-hit واختلاف مقاومات الأفراد.
- اندماج كامل مع «نوافذ الأحداث» (spawn/exit/تغيّر M/بوابات البيئة) وترتيب الطابع الزمني.
- إخراج واضح في windows/log لعدد المتأثرين، الضرر الإجمالي، الضرر للفرد، والوفيات الناتجة.
المرحلة 10: مُفسِّر السلوك والاستهداف (Behavior & Targeting Resolver)
1) الغرض
حلّ «مَن يهاجم مَن؟» بشكل حتمي داخل كل نافذة حدث، وفق الهرمية والقواعد المحدّدة في الوثيقة، مع كسر تعادل واضح، ودمج الطوارئ وTaunt و“الاستراتيجية المسبقة” مع القاعدة الافتراضية للكيان.
2) الهرمية الحاكمة (Priority)
ترتيب التطبيق داخل كل لحظة قرار (بداية نافذة أو عند حدث مؤثر على التهديف):
قدرات/تأثيرات نشطة (مثل Taunt) → طوارئ (emergency_rules) → استراتيجية مسبقة → القاعدة الافتراضية (target_rule). عند الحاجة، كسر التعادل: الأقرب ثم الأقل HP ثم ID أصغر.
3) تعريف القواعد المدعومة
weakest_first: اختيار الهدف صاحب أقل قدرة هجومية/دفاعية مُعرّفة في التصميم كـ“أضعف” (نوصي افتراضيًا بأقل hp_max أو DEF_eff وفق مرجعك؛ توثّق بالواجهة).boss_first: اختيار الكيان الموسوم “boss” (علامة في الـmeta/tags).nearest: أقل مسافة فعليّة (حسب range_m وسياق الاشتباك إن وُجد).lowest_hp: أقل HP لحظية.ranged_first: أولوية لكيانات ذات style بعيد (ranged/caster).taunter_first: إنْ وُجد Taunt مفروض من قدرة فعّالة يُجبِر الاستهداف.
هذه القواعد هي المجموعة الرسمية في المرجع.
ملحوظة: تعريف “boss” و“ranged” يُستمد من tags/style/meta في بطاقة الكيان طبق النموذج الموحّد.
4) متى نحلّ الاستهداف؟
نحلّ الاستهداف في بداية كل نافذة حدث [ti,ti+1)[t_i,t_{i+1})[ti,ti+1) وبعد ترتيب أحداث الطابع الزمني الواحد (انتهاء نوافذ ← وصول مقذوفات ← بدء نوافذ ← تحديث السرب)، ثم نثبّت الهدف للنافذة.
5) دمج الطوارئ (Emergency Rules)
كل قاعدة طوارئ تحوي: condition (مثال: self_hp_lte_pct, enemy_count_gte, time_lt_s …)، action (تبديل target_rule، تفعيل retreat/enable_kite، إلخ)، و until (شرط أو زمن إنهاء). إن طابقت condition ضمن الطابع الحالي، تُطبَّق قبل الاستراتيجية والقاعدة الافتراضية، وتستمر حتى until. أمثلة واضحة موجودة في بطاقات الأمثلة (Arcanist/Panic Shield، Rock Troll/Stone Rush).
6) Taunt وقدرات تغيّر الاستهداف
- إن كانت قدرة فعّالة تحمل Taunt أو تأثيرًا يفرض هدفًا معيّنًا، فهي أعلى الهرمية (تسبق الطوارئ).
- ينتهي أثرها بانتهاء نافذة التأثير (أو شرط القدرة)، ليعود المُفسِّر لتقييم الطوارئ ثم باقي المراتب.
7) تفاعل المُفسِّر مع السرب وAoE
- الضربة المفردة: يختار المُفسِّر هدفًا واحدًا من بين الأفراد النشطين (المتاحين) وفق الهرمية السابقة.
- ضرر المناطق (AoE): لا يحتاج اختيار هدف مفرد؛ لكنّ المُفسِّر يُثبّت مجموعة المتأثرين عبر Kengage=min(N(t),M)K_{engage}=\min(N(t), M)Kengage=min(N(t),M) لهذه النافذة، وتوزَّع الضربة بالتساوي كما صيغ في مرحلة السرب.
8) فضّ التعادل (Tie-breaking) — تفاصيل دقيقة
عند تساوي مرشحين بعد تطبيق القاعدة المختارة:
- الأقرب (مسافة أقل).
- الأقل HP لحظية.
- أصغر ID (حتمي لضمان تكرارية التجارب).
هذا يُطبّق بعد طبقات الهرمية، وقبل بداية التكامل الصحي للنافذة.
9) معايير “الأقرب” و“داخل المدى”
- يُعدّ الهدف “مُتاحًا” إن كان داخل نطاق التأثير وفق القدرة/السلاح (مثال: ضمن range_m أو داخل منطقة AoE تلك النافذة).
- إذا لم يوجد أي هدف متاح لنوع الضربة الحالية (مثال: جميع الأعداء خارج المدى لخبرة معيّنة)، تُسجّل النافذة بلا ضربات لذلك الفاعل. (ما يزال التكامل الصحي يجري لغيره كالمعتاد).
- projectile_speed > 0: لا أثر قبل الوصول tarr=rangemprojectile_speedt_{arr} = \tfrac{range_m}{projectile\_speed}tarr=projectile_speedrangem. المُفسِّر يختار الهدف للنافذة، لكن الضرر لن يحتسب قبل وصول المقذوف.
10) تفاعل المُفسِّر مع الموارد والتبريد
- لا تُفعَّل قدرة تغيّر
target_rule(أو تفرض Taunt) إلا إذا توافرت الموارد وضمن نافذتها زمنيًا، والتبريد يعمل بحسب A4. - إذا فشلت القدرة (لا موارد)، يتجاهلها المُفسِّر في تلك اللحظة ويهبط مباشرة إلى الطوارئ/الاستراتيجية/الافتراضي.
11) أمثلة تنفيذية صغيرة
مثال (أ): Taunt يعلو على الطوارئ
- كيانا العدو A وB، وكيان اللاعب يتعرض لـ Taunt من قدرة فعّالة على A.
- رغم أنّ الطوارئ على اللاعب تقول “ranged_first”، يُجبَر اللاعب على استهداف A حتى انتهاء نافذة الـTaunt (أو تحقق until).
مثال (ب): طارئ Stone Rush (للـRock Troll)
- condition:
enemy_count_gte: 3، action:target_rule=weakest_first، until:time_lt_s: 120. - عندما يصبح عدد أعداء اللاعب ≥3، يبدّل الاستهداف إلى “الأضعف أولًا” حتى زمن <120s. بعدها يعود إلى
lowest_hpالافتراضي. (من بطاقة المثال).
مثال (ج): Clear All مع AoE + Swarm
- في نافذة معيّنة: N=6,M=4N=6, M=4N=6,M=4 ⇒ Kengage=4K_{engage}=4Kengage=4. القدرة AoE لا تختار هدفًا واحدًا؛ المُفسِّر يثبّت الأربعة المتأثرين لهذه النافذة ويُوزّع الضرر عليهم. يتبدّل الاختيار عند تغيّر NNN أو MMM.
12) مخرجات المُفسِّر (ما يُسجَّل)
- في windows: إذا تغيّر الهدف أو تغيّر KengageK_{engage}Kengage بسبب السلوك ⇒
reason="target_switch"أوreason="swarm_change"مع constants_snapshot المحدث. - في log:
- حدث
applyعند بدء Taunt/قاعدة طوارئ، وexpireعند انتهائها؛ - أحداث
hitتُشير إلىtarget_idالحالي؛ - نحتفظ بحتميّة القرار عبر كسر التعادل المذكور (يُكتب في payload اختياريًا:
{ tie_break: "nearest→lowest_hp→id" }).
- حدث
13) التحقق (Validation)
- صحة emergency_rules: وجود name{ar,en}، وcondition/action/until بصيغة صحيحة. (يتوافق مع لزوم ثنائية اللغة لكل نص واجهاتي).
- target_rule يجب أن يكون ضمن المجموعة المدعومة وإلا يُرفض الحفظ.
- لا Taunt خارج نافذته؛ أي تأثير يفرض الاستهداف يعمل فقط ضمن
{start_s, duration_s}.
14) حالات الحافة
- لا يوجد هدف متاح (الجميع خارج المدى أو موت الخصوم): لا ضربات من هذا الفاعل في النافذة؛ يُتابَع حساب البيئة/الحلفاء؛ يُفحَص شرط النهاية كالمعتاد.
- تعادل آني: إذا أسفر تبديل الهدف/تراكب أحداث عن إسقاط الطرفين في نفس الطابع ⇒ تعادل وفق الشرط العالمي.
- تضارب طوارئ متعددة: تُرتَّب داخليًا حسب ترتيب ظهورها في البطاقة أو “الأشد تقييدًا أولًا” (موثّق في الواجهة)، ثم كسر التعادل القياسي.
15) معايير القبول لهذه المرحلة
- تطبيق الهرمية والـtie-break كما في المرجع حرفيًا، مع ثبات الهدف داخل النافذة الواحدة.
- دعم Taunt/الطوارئ والاستراتيجية والقاعدة الافتراضية، واحترام نوافذ التأثير والموارد/التبريد.
- تكامل كامل مع السرب وAoE، وتغيير مجموعة المتأثرين فقط عندما تتبدّل min(N,M)\min(N,M)min(N,M).
- تسجيل واضح للأسباب في windows/log (target_switch, swarm_change, apply/expire…).
المرحلة 11: إدارة الموارد والتبريد (Resources & Cooldowns Scheduler)
الهدف
وضع قواعد تشغيلية واضحة لكيفية تفعيل القدرات، خصم الكلفة، بدء التبريد، ومنع التفعيل عند نقص الموارد، مع ربط ذلك بنوافذ التأثيرات (windows) وسجلّ التشغيل (log) ونتائج المعركة—وفقًا للملحق A4 من المواصفة.
1) مبادئ مُلزِمة (من المرجع)
- خصم الكلفة لحظة التفعيل.
- التبريد يبدأ عند التفعيل.
- لا تفعيل دون موارد كافية.
- التأثيرات تعمل فقط داخل نافذتها
{start_s, duration_s}. - يحتفظ المحرك بترتيب العمليات العام (A1) ونموذج النوافذ (A2) وهرمية الاستهداف (A3).
2) تعريفات تشغيلية
- Attempt (محاولة تفعيل): قرار لحظي عند بداية نافذة أو عند حدث مؤثر، يتحقق من الشروط (الموارد/التبريد/النطاق…).
- Activate (تفعيل): نجاح المحاولة ⇒ خصم الكلفة فورًا + بدء تبريد القدرة + إدراج تأثيراتها في «مُرشّحات الزمن» لنوافذها.
- Fail (فشل التفعيل): لأي سبب (موارد غير كافية، تبريد نشط، خارج النطاق…) ⇒ لا خصم ولا تبريد.
3) جدولة القدرات (Scheduler) — خطوات كل «لحظة قرار»
تُنفَّذ هذه الخطوات بعد ترتيب أحداث الطابع الزمني الواحد وقبل تثبيت ثوابت النافذة:
- فلترة القدرات الجاهزة: قدرة «جاهزة» إذا لم تكن على تبريد ونافذتها الزمنية ستتقاطع مع النافذة الحالية (أو التالية القريبة) وكان اللاعب ضمن الشروط (النطاق، الهدف…).
- تحقق الموارد: قارن الكلفة مع رصيد الموارد (مثل
mana.mcأو غيره). إن لم تكفِ ⇒ «فشل». - التفعيل: عند النجاح ⇒
- خصم الكلفة فورًا من المخزون المناسب.
- بدء التبريد فورًا (تسجّل «جاهز عند t = الآن + cooldown_s»).
- إدراج التأثيرات: أضف
start_sوend_sإلى قائمة نقاط الزمن (سيؤدي ذلك لتوليد/قصّ النوافذ).
- عدم وجود نافذة فعّالة = لا تأثير: حتى إن تم التفعيل، أي تأثير يعمل فقط داخل نافذته
{start_s, duration_s}.
ملاحظة: القدرة قد تحمل أكثر من تأثير (effects[]) بفئات مختلفة (offensive/defensive/healing/buff) وكل منها يملك نافذته و
opالخاص.
4) تداخل القدرات والنوافذ
- تداخل نوافذ التأثيرات: عند تداخل تأثيرين على نفس المسار (affects)، يُحترم ترتيب set → add → mul داخل كل نافذة، كما في A1.
- قدرات متتابعة بنفس «الانفجار» القصير: مثال Arc Bolt (تعزيز قصير 0.5s) ⇒ يجب أن يصل المقذوف داخل تلك النافذة ليستفيد من التعزيز؛ وإلا لا أثر. (المقذوف يبدأ أثره بعد t_arr).
- قدرات دفاعية/درعية: مثل Arcane Barrier (نافذة 6s) تُسجَّل كنوافذ تأثير تضيف
mitigation_passiveضمن المدة.
5) دراسة حالات الموارد (Mana مثالًا)
- MC (Mana Capacity): سعة جماعية للمواجهة؛ MR (Regen R/sec): معدل الاستعادة/ث. (مسرد المصطلحات).
- الخصم عند التفعيل يُقلِّل الرصيد اللحظي؛ الاسترجاع (MR) يُضاف بشكل مستمر في التكامل الصحي للنافذة (ضمن H(t) للموارد، لا يغيّر المعركة إلا بتمكين تفعيل لاحق).
- منع الإفلاس: «لا تفعيل دون موارد كافية» قاعدة صريحة—لا اقتراض.
6) تفاعل الـScheduler مع الاستهداف والسرب
- الاستهداف (A3): قدرات تغيّر الاستهداف (Taunt مثلًا) تُقيَّم أولًا ضمن الهرمية—إذا فُعِّلت بنجاح (بموارد وتبريد) تُفرض على قرار الاستهداف لتلك النافذة حتى انتهاء نافذتها.
- السرب/AoE: تفعيل قدرة AoE يضيف نافذة تأثير «منطقة»؛ الضرر داخل كل نافذة يوزَّع على min(N,M)\min(N,M)min(N,M) كما ثُبِّت في المراحل السابقة.
7) سجلّ التشغيل (Logging)
- عند التفعيل الناجح: أضف حدث
applyفي log يتضمن{ ability_id, cost, cooldown_until, effects_windows[] }. - عند الانتهاء: أضف
expireمع ختم الزمن. - عند فشل التفعيل: أضف
noteيشرح السبب{ reason: "insufficient_resources|on_cooldown|out_of_range" }. - يبقى result/windows/log مطابقًا لصيغة المواصفة:
- result: الحالة + زمن الحسم + HP/MC النهائية،
- log: جدول النوافذ والقيم الفعالة والضرر/الشفاء التراكمي.
8) حالات حافة مهمّة
- نافذة تأثير مدتها 0: تُرفض إلا إذا صُمِّمت كـ«لقطة لحظية» مبرَّرة (متوافق مع سياسات التحقق السابقة).
- التفعيل المتكرر أثناء التبريد: يُرفض ويُسجّل سبب
on_cooldown. - المقذوف يصل بعد نهاية النافذة المعزِّزة: لا يستفيد من التعزيز—هذا متوقّع وصحيح (Arc Bolt مثالًا).
- نفاد الموارد بعد الخصم مباشرة: لا يمنع تأثير القدرة المُفعّلة؛ لكنه قد يمنع تفعيل قدرات لاحقة حتى يتجدّد الرصيد.
- أهداف خارج المدى: تُسجّل محاولة فاشلة
out_of_range؛ لا خصم ولا تبريد.
9) ربط بقاعدة البيانات (وفق المرحلة 2 — خيار الجداول المخصّصة)
- gates_abilities:
cooldown_s,cost_json(mana/stamina …),taunt, نصوص ar/en. - gates_effects:
window_start_s,window_duration_s,op,affects,target. - gates_run_log: أحداث
apply/expire/hit/heal/death/objective/noteمع حمولات (payload) مناسبة. - gates_run_windows: تُولَّد من نقاط
start/endلكل تأثير + وصول مقذوف + تغيّرات السرب/الاستهداف.
10) قبول/اختبارات (Acceptance)
يُعتمد النظام إذا تحققت كل البنود:
- عند التفعيل الناجح تُخصم الكلفة فورًا ويبدأ التبريد فورًا؛ الفشل لا يخصم ولا يبرد.
- التأثيرات تعمل حصريًا داخل
{start_s, duration_s}وتولّد نوافذ حدث مضبوطة. - قدرات «التعزيز القصير + مقذوف» لا تؤثر إلا إذا وصل المقذوف داخل نافذة التعزيز (Arc Bolt مثالًا).
- سجلّ التشغيل يُظهر
apply/expireللكلفة/التبريد، وresult/windows/log مطابق للمواصفة من حيث البُنى والوحدات والدقة. - يمنع النظام التفعيل عند نقص الموارد، ويتعامل مع تجدد الموارد لاحقًا لتمكين تفعيلات لاحقة—بدون أي «اقتراض».
المرحلة 12: التنفيذ، النتائج، وسجل المعركة (Output & Reporting Contract)
1) ما الذي نُخرجه بعد كل تشغيل؟
- result: خلاصة الحسم (فوز/خسارة/تعادل)، زمن الحسم، ملخص HP/MC.
- windows[]: تسلسل «نوافذ الأحداث» مع سبب كل نافذة ولقطة القيم الثابتة فيها.
- log[]: أحداث دقيقة داخل النوافذ (hit/heal/apply/expire/death/objective/note) مع الحمولات الحسابية الضرورية للتتبع.
الوحدات القياسية في العرض: ثوانٍ (s)، أمتار (m)، معدلات ·s⁻¹. التقريب الافتراضي: 3 منازل عشرية (العرض فقط؛ التخزين بدقة كاملة).
2) مخطط JSON رسمي (Contract)
2.1 result
{
"state": "win | lose | draw",
"t_decide_s": 17.926,
"objective": "kill_boss",
"hp_final_by_side": { "player": 1240.331, "enemy": 0.000 },
"mc_final_by_side": { "player": 18.500, "enemy": null },
"notes": "Instant KO on boss at t=17.926s"
}
- state يلتزم بالقاعدة العالمية (إيقاف فوري عند HP=0، مع إمكان التعادل الآني إذا سقط الطرفان معًا).
- objective نسخة مُجمّدة من الإعداد لحظة التشغيل.
- hp_final_by_side / mc_final_by_side إجماليات الجانب (وليس per-entity).
2.2 windows[]
عنصر واحد:
{
"idx": 7,
"t_start_s": 12.500,
"t_end_s": 13.200,
"reason": "projectile_arrival | ability_window | swarm_change | target_switch | objective_hit | death",
"constants_snapshot": {
"player": { "ATK": 320.0, "DEF_eff": 118.950, "m": 0.729, "F_hit": 0.840 },
"enemy": { "ATK": 210.0, "DEF_eff": 142.331, "m": 0.596, "F_hit": 0.700 },
"swarm": { "N": 6, "M": 4, "k_engage": 4 }
}
}
- constants_snapshot يثبت قيم النافذة: ATK/DEF_eff/m/F_hit… وبيانات السرب عند الحاجة.
- reason يعبّر عن سبب قصّ النافذة (وصول مقذوف، بدء/انتهاء تأثير، تبدل هدف، تغيّر السرب…).
2.3 log[] (مختصر وقابل للتفصيل)
حدث نموذجي:
{
"t_s": 12.640,
"window_idx": 7,
"actor": { "run_entity_id": 3, "side": "player" },
"target": { "run_entity_id": 9, "side": "enemy" },
"event_type": "hit | heal | apply | expire | death | objective | note",
"payload": {
"attack_kind": "melee | projectile | area",
"damage_type": "physical | magic | ...",
"pre_hit": {
"ATK": 336.0,
"DEF_eff": 118.950,
"m": 0.739,
"F_hit": 0.840,
"DPS_raw": 248.3
},
"post_hit": {
"resist": 0.10,
"mitigation_passive": 0.05,
"mitigate": 0.20,
"DPS_final": 168.8
},
"aoe": { "k_engage": 4, "d_aoe_total": 675.2, "d_per": 168.8 },
"hp_after": 412.775
}
}
- apply/expire تُسجّل عند تفعيل/انتهاء قدرات وتأثيرات ونوافذها.
- hit/heal تُظهر مسار ما قبل الضربة (pre_hit) ثم طبقات ما بعد الضربة (post_hit) وفق ترتيب A1.
- area/aoe عندما ينطبق، مع k_engage = min(N,M).
- death يُسجّل مع
{ victim_run_entity_id, side }ويتوافق مع نافذةreason="death"إن قصّت الزمن.
3) CSV/Excel Export (أعمدة قياسية)
3.1 windows.csv
idx,t_start_s,t_end_s,reason,player_ATK,player_DEF_eff,player_m,player_F_hit,
enemy_ATK,enemy_DEF_eff,enemy_m,enemy_F_hit,N,M,k_engage
- أعمدة swarm اختيارية تُملأ فقط عند تمكين السرب.
3.2 log.csv
t_s,window_idx,event_type,actor_id,actor_side,target_id,target_side,
attack_kind,damage_type,ATK,DEF_eff,m,F_hit,DPS_raw,
resist,mitigation_passive,mitigate,DPS_final,
k_engage,d_aoe_total,d_per,hp_after,note
- note نص حرّ مَثَلاً لأسباب فشل التفعيل
on_cooldown|insufficient_resources|out_of_range.
3.3 result.json / result.csv
- JSON كما في §2.1.
- CSV مبسط:
state,t_decide_s,objective,hp_player,hp_enemy,mc_player,mc_enemy
4) سياسة التقريب والدقّة
- العرض: تقريـب إلى 3 منازل عشرية في UI وCSV (يمكن تغييرها من Settings).
- التخزين: نحتفظ بالدقة الكاملة داخليًا (decimal/float) لضمان إعادة الحساب والتحليل.
- الوقت: كل الطوابع الزمنية بالثواني (s).
- الطاقة/الموارد: أرقام عشرية؛ الاسترجاع (MR) يُدمج تكامليًا داخل النافذة.
5) توافق المراحل السابقة (Traceability)
- النوافذ تُنشىء فقط عند (قدرات/مقذوف/سرب/تبدّل هدف/بيئة/موت). العرض يذكر reason لكل نافذة.
- pre_hit → post_hit يعكس ترتيب A1 (set→add→mul، ثم resist/mitigation_passive/mitigate).
- Taunt/طوارئ تظهر كـ
apply/expireوتؤثر فيreason="target_switch". - سرب/AoE تظهر حقول k_engage وd_aoe_total/d_per.
6) حالات الحافة في الإخراج
- تعادل آني: يسجَّل حدثان
deathفي نفس الطابع + result.state=”draw”. - لا نوافذ (خطأ إدخال): يعرض UI تنبيه «لا توجد نوافذ أحداث—تحقق من نوافذ التأثيرات»، مع log يضم
noteتشرح السبب. (متوافق مع إدارة phases السابقة) - مقذوف يصل خارج نافذة التعزيز: تُظهر نافذة الوصول
reason="projectile_arrival"لكن pre_hit يخلو من المضاعِف القصير؛ صحيح حسب المواصفة.
7) تصاميم واجهة العرض (Admin UI)
- صفحة Result:
- بطاقة الحالة: state + t_decide_s + objective.
- بطاقة موارد/صحة: HP/MC النهائية لكل جانب.
- أزرار: تصدير JSON, تصدير Windows CSV, تصدير Log CSV.
- جدول Windows (قابل للفرز بحسب t_start_s، والتصفية بالسبب).
- جدول Log مع فلاتر: by event_type / by actor / by window / hits only / deaths only.
- تلميحات سريعة تعرض pre_hit/post_hit عند تمرير المؤشر على صفّ hit.
8) الاستيراد/التصدير والتوافق
- Export:
result.json،windows.csv،log.csv، وملف Run Package (.zip) يضم الثلاثة +scenario_snapshot.json(config + entities snapshots).
- Import:
- استيراد Run Package للأرشفة/التحليل—لا يُعاد تشغيله تلقائيًا بل يُعرض للقراءة.
- Snapshot في
run_entitiesيضمن إعادة العرض حتى لو تغيّرت الكيانات لاحقًا. (مطابق للمرحلة 2 تصميم الجداول)
9) معايير القبول (Acceptance)
- يَنتُج عن كل تشغيل result/windows/log وفق المخطط أعلاه تمامًا، وبالوحدات والتقريب المحددين.
- كل نافذة تحمل reason واضحًا وconstants_snapshot صحيحة القيم.
- أحداث log منسّقة وتبيّن طبقات قبل/بعد الضربة وترابط AoE/Swarm حيث ينطبق.
- يدعم النظام تصدير JSON/CSV، والاستيراد للحزم لأغراض التحليل دون تعارض مع اللقطات.
- تتوافق الأرقام المعلنة مع الأمثلة العددية (الفصل 9) ضمن هامش خطأ ≤ 1e-3.
المرحلة 13: التحقق مقابل أمثلة الوثيقة (Reference Tests)
الهدف
تثبيت “حزمة اختبارات مرجعية” تعيد إنتاج أمثلة الوثيقة رقمياً (Kill Boss / Survive / Clear All / Draw…) وتتحقق من المطابقة الرقمية ضمن هامش خطأ محدد، مع لقطات (snapshots) لضمان إعادة العرض مستقبلًا.
1) مكوّنات حزمة الاختبار (Reference Test Pack)
- Scenario Snapshot: نسخة مجمّدة من
BattleConfig(يتضمن K والهدف والبيئة). - Entities Snapshots: بطاقات الكيانات المستخدمة كما هي (Hunter/Monster) مع
abilities/behavior/effects/swarm. - Test Matrix: ملف تعريف لكل حالة اختبار (id، الوصف، الهدف، أطراف القتال، أي تعديلات طفيفة مطلوبة، ومعايير النجاح).
- Expected Output: قيَم مرجعية مختصرة لكل حالة:
state،t_decide_s، مجاميعhp_final_by_side/mc_final_by_side.- نقاط تحقق داخلية (assertions) على نوافذ محددة أو أحداث محددة (مثل لحظة وصول مقذوف، أول وفاة، أول انقسام نافذة بسبب بوابة زمنية…).
جميع الملفات بالإنجليزية للمفاتيح وبالعربية/الإنجليزية لنصوص الواجهة، متوافقة مع مخطط المراحل السابقة.
2) حالات الاختبار الأساسية (Core)
- T-13.1 Kill Boss (فشل)
- الهدف:
kill_boss. - الترتيب المتوقع: العدو يقتل اللاعب أولًا (مثال:
T_death ≈ 16.6667sقبلT_kill). - النجاح =
state="lose"وزمن الحسم مطابق ضمن ±0.001s، مع سجلّ يظهر أول وفاة على العدو أو اللاعب حسب المواصفة.
- الهدف:
- T-13.2 Survive_T (نجاة زمنية)
- الهدف:
survive_TبقيمةT=60s. - متوقع: فشل/نجاة حسب الإعداد المرجعي؛ إن كانت النجاة، يجب ألا توجد أحداث وفاة على طرف اللاعب حتى t=60s، ويجب إنهاء التشغيل بـ
state="win".
- الهدف:
- T-13.3 Clear All (AoE + Swarm)
- الهدف:
clear_allمع سرب:N0,λ, وMمحددة. - متوقع: إنهاء قبل 20s في السيناريو القياسي مع تفعيل AoE؛ التحقق أن توزيع الضرر جرى على
k_engage = min(N, M)في النوافذ المعنية (وجودreason="swarm_change"عند تغيّر N أو k_engage).
- الهدف:
- T-13.4 تعادل آني (Instant Draw)
- إعدادات متقاربة تؤدي إلى سقوط الطرفين في نفس الطابع الزمني.
- متوقع: حدثان
deathمتزامنان، وstate="draw".
3) حالات تكميليّة (Supplementary)
- Proj-Boost Timing: قدرة بمضاعِف قصير + مقذوف (مثال: تعزيز 0.5s، سرعة 50 م/ث، مدى 16 م → وصول ≈ 0.32s).
- A) يصل المقذوف داخل نافذة التعزيز ⇒ ضرر معزّز.
- B) يصل بعد انتهاء النافذة ⇒ لا يستفيد من التعزيز.
- Mitigation Layers: تحقق طبقات ما بعد الضربة:
resistثمmitigation_passiveثمmitigate(ضرب متسلسل) بمثال عددي واضح. - Targeting Priority: Taunt يفرض الاستهداف رغم وجود قاعدة
ranged_firstفي الطوارئ؛ تحقق أحداثapply/expireوتبدّلreason="target_switch". - EVA/AIM Edge:
aim=0أوeva=1⇒F_hit=0، لا ضربات فعّالة في النوافذ.
4) صيغة ملف تعريف الاختبار (Test Case Descriptor)
{
"id": "T-13.3",
"title": { "ar": "تنظيف السرب", "en": "Clear All (Swarm+AoE)" },
"objective": "clear_all",
"battle_config_ref": "cfg_ref_001",
"sides": {
"player": [{ "entity_uid": "hunter_arcanist_t2p", "count": 1 }],
"enemy": [{ "entity_uid": "monster_bug_swarm_t1", "count": 1 }]
},
"tolerance": { "time_s": 0.001, "hp_abs": 0.01, "mc_abs": 0.01 },
"expected": {
"state": "win",
"t_decide_s": "< 20.0",
"assertions": [
{ "type": "window_reason_count", "reason": "swarm_change", "op": ">=", "value": 1 },
{ "type": "aoe_k_engage_track", "window_idx": "any", "op": "==", "value": "min(N,M)" }
]
}
}
5) آلية التحقق (Assertions)
- Result-Level:
- تطابق
stateبالضبط. t_decide_sضمن التحمّل (أو علاقات<,<=في الحالات الشرطية).- فروق HP/MC النهائية ضمن الحدود.
- تطابق
- Windows-Level:
- وجود نوافذ بأسباب محددة (arrival/ability_window/swarm_change/target_switch/death/objective_hit).
- constants_snapshot تحمل القيم المتوقعة (مثل وجود
k_engageمع السرب).
- Log-Level:
- أول
deathلطرف معيّن يحدث قبل/بعد علامة زمنية متوقعة. apply/expireمتسقة مع نوافذ التأثير.- تحقق ترتيب pre/post-hit (وجود
DPS_rawثمDPS_finalبعد الطبقات).
- أول
6) سياسة التحمّل (Tolerance Policy)
- الزمن: ±0.001s (أو أشدّ إن لزم).
- القيم المستمرة (HP/MC/DPS): فرق مطلق ≤ 0.01، ونسبـي ≤ 0.1% عند الأرقام الكبيرة.
- عدد النوافذ: يجب أن يتطابق أو يتفوق تفسيرنا بعدد أحداث إضافية مع الحفاظ على أسباب منطقية (لا تُقبل نوافذ “شبحية” بلا سبب).
7) التسمية والإصدارات
- حزمة v1: أمثلة الوثيقة كما هي (من دون أي “توازن” إضافي).
- كل تحديث (v1.0.1, v1.1…) يضم changelog يذكر ما تغيّر (K/قواعد/كيانات)، ويُثبت أرقامًا جديدة متى تغيّر النموذج عمدًا.
- أسماء حالات الاختبار ثابتة لسهولة الرجوع (T-13.1 .. T-13.4، إلخ).
8) تنظيم لوحة «Reference Tests» في لوحة التحكم
- جدول بالحالات (id، العنوان، آخر نتيجة، آخر زمن حسم).
- أزرار: تشغيل الكل | تشغيل المحدد | تصدير النتائج.
- أي حالة فاشلة تُظهر بطاقة اختلاف (diff) بين expected/actual:
- result: اختلاف state أو t_decide
- windows: نقص/زيادة في reasons
- log: فقدان حدث رئيسي (مثلاً غياب
projectile_arrivalالمتوقع).
9) معايير القبول (Acceptance)
- تشغيل الحزمة يُنتج state/t_decide/HP/MC المطابقة لكل حالة ضمن حدود التحمّل.
- نوافذ بأسباب صحيحة، مع constants_snapshot ذات معنى (ATK/DEF_eff/m/F_hit … و
k_engageحيث يلزم). - سجلّ يُبيّن ترتيب pre→post-hit وAoE/Swarm وTaunt/طوارئ عند الحالات المقابلة.
- إمكان تصدير نتائج جميع الاختبارات (JSON/CSV) وحزمة تشغيل واحدة قابلة للمراجعة لاحقًا (snapshots).
المرحلة 14: واجهة التشغيل الأمامية (Front-End Run UI)
هدفها تمكين المستخدم/اللاعب من تشغيل سيناريو جاهز واستعراض النتائج (result / windows / log) بأسلوب مبسّط، ثنائي اللغة، ومطابق تمامًا لعقود الإخراج التي ثبّتْناها.
1) نطاق الواجهة
- صفحة عامة يمكن إدراجها كـ Shortcode
[gates_battle_run]أو صفحة مخصّصة. - اللغة: زر تبديل
العربية | Englishينعكس على كل النصوص والوحدات (الاتجاه RTL/LTR تلقائي). - لا إعدادات توازن داخل هذه الصفحة (K أو غيره) — الإعدادات تأتي من Battle Config المعتمَدة.
2) تخطيط الشاشة (UX)
- Hero / Banner
- عنوان السيناريو + وصف مختصر (ar/en) + اختيار Battle Config من قائمة جاهزة للنشر.
- حقول اختيار جانبي القتال (Player/Enemy) من مكتبة كيانات «مُعلَّمة للنشر» مع عدّاد العدد لكل كيان (إن لزم).
- زر تشغيل المعركة (Run).
- لوحة النتيجة (Result Card)
- حالة الحسم (فوز/خسارة/تعادل) + زمن الحسم (t_decide_s).
- ملخص HP/MC النهائية لكل جانب.
- أزرار: تصدير result.json، نسخ البيانات.
- نوافذ الأحداث (Windows)
- جدول مبسّط:
#،t_start_s،t_end_s، السبب (projectile_arrival / ability_window / swarm_change / target_switch / death / objective_hit). - عند النقر على أي صف: يعرض constants_snapshot (ATK/DEF_eff/m/F_hit/…، وN/M/k_engage عند السرب).
- فلاتر: حسب السبب، مدى زمني، أو جانب معيّن.
- جدول مبسّط:
- سجل المعركة (Log)
- جدول: الزمن
t_s،event_type(hit/heal/apply/expire/death/objective/note)، الفاعل→الهدف (إن وُجد)، وملخص payload. - تمرير الفأرة على hit/heal يعرض pre_hit وpost_hit (DPS_raw ثم معاملات ما بعد الضربة ثم DPS_final).
- فلاتر سريعة: «hits فقط»، «الوفيات فقط»، «حسب الفاعل/الهدف»، «حسب نافذة #».
- جدول: الزمن
- التنزيلات (Exports)
- windows.csv، log.csv، Run Package (.zip) تتضمن result.json + windows.csv + log.csv + scenario_snapshot.json.
3) تدفّق الاستخدام
- يختار المستخدم Config والكيانات → ضغط Run → الواجهة تستدعي نقطة تشغيل (REST) → تُعرض النتائج فورًا في البطاقات.
- لا إعادة تشغيل تلقائي عند تغيير اللغة؛ التبديل يغيّر النصوص فقط.
4) رسائل واجهة جاهزة (عربي/إنجليزي)
- تم التنفيذ: «تم تنفيذ المعركة» / “Run executed.”
- لا نوافذ: «لا توجد نوافذ أحداث—تحقق من نوافذ التأثيرات.» / “No event windows—check effects’ windows.”
- فشل تشغيل (مدخلات ناقصة): «اختر إعداد معركة وجانبَيْ قتال.» / “Select a battle config and both sides.”
5) اعتبارات الوصول والأداء
- جداول كبيرة (logs) بترقيم صفحات + بحث فوري.
- إمكانية طيّ (collapse) أقسام التفاصيل.
- كل الأرقام تُعرض بثلاث منازل عشرية (قابلة للتغيير من Settings الإدارية).
المرحلة 15: الأداء، الجودة، والتعبئة (Performance & Packaging)
نُغلق المواصفة بمسلّمات الإنتاج، اختبارات الضغط، وأسلوب تسليم الإضافة.
1) الأداء (Back-End)
- Partitioning لجدول
gates_run_logحسبrun_idلتسريع القراءة والحذف. - Indices عمليّة:
gates_entities: (type)، (style)، (role)، (rank_band, rank_mod)gates_effects: (ability_id)، (target, affects)، (op)gates_run_log: (run_id)، (window_id, t_s)، (event_type, t_s)
- Snapshots في
gates_run_entitiesلضمان إعادة العرض حتى لو تغيّرت البطاقات لاحقًا. - Generator للنوافذ يعمل على أحداث مجمّعة (نقاط start/end، وصول مقذوف، تغيّر N/M) بدل التكرار على «أفراد» تخيّليين.
2) الأداء (Front-End)
- ترقيم صفحات في windows/log، وتحميل كسول (lazy) لصفوف السجل.
- ضغط (gzip) وcaching على استجابات REST الكبيرة.
- «وضع خفيف» يعرض الملخص فقط للهواتف.
3) الجودة والاختبارات
- Reference Tests من المرحلة 13 تُشكّل «قبولًا آليًا» قبل أي إصدار.
- Unit Tests للمُفسّر، نوافذ الأحداث، وترتيب العمليات (set→add→mul ثم طبقات ما بعد الضربة).
- Property Tests لحواف مثل AIM=0/EVA=1، projectile_speed=0، نافذة تأثير قصيرة، سرب بمعدّل λ=0، تعادل آني.
4) الأمان والسلامة
- ترميز وإزالة وسوم HTML من حقول النص.
- تحقّق JSON صارم للبيانات المرفوعة (Import).
- صلاحيات (Capabilities): Admin/Designer/Analyst كما حدّدنا سابقًا.
- Nonces & capability checks في REST endpoints.
5) الاستيراد/التصدير
- Export/Import JSON للكيانات وConfigs وحِزم التشغيل.
- Dry-run Validator يُظهر الأخطاء قبل الإدخال.
- توافق إصدارات عبر
schema_versionوحقلmeta.version.
6) التوثيق والمساعدة
- صفحة Help داخل الإضافة:
- شرح المعادلات الأساسية (DEF_eff، m، F_hit…)،
- شرح النوافذ وأسبابها (ability_window / projectile_arrival / swarm_change / target_switch / death / objective_hit)،
- أمثلة إدخال للقدرات (effects: set/add/mul/penetrate_def/mitigate، windows {start_s,duration_s})،
- سياسة السرب وAoE (k_engage = min(N,M))،
- كيفية قراءة result/windows/log.
7) خطط التطوير لاحقًا (Nice-to-have)
- مُحسّن بصري للخطّ الزمني (Timeline Visualization).
- محرّك معاينة «What-if» سريع لتعديل رقم واحد (مثلاً K أو ATK كاختبار) دون حفظ دائم.
- دعم تصفية/تجميع إحصائي (متوسط DPS، زمن أول وفاة، …) عبر عدة Runs.
8) التعبئة والتوزيع
- bundle باسم
gates-battle-sim/مع هيكل WordPress قياسي. - مُثبّت «جداول مخصّصة» (dbDelta) مع فحص إصدار المخطط.
- مُولّد «نماذج أمثلة» (Entities + Config + Reference Tests) يمكن تفعيله اختياريًا بعد التثبيت.
- سجل تغييرات (CHANGELOG) وإصدار Semantic Versioning.
المواصفة الشاملة النهائية (نسخة موحّدة بدون تناقض)
الإصدار: 1.0 • التاريخ: 2025-10-13
✅ التزام لغوي إلزامي: أي نص يظهر للاعب يجب أن يملك صيغتين:
arوen.
⚠️ تنبيه توازُن: ثوابت الموازنة (مثلK) تُعرَّف في إعدادات المعركة العامة (Battle Config) وليست جزءًا من بطاقات الكيانات.
🔴 تنبيه توثيقي دائم: أي مثال رقمي داخل هذه المواصفة يجب أن يُحسب حصريًا وفق المعادلات الواردة هنا. تُمنع الأمثلة السردية غير المحسوبة داخل المرجع.
1) النطاق والغاية
وثيقة مرجعية موحَّدة: القواعد العامة، المعادلات، هرمية الاستهداف والسلوك، تصنيف القدرات، النموذج الموحّد للكيان (Hunter/Monster) ثنائي اللغة، محاكاة الأسراب، وأمثلة حسابية صارمة. لا تعتمد على tick؛ الحسابات زمنية مستمرة بفترات ثابتة البارامترات.
2) إعدادات المعركة العامة (Battle Config)
K: ثابت موازنة لتحويل الدفاع (DEF) إلى دفاع فعّال (DEF_{eff}). مثال قياسي: 200.time_origin: مرجع الزمن ((t=0)).objective: هدف المعركة (واحد فقط):kill_boss|survive_T|clear_all…win_condition: الشرط العالمي: تنتهي المعركة فور وصول (HP) لأي طرف إلى 0؛ الباقي فائز، والتساوي تعادل آني.environment(اختياري): عوامل ساحة (تضاريس، ضرر بيئي مستمر، عتبات زمنية…).
مهم: لا تُكرر
Kداخل بطاقات الكيانات.
3) قواعد الأهداف والنهاية
- هدف واحد فقط لكل معركة.
- الشرط العالمي للنهاية: عند (HP=0) لأي طرف ⇒ نهاية فورية.
- في الأهداف الزمنية (مثل النجاة (T) ثانية): إذا مات اللاعب قبل (T) ⇒ فشل فوري.
- النجاح يُعلن عند تحقق الهدف واللاعب حي في لحظة التحقق.
4) المعادلات (زمن مستمر، بلا tick)
تحويل الدفاع (لوغاريتمي):
[
DEF_{eff} = K\cdot\ln\Big(1 + \frac{DEF}{K}\Big)
]
معامل التخفيف:
[
m = \frac{ATK}{ATK + DEF_{eff}}
]
ضرر/ثانية (نموذج مستمر):
[
DPS(t) = ATK(t)\cdot m(t)
]
إذا كان السلاح يعتمد المعدل
RATE، يمكن نمذجته داخل (ATK) أو كعامل خارجي وفق التصميم.
تطور الصحة:
[
\frac{dHP}{dt} = -D(t) + H(t) \Rightarrow HP(t) = HP_0 – \int D(t)\,dt + \int H(t)\,dt
]
زمن القتل لفترة ثابتة:
[
TTK = \frac{HP_\text{rem}}{DPS}
]
زمن وصول المقذوف:
[
t_{arr} = \frac{\text{range_m}}{\text{projectile_speed}}
]
تقسيم الفترات: تُقسّم المعركة إلى فترات يكون فيها (ATK, DEF) (وبالتالي (DPS)) ثابتة؛ نُجمع/نُكامل على الفترات.
5) هرمية السلوك والاستهداف
1) القدرات/التأثيرات النشطة (مثل Taunt) — أعلى أولوية.
2) قواعد الطوارئ في بطاقة الكيان.
3) الاستراتيجية المختارة قبل القتال (إن وُجدت).
4) قاعدة الاستهداف الافتراضية في بطاقة الكيان.
قواعد مدعومة: weakest_first, boss_first, nearest, lowest_hp, ranged_first, taunter_first.
6) تصنيف القدرات (Categories) + Ops
- هجومية (offensive)، دفاعية (defensive)، علاجية (healing)، تعزيزية (buff).
- نافذة زمنية:
{start_s, duration_s}داخل القدرة. - المعاملات (ops):
mul,add,set,penetrate_def,mitigate.
7) النموذج الموحَّد للكيان (Hunter/Monster)
المفاتيح برمجياً بالإنجليزية، وكل نص واجهاتي ثنائي اللغة
{ar,en}. لا ثوابت توازن داخل البطاقة.7.1 مثال — Hunter (caster)
{
"id": "hunter_arcanist_t2p",
"type": "hunter",
"name": { "ar": "صيّاد الأرْكَنة", "en": "Arcanist Hunter" },
"title": { "ar": "مُقذِف القُوَى", "en": "Weaver of Forces" },
"family": { "ar": "بشر", "en": "Humans" },
"species": { "ar": "بشري", "en": "Human" },
"rank": { "band": "B", "mod": "+", "label": { "ar": "الرتبة B+", "en": "Rank B+" } },
"style": "caster",
"role": "mage",
"tags": [ "human", "magic_user", "ranged" ],
"stats": {
"hp_max": 2100,
"atk": 520,
"def": 120,
"HPS": 1.6,
"rate": 1.0,
"range_m": 16.0,
"projectile_speed": 50.0,
"damage_type": "magic",
"eva": 0.10,
"aim": 0.88,
"resist": { "physical": 0.00, "magic": 0.10, "fire": 0.00, "cold": 0.05, "poison": 0.00 },
"mitigation_passive": 0.00,
"regen_hps": 0.0,
"mana": { "mc": 120.0, "mr": 4.0 }
},
"behavior": {
"target_rule": "boss_first",
"emergency_rules": [
{
"name": { "ar": "درع الطوارئ", "en": "Panic Shield" },
"condition": { "self_hp_lte_pct": 0.25 },
"action": { "target_rule": "nearest", "retreat": true, "enable_kite": true },
"until": { "self_hp_gt_pct": 0.40 }
}
]
},
"abilities": [
{
"name": { "ar": "قذيفة قوسية", "en": "Arc Bolt" },
"category": "offensive",
"cooldown_s": 4,
"cost": { "mana": 8.0, "stamina": 0.0 },
"effects": [
{ "target": "enemy", "affects": "attack.atk", "op": "mul", "value": 1.25, "window": { "start_s": 0, "duration_s": 0.5 } }
],
"taunt": false,
"notes": { "ar": "اندفاعة سحرية قصيرة", "en": "Short magical burst" }
},
{
"name": { "ar": "حاجز أركي", "en": "Arcane Barrier" },
"category": "buff",
"cooldown_s": 18,
"cost": { "mana": 15.0, "stamina": 0.0 },
"effects": [
{ "target": "self", "affects": "stats.mitigation_passive", "op": "add", "value": 0.18, "window": { "start_s": 0, "duration_s": 6 } }
],
"taunt": false,
"notes": { "ar": "يقلّل الضرر مؤقتًا", "en": "Temporarily reduces incoming damage" }
}
],
"ui": { "short_desc": { "ar": "صيّاد ساحر بعيد المدى", "en": "Long-range arcane hunter" },
"lore": { "ar": "يُتقن هندسة المانا لفرض السيطرة.", "en": "Harnesses mana to control the field." } },
"meta": { "version": "FIXED", "author": "design" }
}
7.2 مثال — Monster (غير سحري؛ MC/MR=0)
{
"id": "monster_rock_troll_t3",
"type": "monster",
"name": { "ar": "ترول الصخر", "en": "Rock Troll" },
"title": { "ar": "ساحق الجروف", "en": "Cliff Crusher" },
"family": { "ar": "عمالقة", "en": "Giants" },
"species": { "ar": "ترول حجري", "en": "Rock Troll" },
"rank": { "band": "A", "mod": "base", "label": { "ar": "الرتبة A", "en": "Rank A" } },
"style": "melee",
"role": "monster_generic",
"tags": [ "ground", "brute", "rock" ],
"stats": {
"hp_max": 6400,
"atk": 780,
"def": 100,
"HPS": 0.9,
"rate": 1.0,
"range_m": 2.2,
"projectile_speed": 0.0,
"damage_type": "physical",
"eva": 0.05,
"aim": 0.80,
"resist": { "physical": 0.10, "magic": 0.00, "fire": 0.00, "cold": 0.05, "poison": 0.00 },
"mitigation_passive": 0.05,
"regen_hps": 0.0,
"mana": { "mc": 0.0, "mr": 0.0 }
},
"behavior": {
"target_rule": "lowest_hp",
"emergency_rules": [
{
"name": { "ar": "اندفاع حجري", "en": "Stone Rush" },
"condition": { "enemy_count_gte": 3 },
"action": { "target_rule": "weakest_first" },
"until": { "time_lt_s": 120 }
}
]
},
"abilities": [
{
"name": { "ar": "هزّة أرضية", "en": "Ground Shatter" },
"category": "offensive",
"cooldown_s": 10,
"cost": { "mana": 0.0, "stamina": 0.0 },
"effects": [
{ "target": "area", "affects": "attack.atk", "op": "mul", "value": 1.20, "window": { "start_s": 0, "duration_s": 0.7 } },
{ "target": "enemy", "affects": "stats.eva", "op": "add", "value": -0.06, "window": { "start_s": 0, "duration_s": 4 } }
],
"taunt": false,
"notes": { "ar": "ضربة ارتجاجية تقلّل التفادي", "en": "Tremor hit that lowers evasion" }
}
],
"ui": { "short_desc": { "ar": "مهاجم ثقيل عنيد", "en": "Stubborn heavy striker" },
"lore": { "ar": "ينحت مساره عبر الصخر والخصوم.", "en": "Carves through rock and foes alike." } },
"meta": { "version": "FIXED", "author": "design" }
}
8) محاكاة الأسراب (Swarm Modeling)
المعاملات العامة: enabled, N0, معدل الوصول (\lambda) (عدو/ث)، (N(t) = N0 + \lfloor \int_0^t \lambda(\tau)\,d\tau \rfloor)، حد الاشتباك (M).
التوزيع: AoE يوزَّع على (\min(N(t), M)). الضربة المفردة تتبع target_rule.
لا tick: نقسّم الزمن إلى فترات بين وصولَيْن/تبدّل حالة، ونحسب تكاملاً تحليليًا في كل فترة.
9) أمثلة حسابية صارمة
9.1 Kill Boss (فشل)
المعطيات: (HP_b(0)=12000)، فترات: [0,4] (ATK=700)؛ [4,10] (ATK=900)؛ (>10) (ATK=700). (DEF_b=150), (K=200). على اللاعب 180 DPS وارد، (HP_p=3000).
الحساب: (DEF_{eff}=200\ln(1.75)=111.9232)، (m_1=0.8621506) ⇒ (DPS_1=603.5054)، (m_2=0.8893956) ⇒ (DPS_2=800.4560). حتى (t=10): (7216.7578). (HP_b(10)=4783.2422). بعد ذلك: (\Delta t=7.9258) ⇒ (T_{kill}=17.9258)s. (T_{death}=16.6667)s ⇒ ❌ فشل.
9.2 Survive 60s (تحليل جدوى)
المعطيات: (HP_p(0)=2600)، 120 DPS أساسي + 300 DPS ضمن [20,30]s، تجدد (H=6).
النتيجة: يفشل البقاء دون تعديل (مثلاً رفع (H) إلى ≥20 أو درع ≥0.7 لمدة 6s أثناء الطفرة أو تقليل الطفرة ≤220 DPS).
9.3 Clear All مع AoE+DoT+Swarm (نجاح مختصر)
(N0=2, \lambda=0.5, M=4, HP_{mob}=1200). لاعب: (ATK=600, DEF_{mob}=100, K=200 ⇒ DEF_{eff}=81.093, m=0.8810 ⇒ DPS_{total}=528.6). DoT +30 ضمن [5,15]s. الحسم قبل 20s ⇒ ✅ نجاح.
9.4 تعادل آني
ضربة متبادلة آنية تجعل (HP) للطرفين =0 بنفس اللحظة ⇒ تعادل وفق الشرط العالمي.
10) مسرد المصطلحات (عربي / English)
| الرمز / الحقل | العربي | English | الوصف |
|---|---|---|---|
MC | سعة المانا | Mana Capacity | سقف المانا داخل المواجهة |
MR | تجدّد/ثانية | Mana Regen (R/sec) | معدل استعادة المانا |
band | شريحة الرتبة | Rank Band | E → D → C → B → A → S → SS → SSS |
mod | معامل الرتبة | Rank Mod | base / + / ++ |
style | أسلوب القتال | Combat Style | melee/ranged/caster/hybrid/support |
role | الدور القتالي | Role | fighter/archer/mage/… |
rate | معدل الضرب | Attack Rate | أفعال/ثانية |
range_m | المدى (م) | Range (m) | مسافة التأثير |
projectile_speed | سرعة المقذوف | Projectile Speed | م/ث |
damage_type | نوع الضرر | Damage Type | physical/magic/fire/… |
eva | تفادي | Evasion | 0..1 |
aim | دقّة | Aim | 0..1 |
mitigation_passive | تخفيف ثابت | Passive Mitigation | 0..1 |
resist.* | مقاومات نوعية | Elemental/Type Resist | 0..1 |
target_rule | قاعدة الاستهداف | Target Rule | weakest_first/… |
swarm | سرب | Swarm | N0, λ, M… |
| HPS | عدد الضربات في الثانية | Hit per Second | 2 اي كل ضربة فيها نصف الهجوم |
الملحق: Appendix — Implementation v1.0 (ملزِم)
A1) ترتيب العمليات (Order of Ops)
1) حساب (DEF_{eff}) من (DEF) باستخدام (K).
2) اختراق الدفاع penetrate_def (إن وُجد) يُطبق قبل حساب (m).
3) (m = \frac{ATK}{ATK + DEF_{eff}}).
4) عامل الإصابة الحتمي (لا RNG): (F_{hit} = \text{clamp}(AIM\times(1-EVA),0,1)).
5) ترتيب تأثيرات نفس المقياس: set → add → mul.
6) (DPS_{raw} = ATK\times m).
7) تخفيفات ما بعد الضرب: resist[type] وmitigation_passive وmitigate تُطبَّق ضربيًا على (DPS).
8) المقذوفات: يبدأ التأثير بعد (t_{arr}) إن كان >0.
9) AoE مع السرب: تقسيم على (\min(N(t),M)).
A2) نوافذ الأحداث (Event Windows)
نبني خطًّا زمنيًا من النوافذ حيث القيم ثابتة (قدرة تبدأ/تنتهي، وصول مقذوف، دخول/خروج عدو في السرب، تبدّل هدف…). نكامل (D(t)) و(H(t)) داخل النافذة ونوقف فور تحقق شرط النهاية أو الهدف.
A3) Resolve الاستهداف
أولوية: قدرات نشطة > طوارئ > استراتيجية مسبقة > افتراضي. كسر التعادل: الأقرب ثم الأقل HP ثم ID أصغر.
A4) الموارد والتبريد
- خصم الكلفة لحظة التفعيل.
- التبريد يبدأ عند التفعيل.
- لا تفعيل دون موارد كافية.
- التأثيرات تعمل فقط ضمن نافذتها
{start_s, duration_s}.
A5) الدقة والمخرجات
- الحسابات float64، التقارير تُقرب إلى 3 منازل.
- الوحدات: s / m / m·s⁻¹.
- واجهة النتيجة:
- result: الحالة (فوز/خسارة/تعادل) + زمن الحسم + HP/MC النهائية.
- log: جدول نوافذ يبين الأسباب والقيم الفعالة والضرر/الشفاء التراكمي.
— انتهت الوثيقة —