ديسكورس فوترز 🧙

واو، إضافة جديدة! :tada: هذه الإضافة أقل جدية قليلاً. :video_game:

Discourse Frotz


\u003csup\u003eلم يعد من الضروري ذكر البوت (@mention) في كل خطوة. بمجرد بدء اللعب، ما عليك سوى الرد عليه.

مستودع Git: GitHub - merefield/discourse-frotz: A plugin that uses Frotz to give you an interactive fiction experience on your Discourse forum · GitHub

ما هي هذه الإضافة؟

إنها ‘بوت’ يتيح لك لعب القصص التفاعلية (أي ألعاب المغامرات النصية الكلاسيكية) على منتدى Discourse الخاص بك، وهي في الأساس أداة ربط لمفسر Z-machine القياسي والمذهل المسمى ‘frotz’ الموجود في David Griffith / frotz · GitLab

كيفية الاستخدام

تضيف الإعدادات لعبتين، ويمكنك إضافة المزيد من خلال الإعدادات.

تحتوي كل إدخال على عنوان واسم ملف القصة.

لبدء التفاعل، تحتاج إلى ذكر البوت المحدد في الإعدادات (@mention). بعد ذلك، يكفي الرد على منشور من منشورات البوت.

للعرض قائمة بالألعاب المتاحة، يجب عليك أولاً ذكر البوت وطرح السؤال التالي:

@mybot list games

سيظهر لك هذا مجموعة الخيارات المتاحة.

لبدء لعبة، اكتب:

start game x مع استبدال x برقم الخيار.

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

لمتابعة لعبة قائمة، اكتب:

continue game x مع استبدال x برقم الخيار.

ملاحظة: إعادة البناء الكاملة ستدمر جميع ملفات الحفظ. هذا حل وسط ضروري.

كيف ألعب لعبة قصص تفاعلية (IF)؟

كثير من “الميتات” (Meta’s) نشأوا مع هذه الألعاب. لأولئك الأقل دراية بها، تحقق من هذه ورقة الغش: Play Some Interactive Fiction

الإعداد

إنشاء مستخدم البوت

(عذراً، أتمتة هذا الإجراء مدرجة في قائمتي!)

في جلسة SSH، أدخل الحاوية الخاصة بك وافتح وحدة تحكم Rails:

\n./launcher enter app\nrails c\n\n

ثم قم بما يلي:

\nu = User.create!(username: "Frotz", name: "FrotzBot", id:-5, email: "not@really.valid")\nu.activate\n\n

سيصبح البوت الجديد متاحاً للإعداد من خلال واجهة المستخدم. انتقل إلى إعدادات المستخدم في الواجهة عبر زر المسؤول وقم بإيقاف جميع عمليات الإرسال عبر البريد الإلكتروني. قم بتحديث الصورة الرمزية حسب رغبتك.

تثبيت Discourse Frotz

تحديث ملف app.yml الخاص بك

هذا الإجراء أكثر تدخلاً من الإضافات المعتادة.

أضف التالي إلى ملف app.yml:

\nhooks:\n after_code:\n - exec:\n cd: $home\n cmd:\n - git clone https://gitlab.com/DavidGriffith/frotz\n - exec:\n cd: $home/frotz\n cmd:\n - make dfrotz\n - exec:\n cd: $home/frotz\n cmd:\n - mkdir savegames\n - exec:\n cd: $home/frotz\n cmd:\n - mkdir stories\n - exec:\n cd: $home/frotz/stories\n cmd:\n - wget -O zork1.z3 https://eblong.com/infocom/gamefiles/zork1-r119-s880429.z3\n - exec:\n cd: $home/frotz/stories\n cmd:\n - wget --no-check-certificate http://www.douglasadams.com/creations/hhgg.z3\n - exec:\n cd: $home/plugins\n cmd:\n - git clone https://github.com/merefield/discourse-frotz\n\n

قبل إدخالات الإضافات الأخرى الخاصة بك.

ستحتاج أيضاً إلى إضافة إضافة Discourse BBCode!!

أعد البناء باستخدام الأمر المعتاد ./launcher rebuild app

الآن انتقل إلى إعدادات الإضافة واختر مستخدم البوت الذي أضفته سابقاً:

image

القصص

ستلاحظ أنني أضفت بضع قصص. يمكنك العثور على المزيد في https://ifdb.tads.org/.
ومع ذلك، انتبه لحدود المعدل هنا! قد يؤدي الحصول على عدد كبير جداً من القصص من نفس الموقع إلى حدوث خطأ.

لاحظ أيضاً أن القصص ليست مستضافة على خوادم محمية بـ HTTPS (توت توت).

إذا أصررت على تحميل المزيد، أضفها إلى ملف app.yml. يمكنك أيضاً إضافتها يدوياً من موجه الأوامر، لكن اعلم أن هذه ستُحذف عند إعادة البناء الكاملة التالية.

تمكين FrotzBot للرسائل الخاصة (يُنصح بالحذر)

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

image
الافتراضي: OFF

إذا لم يكن البوت مفعلًا هناك، فسيحصل المستخدم على رسالة مهذبة:

تقييد FrotzBot حسب الفئة

يمكنك تقييد البوت على (قائمة) فئة لتجنب ملء المناطق الأخرى:

اختصارات لوحة المفاتيح!

هذا أمر بالغ الأهمية لتحسين تجربة “اللعب”. وفي الواقع، ما عليك سوى تذكر اختصارين:

  • \u003ckbd\u003eShift\u003c/kbd\u003e-\u003ckbd\u003eR\u003c/kbd\u003e للرد على البوت

  • \u003ckbd\u003eCtrl\u003c/kbd\u003e-\u003ckbd\u003eEnter\u003c/kbd\u003e لتقديم حركتك التالية

القيود والاعتبارات

لا يتم دعم جميع صيغ القصص والألعاب بعد، ومن غير المرجح أن يتم دعمها. هناك العديد من الألعاب التي لا تعمل بسبب طبيعة بروتوكولات الاستدعاء والاستجابة الخاصة بها. وبسبب الطريقة التي نتفاعل بها عبر المنشورات، يجب أن نطلب من Frotz حفظ الحالة بعد كل حركة. إذا لم تؤدي إحدى خطوات اللعبة إلى موجه يمكن للنظام عندها الحفظ (مع تجاهل موجهات “اضغط أي مفتاح” أو “المزيد” التي يجب معالجتها)، فلن تعمل القصة. على سبيل المثال، في لعبة “Act of Murder” (لعبة رائعة!)، تسأل السيدة عند الباب عما إذا كنت شرطيًا. للأسف، هذه حالة في اللعبة لا يمكن حفظها، وبالتالي تفشل في هذا الشرط، ولا أرى طريقة لجعل ذلك يعمل.

ملاحظة: وضع قائمة البريد الإلكتروني هو كارثة مع هذا، لذا تأكد من عدم استخدامه قبل محاولة استخدام هذه الإضافة!

يمكن القول إنها تهدر موارد المنتدى قليلاً لأنها تتطلب منشورين على الأقل لكل “حركة”. من الواضح أنه غالباً ما يكون أكثر ملاءمة للعب هذه الأنواع من الألعاب باستخدام واجهة دردشة بدلاً من منتدى، لكن يمكنك القول إن هذا يمكن استخدامه لإنشاء أدلة الحل (Walkthroughs)؟ :wink:

لحل أقل تدخلاً، ضع في اعتبارك: Turning a topic into interactive fiction ;)

التعليقات

كل التعليقات موضع ترحيب!

الاعتمادات

تستغل هذه الإضافة David Griffith / frotz · GitLab وهو مفسر Z الخاص بـ Frotz والذي يتم نسخه وإنشاؤه بواسطة برنامج الإعداد.

شكراً لـ @P16 على السماح لي باستخدام مقتطفات من كود لبوت دردشة مغلق المصدر عملنا عليه معاً.

45 إعجابًا

واو، عدت مرة أخرى!

ميزات جديدة

تفعيل FrotzBot للرسائل الخاصة (على مسؤوليتك! ;))

يسمح للمستخدمين باللعب بشكل خاص، لكن الاستخدام سيكون أقل شفافية. إذا كان لديك خادم كبير بما يكفي، فقد لا يكون هذا مشكلة بالنسبة لك.

image
الافتراضي: مغلق

إذا لم يكن (هو/هي) مفعّلاً هناك، فسيحصل المستخدم على رسالة مهذبة:

تقييد قائمة فئات معينة، أو السماح بالكل:


الافتراضي: مفتوح لجميع الفئات

10 إعجابات

مرحبًا روبرت! شكرًا لك، أعجبني هذا الملحق حقًا!
لقد حاولت تثبيته في بيئة التطوير (بدون Docker)، وطلب نظامي مكتبة ncursesw عند بناء dfrotz. بعد تثبيتها، عملت بشكل صحيح. هل سيكون الأمر كذلك في بيئة الإنتاج باستخدام Docker؟

إعجاب واحد (1)

اختبرت على بيئة الإنتاج، وبناء التطبيق باستخدام Docker (إلى فاجأتي) عمل مباشرة دون مشاكل. لا تتردد في النشر على بيئة إنتاج وأخبرني بالنتيجة.

سعيد لأنك أعجبك الأمر!!

إعجابَين (2)

بالنسبة لأولئك مثلي، الذين قد يفقدون القليل من شعرهم بسبب ذلك:

hhgg.z3,9,7,3
هذا يعني:

  story_header_lines = 9
  story_load_lines = 7
  story_save_lines = 3

والآن، كيف نكيّف ذلك… :sweat_smile:، إنها مغامرة داخل مغامرة…!

إعجاب واحد (1)

أعمل حاليًا مع صانع Frotz لمعرفة ما إذا كان بإمكاننا الاستغناء عنها. إنها نهج نقلته من restful-Frotz لكنه ليس مثاليًا تمامًا :slight_smile:

إعجاب واحد (1)

نعم! وجدتها!
kheper.z8,20,15,4 تعمل تقريبًا
لهذا الموقع:

:smiley:

لا شيء جوهري، لكن هناك شيء غريب

) إظهار نوع السطر معطل
وضع الضغط: أقصى، وإخفاء 0 أسطر من الأعلى

يُعرض مرة واحدة بواسطة Pause() مع

[Pause notNeeded;
@read_char 1 notNeeded;
rtrue;
];

إعجاب واحد (1)

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

حاليًا، تركيزي ينصب على:

  1. تبسيط الكود
  2. جعل الكود أكثر أمانًا
  3. إضافة التنسيق حيث يكون ذلك عمليًا.

المهمة رقم 3 صعبة بشكل مدهش.

إعجاب واحد (1)

لقد دفعت بعض التحسينات إلى فرع الميزة:

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

يتطلب هذا الفرع تثبيت إضافة BBCode الرسمية.

ما زلت أختبرها. لا تتردد في تجربتها أيضًا.

سأقوم على الأرجح بالدمج بعد بعض التجارب المهمة.

إعجاب واحد (1)

هل يحتاج الإضافة إلى استنساخ مستودع frotz بالكامل أم يكفي وجود $home/frotz/dfrotz؟ لأنني أفضل تجميعه مرة واحدة فقط وحفظ الملف التنفيذي بين عمليات إعادة البناء.

لست متأكدًا من سبب اهتمامك بذلك؟ الموارد التي نتحدث عنها صغيرة نسبيًا (6 ميجابايت للمستودع بأكمله بعد عملية البناء مقابل غيغابايتات للمنتدى؟). يقوم باستنساخ المستودع بالكامل، ثم يبني dfrotz فقط. ربما يكون ذلك مضيعةً قليلاً، لكنني أعتقد أن البساطة والقدرة على التكرار أكثر أهمية. يمكنني الدخول في تفاصيل أكثر وإجراء استنساخ متفرق، لكن ذلك سيجعل سكريبت البناء أكثر تعقيدًا وأقل متانة. هل يستحق ذلك؟ لا تتردد في اقتراح تحسين. يتم البناء كله داخل الحاوية، لذا سيتم تنظيفه كلما تم تنظيف الحاوية.

أنا أحاول فقط التحسين لسيرفي الصغير، ولا أطلب منك تغيير التثبيت العام.

إعجاب واحد (1)

هذا إضافة رائعة حقًا! هذا يذكرني بلعبة كمبيوتر “كلاسيكية” تم إنشاؤها منذ سنوات (نسيت اسمها).

3 إعجابات

إنها اقتراح رائع لتحسين مستقبلي إذا تمكنت من إبقائه بسيطًا وقويًا. شكرًا لك!

إعجاب واحد (1)

نعم، هناك العديد من الكلاسيكيات القابلة للعب. المزيد عبر الرابط في المنشور الأصلي.

إعجابَين (2)

تحديث كبير: :tada: :kiwi_fruit:

(استغرق هذا شهورًا من العمل الخلفي المتقطع والتنسيق مع فريق Frotz).

تقديم تنسيق الألوان الكامل والنص أحادي المسافة للقصص

يأتي هذا التحديث الكبير مع مجموعة من التحسينات:

  • أُضِيف دعم تنسيق الألوان والنص أحادي المسافة
  • تحسّنت الإعدادات المبسّطة: لم تعد تتطلب معاينة الرأس والتذييل، بل فقط العنوان المطلوب وملف القصة، هورا!
  • تحسّنت استخدامات مكتبة Open3 gem لأوامر النظام، مما يقلل من خطر الإساءة/الثغرات الأمنية.
  • تحسّنت التفاعلات الداخلية مع سطر الأوامر لإزالة الحاجة إلى ملفات التدفق، وتتعامل الآن مع مطالبات “المزيد/اضغط أي مفتاح”

يتطلب الآن إضافة Discourse BBCode!!

تطلب هذا التعاون مع مُصان Frotz، ديفيد غريفيثز، وأحد الأعضاء النشطين جدًا في تلك المجتمع، Borg323، الذي كتب إضافات BBCode وفقًا لمعيار BBCode الخاص بـ Discourse. شكرًا جزيلاً لهما! اضطررنا إلى الإبداع قليلاً لجعل النص أحادي المسافة يعمل، لكن الحل رائع حقًا!

بعض الأمثلة على التنسيق الجديد (لم أختبر هذه القصص بالكامل، هذه مجرد أمثلة على التنسيق)

ولاحظ البوصلة الملونة هنا:

المشاكل المعروفة: هناك العديد من الألعاب التي لا تعمل بسبب طبيعة بروتوكولات الاستدعاء والاستجابة الخاصة بها. إذا لم تؤدّ خطوة واحدة في اللعبة إلى مطالبة يمكنك فيها الحفظ (متجاهلًا مطالبات “اضغط أي مفتاح” أو “المزيد” التي يجب معالجتها)، فلن تعمل القصة. على سبيل المثال، في لعبة Act of Murder (لعبة رائعة!)، تسأل السيدة عند الباب عما إذا كنت شرطيًا. للأسف، هذه حالة في اللعبة لا يمكن حفظها، لذا تفشل في هذا الشرط، ولا أرى طريقة يمكننا من خلالها جعل ذلك يعمل.

من المرجح أن تكون هناك ألعاب أصبحت الآن متوافقة مع Discourse Frotz بينما لم تكن كذلك من قبل… يُرجى التجربة، ولكن لاحظ القيد المذكور أعلاه!

أخبرني إذا واجهت أي مشاكل في جعل هذا يعمل، وسأقوم بتحسين التعليمات حسب الحاجة.

8 إعجابات

تذكير: يمكنك استخدام اختصارات لوحة المفاتيح لتحسين تجربتك مع هذه الإضافة:

  • Shift+R للرد على البوت

  • Ctrl+Enter لتقديم حركتك التالية

(اختصارات لوحة المفاتيح القياسية الافتراضية).

5 إعجابات

مرحبًا روبرت!
أخيرًا توفرت لي الوقت للمتابعة، حتى الآن كل شيء على ما يرام، لقد عملت مباشرة في بيئة الإنتاج :+1:

بشكل غريب، لا يستطيع frotz الرد على الرسائل الخاصة إلا إذا قمت بضبطه في أي فئة أيضًا :thinking:
الخطوة التالية: اللعب :grinning_face_with_smiling_eyes:

إعجاب واحد (1)

شكرًا على التقرير!

لقد قمت بإصلاحه: FIX: behaviour of private messages playing permission setting · merefield/discourse-frotz@34b022e · GitHub

ملاحظة: يجب إضافة بعض اختبارات الوحدة!

إعجابَين (2)

حاولت إضافة :grin: في المصدر،

سيكون الأمر ممتعًا!

إعجاب واحد (1)