Undertale In Extremis
TeX

Undertale In Extremis

مشروع لتنظيم الحاسوب (Organização de Computadores). محاكي معركة RPG بلغة التجميع Risc-V يشبه لعبة Undertale.

مشروع جامعي (ORG 2026.1). محاكي معارك RPG ومحرك مونت كارلو مكتوب بالكامل بلغة التجميع RISC-V.

الإعداد

قمت ببناء محرك معارك RPG من الصفر بلغة التجميع الخام RISC-V. كان الهدف هو كتابة ثلاث آلات حالة ذكاء اصطناعي متميزة، ووضعها في محاكٍ بدون واجهة رسومية، وتشغيل 10,000 مباراة آلية لمعرفة أي استراتيجية ستتفوق.

تدور المعارك حول اقتصاد حركة صارم. نقاط السحر (MP) تتجدد ببطء، ولكن يمكن شحنها بشكل زائد باستخدام مهارات محددة.

المهارة التكلفة ما تفعله
هجوم مجاني ترمي نردًا ذا 20 وجهًا. < 10 يخطئ، 10+ يصيب، 20 ضربة قاضية لضعف الضرر.
دفاع مجاني يمنع الضرر الوارد. الرميات العالية تؤدي إلى هجوم مضاد.
صمود مطلق 20 نقطة سحر يتجاوز النرد لضمان ضربة قاضية مؤكدة.
امتصاص الروح مجاني المهاجم يتلقى 1–12 ضررًا ارتداديًا، ويمتص نفس المقدار من نقاط سحر العدو، ويكتسب 4 أضعافها لنفسه. الطريقة الوحيدة لتجاوز حد 100 نقطة سحر.
إعدام نهائي 150 نقطة سحر قنبلة ضرر بنسبة 800%. تفشل إذا كان الهدف فوق 50% من نقاط الحياة.
درع المرآة 30 نقطة سحر يعكس الهجوم التالي الوارد إلى المهاجم.

المتنافسون

كتبت ثلاثة روبوتات، لكل منها عقل مختلف تمامًا:

Flowey (الفوضى): RNG خالص. لا يقيم أي شيء ويقوم فقط برمي رقم عشوائي لاختيار حركته التالية.

decision_random:
  li a0, 6
  call randomizer  # يختار رقمًا بين 1 و6، هذه هي الاستراتيجية بأكملها
  j decision_end

Chara (المجتهدة): تحسن التوصل إلى توليفة واحدة: تستخدم امتصاص الروح بشكل متكرر حتى تصل إلى 150 نقطة سحر، ثم تخفض حياة العدو إلى أقل من 50%، وتستخدم الإعدام النهائي. في الكود، الاستراتيجية تسمى أيضًا ذكية، لكنها ليست كذلك تمامًا.

decision_smart:
  # eu escrevi essa estrategia
  # ela se consiste em usar roubo de alma até poder usar execute
  # só que pra isso também precisamos sobreviver e diminuir a vida do inimigo pra 50%
  # sem morrer
  ...
  li t6, 150        # preço do execute
  blt t4, t6, decision_smart_my_mana_is_low   # mp < 150? go farm
  bge a2, t6, decision_smart_enemy_hp_high    # enemy hp > 50? go bully
  j decision_smart_i_can_kill                 # otherwise, execute

decision_smart_my_mana_is_low:
  li a0, 4  # soul suck
decision_smart_enemy_hp_high:
  li a0, 2  # absolute grit
decision_smart_i_can_kill:
  li a0, 5  # final execution

Toby (المضاد القوي): بُني خصيصًا لاستغلال Chara. يراقب نقاط حياته هو ونقاط سحر العدو. إذا كان تحت 50 نقطة حياة والعدو يمتلك 150 نقطة سحر، يرفع درع المرآة ويترك القنبلة ترتد. خارج هذه النافذة، يخلط بين الهجمات وامتصاص الروح، ويمكنه أيضًا إطلاق الإعدام النهائي بنفسه عندما تتوفر الظروف.

decision_troll_checks:
  li t6, 50
  ble t5, t6, decision_troll_check_enemy_mp  # am I low enough to worry?
  j decision_troll_not_execute
decision_troll_check_enemy_mp:
  li t6, 150
  bge a3, t6, decision_troll_prepare_against_execute  # is enemy close to 150 mp?
  j decision_troll_not_execute
decision_troll_prepare_against_execute:
  li a0, 6  # mirror shield
  ret

نتائج القياس

بعد تشغيل 10,000 مباراة على Terminal باستخدام rars.jar، الجرة من محاكي RISC-V القائم على Java RARS، جاءت النتائج.

الشخصية نسبة الفوز
Flowey ~52%
Toby ~29%
Chara ~17%

أغبى ذكاء اصطناعي فاز بالأغلبية المطلقة من المباريات.

نسبة فوز Chara البالغة 17% تكشف المشكلة في التوليفات الصارمة والجشعة. للوصول إلى 150 نقطة سحر، عليها تحمل ضرر ارتدادي من امتصاص الروح. غالبًا، يرفع Toby درعه، ويجبرها سكريبت Chara على الاستمرار في استنزاف صحتها حتى تقتل نفسها حرفيًا قبل أن تتمكن من إطلاق مهارتها النهائية.

نسبة Toby البالغة 29% تأتي من استدراج Chara بنجاح. ضد Flowey، الأمر مختلف: شرط الدرع يتطلب أن يكون العدو قريبًا من 150 نقطة سحر، وFlowey لا يبني نحو ذلك عمدًا أبدًا. لا يتم تفعيل المضاد أبدًا، لذا يلعب Toby لعبته الافتراضية من الهجوم وامتصاص الروح، مما لا يمنحه أي ميزة حقيقية على الفوضى.

فاز Flowey بنسبة 52% من الوقت لأنه لا توجد استراتيجية يمكن مواجهتها بشكل متسق. لا يتحمل ضررًا ارتداديًا لمحاولة تنفيذ حركة ضخمة؛他只是 يرمي حركات عالية القيمة بالصدفة. اتضح أنه إذا كان كودك بالكامل يعتمد على توقع سلوك العدو، فإنك تخسر تلقائيًا أمام عدو يفعل أشياء بدون سبب.

هل هذا مفاجئ حقًا؟

على الأرجح لا. هيمنة الوكلاء العشوائيين على الوكلاء الحتميين هي نتيجة موثقة جيدًا في محاكاة الاستراتيجيات.

محاكاة Citadel التي صادفتها في مجموعة دراسة أنتجت نفس النمط: بعض الاستراتيجيات تهزم العشوائي باستمرار، وبعضها يُهزم به، وبعضها يهزم خصومًا معينين لكنه يخسر أمام آخرين. ديناميكية حجر-ورقة-مقص كانت موجودة، لكن العشوائي ظل صامدًا أمام معظمها.

الفرق هو أنه في بيئة أكثر ثراءً (استراتيجيات أكثر، متغيرات قرار أكثر، طرق أكثر لوكيل ذكي لاستغلال وكيل عشوائي)، تميل النتائج إلى التشتت أكثر. يمكن لاستراتيجية حتمية مضبوطة جيدًا أن تحقق ميزة موثوقة إذا كانت مساحة الحركة تمنحها ما يكفي للعمل به.

هنا، على الأرجح لا. مع ستة إجراءات محتملة فقط ونظام معارك حيث يمكن لضربة قاضية محظوظة واحدة أن تنهي المباراة بغض النظر عن الاستراتيجية، فإن الفجوة بين تخطيط Chara الدقيق وضغط Flowey العشوائي على الأزرار ليست واسعة جدًا. تتطلب توليفة Chara عدة أدوار من الإعداد، وRNG لديه فرصة كبيرة لقتلها قبل أن تصل إلى هناك. قد تكون مساحة الحركة ببساطة صغيرة جدًا ومتقلبة جدًا لاستراتيجية جشعة لتتفوق باستمرار على الفوضى.

بعبارة أخرى: فوز Flowey هو أقل من كونه اكتشافًا وأكثر من كونه قيدًا في التصميم. كانت Chara الأذكى ستحتاج إلى لعبة أذكى لإثبات نفسها.

لماذا هذه الأرقام ليست موثوقة تمامًا

قبل استخلاص النتائج من القياس، هناك بعض التحيزات الهيكلية التي تستحق الاعتراف بها.

المباريات ليست معزولة. يحصل كلا اللاعبين على استراتيجية معينة عشوائيًا في كل مباراة، مما يعني أن معدلات الفوز هي إجماليات عبر جميع الاقترانات الممكنة، وليست إحصائيات 1v1 نظيفة. نسبة Flowey 52% تتضمن مباريات حيث قاتل Flowey Flowey آخر، وفي تلك المباريات كان على أحدهما الفوز. لمعرفة ما إذا كانت Chara تهزم Toby أو إذا كان Flowey يهزم الجميع بالتساوي، ستحتاج إلى تثبيت المباراة وتشغيل كل اقتران بشكل منفصل.

ترتيب الأدوار لا يتم تدويره أبدًا. اللاعب 1 يتحرك دائمًا أولاً. في نظام حيث يمكن لضربة قاضية واحدة أن تنهي المباراة، فإن التحرك أولاً هو ميزة حقيقية. النتائج لا تأخذ هذا في الاعتبار على الإطلاق.

RNG هو xorshift مخصص يتم تغذيته من وقت النظام. يعمل بشكل جيد بما يكفي لمشروع جامعي، لكنه ليس مولدًا مُتحققًا منه إحصائيًا. إذا كان توزيع المخرجات غير متساوٍ عبر الإجراءات الستة المحتملة، فإن نتائج Flowey تتأثر بشكل مباشر لأن استراتيجيته بأكملها هي مجرد استدعاء تلك الدالة.

مساحة الحركة صغيرة جدًا. ستة إجراءات محتملة تعني أن أي استراتيجية لديها مجال محدود لتمييز نفسها عن الفوضى. في نظام أعمق، قد يكون من الصعب مقاطعة توليفة Chara، أو قد تكون هناك خيارات استرداد تقلل من تكلفة إعدادها. هنا، اللعبة عقابية بما يكفي لدرجة أن ضررها الارتدادي غالبًا ما ينهي الجولة قبل وصول المكافأة.

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

النتائج مثيرة للاهتمام من حيث الاتجاه ولكن يجب قراءتها كلقطة لهذا التكوين المحدد، وليس كبيان عام حول الاستراتيجية مقابل العشوائية.

أبحاث مستقبلية

الخطوة الواضحة التالية هي الابتعاد عن RARS تمامًا. هذا الإصدار يعمل على محاكي RISC-V قائم على Java، مما يضع سقفًا صلبًا على سرعة المحاكاة. إصدار ثانٍ يستهدف RISC-V مُجمَّعًا حقيقيًا مع استدعاءات نظام Linux بدلاً من استدعاءات RARS ecalls يجب أن يكون أسرع بشكل كبير، وهذا مهم جدًا بمجرد أن يبدأ عدد المباريات في الارتفاع إلى الملايين.

ما وراء الأداء، الاتجاهات الأكثر إثارة للاهتمام هي على جانب التصميم:

المزيد من اللاعبين في كل مباراة. الآن هي دائمًا 1v1. إضافة مشارك ثالث أو رابع يغير المشهد الاستراتيجي تمامًا. فجأة، يجب على الاستراتيجية المضادة أن تأخذ في الاعتبار التعرض للهجوم من اتجاهين في وقت واحد، وتصبح العشوائية الخالصة أكثر صعوبة في الاستمرار.

التعلم الآلي داخل لغة التجميع. الفكرة هي تنفيذ خوارزمية تعلم آلي ضئيلة مباشرة في RISC-V، باستخدام عمليات المصفوفات للسماح لروبوت بتحديث أوزانه بناءً على نتائج المباراة. لا مكتبات خارجية، لا بيئة تشغيل عالية المستوى، فقط عمليات مصفوفات أعداد صحيحة في السجلات. ما إذا كان هذا عمليًا أم مجرد ألم مثير للتنفيذ هو جزء من الجاذبية.

المزيد من الاستراتيجيات ومحرك أعمق. مساحة الحركة الحالية صغيرة جدًا لأي استراتيجية لتتقدم بشكل ملحوظ على العشوائي. أخذ إلهام أكثر مباشرة من World of Warcraft (فترات التهدئة، مقايضات الموارد، تأثيرات التموضع، تفاعلات مهارات أكثر تنوعًا) سيعطي الاستراتيجيات المصممة جيدًا مساحة فعلية لإثبات نفسها على الفوضى.

البنية التحتية للقياس موجودة بالفعل. عنق الزجاجة هو أن تكون اللعبة عميقة بما يكفي لجعل النتائج ذات معنى.

تشغيلها

لتجميع لغة التجميع وتشغيل المحرك محليًا:

make simulate