پرش به محتوای اصلی
پرش به محتوای مقاله

ابزار lucasartsifier با تحلیل استاتیک بن‌بست‌های بازی‌های کلاسیک سیرا را حذف کرد

·۲۸ مرداد ۱۴۰۵۹ دقیقه مطالعه۴ بازدید
تحلیل ایستا بازی‌های ماجراجویی Sierra: یافتن بن‌بست‌ها با تفسیر انتزاعی اسکریپت‌های SCI، استخراج و تأیید محافظ‌ها، بازتدوین د
تحلیل ایستا بازی‌های ماجراجویی Sierra: یافتن بن‌بست‌ها با تفسیر انتزاعی اسکریپت‌های SCI، استخراج و تأیید محافظ‌ها، بازتدوین د
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

استفاده از تفسیر انتزاعی (Abstract Interpretation) برای شناسایی بن‌بست‌های منطقی در بازی‌های قدیمی؛ برخلاف پچ‌های معمولی که با تجربه انسانی ساخته می‌شوند، این ابزار بن‌بست‌ها را به‌صورت ریاضی و خودکار کشف می‌کند.

تصور کنید ساعت‌ها در یک بازی ماجراجویی پیش می‌روید و ناگهان می‌فهمید به دلیل فراموش کردن یک شیء کوچک در ابتدای بازی، پیروزی برای شما غیرممکن شده است. این کابوس بازیکنان بازی‌های کلاسیک سیرا بود، اما حالا ابزاری به نام lucasartsifier این بن‌بست‌های منطقی را برای همیشه از بین می‌برد.

طبق اعلام توسعه‌دهندگان، این ابزار که در ۱۹ اوت ۲۰۲۶ منتشر شد، از تحلیل استاتیک (Static Analysis) — شبیه به بازبینی دقیق نقشه‌ی یک ساختمان برای یافتن درهای قفل‌شده پیش از ورود به آن — استفاده می‌کند تا وضعیت‌های شکست‌ناپذیر را شناسایی و حذف کند.

بازی‌های ماجراجویی دهه ۸۰ و ۹۰ میلادی به «تله‌های منطقی» معروف بودند. برخلاف آثار لوکاس‌آرتس، بازی‌های سیرا اغلب اجازه می‌دادند بازیکنان آیتمی حیاتی را پیش از عبور از یک مرز یک‌طرفه جا بگذارند. این اتفاق باعث می‌شد بازیکن در دنیایی زنده بماند که در آن هدف بازی دیگر دست‌یافتنی نبود و تنها راه نجات، بازگشت به یک فایل ذخیره (Save) قدیمی بود.

برای مثال، تصور کنید در یک بازی سوار بر یک کشتی تفریحی می‌شوید و ساعت‌ها بعد متوجه می‌شوید که آیتمی ضروری را روی اسکله جا گذاشته‌اید. در نسخه‌های اصلی بازی، شما صرفاً گیر می‌افتادید. lucasartsifier این مشکل را با تحلیل منطق بازی و نصب «نگهبانانی» حل می‌کند که اگر شما آماده نباشید، از عبور شما از آن مرز جلوگیری می‌کنند.

زمینه: ماهیت سافت‌لاک و منطق شناسایی

در چارچوب این ابزار، سافت‌لاک (Softlock) به وضعیتی گفته می‌شود که بازی همچنان دستورات ورودی را می‌پذیرد، اما پیروزی در سکوت غیرممکن شده است. تحلیل‌گر این سیستم، وضعیت‌های غیرقابل پیروزی را از «مرگ‌های اجتناب‌پذیر» تشخیص می‌دهد؛ این تشخیص بر اساس قابلیت دسترسی (Reachability) انجام می‌شود و نه بر اساس شرایط مرگ.

به عنوان مثال، در بازی Leisure Suit Larry 2، اگر بازیکن بدون لباس مبدل کامل وارد ساحل KGB شود، کشته می‌شود. برخی از قطعات این لباس تنها در کشتی تفریحی موجود هستند. در این حالت، تحلیل‌گر اجازه نمی‌دهد بازیکن بدون این قطعات کشتی را ترک کند. با این حال، قطعات دیگر لباس در خودِ جزیره — حتی در همان مکانی که مرگ رخ می‌دهد — قابل دستیابی هستند. چون این مرگ‌ها از مکان فعلی قابل اجتناب هستند، ابزار آن‌ها را تغییر نمی‌دهد و در بازی باقی می‌گذارد. همان‌طور که ال لو، خالق بازی، به طور مشهوری می‌گفت: «زود به زود ذخیره کنید!»

زمینه: دوران موتورها و محدوده اثر

این ابزار برای مدیریت تکامل موتور Sierra Creative Interpreter (SCI) طراحی شده است. تا کنون عملکرد آن در دو دوره اصلی تأیید شده است: SCI0 (محصول سال ۱۹۸۸) و SCI1.1 (محصول سال ۱۹۹۲).

از آنجا که این ابزار «موتور-محور» است و نه «بازی-محور»، نیازی به تعریف دستی ثابت‌های خاص هر بازی نیست. خط لوله (Pipeline) به‌طور خودکار اتاق شروع، اتاق پیروزی، سیگنال مرگ و پرچم‌های دیباگ (Debug Flags) را مستقیماً از کد باینری خودِ بازی کشف می‌کند.

خط لوله فنی (Technical Pipeline)

این ابزار از طریق یک خط لوله چندمرحله‌ای عمل می‌کند که به هیچ تنظیمات دستی برای هر بازی نیاز ندارد. هیچ موردی درباره هر عنوان تعریف نمی‌شود؛ اتاق شروع، اتاق پیروزی، سیگنال مرگ و پرچم‌های دیباگ همگی از کد بازی استخراج می‌شوند. طبق مستندات پروژه در گیت‌هاب، این فرآیند مراحل زیر را دنبال می‌کند:

  • دکامپایل (Decompilation): ابزار از یک فورک از sci-tools (نسخه sluicebox با لایسنس MIT) استفاده می‌کند تا باینری‌های بازی را به یک درخت نحو انتزاعی (AST) با جریان کنترل تایپ‌شده در قالب JSON تبدیل کند. پروژه یک شاخه به نام json-ir را نگه می‌دارد که این خروجی دوم را در کنار خروجی استاندارد .sc اضافه می‌کند. منطق دکامپایل در اینجا دست‌نخورده باقی مانده است.
  • تفسیر انتزاعی (Abstract Interpretation): ابزار این AST را تفسیر می‌کند تا یک گراف بازی بسازد. این گراف جابه‌جایی‌های اتاق‌های محافظت‌شده، حرکت آیتم‌ها و نوشتن پرچم‌های پیرنگ (Plot-flag) را ردیابی می‌کند. همچنین هنر اتاق‌ها (فایل‌های PIC/VIEW) و چندضلعی‌های موانع را می‌خواند، زیرا برخی گیت‌ها هندسی هستند و در هیچ‌کجای اسکریپت وجود ندارند.
  • تراکم گراف (Graph Condensation): سیستم بازی را به مؤلفه‌های به‌شدت متصل (Strongly-connected components) گروه‌بندی می‌کند؛ یعنی مناطقی که بازیکن می‌تواند آزادانه در آن‌ها بچرخد. این کار به تحلیل‌گر اجازه می‌دهد به‌طور خاص روی لبه‌های یک‌طرفه تمرکز کند، زیرا این‌ها تنها نقاطی هستند که بازیکن می‌تواند در آن‌ها گیر کند و بدین ترتیب مسئله را محدود و متناهی می‌کند.
  • شناسایی سافت‌لاک: سیستم به دنبال آیتم‌هایی می‌گردد که قبل از عبور از یک مرز قابل دستیابی هستند، اما بعد از عبور از دسترس خارج شده و همچنان برای پیروزی ضروری‌اند. همچنین «بن‌بست‌های اتلاف آیتم» (Item-wasting dead ends) را شناسایی می‌کند و آن‌ها را با یک پیام «فقط شوخی کردم!» خنثی می‌کند تا بازیکن بدون جریمه در امتیاز، آیتمی ضروری را هدر ندهد.
  • استخراج نگهبان: ابزار شرط دقیق مورد نیاز برای پیروزی را از منطقه پیروزی استخراج کرده و یک نگهبان را در آخرین لحظه ممکن که بازیکن هنوز می‌تواند شرایط را برآورده کند، قرار می‌دهد.

جزئیات: معیارهای تحلیل و منطق

برای نشان دادن عمق این تحلیل، اجرای ابزار روی بازی Leisure Suit Larry 2 (از طریق دستور python3 -m pipeline <game>) داده‌های فنی خاصی تولید می‌کند:

  • کشف: ابزار اتاق شروع (rm11)، اتاق پیروزی و سیگنال مرگ (global101 == 1001) را به همراه متغیرهای جهانی دیباگ [14, 100] شناسایی می‌کند.
  • مقیاس گراف: تحلیل، ۱۰۱ اتاق، ۲۷ مؤلفه به‌شدت متصل و ۴۰ ثبات (Register) گیتینگ را نقشه‌برداری می‌کند.
  • شناسایی سافت‌لاک: سیستم ۱۵ آیتم و یک گروه گسسته (Disjunctive group) را که باعث سافت‌لاک می‌شدند، پیدا می‌کند.
  • مثال‌های نگهبان:
    • rm38 -> rm131: نیازمند آیتم‌های ۱۱، ۱۲، ۱۴ و ۱۵ است.
    • rm57 -> rm58: نیازمند آیتم‌های ۲۱، ۲۴، ۲۵ و ۲۶ است.
    • rm79 -> rm80: نیازمند یکی از آیتم‌های ۳۰ یا ۳۱ است.
    • rm63: اکشن (gEgo put: 21 -1) را برای Hair_Rejuvenator حذف می‌کند تا از هدر رفتن آن جلوگیری شود.

نتایج اثبات شده در موتورهای مختلف

توسعه‌دهنده تاکنون چهار عنوان اصلی را که دو دوره از موتور SCI (یعنی SCI0 و SCI1.1) را پوشش می‌دهند، تحلیل و تست کرده است. زنجیره ابزار مستقل از بازی است، به این معنی که هیچ کد تحلیل خاصی برای این عناوین نیاز نبود.

Leisure Suit Larry 2 (۱۹۸۸, SCI0)
یک اجرای خلاصه از خط لوله برای این عنوان، ۱۰۱ اتاق، ۲۷ مؤلفه به‌شدت متصل و ۴۰ ثبات گیتینگ را نشان داد. تحلیل‌گر ۱۵ آیتم و یک گروه گسسته را شناسایی کرد که باعث سافت‌لاک می‌شدند. به‌طور خاص، «دیپ اسفناج» (Spinach Dip) به عنوان آیتمی مرگبار برای ورود به اتاق ۱۳۸ علامت‌گذاری شد. ابزار یک نگهبان با عبارت منطقی منفی (not (gEgo has: 13)) استخراج کرد تا تا زمانی که بازیکن دیپ را دارد، اجازه عبور ندهد؛ این نگهبان دقیقاً در جایی قرار گرفت که بازیکن هنوز می‌تواند آن را به دریا بیندازد. این کار از ایجاد «دیواری» جلوگیری می‌کند که در آن بازی از شما می‌خواهد چیزی را دور بریزید که دیگر نمی‌توانید.

King's Quest IV (۱۹۸۸, SCI0)
در نسخه دمو اصلاح‌شده، ابزار با موفقیت از نهنگ و ساعت شبانه (Real-time night clock) محافظت کرد. این‌ها رویدادهای تصادفی هستند که ابزار اکنون آن‌ها را تنها زمانی فعال می‌کند که زنده ماندن از آن‌ها ممکن باشد، همچنین از هفت آیتم که باعث گیر افتادن بازیکن می‌شدند، محافظت کرد.

King's Quest VI (۱۹۹۲, SCI1.1)
این عنوان به دلیل وجود دو مسیر متفاوت برای پایان‌بندی که تحلیل را به‌شدت پیچیده می‌کرد، چالش بیشتری داشت. ابزار این مشکل را با محافظت از شروع مراسم عروسی (که توسط یک تایمر کنترل می‌شود) تا زمانی که تمام آیتم‌های ضروری در دست باشند، حل کرد.

Laura Bow 2 (۱۹۹۲, SCI1.1)
این بازی بر اساس ساختار پرده‌های نمایش (Act structure) تحلیل شد. ابزار ساعت پیرنگ را به عنوان یک ثبات در نظر گرفت و شکست‌های بین پرده‌ها را به عنوان انتقال‌های یک‌طرفه مدیریت کرد، در حالی که تقاضاهای لازم روی اینترسپتور تغییر پرده قرار گرفتند.

پیاده‌سازی و امنیت

مکانیزم پچ کردن غیرتخریبی است. این ابزار از فرمت پچ‌های لوز (Loose-patch) خودِ سیرا استفاده می‌کند، به این معنی که فایل‌های اصلی بازی هرگز تغییر نمی‌کنند. خط لوله اسکریپت‌های تغییر یافته را مجدداً به این فرمت کامپایل می‌کند. اگر کاربر بخواهد تغییرات را به حالت اول برگرداند، کافی است فایل‌های پچ را از دایرکتوری بازی حذف کند.

کاربران می‌توانند رفتار نگهبان را در داخل بازی تغییر دهند:

  • Full: هر اقدام خطرناک را به‌طور کامل منع می‌کند.
  • Lite: اقدام را یک بار منع کرده و سپس پس از یک هشدار اجازه می‌دهد.
  • Off: تمام نگهبان‌ها را غیرفعال می‌کند.

برای تضمین پایداری، خط لوله اگر نگهبان‌ها در مرحله اعتبارسنجی شکست بخورند یا اسکریپت ویرایش‌شده کامپایل نشود، هیچ پچی صادر نمی‌کند. زنجیره ابزار بر یک پورت لینوکسی بدون رابط گرافیکی (Headless) از کامپایلر اسکریپت SCICompanion (توسط Philip Fortier، لایسنس GPL-2.0+) تکیه دارد. این پورت لایه MFC/Windows را با یک CLI و لایه سازگاری جایگزین کرده تا بتواند پارسر واقعی، مرورگر کلاس، نقشه منابع و تولیدکننده کد (GenerateScriptResource) را فراخوانی کند. درخت فروشنده (Vendor tree) در زمان ساخت کلون شده و هرگز ویرایش نمی‌شود، هرچند چند فایل برای سازگاری با ساختارهای مخصوص MSVC پچ شده‌اند.

تحلیل رویکرد

این پروژه نشان‌دهنده یک کاربرد پیچیده از «تأیید رسمی» (Formal Verification) در نرم‌افزارهای قدیمی است. توسعه‌دهنده با تبدیل یک بازی به یک گراف جهت‌دار از وضعیت‌ها، فرآیند دستی «آزمون و خطا» در دیباگ را به یک قطعیت ریاضی تبدیل کرده است.

برای جامعه گیمرهای رترو، این موضوع تجربه را از «تنبیهی» به «منتخب» تغییر می‌دهد. این ابزار دشواری پازل‌ها را حفظ می‌کند اما استرس برخورد با دیوارهای نامرئی را حذف می‌کند. این ثابت می‌کند که تحلیل استاتیک می‌تواند برای «مدرن کردن» منطق طراحی بازی بدون نیاز به سورس‌کد اصلی یا یادداشت‌های توسعه‌دهنده استفاده شود.

مسیرهای آینده

پروژه در حال حاضر در حال گسترش برای پوشش King's Quest V (۱۹۹۰) است که از یک موتور ترکیبی SCI1-middle استفاده می‌کند. توسعه‌دهنده اشاره می‌کند که بازار روستا در آن بازی یک «مسئله تطبیق» (Matching problem) ایجاد می‌کند که در آن پرداخت‌ها باید با بازرگانان تطبیق داده شوند تا همه پرداخت‌هایشان را دریافت کنند.

سایر اهداف آینده عبارتند از:

  • مدل‌سازی اقدامات ضروری: در حال حاضر ابزار از انتقال‌ها محافظت می‌کند. هنوز اقداماتی را مدل نمی‌کند که اگر انجام نشوند، منجر به مرگ در آینده می‌شوند (مثلاً پرتاب کفش به گربه در King's Quest V برای نجات موشی که بعداً بازیکن را از دست راهزنان نجات می‌دهد).
  • انفجار وضعیت (State Explosion): بازی‌های Quest for Glory پیچیدگی زیادی دارند که تحلیل‌گر فعلی نمی‌تواند آن‌ها را کامل کند. توسعه‌دهنده گمان می‌کند این مشکل با انتزاعی کردن آمارهای بازیکن، مبارزات و مصرف‌کننده‌های سلامتی مانند جیره غذایی قابل حل باشد.
  • تست کامل بازی: در حالی که چهار بازی تکمیل‌شده در بخش‌های پچ‌شده به‌طور گسترده تست شده‌اند، هیچ‌کدام هنوز به‌طور کامل از ابتدا تا انتها بازی نشده‌اند. انجام این کار ممکن است باگ‌های باقی‌مانده را آشکار کند.
  • پشتیبانی از AGI: برنامه‌هایی برای گنجاندن عناوین AGI (Adventure Game Interpreter) وجود دارد، هرچند کار روی آن هنوز شروع نشده است.

اگر از طرفداران ماجراجویی‌های کلاسیک هستید، می‌توانید جزئیات پیاده‌سازی را در مستندات معماری پروژه بررسی کنید یا خط لوله را روی نسخه‌های قانونی خود از این بازی‌ها از طریق ScummVM اجرا کنید.

چرا این موضوع مهم است؟

این ابزار با تکیه بر تخصص در تحلیل استاتیک، استانداردی جدید برای حفظ و نوسازی میراث دیجیتال ایجاد می‌کند. حذف سافت‌لاک‌ها بدون تغییر در باینری اصلی، نمونه‌ای از اعتماد به متدهای تأیید رسمی برای بهبود نرم‌افزارهای Legacy است.

تأثیر برای ایران

این ابزار برای توسعه‌دهندگان ایرانی که در زمینه مهندسی معکوس و بازی‌های کلاسیک فعالیت می‌کنند، یک الگوی عملی برای تحلیل نرم‌افزارهای قدیمی بدون دسترسی به سورس‌کد است.

·نگاه ما
تحریریه دات‌هوش

تبدیل یک بازی به گراف ریاضی برای حذف بن‌بست‌ها، نشان می‌دهد که ابزارهای تحلیل استاتیک دیگر فقط برای یافتن باگ‌های امنیتی در کد نیستند، بلکه می‌توانند برای «بازطراحی تجربه کاربری» در نرم‌افزارهای قدیمی به کار روند. این رویکرد، مرز بین مهندسی معکوس و طراحی بازی را می‌شکند و اجازه می‌دهد منطق یک اثر هنری ۳۰ ساله بدون دستکاری در هسته آن، با استانداردهای امروز اصلاح شود.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.