MUD- শৈলীর পাঠ্য ভিত্তিক বিশ্বে স্তর / কক্ষগুলি সংগঠিত করা হচ্ছে


12

আমি একটি ছোট পাঠ্য-ভিত্তিক অ্যাডভেঞ্চার গেম লেখার কথা ভাবছি তবে আমি কীভাবে প্রযুক্তিগত দিক থেকে বিশ্বের নকশা করা উচিত তা আমি বিশেষভাবে নিশ্চিত নই।

আমার প্রথম চিন্তাটি এটি এক্সএমএলে করা, নিম্নলিখিতগুলির মতো কিছু ডিজাইন করা। এক্সএমএলের বিশাল স্তূপের জন্য ক্ষমাপ্রার্থী, তবে আমি কী করছি তা পুরোপুরি ব্যাখ্যা করা আমার কাছে গুরুত্বপূর্ণ মনে হয়েছিল।

<level>
    <start>
        <!-- start in kitchen with empty inventory -->
        <room>Kitchen</room>
        <inventory></inventory>
    </start>
    <rooms>
        <room>
            <name>Kitchen</name>
            <description>A small kitchen that looks like it hasn't been used in a while. It has a table in the middle, and there are some cupboards. There is a door to the north, which leads to the garden.</description>
            <!-- IDs of the objects the room contains -->
            <objects>
                <object>Cupboards</object>
                <object>Knife</object>
                <object>Batteries</object>
            </objects>
            </room>
        <room>
            <name>Garden</name>
            <description>The garden is wild and full of prickly bushes. To the north there is a path, which leads into the trees. To the south there is a house.</description>
            <objects>
            </objects>
        </room>
        <room>
            <name>Woods</name>
            <description>The woods are quite dark, with little light bleeding in from the garden. It is eerily quiet.</description>
            <objects>
                <object>Trees01</object>
            </objects>
        </room>
    </rooms>
    <doors>
        <!--
            a door isn't necessarily a door.
            each door has a type, i.e. "There is a <type> leading to..."
            from and to are references the rooms that this door joins.
            direction specifies the direction (N,S,E,W,Up,Down) from <from> to <to>
        -->
        <door>
            <type>door</type>
            <direction>N</direction>
            <from>Kitchen</from>
            <to>Garden</to>
        </door>
        <door>
            <type>path</type>
            <direction>N</direction>
            <from>Garden</type>
            <to>Woods</type>
        </door>
    </doors>
    <variables>
        <!-- variables set by actions -->
        <variable name="cupboard_open">0</variable>
    </variables>
    <objects>
        <!-- definitions for objects -->
        <object>
            <name>Trees01</name>
            <displayName>Trees</displayName>
            <actions>
                <!-- any actions not defined will show the default failure message -->
                <action>
                    <command>EXAMINE</command>
                    <message>The trees are tall and thick. There aren't any low branches, so it'd be difficult to climb them.</message>
                </action>
            </actions>
        </object>
        <object>
            <name>Cupboards</name>
            <displayName>Cupboards</displayName>
            <actions>
                <action>
                    <!-- requirements make the command only work when they are met -->
                    <requirements>
                        <!-- equivilent of "if(cupboard_open == 1)" -->
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>EXAMINE</command>
                    <!-- fail message is the message displayed when the requirements aren't met -->
                    <failMessage>The cupboard is closed.</failMessage>
                    <message>The cupboard contains some batteires.</message>
                </action>
                <action>
                    <requirements>
                        <require operation="equal" value="0">cupboard_open</require>
                    </requirements>
                    <command>OPEN</command>
                    <failMessage>The cupboard is already open.</failMessage>
                    <message>You open the cupboard. It contains some batteries.</message>
                    <!-- assigns is a list of operations performed on variables when the action succeeds -->
                    <assigns>
                        <assign operation="set" value="1">cupboard_open</assign>
                    </assigns>
                </action>
                <action>
                    <requirements>
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>CLOSE</command>
                    <failMessage>The cupboard is already closed.</failMessage>
                    <message>You closed the cupboard./message>
                    <assigns>
                        <assign operation="set" value="0">cupboard_open</assign>
                    </assigns>
                </action>
            </actions>
        </object>
        <object>
            <name>Batteries</name>
            <displayName>Batteries</displayName>
            <!-- by setting inventory to non-zero, we can put it in our bag -->
            <inventory>1</inventory>
            <actions>
                <action>
                    <requirements>
                        <require operation="equal" value="1">cupboard_open</require>
                    </requirements>
                    <command>GET</command>
                    <!-- failMessage isn't required here, it'll just show the usual "You can't see any <blank>." message -->
                    <message>You picked up the batteries.</message>
                </action>
            </actions>
        </object>
    </objects>
</level>

স্পষ্টতই এর চেয়ে আরও বেশি কিছু হওয়া দরকার। মানুষ এবং শত্রুদের সাথে যোগাযোগের পাশাপাশি মৃত্যু এবং সমাপ্তি প্রয়োজনীয় সংযোজন। এক্সএমএল যেহেতু কাজ করা বেশ কঠিন তাই আমি সম্ভবত একরকম বিশ্ব সম্পাদক তৈরি করব।

আমি জানতে চাই যে এই পদ্ধতির কোনও অবক্ষয় রয়েছে কিনা এবং যদি এটির "আরও ভাল" বা আরও মানক উপায় থাকে।


3
ব্যক্তিগতভাবে আমি এক্সএমএলকে সিরিয়ালাইজেশন বিন্যাসের চেয়ে বেশি কিছু মনে করি না। যদি আপনি "কোনওভাবে আমি এটি ডিস্কে পড়তে এবং লিখতে যাচ্ছি" প্রশ্নটি (এক্সএমএল, জেএসওএন, প্রোটোকল বাফারস, কাস্টম বাইনারি ফর্ম্যাট, যাই হোক না কেন) ব্যবহার করে, তবে প্রশ্নটি হয়ে যায় "আমার কী ডেটা সংরক্ষণ করতে হবে?" ", যা আপনার গেমের প্রয়োজনীয়তাগুলির উপর নির্ভর করে কেবলমাত্র সত্যই আপনি উত্তর দিতে পারেন।
টেট্রাড

ভাল যুক্তি. যাইহোক, আমি গেমস এর আগেও এই জাতীয় শৈলী ব্যবহার করতে দেখেছি এবং সেগুলি সত্যিই সীমাবদ্ধ বলে প্রমাণিত হয়েছে। এই ক্ষেত্রে, যদিও, গেমের প্রবাহ এবং যুক্তিটি বেশ সহজ, তাই এটি ভালভাবে কাজ করতে পারে এবং স্ক্রিপ্টিং ইঞ্জিনটি বাস্তবায়ন থেকে আমাকে বাঁচায়। আমি প্রাথমিকভাবে এ জাতীয় স্থির কাঠামো (আলাদা ঘর, দরজা, অবজেক্টস, কোথাও একটি সংজ্ঞায়িত ফাইলের ভেরিয়েবল) কার্যকর বা না তা নিয়ে আগ্রহী।
বহুবর্ষীয়

টেট্রাড প্রতিধ্বনিত না করার চেষ্টা করছেন তবে আপনি যদি বিশ্ব সম্পাদক তৈরির পরিকল্পনা করছেন (গেমটি খুব সংক্ষিপ্ত না হওয়া পর্যন্ত আমি প্রস্তাব করব) তবে আপনার ফাইলের ফর্ম্যাটটিতে কোনও পার্থক্য নেই কারণ আপনি এটির সাথে কাজ করবেন সম্পাদক, বনাম হার্ড কোডিং।
মাইক ক্লক

উত্তর:


13

যদি আপনি পুরোপুরি সি # তে আবদ্ধ হন না, তবে এটির আরও "আরও প্রমিত" উপায়টি হ'ল এই ধরণের গেমটি তৈরি করতে লোকদের সহায়তা করার জন্য ইতিমধ্যে বিদ্যমান অনেকগুলি পাঠ্য দু: সাহসিক কাজ তৈরির সরঞ্জামগুলির মধ্যে একটি ব্যবহার করা। এই সরঞ্জামগুলি আপনাকে ইতিমধ্যে কার্যক্ষম পার্সার, মৃত্যুর জন্য পরিচালনা, সংরক্ষণ / পুনরুদ্ধার / পূর্বাবস্থায় ফিরিয়ে আনতে, চরিত্রের মিথস্ক্রিয়া এবং পাঠ্যের সাহসিক কার্যকারিতার অন্যান্য অনুরূপ স্ট্যান্ডার্ড বিট দেয়। এই মুহুর্তে, সর্বাধিক জনপ্রিয় রাইটিং সিস্টেমগুলি অবহিত করা হয় এবং টিএডিএস (যদিও সেখানে আরও অর্ধ ডজন উপস্থিত রয়েছে)

ইনফোকম গেমস দ্বারা ব্যবহৃত বেশিরভাগ জেড মেশিন ভার্চুয়াল মেশিন নির্দেশ সেটগুলিতে বা আরও সাম্প্রতিক গ্লাক্স ভার্চুয়াল মেশিন নির্দেশের সেটগুলিতে অবহিত করা যেতে পারে। অন্যদিকে, টিএডিএস তার নিজস্ব ভার্চুয়াল মেশিন কোডে সংকলন করে।

যে কোনও ধরণের বাইনারি বেশিরভাগ আধুনিক ইন্টারেক্টিভ কথাসাহিত্যিক দোভাষী দ্বারা চালিত হতে পারে (পুরানো দিনগুলিতে, আপনাকে প্রায়শই গ্ললাক্স গেমস থেকে জেডম্যাচিন গেমস থেকে টিএডিএস গেমের জন্য পৃথক দোভাষীর প্রয়োজন হয় But তবে ধন্যবাদ, সেই দিনগুলি মূলত এখন শেষ। আপনি চান যে কোনও প্ল্যাটফর্ম সম্পর্কে; Mac / PC এর / লিনাক্স / বাসদ / আইওএস / অ্যান্ড্রয়েড / কিন্ডল / ব্রাউজার / ইত্যাদি। সুতরাং আপনি ইতিমধ্যে ভাল ক্রস প্ল্যাটফর্ম পেয়েছেন এবং সত্যই যত্ন নেওয়া হয়েছে।

বেশিরভাগ প্ল্যাটফর্মের জন্য, বর্তমানে প্রস্তাবিত দোভাষী হলেন গারগোইল , তবে প্রচুর অন্য রয়েছে, তাই নিখরচায় পরীক্ষা নিরীক্ষণ করবেন না।

ইনফোমে কোডিং (বিশেষত সর্বশেষতম সংস্করণ )টি অভ্যস্ত হতে খানিকটা সময় নেয়, যেহেতু এটি ইঞ্জিনিয়ারদের চেয়ে লেখকদের দিকে বেশি বিপণন করে, এবং তাই এর বাক্য গঠনটি অদ্ভুত এবং প্রায় কথোপকথন দেখাচ্ছে। 7-এর সিনট্যাক্সে অবহিত করাতে, আপনার উদাহরণটি দেখতে এরকম হবে:

"My Game" by Polynomial

Kitchen is a room. "A small kitchen that looks like it hasn't been used in a 
while. It has a table in the middle, and there are some cupboards. There is a 
door to the north, which leads to the garden."

In the Kitchen is a knife and some cupboards.  The cupboards are fixed in 
place and closed and openable.  In the cupboards are some batteries.

Garden is north of Kitchen. "The garden is wild and full of prickly bushes. 
To the north there is a path, which leads into the trees. To the south there 
is a house."

Woods is north of Garden.  "The woods are quite dark, with little light bleeding 
in from the garden. It is eerily quiet."  

Trees are scenery in the Woods.  "The trees are tall and thick. There aren't any 
low branches, so it'd be difficult to climb them."

যেখানে TADS দেখতে প্রচলিত প্রোগ্রামিং ভাষার চেয়ে বেশি, এবং TADS এ একই খেলাটি দেখতে এই রকম দেখাচ্ছে:

#charset "us-ascii"
#include <adv3.h>
gameMain: GameMainDef
    initialPlayerChar = me
;
versionInfo: GameID
    name = 'My Game'
    byline = 'by Polynomial'
;
startroom: Room                  /* we could call this anything we liked */ 
    roomName = 'Kitchen'         /* the displayed "name" of the room */ 
    desc = "A small kitchen that looks like it hasn't been used 
            in a while. It has a table in the middle, and there 
            are some cupboards. There is a door to the north, 
            which leads to the garden." 
    north = garden         /* where 'north' will take us */ 
; 

+me: Actor
; 

cupboards: OpenableContainer
    vocabWords = 'cupboard/cupboards' 
    name = 'cupboards' 
    isPlural = true
    location = startroom 
; 
battery: Thing
    name = 'battery'
    location = cupboards
;
knife: Thing
    name = 'knife'
    location = startroom
;
garden: Room
    roomName = 'Garden'
    desc = "The garden is wild and full of prickly bushes. To the 
            north there is a path, which leads into the trees. To 
            the south there is a house." 
    north = woods
    south = startroom
; 
woods: Room
    roomName = 'Woods'
    desc = "The woods are quite dark, with little light bleeding 
            in from the garden. It is eerily quiet."
    south = garden
;
trees: Decoration
    desc = "The trees are tall and thick. There aren't any low 
            branches, so it'd be difficult to climb them."
    location = woods
;

উভয় সিস্টেমই অবাধে উপলভ্য, খুব ঘন ঘন ব্যবহৃত হয় এবং প্রচুর পরিমাণে টিউটোরিয়াল ডকুমেন্টেশন থাকে (আমি উপরে প্রদত্ত লিঙ্কগুলি থেকে উপলব্ধ), সুতরাং এটি উভয়টিই পরীক্ষা করে নেওয়া এবং আপনার পছন্দেরটিকে বাছাইয়ের পক্ষে মূল্যবান।

নোট করুন যে দুটি সিস্টেমে সূক্ষ্মভাবে পৃথক স্ট্যান্ডার্ড আচরণ রয়েছে (যদিও উভয়ই সংশোধিত হতে পারে)। ইনফর্ম উত্স থেকে সংকলিত হিসাবে এখানে খেলাটির স্ক্রিনশটটি খেলছে:

স্ক্রিনশটটি অবহিত করুন

টেডস উত্স থেকে সংকলিত গেমটি এখানে খেলতে চলেছে (টার্মিনালের অভ্যন্তরে - টাইপোগ্রাফিটি এর চেয়ে অনেক সুন্দর হতে পারে):

TADS3 স্ক্রিনশট

আকর্ষণীয় বিষয়গুলি লক্ষ্য করুন: টিএডিএস আপনাকে ডিফল্টরূপে শীর্ষে ডানদিকে একটি 'স্কোর' প্রদর্শন দেয় (তবে আপনি এটি বন্ধ করতে পারেন), তবে ইনফর্মটি দেয় না (তবে আপনি এটি চালু করতে পারেন)। ডিফল্টরূপে আপনাকে রুম বিবরণে আইটেমগুলির খোলা / বন্ধ অবস্থাগুলি জানাতে হবে, ট্যাডগুলি হবে না। প্লেস কমান্ডগুলি পরিচালনা করার জন্য টিডস স্বয়ংক্রিয়ভাবে আপনার জন্য পদক্ষেপ গ্রহণ করে (যদি না আপনি তা না বলেন), যেখানে ইনফর্মটি না করে (আপনি যদি না বলেন)।

যে কোনও একটি খেলাকে যেকোন ধরণের গেম তৈরি করতে ব্যবহার করা যেতে পারে (তারা উভয়ই অত্যন্ত কনফিগারযোগ্য) তবে ইনফোকে আধুনিক-শৈলীর ইন্টারেক্টিভ কথাসাহিত্য (প্রায়শই ন্যূনতম ধাঁধা এবং শৈলীতে আরও বর্ণনামূলক) উত্পাদনের দিকে আরও কাঠামোগত করা হয় যেখানে টিএডিএস আরও কাঠামোগত হয় পুরানো-শৈলীর পাঠ্য অ্যাডভেঞ্চারগুলি উত্পাদন করার দিকে (প্রায়শই ধাঁধার উপর জোর দেয় এবং গেমের বিশ্ব মডেলের যান্ত্রিক সংজ্ঞা দেয়)।


এটি খুব দুর্দান্ত এবং তথ্যপূর্ণ তবে ইমো প্রশ্নের উত্তর দেয় না। আমি মূলত এই একই একই প্রশ্ন জিজ্ঞাসা করতে যাচ্ছিলাম। এই এক্সএমএলটি একটি বৈধ পন্থা বা এটির যে কোনও সমস্যা বা দুর্বলতা রয়েছে সে সম্পর্কে আমি আরও জানতে চাই।
ডিএলহ

1
@ ডিএলএহ প্রশ্নটি ছিল "আমি জানতে চাই যে এই পদ্ধতির কোনও ক্ষয়ক্ষতি রয়েছে কিনা, এবং যদি এটির" আরও ভাল "বা আরও মানক উপায় থাকে তবে" এই উত্তরটি আরও উন্নততর এবং আরও-মানসম্মত উপায় সরবরাহ করে করছেন-এটা
ট্রেভর পাওয়েল

তবে যেহেতু আপনি "সমস্যা এবং দুর্বলতা" সম্পর্কে জিজ্ঞাসা করেছেন: অবহিতকরণ বাস্তবায়নটি 19 লাইন দীর্ঘ। টিএডিএস উদাহরণটি 40 লাইন দীর্ঘ। এক্সএমএল বাস্তবায়নের জন্য 126 টি লাইন প্রয়োজন (এটি যদি 80 কলামে শব্দ-মোড়ানো থাকে এবং প্রগতিশীলতার জন্য শ্বেত স্পেস থাকে তবে যেভাবে ইনফর্ম এবং টিএডিএস বাস্তবায়ন হয়) requires
ট্রেভর পাওয়েল

অনেক খাটো হওয়ার পাশাপাশি ইনফর্ম এবং টিএডিএস উদাহরণগুলি আরও বৈশিষ্ট্যগুলিকে সমর্থন করে। উদাহরণস্বরূপ, উভয়টিতে আপনি আলমারিতে ছুরি রাখতে পারেন যা এক্সএমএল সংস্করণে মোটেই সমর্থিত নয়।
ট্রেভর পাওয়েল

1
এটিও লক্ষণীয় যে এক্সএমএল সংস্করণটি আলমারিগুলির বিবরণগুলিতে আলমারির সামগ্রীগুলি বেক করছে। অর্থাত, (খোলা) আলমারিগুলি খোলার সময় বা কী কী মুদ্রণ করতে হবে তার জন্য একটি হার্ডকোডযুক্ত বার্তা রয়েছে যা আপনাকে জানায় যে ভিতরে ব্যাটারি রয়েছে। তবে খেলোয়াড় যদি ইতিমধ্যে ব্যাটারি নিয়ে থাকেন? এক্সএমএল সংস্করণ আপনাকে জানাবে যে ভিতরে ব্যাটারি রয়েছে (কারণ এটি প্রদর্শন করার জন্য এটি কেবলমাত্র স্ট্রিং রয়েছে), তবে ইনফর্ম এবং টিএডিএস সংস্করণ আপনাকে জানিয়ে দেবে যে আলমারিগুলি খালি রয়েছে।
ট্রেভর পাওয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.