Undertale In Extremis
कंप्यूटर संगठन के लिए परियोजना। एक Undertale-शैली का RISC-V असेंबली भाषा आरपीजी लड़ाई सिमुलेटर।
विश्वविद्यालय परियोजना (ORG 2026.1)। एक आरपीजी लड़ाई सिम्युलेटर और मोंटे कार्लो इंजन जो पूरी तरह से RISC-V असेंबली में लिखा गया है।
सेटअप
मैंने कच्ची RISC-V असेंबली में शुरू से एक आरपीजी कॉम्बैट इंजन बनाया। लक्ष्य तीन अलग-अलग एआई स्टेट मशीन लिखना, उन्हें एक हेडलेस एमुलेटर में डालना, और यह देखने के लिए 10,000 स्वचालित मैच चलाना था कि कौन सी रणनीति सबसे ऊपर रही।
लड़ाई एक सख्त एक्शन इकोनॉमी के इर्द-गिर्द घूमती है। एमपी धीरे-धीरे पुनर्जीवित होता है, लेकिन विशिष्ट कौशल का उपयोग करके इसे ओवरचार्ज किया जा सकता है।
| कौशल | लागत | यह क्या करता है |
|---|---|---|
| अटैक | मुफ़्त | 1d20 रोल करता है। < 10 चूकता है, 10+ हिट करता है, 20 दोगुने नुकसान के लिए क्रिट करता है। |
| रक्षा | निःशुल्क | आने वाले नुकसान को रोकता है। उच्च रोल एक पलटवार को ट्रिगर करते हैं। |
| अपरिमेय दृढ़ता | 20 एमपी | एक गारंटीकृत क्रिटिकल हिट के लिए पासे को बायपास करता है। |
| आत्मा चूसना | नि:शुल्क | कास्टर 1-12 का रिकोइल डैमेज लेता है, दुश्मन के MP से उतनी ही मात्रा खींच लेता है, और अपने लिए उसका 4× प्राप्त करता है। 100 MP की सीमा को बायपास करने का एकमात्र तरीका। |
| अंतिम निष्पादन | 150 एमपी | 800% क्षति वाला एक नूक। यदि लक्ष्य की एचपी 50% से अधिक है तो यह विफल हो जाता है। |
| मिरर शील्ड | 30 एमपी | अगले आने वाले हमले को वापस हमलावर पर प्रतिबिंबित करता है। |
दावेदार
मैंने तीन बॉट लिखे, जिनमें से प्रत्येक का दिमाग पूरी तरह से अलग है:
फ्लोई (द केओस): शुद्ध आरएनजी। वह कुछ भी आकलन नहीं करता है और अपनी अगली चाल चुनने के लिए बस एक यादृच्छिक संख्या निकालता है।
decision_random:
li a0, 6
call randomizer # 1 और 6 के बीच एक संख्या चुनता है, बस यही पूरी रणनीति है
j decision_end
चारा (द ट्राई-हार्ड): वह एक कॉम्बो के लिए ऑप्टिमाइज़ करती है: सोल सक का स्पैम तब तक करती है जब तक उसकी एमपी 150 नहीं हो जाती, दुश्मन की HP 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%
# बिना मरे
...
li t6, 150 # execute की कीमत
blt t4, t6, decision_smart_my_mana_is_low # mp < 150? फार्म पर जाएं
bge a2, t6, decision_smart_enemy_hp_high # दुश्मन का HP > 50? तो दबाओ
j decision_smart_i_can_kill # अन्यथा, खत्म करो
decision_smart_my_mana_is_low:
li a0, 4 # सोल सक
decision_smart_enemy_hp_high:
li a0, 2 # एब्सोल्यूट ग्रिट
decision_smart_i_can_kill:
li a0, 5 # फाइनल एक्जीक्यूशन
टोबी (द हार्ड-काउंटर): खास तौर पर चारा को फार्म करने के लिए बनाया गया है। वह अपने HP और दुश्मन के MP बार दोनों पर नज़र रखता है। अगर उसका HP 50 से नीचे है और दुश्मन के पास 150 MP है, तो वह अपनी मिरर शील्ड उठा लेता है और न्यूक को वापस लौटा देता है। उस खिड़की के बाहर वह हमलों और सोल सक (Soul Suck) को मिलाता है, और जब परिस्थितियाँ अनुकूल होती हैं तो वह खुद भी फ़ाइनल एक्ज़ीक्यूशन (Final Execution) कर सकता है।
decision_troll_checks:
li t6, 50
ble t5, t6, decision_troll_check_enemy_mp # क्या मैं चिंता करने के लिए पर्याप्त कम HP पर हूँ?
j decision_troll_not_execute
decision_troll_check_enemy_mp:
li t6, 150
bge a3, t6, decision_troll_prepare_against_execute # क्या दुश्मन 150 mp के करीब है?
j decision_troll_not_execute
decision_troll_prepare_against_execute:
li a0, 6 # मिरर शील्ड
ret
बेंचमार्क परिणाम
RARS, Risc-V Java-आधारित सिमुलेटर से आने वाले jar, rars.jar का उपयोग करके टर्मिनल पर 10,000 मैच चलाने के बाद, परिणाम सामने आए।
| कैरेक्टर | जीत की दर |
|---|---|
| फ्लोवी | ~52% |
| टोबी | ~29% |
| चारा | ~17% |
सबसे बेवकूफ़ एआई ने अधिकांश गेम जीते।
चारा की 17% जीत दर कठोर, लालची कॉम्बो की समस्या को उजागर करती है। 150 एमपी तक पहुँचने के लिए, उसे सोल सक से रिकोइल डैमेज लेना पड़ता है। अक्सर, टोबी बस अपनी ढाल उठाए रहता है, और चारा का स्क्रिप्ट उसे अपना ही स्वास्थ्य कम करते रहने के लिए मजबूर करता है, जब तक कि वह सचमुच खुद को मार न डाले, इससे पहले कि वह अपना अल्टिमेट भी कास्ट कर सके।
टोबी का 29% चारा को सफलतापूर्वक चारा (bait) करने से आता है। Flowey के खिलाफ कहानी अलग है: शील्ड की शर्त के लिए दुश्मन का लगभग 150 MP के पास होना जरूरी है, और Flowey जानबूझकर उस ओर बिल्ड नहीं करता। काउंटर कभी ट्रिगर नहीं होता, इसलिए Toby बस अपनी डिफ़ॉल्ट गेम—हमला करना और आत्मा चूसना—खेलता रहता है, जिससे उसे Chaos पर कोई असली बढ़त नहीं मिलती।
फ्लोवी ने 52% बार इसलिए जीता क्योंकि बिना किसी रणनीति के खेल को लगातार काउंटर करना असंभव है। वह एक बड़ा खेल तैयार करने की कोशिश में कभी रिकोइल डैमेज नहीं लेता; वह बस गलती से उच्च-मूल्य वाली चालें चल देता है। यह पता चलता है कि, अगर आपका पूरा कोडबेस दुश्मन के व्यवहार की भविष्यवाणी करने पर निर्भर करता है, तो आप एक ऐसे दुश्मन से स्वचालित रूप से हार जाते हैं जो बिना किसी कारण के चीजें करता है।
क्या यह वास्तव में आश्चर्यजनक है?
शायद नहीं। रणनीति सिमुलेशन में, यादृच्छिक एजेंटों का निर्धारणात्मक एजेंटों पर हावी होना एक अच्छी तरह से प्रलेखित परिणाम है।
एक अध्ययन समूह में मुझे जो सिटाडेल सिमुलेशन मिला, उसने भी यही पैटर्न दिखाया: कुछ रणनीतियाँ लगातार रैंडम को हराती थीं, कुछ उससे बुरी तरह हार गईं, और कुछ कुछ विरोधियों को हराती थीं लेकिन दूसरों से हार जाती थीं। रॉक-पेपर-सिज़र्स की डायनामिक मौजूद थी, लेकिन रैंडम फिर भी उनमें से ज़्यादातर के खिलाफ अपनी जगह बनाए हुए था।
फर्क यह है कि एक समृद्ध वातावरण में (अधिक रणनीतियाँ, अधिक निर्णय चर, एक स्मार्ट एजेंट के लिए एक यादृच्छिक एजेंट का फायदा उठाने के अधिक तरीके) परिणाम अधिक फैलते हैं। एक अच्छी तरह से समायोजित निर्धारक रणनीति एक विश्वसनीय बढ़त बना सकती है यदि क्रिया क्षेत्र उसे काम करने के लिए पर्याप्त अवसर देता है।
यहाँ, शायद ऐसा नहीं है। केवल छह संभावित क्रियाओं और एक ऐसे लड़ाई प्रणाली के साथ जहाँ एक ही भाग्यशाली क्रिट किसी भी रणनीति की परवाह किए बिना मैच समाप्त कर सकता है, चारा की सावधानीपूर्वक योजना और फ्लोवी की यादृच्छिक बटन दबाने के बीच का अंतर उतना बड़ा नहीं है। चारा के कॉम्बो के लिए सेटअप में कई बारी की आवश्यकता होती है, और RNG के पास उसके वहाँ पहुँचने से पहले उसे खत्म करने का भरपूर अवसर होता है। एक्शन स्पेस शायद एक लालची रणनीति के लिए लगातार अराजकता से बेहतर प्रदर्शन करने के लिए बहुत छोटा और बहुत अस्थिर हो सकता है।
दूसरे शब्दों में: फ्लोवी का जीतना खोज से कम और एक डिज़ाइन की बाधा से अधिक है। एक चतुर चारा को इसे साबित करने के लिए एक चतुर गेम की आवश्यकता होगी।
ये नंबर पूरी तरह से भरोसेमंद क्यों नहीं हैं
बेंचमार्क से निष्कर्ष निकालने से पहले, कुछ संरचनात्मक पूर्वाग्रहों को स्वीकार करना महत्वपूर्ण है।
मैचअप अलग-थलग नहीं हैं। दोनों खिलाड़ियों को हर मैच में एक यादृच्छिक रूप से सौंपी गई रणनीति मिलती है, जिसका अर्थ है कि जीत की दरें सभी संभावित जोड़ीकरणों का एक समग्र हैं, न कि स्वच्छ 1v1 आँकड़े। फ्लोवी के 52% में वे मैच शामिल हैं जहाँ फ्लोवी ने किसी दूसरे फ्लोवी से लड़ा, और उन मैचों में उनमें से एक को तो जीतना ही था। यह वास्तव में जानने के लिए कि क्या चारा टोबी को हराता है या क्या फ्लोवी सभी को समान रूप से हराता है, आपको मैचअप को स्थिर करना होगा और प्रत्येक जोड़ी को अलग से चलाना होगा।
टर्न ऑर्डर कभी नहीं बदला जाता है। खिलाड़ी 1 हमेशा पहले चलता है। एक ऐसी प्रणाली में जहाँ एक ही क्रिट मैच खत्म कर सकता है, पहले चलना एक वास्तविक बढ़त है। परिणाम इस बात का बिल्कुल भी हिसाब नहीं रखते हैं।
आरएनजी (RNG) सिस्टम टाइम से सीडेड एक कस्टम xorshift है। यह एक विश्वविद्यालय परियोजना के लिए ठीक काम करता है, लेकिन यह सांख्यिकीय रूप से मान्य जनरेटर नहीं है। यदि 6 संभावित क्रियाओं में आउटपुट का वितरण असमान है, तो फ्लोवी के परिणाम सीधे प्रभावित होते हैं क्योंकि उसकी पूरी रणनीति बस उस फ़ंक्शन को कॉल करने पर आधारित है।
एक्शन स्पेस बहुत छोटा है। छह संभावित क्रियाओं का मतलब है कि किसी भी रणनीति के पास अव्यवस्था से खुद को अलग करने के लिए सीमित जगह होती है। एक गहरे सिस्टम में, चारा के कॉम्बो को बाधित करना मुश्किल हो सकता है, या रिकवरी के विकल्प हो सकते हैं जो उसकी सेटअप की लागत को कम करते हैं। यहाँ, गेम इतना कठोर है कि उसका रीकॉइल डैमेज अक्सर इनाम मिलने से पहले ही रन को समाप्त कर देता है।
शायद चारा को अच्छी तरह से डिज़ाइन नहीं किया गया था। उसकी रणनीति में कोई रक्षात्मक विकल्प नहीं है। यदि कॉम्बो की शर्तें पूरी नहीं होती हैं और उसे भारी नुकसान हो रहा है, तब भी वह बस एमपी (MP) फार्म करती रहती है। एक अधिक मजबूत संस्करण किसी निश्चित एचपी (HP) सीमा से नीचे होने पर सर्वाइवल मोड में चला जाता, जिससे संभवतः उसके आंकड़ों में सार्थक रूप से सुधार होता।
परिणाम दिशात्मक रूप से दिलचस्प हैं, लेकिन इन्हें रणनीति बनाम यादृच्छिकता के बारे में एक सामान्य बयान के रूप में नहीं, बल्कि इस विशिष्ट कॉन्फ़िगरेशन के एक स्नैपशॉट के रूप में पढ़ा जाना चाहिए।
भविष्य का शोध
स्पष्ट अगला कदम RARS से पूरी तरह से छुटकारा पाना है। यह संस्करण एक जावा-आधारित RISC-V एमुलेटर पर चलता है, जो सिमुलेशन गति पर एक कठोर सीमा लगाता है। RARS ecalls के बजाय लिनक्स syscalls के साथ वास्तविक संकलित RISC-V को लक्षित करने वाला एक दूसरा संस्करण नाटकीय रूप से तेज़ होना चाहिए, जो तब बहुत मायने रखता है जब मैचों की संख्या लाखों तक पहुँचने लगती है।
प्रदर्शन से परे, अधिक दिलचस्प दिशाएँ डिज़ाइन पक्ष पर हैं:
प्रति मैच अधिक खिलाड़ी। अभी यह हमेशा 1v1 है। एक तीसरा या चौथा प्रतिभागी जोड़ने से रणनीतिक परिदृश्य पूरी तरह से बदल जाता है। अचानक एक प्रति-रणनीति को एक साथ दो दिशाओं से हमले का हिसाब रखना पड़ता है, और शुद्ध यादृच्छिकता को बनाए रखना मुश्किल हो जाता है।
असेंबली के अंदर मशीन लर्निंग। इसका विचार RISC-V में सीधे एक न्यूनतम एमएल (ML) एल्गोरिदम को लागू करना है, जिसमें मैट्रिक्स संचालन का उपयोग करके एक बॉट को मैच के परिणामों के आधार पर अपने वेट्स (weights) को अपडेट करने दिया जाएगा। कोई बाहरी लाइब्रेरी नहीं, कोई हाई-लेवल रनटाइम नहीं, बस रजिस्टरों में इंटीजर मैट्रिक्स मैथ। यह व्यावहारिक है या इसे लागू करना सिर्फ एक दिलचस्प चुनौती है, यह इसका एक आकर्षण है।
अधिक रणनीतियाँ और एक गहरा इंजन। वर्तमान एक्शन स्पेस किसी भी रणनीति के लिए यादृच्छिक से सार्थक रूप से आगे निकलने के लिए बहुत छोटा है। वर्ल्ड ऑफ़ वॉरक्राफ्ट से अधिक सीधे प्रेरणा लेने (कूलडाउन, संसाधन ट्रेड-ऑफ, पोजिशनिंग प्रभाव, अधिक विविध कौशल इंटरैक्शन) से अच्छी तरह से डिज़ाइन की गई रणनीतियों को अराजकता पर खुद को साबित करने के लिए वास्तविक जगह मिलेगी।
बेंचमार्क इंफ्रास्ट्रक्चर पहले से ही मौजूद है। बाधा यह है कि गेम इतना गहरा हो कि परिणामों का कोई मतलब बन सके।
इसे चलाना
असेंबली को कंपाइल करने और इंजन को लोकली चलाने के लिए:
make simulate
