আমার গেমটিতে একটি ডায়ালগ ট্রি সিস্টেম কার্যকর করার সর্বোত্তম উপায় কী? আমি একটি এনপিসি খেলোয়াড়কে বিভিন্ন প্রতিক্রিয়ার সেট দিতে চাই, এমন কিছু উপস্থিতি কেবল তখনই উপস্থিত হতে পারে যখন প্লেয়ারের কোনও আইটেম থাকে বা কোনও পূর্ববর্তী ঘটনা ঘটে থাকে।
আমার গেমটিতে একটি ডায়ালগ ট্রি সিস্টেম কার্যকর করার সর্বোত্তম উপায় কী? আমি একটি এনপিসি খেলোয়াড়কে বিভিন্ন প্রতিক্রিয়ার সেট দিতে চাই, এমন কিছু উপস্থিতি কেবল তখনই উপস্থিত হতে পারে যখন প্লেয়ারের কোনও আইটেম থাকে বা কোনও পূর্ববর্তী ঘটনা ঘটে থাকে।
উত্তর:
এক্সএমএল ব্যবহার করে ডায়ালগ ট্রি করা উচিত। যদি আপনাকে আরও জটিল কিছু করার দরকার হয় তবে আপনি প্রতিক্রিয়াগুলির জন্য শর্তাদি এবং নেস্টেড ট্রিগুলিতে প্রতিক্রিয়ার জন্য কোনও স্ক্রিপ্ট ফাইলের রেফারেন্স সহ সঞ্চয় করেন।
আপনার স্ক্রিপ্টগুলি এবং কথোপকথনটি আলাদা রাখতে হবে বিশেষত যদি আপনি কোনও আরপিজি একসাথে রাখছেন যার মধ্যে মেট্রিক টন মূল্যের কথোপকথন রয়েছে। এরপরে আপনি এক্সএমএল ফাইলটি পড়ার জন্য সিম্পল এক্সএমএলের মতো লাইব্রেরি ব্যবহার করতে পারেন।
এসও তে একই উদাহরণ রয়েছে যার একটি উদাহরণ রয়েছে: 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!"
এটি এআই এবং অন্যান্য সহজ জিনিসগুলি কোডিংয়ের জন্যও ভাল কাজ করে যা রান সময়ের জন্য টুইঙ্ক করতে দরকারী। এমনকি আপনি নিজের অ্যাপ্লিকেশনটিতে নির্মিত একটি সম্পাদকও যুক্ত করতে পারেন যা ডিবাগ চলাকালীন (বা একটি ইস্টার ডিম হিসাবে) চালিত হতে পারে।
গেম স্টেনডাল আমরা এনপিসি বাস্তবায়নের জন্য একটি সসীম স্টেট মেশিন ব্যবহার করি।
নিম্নলিখিত চিত্রটি কীভাবে কোয়েস্ট টিউটোরিয়াল লিখবেন তার থেকে সামান্য উদাহরণ দেখায় ।
শুরুতে, এনপিসি একটি আইডিএল অবস্থায় রয়েছে এবং চারপাশে হাঁটতে পারে। একজন খেলোয়াড় "হাই" বলে কথোপকথন শুরু করতে পারেন এবং এনপিসি এতে অংশ নিতে রাজ্যে যাবে। এই অবস্থায় এটি তার "কাজ" সম্পর্কে প্রশ্নের উত্তর দেয় এবং কিছু গেম "সহায়তা" দেয়। প্লেয়ারটি কোনও খোঁজ চাইতে পারে এবং এনপিসি প্লেয়ারটির ("হ্যাঁ") গ্রহণ করার ("হ্যাঁ") প্রত্যাশা করে ("না") প্রত্যাশা করে কুইসT_OFFERED এ যাবে।
আমরা শর্তগুলির একটি সেট সংজ্ঞায়িত করেছি যা রূপান্তরের সাথে সংযুক্ত থাকতে পারে। উদাহরণস্বরূপ কোনও খেলোয়াড়ের কাজ সম্পূর্ণ করা কেবল তখনই সম্ভব যখন কোনও প্লেয়ারহ্যাসআইটেমটি উইথহিম কনডিশন পূরণ হয়।
কোনও রূপান্তর কার্যকর হওয়ার পরে এনপিসি কিছু পাঠ্য বলতে পারে এবং / অথবা কোনও ক্রিয়াকলাপ চালায়। শর্তের অনুরূপ আমরা ইক্যুইপ আইটেমএक्शन এর মতো পুনরায় ব্যবহারযোগ্য ক্রিয়াগুলির সংজ্ঞা দিয়েছি যা কোনও খেলোয়াড়কে সন্ধানের পুরষ্কার দিতে ব্যবহৃত হয়।
অ্যান্ডকন্ডিশন , অরকন্ডিশন এবং নোটকন্ডিশন ব্যবহার করে একাধিক শর্ত একত্রিত করা যেতে পারে । কোয়েস্ট সমাপ্তিতে সাধারণত বেশ কয়েকটি ক্রিয়া করতে হয়, তাই একাধিক কর্ম শ্রেণিও রয়েছে।
যদিও স্টেনডালের আসল বাস্তবায়ন অন্যান্য (মানব) ভাষায় সহজে অনুবাদযোগ্য না হয়ে ভোগে, আমি মনে করি সাধারণ ধারণাটি ভাল।
আপনি ওপেন সোর্স আরপিজি ইঞ্জিন অ্যাডন্টেল এর Dlgedit সরঞ্জামটি একবার দেখে নিতে পারেন । এটি অত্যন্ত উন্নত এবং আপনার প্রয়োজনীয় সমস্ত কিছু থাকতে পারে (উত্সগুলি সহ;))
আমি অনুবাদগুলিতে যুক্ত করার জন্য ভাবি, আপনি এখনও উপরে বর্ণিত যুক্তির জন্য XML ব্যবহার করতে পারেন । আপনি যখন এই ধরণের জটিলতায় পড়ছেন তখন আপনার নিজের আলাপের সরঞ্জামটি লিখতে হবে। আপনার কথোপকথনের পাঠ্যটি একটি ডাটাবেসের মূল কী হিসাবে সঞ্চিত হবে যা আপনি প্রদর্শিত করতে চান এমন ভাষা নির্ভর করে could
উদাহরণস্বরূপ আপনার থাকতে পারে:
<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>
তারপরে আপনার কাছে কোয়েস্ট পাঠ্য রেন্ডারারের উপযুক্ত স্থানান্তরিত পাঠ্যের সাথে "লোকালাইজ.ফিক্সমাইকার" প্রতিস্থাপন করা হবে।
আপনার সরঞ্জামটি সম্পাদনাযোগ্য কাঁচা এক্সএমএল পাশাপাশি খেলোয়াড়কে বাছাইযোগ্য ভাষায় কী দেখায় তা প্রদর্শন করবে।
একইভাবে আপনি যেমন উল্লেখ করেছেন তা থেকে এরকম কিছু ব্যবহার করতে পারেন :
npc.add(ConversationStates.ATTENDING,
ConversationPhrases.QUEST_MESSAGES,
null,
ConversationStates.QUEST_OFFERED,
Localization[ "BringMeABeer" ],
null);
যদি আপনার কীগুলি সম্পূর্ণরূপে বর্ণনামূলক থাকে তবে পুরো পাঠ্যটি সমস্যা না হওয়া উচিত।
এর মতো কিছু কার্যকর হতে পারে:
Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
ডেটা LUA স্ক্রিপ্ট বা এমনকি এক্সএমএল ফাইলগুলি সহ আপনার অক্ষরগুলি ড্রাইভ করে। আপনি যখন কোনও এনপিসির সাথে ইন্টারঅ্যাক্ট করেন, তার সাথে সংযুক্ত ফাইলটি ধরুন, এতে পড়ুন, ট্রিগারযুক্ত হতে পারে এমন কোনও গেমের ভেরিয়েবলের জন্য সামঞ্জস্য করুন এবং বৈধ প্রতিক্রিয়াটি তৈরি করুন।
এইভাবে করা থেকে সবচেয়ে বড় লাভ হ'ল আপনি সহজেই ডায়লগটি প্রবেশ করতে পারেন এবং নতুন অক্ষর যুক্ত করতে পারেন etc. ইত্যাদি each আপনি প্রতিটি কোডকে পরিচালনা করার ক্ষেত্রে বিশেষ যুক্তি দিয়ে আপনার কোড বেসকে উপহাস করা এড়াতে পারেন।
আপনার যদি ডায়ালগ ট্রিগুলির একটি গভীর গভীর সেট থাকে তবে চ্যাটম্যাপার ব্যবহার করুন । তাদের একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ফ্রি সংস্করণ রয়েছে এবং সরঞ্জামটি আপনাকে আপনার ডায়ালগ গাছগুলি এক্সএমএলে রফতানি করার অনুমতি দেয়। আমি এটি ব্যবহার করে চলেছি এবং জটিল ডায়ালগ ট্রিগুলি ভিজ্যুয়ালাইজ এবং পরিচালনা করার জন্য এটি একটি দুর্দান্ত উপায়।
যদি আপনার ডায়লগগুলি কোনও জটিলতার হয় তবে আপনার ডায়ালগ বাস্তবায়নের জন্য সবচেয়ে গুরুত্বপূর্ণ জিনিসটি হ'ল আপনার মিথস্ক্রিয়াটির জটিলতা বোঝার উপায়। আমি এটি কল্পনা করার জন্য কোনও ধরণের নোড সম্পাদককে প্রস্তাব দিচ্ছি, যদিও আমার কাছে সুপারিশ করার মতো কোনও ভাল ওপেন সিস্টেম নেই।
আমি মনে করি, আপনি এই জাতীয় গেমটি পরিচালনা করার জন্য আপনার নিজের স্ক্রিপ্ট ভাষা ব্যবহার করেন (যদি না হয় তবে আপনার উচিত) hen
ডায়লগ যুক্তি তৈরির সময় আপনি অন্যান্য গেম ভেরিয়েবলের সাথে কাজ করতে পারেন। গেম ইঞ্জিনগুলি লেগোয়ের মতো। আপনি কেবল ইট প্রোগ্রাম করেছেন এবং স্ক্রিপ্ট সেগুলি ব্যবহার করে। আপনি কিছু স্ক্রিপ্ট দোভাষী বা সংকলক তৈরি করে তা বিবেচ্য নয়। তবে স্ক্রিপ্ট সর্বদা দরকারী।
সাধারণ অটোমেটন এটি করতে পারে:
(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!!!")
গেমটিতে আপনি আইডি খুঁজে পান এবং আইডি এবং শর্তটি মেলাতে চেষ্টা করুন।
আপনার শর্ত এবং ক্রিয়াগুলির মডেল করা দরকার। অবজেক্টস, ফাংশন পয়েন্টার, এক্সএমএল দ্বারা ...
ভাল কথোপকথন সম্পাদকও কাজে আসবে।