मेरे खेल में संवाद पेड़ प्रणाली को लागू करने का सबसे अच्छा तरीका क्या है? मैं एक एनपीसी चाहता हूं कि खिलाड़ी को प्रतिक्रियाओं के अलग-अलग सेट दिए जाएं, कुछ जो केवल तब दिखाई दे सकते हैं जब खिलाड़ी के पास कोई आइटम या पिछली घटना हुई हो।
मेरे खेल में संवाद पेड़ प्रणाली को लागू करने का सबसे अच्छा तरीका क्या है? मैं एक एनपीसी चाहता हूं कि खिलाड़ी को प्रतिक्रियाओं के अलग-अलग सेट दिए जाएं, कुछ जो केवल तब दिखाई दे सकते हैं जब खिलाड़ी के पास कोई आइटम या पिछली घटना हुई हो।
जवाबों:
एक्सएमएल का उपयोग करते हुए डायलॉग ट्रीज़ किया जाना चाहिए। यदि आप कुछ अधिक जटिल करने की आवश्यकता है, तो आप स्क्रिप्ट की फ़ाइल के संदर्भ में नेस्टेड पेड़ों में प्रतिक्रियाओं और प्रतिक्रिया के लिए शर्तों को संग्रहीत करते हैं।
आपको स्क्रिप्ट और संवाद को अलग रखना चाहिए, खासकर यदि आप एक आरपीजी डाल रहे हैं जिसमें एक मीट्रिक टन वार्तालाप है। फिर आप XML फ़ाइल को पढ़ने के लिए simpleXML जैसी लाइब्रेरी का उपयोग कर सकते हैं।
उदाहरण के साथ SO पर एक समान प्रश्न है: https://stackoverflow.com/questions/372915/game-logic-in-xml-files
मैं एक स्क्रिप्टिंग भाषा जैसे कि लुआ या रूबी और कोडिंग डायलॉग इंटरैक्शन को एम्बेड करूंगा।
इस प्रकार एक संवाद स्क्रिप्ट की तरह लग सकता है:
switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
case 1:
showDialog "And stay gone!"
case 2:
if playerHasObject "dog"
showDialog "Thank you!"
else
showDialog "Liar!"
यह AI और अन्य सरल चीजों को कोड करने के लिए भी अच्छी तरह से काम करता है जो रन टाइम के दौरान ट्वीक करने के लिए उपयोगी होते हैं। आप अपने एप्लिकेशन में निर्मित एक संपादक को भी जोड़ सकते हैं जिसे डिबग (या ईस्टर एग के रूप में) में चलने पर आमंत्रित किया जा सकता है।
खेल स्टेंडल में हम एनपीसी को लागू करने के लिए एक परिमित राज्य मशीन का उपयोग करते हैं।
निम्नलिखित आरेख ट्यूटोरियल को लिखने के तरीके से एक छोटा सा उदाहरण दिखाता है ।
शुरुआत में, एनपीसी एक आईडीएलई राज्य में है और घूम रहा हो सकता है। एक खिलाड़ी "हाय" कहकर बातचीत शुरू कर सकता है और एनपीसी स्टेट एटीटैंडिंग पर जाएगा। इस राज्य में यह उसकी "नौकरी" के बारे में सवालों के जवाब देता है और कुछ खेल "सहायता" प्रदान करता है। खिलाड़ी एक खोज के लिए पूछ सकता है और NPC राज्य QUEST_OFFERED पर जाकर इस खिलाड़ी के स्वीकार ("हाँ") या गिरावट ("नहीं") को स्वीकार करेगा।
हमने ऐसी स्थितियों का एक सेट परिभाषित किया है जो संक्रमणों से जुड़ी हो सकती हैं। उदाहरण के लिए एक खोज को पूरा करना केवल तभी संभव हो सकता है जब एक PlayerHasItemWithHimCondition पूरा हो।
एक संक्रमण निष्पादित होने के बाद NPC कुछ पाठ और / या किसी कार्रवाई को निष्पादित कर सकती है। शर्तों के समान हमने EquipItemAction जैसे कार्यों के पुन: प्रयोज्य सेट को परिभाषित किया है जिसका उपयोग किसी खिलाड़ी को एक खोज इनाम देने के लिए किया जाता है।
एकाधिक शर्तों को AndCondition , OrCondition और NotCondition का उपयोग करके जोड़ा जा सकता है । आमतौर पर खोज पूर्ण होने पर कई कार्य किए जाते हैं, इसलिए एक बहुआयामी वर्ग भी है।
जबकि स्टेंडल में वास्तविक कार्यान्वयन अन्य (मानव) भाषाओं में आसानी से अनुवाद योग्य नहीं होने के कारण होता है, मुझे लगता है कि सामान्य अवधारणा अच्छी है।
आप ओपन सोर्स आरपीजी इंजन Adonthell के Dlgedit टूल पर एक नज़र डाल सकते हैं । यह बहुत उन्नत है और इसमें आपकी ज़रूरत की हर चीज़ शामिल होनी चाहिए (स्रोतों सहित;)
मुझे लगता है कि अनुवाद में जोड़ने के लिए, आप अभी भी एक्सएमएल का उपयोग तर्क के लिए कर सकते हैं जैसा कि ऊपर कहा गया है । जब आप उस प्रकार की जटिलता में आ रहे हैं तो आपको अपना संवाद टूल लिखना चाहिए। आपके संवाद पाठ को एक डेटाबेस की कुंजी के रूप में संग्रहीत किया जाएगा जिसे आप उस भाषा के आधार पर स्वैप कर सकते हैं जिसे आप दिखाना चाहते हैं।
उदाहरण के लिए आप हो सकते हैं:
<dialogue id="101" condition="!npc.carsFixed">
<message>Localize.FixMyCar</message>
<choices>
<choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.Sure">
<command>hero.carFixingSkills += 1</command>
<command>npc.carFixed = true</command>
<command>hero.playSmokeAnimation()</command>
<command>nextDialogue = 104</command>
</choice>
<choice condition="hero.carFixingSkill <= 5" id="Localize.CantFix">
<command>nextDialogue = 105</command>
</choice>
<choice id="Localize.FixYourself">
<command>npc.likesHero -= 1</command>
</choice>
</choices>
</dialogue>
तब आपके पास खोज पाठ रेंडरर "स्थानीयकृत .ixMyCar" को उचित रूप से अनुवादित पाठ के साथ बदलना होगा।
आपका टूल यह प्रदर्शित करेगा कि खिलाड़ी संपादन योग्य कच्चे XML के साथ चयन योग्य भाषा में क्या देखेगा।
इसी तरह आप उदाहरण के लिए कुछ ऐसा इस्तेमाल कर सकते हैं जिसे आपने संदर्भित किया है :
npc.add(ConversationStates.ATTENDING,
ConversationPhrases.QUEST_MESSAGES,
null,
ConversationStates.QUEST_OFFERED,
Localization[ "BringMeABeer" ],
null);
यदि आपकी चाबियां वर्णनात्मक हैं, तो पूरा पाठ नहीं होना एक मुद्दा नहीं होना चाहिए।
ऐसा कुछ उपयोगी हो सकता है:
Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
डेटा LUA स्क्रिप्ट या XML फ़ाइलों के साथ अपने वर्णों को चलाते हैं। जब आप एनपीसी के साथ बातचीत करते हैं, तो उस फ़ाइल को पकड़ो जो उससे जुड़ी हुई है, उसे पढ़ें, ट्रिगर किए गए किसी भी गेम चर के लिए समायोजित करें, और मान्य प्रतिक्रिया को उत्पाद करें।
इस तरह से करने से सबसे बड़ा लाभ यह है कि आप आसानी से अंदर जा सकते हैं और संवाद में हेरफेर कर सकते हैं, नए पात्रों को जोड़ सकते हैं, आदि। आप प्रत्येक और हर मामले को संभालने में विशेष तर्क के साथ अपने कोड आधार को मूक करने से भी बचते हैं।
यदि आप एक्सएमएल का उपयोग करते हैं, तो सुनिश्चित करें कि आप एक्सएमएल फ़ाइल को संपादित करने के लिए एक छोटा सा उपकरण बनाते हैं। तुम पागल हो जाओगे अन्यथा।
यदि आपके पास संवाद पेड़ों का एक बहुत गहरा सेट है, तो चैटमैपर का उपयोग करें । उनके पास एक पूरी तरह से चित्रित मुफ्त संस्करण है और उपकरण आपको अपने संवाद पेड़ों को एक्सएमएल में निर्यात करने की अनुमति देता है। मैं इसका उपयोग कर रहा हूं और यह जटिल संवाद पेड़ों की कल्पना और व्यवस्थित करने का एक शानदार तरीका है।
यदि आपके संवाद किसी जटिलता के हैं, तो संवाद कार्यान्वयन के लिए सबसे महत्वपूर्ण बात जो आपके लिए आवश्यक है, वह है आपकी बातचीत की जटिलता को समझने का एक तरीका। मैं यह कल्पना करने के लिए किसी तरह का एक नोड संपादक की सलाह देता हूं, हालांकि मेरे पास सिफारिश करने के लिए कोई अच्छा खुला सिस्टम नहीं है।
मुझे लगता है, कि आप इस प्रकार के खेल को निर्देशित करने के लिए अपनी स्वयं की स्क्रिप्ट भाषा का उपयोग करते हैं (यदि नहीं, तो आपको करना चाहिए)। फिर संवाद को संभालने के लिए अपनी स्क्रिप्ट का भी विस्तार करें।
आप संवाद तर्क के निर्माण के दौरान अन्य खेल चर के साथ काम कर सकते हैं। गेम इंजन लेगो की तरह हैं। आपने केवल ईंटों को प्रोग्राम किया और स्क्रिप्ट उनका उपयोग करती है। इससे कोई फर्क नहीं पड़ता कि आप कुछ स्क्रिप्ट दुभाषिया या संकलक बनाते हैं। लेकिन स्क्रिप्ट हमेशा उपयोगी होती है।
सरल ऑटोमेटन कर सकते हैं:
(dialogueline_id, condition) -> (next_id, response)
यह कुछ इस तरह दिख सकता है:
(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")
खेल में आप आईडी ढूंढते हैं और आईडी और स्थिति का मिलान करने का प्रयास करते हैं।
आपको परिस्थितियों और कार्यों को मॉडल करने की आवश्यकता है। ऑब्जेक्ट्स, फंक्शन पॉइंटर्स, XML द्वारा ...
अच्छा संवाद संपादक भी काम आएगा।