آیا تا به حال تصور کردهاید که بتوانید بازی کلاسیک DOOM را مستقیماً در برنامه نقاشی ویندوز اجرا کنید؟ با پروژهای به نام DoomPaint، این تصور به واقعیت پیوسته است. این برنامه به شما امکان میدهد تا از طریق کلیپبورد ویندوز، بازی DOOM را در محیط برنامه نقاشی (MS Paint) به اجرا درآورید.
راهنمای اجرای DOOM در برنامه نقاشی مایکروسافت
برای شروع، ابتدا به صفحه گیتهاب DoomPaint پروژه در گیتهاب مراجعه کرده و آن را به صورت فایل ZIP دانلود کنید یا اگر از Git استفاده میکنید، آن را کلون نمایید.
اطمینان حاصل کنید که برنامه پایتون روی کامپیوتر شما نصب شده باشد، زیرا این پروژه برای اجرا به آن نیاز دارد.
فایلهای دانلود شده را از حالت فشرده خارج کرده و سپس روی فایل run.bat دابل کلیک کنید.
در اولین اجرا، برنامه به طور خودکار یک محیط مجازی ایجاد کرده و تمام وابستگیهای مورد نیاز را نصب میکند. بنابراین، صبور باشید تا این فرآیند به اتمام برسد.
پس از اتمام نصب، برنامه Microsoft Paint به صورت خودکار باز خواهد شد.
برنامه Paint را در حالت فوکوس نگه دارید و بلافاصله بازی را شروع کنید.
کنترلهای پیشفرض بازی:
- W / S یا کلیدهای جهتنمای بالا / پایین: حرکت به جلو و عقب
- A / D یا کلیدهای جهتنمای چپ / راست: چرخش
- Q / E: حرکت جانبی (Strafing)
- Ctrl یا F: شلیک
- Space: استفاده، باز کردن درها
- Shift: دویدن
- F12: خروج از بازی

تفاوت DoomPaint با ترفندهای قبلی “اجرای DOOM در Paint”
برخلاف تصور رایج، DoomPaint اولین پروژهای نیست که تصویری از DOOM را بر روی بوم برنامه Paint نمایش میدهد. با این حال، تلاشهای قبلی معمولاً بازی را در پنجرهای جداگانه اجرا کرده و سپس آن پنجره را در Paint منعکس یا ضبط میکردند؛ به این معنی که شما در واقع DOOM را به صورت عادی بازی میکردید و فقط کپی آن را در جای دیگری تماشا میکردید.
DoomPaint به شیوهای متفاوت عمل میکند. هیچ پنجره جداگانهای برای DOOM وجود ندارد. بوم برنامه Paint تنها نمایشگر بازی است و هر ورودی که شما وارد میکنید، از طریق Paint پردازش میشود.
موتور بازی ViZDoom است که بر پایه ZDoom ساخته شده و برای تحقیقات یادگیری تقویتی و هوش مصنوعی بهینهسازی شده است. به همین دلیل میتواند بدون نیاز به باز کردن پنجره، بازی را رندر کند. مارک روسینویچ، توسعهدهنده پروژه، این پنجره را بلافاصله پس از ایجاد شدن، قبل از نمایش، پنهان میکند. فایل DOOM1.WAD (نسخه Shareware) شامل قسمت اول بازی، شامل مراحل و موسیقی متن اصلی Bobby Prince است. برای مراحل بعدی، از Freedoom استفاده میشود که جایگزینی با مجوز BSD است، زیرا id Software بقیه بازی را رایگان منتشر نکرده است.
رزولوشن پیشفرض بازی ۶۴۰×۴۰۰ پیکسل با نرخ فریم حداکثر ۳۵ فریم در ثانیه است. اگر رزولوشن را به ۳۲۰×۲۰۰ (رزولوشن اصلی و واقعی DOOM در سال ۱۹۹۳) کاهش دهید، نرخ فریم افزایش مییابد.
در یکی از ویدیوهای منتشر شده از این پروژه، فریم بازی به صورت شناور درون دستگیرههای انتخاب معمولی Paint نمایش داده میشود. همچنین HUD کلاسیک DOOM، شامل اطلاعات سلامتی، مهمات، زره و چهره شخصیت بازی در پایین صفحه و دکمه Copilot و سایر گزینهها در نوار ابزار بالای Paint قابل مشاهده هستند.
جزئیات فنی و نحوه عملکرد
برای حرکت از کلیدهای WASD یا کلیدهای جهتنما استفاده میشود. حرکت جانبی با کلیدهای Q و E و شلیک با کلیدهای Ctrl و F انجام میشود. استفاده از هر دو کلید Ctrl و F برای شلیک، یک اقدام احتیاطی است تا در صورت تداخل کلید Ctrl با برنامههای جانبی مانند PowerToys، بازی همچنان قابل کنترل باشد.
نکته جالب این است که کلید Undo (Ctrl+Z) به عنوان دکمه بازگشت عمل میکند. از آنجایی که هر فریم بازی به عنوان یک مرحله مجزا در تاریخچه Undo برنامه Paint ذخیره میشود، با فشردن چندباره Ctrl+Z پس از مرگ، میتوانید به عقب بازگردید و از مرگ نجات پیدا کنید.
ذخیره کردن فایل در هر لحظه، یک تصویر PNG از فریم فعلی را ایجاد میکند، زیرا برنامه Paint نمیداند که در حال رندر کردن یک بازی ویدیویی از سال ۱۹۹۳ است!
اجرای این برنامه نیازمند نصب پایتون است، زیرا فایل run.bat یک محیط مجازی ایجاد کرده و وابستگیها را به طور خودکار نصب میکند.
برای قسمت اول بازی نیازی به خرید جداگانه DOOM نیست. با این حال، قرار دادن فایل doom.wad یا doom2.wad در پوشه wad پروژه، موسیقی متن کامل را برای مراحل بعدی فعال میکند.

حل مشکل شرط رقابتی کلیپبورد
یکی از چالشهای اصلی این پروژه، نحوه ارسال دهها فریم در ثانیه به کلیپبورد بدون ایجاد خطا در برنامه Paint بود. برنامه Paint کلیپبورد را به صورت ناهمزمان میخواند. روش معمول استفاده از توابع EmptyClipboard و SetClipboardData ویندوز است. اما اگر این عملیات با سرعت بالا انجام شود، ممکن است کلیپبورد قبل از اتمام خواندن توسط Paint، خالی شود و این باعث نمایش پیام خطا و توقف بازی میگردد.
راه حل مارک روسینویچ، که در فایل clipserve.py پروژه یافت میشود، این است که به جای بازنویسی مکرر کلیپبورد، از قابلیت مالکیت کلیپبورد در ویندوز استفاده شود. در این روش، برنامه یک شیء داده سفارشی (IDataObject) را از طریق OleSetClipboard منتشر کرده و دادههای فریم را از طریق فراخوانی GetData در اختیار سایر برنامهها قرار میدهد. این شیء به صورت شمارش ارجاعی (reference-counted) عمل میکند، بنابراین حتی اگر Paint در حال خواندن یک فریم باشد، این شیء همچنان معتبر باقی میماند و مشکل شرط رقابتی (race condition) برطرف میشود. همچنین، هر بار فراخوانی GetData به عنوان سیگنالی برای بازی عمل میکند تا فریم بعدی را تنها پس از تأیید خوانده شدن فریم قبلی توسط Paint، منتشر کند.
اطمینان از اجرای صحیح عملیات Paste بدون تداخل با کلیدهای ورودی
DoomPaint در هنگام راهاندازی، دو روش مختلف برای فعال کردن عملیات Paste را آزمایش کرده و بهترین روش را برای نسخه Paint شما انتخاب میکند. روش ارجح، ارسال یک کلید ترکیبی مصنوعی Ctrl+V است که هیچ منویی را باز نمیکند و احتمال تداخل با کلیدهای بازی را از بین میبرد. با این حال، در برخی نسخههای Paint، فشردن کلید Ctrl+V به صورت مصنوعی نادیده گرفته میشود. در این حالت، پروژه به روش جایگزین، یعنی فعال کردن Paste از طریق منوی UI Automation برنامه Paint، متوسل میشود. این روش کندتر اما قابل اطمینانتر است و به طور موقت منوی Edit را باز میکند.
هر فریم بازی که در Paint Paste میشود، به صورت یک انتخاب شناور (floating selection) ظاهر میشود. با ورود فریم بعدی، انتخاب شناور قبلی به طور خودکار تأیید شده و به بخشی دائمی از تاریخچه Undo برنامه Paint تبدیل میشود. این فرآیند بدون نیاز به اقدام اضافی از سوی توسعهدهنده، هر فریم را به یک مرحله مستقل در تاریخچه Undo تبدیل میکند.
برای جلوگیری از تداخل کلیدهای بازی با رابط کاربری Paint، از یک هوک کیبورد در سطح پایین ویندوز (WH_KEYBOARD_LL) استفاده شده است. این هوک تمام کلیدهای بازی را در زمانی که Paint در فوکوس است، رهگیری کرده و از رسیدن آنها به برنامه Paint جلوگیری میکند. بدون این هوک، فشردن یک کلید جهتنما میتواند منوی Paste را ببندد و تحویل فریم را برای چند ثانیه متوقف کند.
نحوه ایجاد صدا در DoomPaint
جلوههای صوتی از طریق ViZDoom و کتابخانه OpenAL تولید میشوند. روسینویچ از نسخه جدیدتر OpenAL-Soft ۱.۲۴ استفاده کرده است، زیرا نسخه قدیمیتر همراه ViZDoom، دستگاه صوتی پیشفرض شما را هنگام تغییر خروجی صدا در طول جلسه (مانند اتصال هدفون) دنبال نمیکند.
برای موسیقی، از آنجایی که ViZDoom پخش موسیقی داخلی ZDoom را حذف کرده است، یک ماژول جداگانه دادههای خام موسیقی را از فایل WAD استخراج کرده، در صورت نیاز از فرمت MUS بازی DOOM به MIDI تبدیل میکند و سپس آن را از طریق Windows MIDI sequencer پخش میکند.
این پروژه همچنین یک اشکال غیرقطعی (nondeterministic) در سیستم صوتی ویندوز را برطرف میکند که در آن ممکن است دستگاه صوتی کار کند اما هیچ صدایی تولید نکند. DoomPaint سیستم صوتی را یک بار در هنگام راهاندازی مجدداً راهاندازی میکند تا از این مشکل جلوگیری کند و سپس در حین بازی، خروجی آن را نظارت کرده و در صورت شنیده نشدن صدا هنگام شلیک، مجدداً سیستم صوتی را ریست میکند.
تأثیر ابزارهای هوش مصنوعی در توسعه نرمافزار
مارک روسینویچ در پستی در لینکدین اعلام کرد که از مدل زبانی Claude Fable ۵ برای کارهای تحقیقاتی جدی استفاده کرده و آن را بهبود قابل توجهی نسبت به Opus ۴.۸ دانسته است. او همچنین اشاره کرد که این پروژه Doom-in-Paint را در همان صبح با استفاده از این مدل برای سرگرمی ساخته است. تاریخچه کامیتهای پروژه DoomPaint در گیتهاب نشاندهنده مشارکتهای واقعی از سوی ابزارهای کدنویسی هوش مصنوعی است.
اگرچه DoomPaint یک پروژه سرگرمکننده است، اما مجبور بود تا یک شرط رقابتی واقعی در ویندوز را حل کند، رفتار مستند نشده کلیپبورد Paint را مهندسی معکوس کند و یک باگ درایور صوتی را دور بزند. این پروژه نمونهای از این است که چگونه یک کارمند مایکروسافت میتواند با استفاده از یک مدل هوش مصنوعی، به سرعت نمونههای اولیه سیستمهای واقعی را در اوقات فراغت خود بسازد.
DoomPaint نمونهای کوچک و عمدی از روند رو به رشد هوش مصنوعی در مایکروسافت است که در سراسر ویندوز دیده میشود، به خصوص در جایی که عوامل هوش مصنوعی کارهای مهندسی جدیتری را انجام میدهند؛ موضوعی که یوسف مهدی بر پیشبرد آن در سال آخر حضورش در مایکروسافت قبل از ترک این شرکت تأکید کرده بود.










