হ্যালো! আমি ভ্লাদিমির পপভ, ওয়ার রোবট প্রকল্পের ক্লায়েন্ট বিকাশকারী। লেখার সময়, ওয়ার রোবটগুলি বেশ কয়েক বছর ধরে রয়েছে এবং এই সময়ে গেমটিতে কয়েক ডজন নতুন মেক উপস্থিত হয়েছে। স্বাভাবিকভাবেই, রোবটগুলির বিভিন্ন ক্ষমতা গুরুত্বপূর্ণ, কারণ, তাদের ছাড়া, রোবটগুলি তাদের স্বতন্ত্রতা হারায় যা গেমটিকে আরও আকর্ষণীয় করে তোলে।
এই পোস্টে, আমি আমাদের গেমে গেমপ্লে সক্ষমতা সিস্টেমটি কীভাবে কাজ করে - এবং এটি কীভাবে বিবর্তিত হয়েছে তা শেয়ার করব। এবং, জিনিসগুলিকে আরও অ্যাক্সেসযোগ্য করতে, আমি জিনিসগুলিকে সহজ ভাষায় এবং খুব বেশি প্রযুক্তিগত বিশদ ছাড়াই ব্যাখ্যা করব।
প্রথমে, আসুন প্রকল্পের ইতিহাসে ডুব দেওয়া যাক এবং একটি পুরানো বাস্তবায়ন দেখুন যা আর ব্যবহার করা হচ্ছে না।
পূর্বে, ক্ষমতাগুলি খুব তুচ্ছ উপায়ে ডিজাইন করা হয়েছিল: তাদের একটি উপাদান ছিল যা রোবটের সাথে সংযুক্ত ছিল। এটি একটি নির্মাণ যেখানে প্রোগ্রামার সম্পূর্ণরূপে বর্ণনা করে যে কীভাবে ক্ষমতা কাজ করে: উভয়ই এর প্রবাহ এবং কীভাবে এটি অন্যান্য ক্ষমতার সাথে ইন্টারঅ্যাক্ট করে। সমস্ত যুক্তি একটি উপাদানের ভিতরে বর্ণনা করা হয়েছে, এবং গেম ডিজাইনার এটিকে রোবটের সাথে সংযুক্ত করতে পারে এবং প্রয়োজন অনুসারে পরামিতিগুলি কনফিগার করতে পারে। এটা উল্লেখ করার মতো যে ক্ষমতার প্রবাহ পরিবর্তন করা সম্ভব ছিল না - গেম ডিজাইনাররা শুধুমাত্র পরামিতি এবং সময় পরিবর্তন করতে পারে।
একটি পুরানো ক্ষমতা শুধুমাত্র দুটি রাজ্যে বিদ্যমান থাকতে পারে: সক্রিয় এবং নিষ্ক্রিয়, এবং প্রতিটি রাজ্যের জন্য তার কর্ম নির্ধারিত থাকতে পারে।
আসুন "জ্যামার" ক্ষমতার একটি উদাহরণ দেখি, যা রোবট "স্টকার" এর আগে ছিল; এটি এই মত কাজ করেছে:
দীর্ঘ সময়ের জন্য, এই কার্যকারিতা আমাদের জন্য যথেষ্ট ছিল, কিন্তু সময়ের সাথে সাথে গেম ডিজাইনার এবং প্রোগ্রামাররা উভয়ই এই পদ্ধতিতে আর সন্তুষ্ট ছিলেন না: প্রোগ্রামারদের পক্ষে এই ক্ষমতাগুলি সমর্থন করা কঠিন ছিল কারণ কোডটি ভয়ঙ্কর হয়ে উঠেছে; এটি একটি খুব দীর্ঘ উত্তরাধিকার শৃঙ্খল জড়িত, যেখানে প্রতিটি পরিস্থিতি বর্ণনা করতে হয়েছিল। অতিরিক্তভাবে, গেম ডিজাইনারদের নমনীয়তার অভাব ছিল - একটি ক্ষমতাতে কোনও পরিবর্তন করতে, তাদের প্রোগ্রামারদের কাছ থেকে পরিবর্তনগুলি অর্ডার করতে হয়েছিল, এমনকি যদি একটি সংলগ্ন ক্ষমতার একই কার্যকারিতা থাকে।
সুতরাং, আমরা বুঝতে পেরেছি যে কিছু পরিবর্তন করা দরকার। অতএব, আমরা একটি নতুন সিস্টেম তৈরি করেছি, যেখানে প্রতিটি ক্ষমতা বিভিন্ন সম্পর্কিত বস্তুর একটি সেট হিসাবে উপস্থাপন করা হয়েছিল। কার্যকারিতা রাষ্ট্রীয় ক্ষমতা এবং রাষ্ট্রীয় উপাদানে বিভক্ত ছিল।
এটা কিভাবে কাজ করে? প্রতিটি ক্ষমতা একটি প্রধান বস্তু আছে. এই কেন্দ্রীয় বস্তুটি বাইরের বিশ্বের সাথে অন্যান্য সামর্থ্য বস্তুকে সংযুক্ত করে, এবং তদ্বিপরীত; এটি সমস্ত প্রধান সিদ্ধান্তও করে।
রাজ্যের যে কোন সংখ্যা হতে পারে. মূলত, এই পুনরাবৃত্তির অবস্থা পুরানো সংস্করণের সক্রিয়/নিষ্ক্রিয় অবস্থা থেকে খুব বেশি আলাদা নয়, তবে এখন তাদের যেকোনো সংখ্যা থাকতে পারে এবং তাদের উদ্দেশ্য আরও বিমূর্ত হয়ে উঠেছে। আমরা লক্ষ্য করব যে একটি ক্ষমতার একটি সময়ে শুধুমাত্র একটি রাষ্ট্র সক্রিয় থাকতে পারে।
পুরানো সিস্টেমের তুলনায় প্রধান উদ্ভাবন ছিল উপাদানগুলি: একটি উপাদান কিছু ক্রিয়া বর্ণনা করে এবং প্রতিটি রাজ্যে যেকোন সংখ্যক উপাদান থাকতে পারে।
নতুন ক্ষমতা কিভাবে কাজ করে? একটি ক্ষমতা শুধুমাত্র একটি রাজ্যের মধ্যে হতে পারে; মূল বস্তুটি তাদের স্যুইচ করার জন্য দায়ী। একটি রাষ্ট্রের সাথে সংযুক্ত উপাদানগুলি রাষ্ট্রের সক্রিয়করণ/নিষ্ক্রিয়করণে প্রতিক্রিয়া দেখায় এবং এর উপর নির্ভর করে, হয় কিছু কাজ করা শুরু করতে পারে বা এটি সম্পাদন করা বন্ধ করতে পারে।
সমস্ত বস্তু কাস্টমাইজ করা হয়েছে; একটি গেম ডিজাইনার রাজ্য এবং উপাদানগুলিকে তাদের পছন্দ মতো মিশ্রিত করতে পারে, এইভাবে পূর্বে ইনস্টল করা ব্লকগুলি থেকে একটি নতুন ক্ষমতা রচনা করে। এখন, প্রোগ্রামারদের একটি নতুন কম্পোনেন্ট বা স্টেট তৈরি করার জন্য শুধুমাত্র ছবিতে প্রবেশ করতে হবে, যা কোড লেখাকে অনেক সহজ করে তোলে: তারা ছোট সত্তার সাথে কাজ করে, কিছু সাধারণ উপাদানের বর্ণনা দেয় এবং নিজেরাই ক্ষমতা তৈরি করে না - গেম ডিজাইনাররা এখন এটি করে।
প্রবাহটি এইরকম হয়েছে:
পরবর্তীকালে, এই পদ্ধতি বারবার পুনরাবৃত্তি হয়। ব্যবহারের সুবিধার জন্য, একটি রাষ্ট্র শুধুমাত্র একটি উপাদান ধারক হিসাবে কাজ করে না, এটি কখন অন্য রাজ্যে সুইচ করতে হবে তাও নির্ধারণ করে এবং সুইচ করার জন্য মূল বস্তুকে অনুরোধ করে। সময়ের সাথে সাথে, এটি এখনও আমাদের জন্য যথেষ্ট নয় বলে প্রমাণিত হয়েছিল, এবং ক্ষমতা চিত্রটি নিম্নলিখিতগুলিতে রূপান্তরিত হয়েছিল:
মূল বস্তু, রাষ্ট্র এবং উপাদানগুলি তাদের জায়গায় রয়ে গেছে, তবে নতুন উপাদানগুলিও যুক্ত হয়েছে।
প্রথম যে জিনিসটি আপনার নজর কেড়েছে তা হল আমরা প্রতিটি রাজ্য এবং উপাদানে শর্ত যুক্ত করেছি: রাজ্যগুলির জন্য, এইগুলি রাজ্য ছেড়ে যাওয়ার জন্য অতিরিক্ত প্রয়োজনীয়তা সংজ্ঞায়িত করে; উপাদানগুলির জন্য, তারা নির্ধারণ করে যে উপাদানটি তার ক্রিয়া সম্পাদন করতে পারে কিনা।
চার্জ কন্টেইনারে চার্জ থাকে, সেগুলি রিচার্জ করে, প্রয়োজনে রিচার্জ করা বন্ধ করে এবং রাজ্যগুলিকে ব্যবহারের জন্য চার্জ প্রদান করে।
একটি টাইমার ব্যবহার করা হয় যখন বেশ কয়েকটি রাজ্যের একটি সাধারণ মৃত্যুদন্ডের সময় থাকতে হবে, কিন্তু তাদের নিজস্ব কার্যকর করার সময় সংজ্ঞায়িত করা হয় না।
এটা লক্ষ্য করা গুরুত্বপূর্ণ যে সমস্ত ক্ষমতা বস্তু ঐচ্ছিক। প্রযুক্তিগতভাবে, কাজ করার ক্ষমতার জন্য, শুধুমাত্র একটি প্রধান বস্তু এবং একটি রাষ্ট্র প্রয়োজন।
এখন, যদিও প্রোগ্রামারদের সম্পৃক্ততা ছাড়াই সম্পূর্ণরূপে তৈরি করা অনেক ক্ষমতা নেই, সাধারণভাবে উন্নয়ন লক্ষণীয়ভাবে সস্তা হয়ে উঠেছে, কারণ প্রোগ্রামারদের এখন শুধুমাত্র খুব ছোট জিনিস লিখতে হবে: উদাহরণস্বরূপ, একটি নতুন রাষ্ট্র বা দুটি উপাদান - বাকিগুলি পুনরায় ব্যবহার করা হয়।
আসুন আমাদের ক্ষমতার উপাদানগুলিকে সংক্ষিপ্ত করা যাক:
মূল বস্তুটি রাষ্ট্রীয় যন্ত্রের কার্য সম্পাদন করে। এটি রাজ্য এবং উপাদানগুলিকে বিশ্বের তথ্য সরবরাহ করে এবং বিশ্বকে ক্ষমতা সম্পর্কে তথ্য সরবরাহ করে। মূল বস্তুটি ক্ষমতার রাজ্য, উপাদান এবং পরিষেবা অংশগুলির মধ্যে একটি লিঙ্ক হিসাবে কাজ করে: চার্জ এবং বাহ্যিক টাইমার।
রাষ্ট্র প্রধান অবজেক্ট থেকে সক্রিয়করণ এবং নিষ্ক্রিয়করণ আদেশগুলি শোনে এবং সেই অনুযায়ী, উপাদানগুলি সক্রিয় এবং নিষ্ক্রিয় করে, এবং মূল বস্তুটিকে অন্য রাজ্যে স্যুইচ করার জন্য অনুরোধ করে। রাষ্ট্র নির্ধারণ করে কখন পরবর্তীতে স্যুইচ করতে হবে; এটি করার জন্য, এটি তার অভ্যন্তরীণ অবস্থা ব্যবহার করে: প্লেয়ারটি সক্ষমতা বোতামে ক্লিক করেছে কিনা, রাষ্ট্র সক্রিয় হওয়ার পরে একটি নির্দিষ্ট সময় কেটে গেছে কিনা, এবং আরও অনেক কিছু এবং রাজ্যের সাথে যুক্ত বাহ্যিক অবস্থা।
উপাদানটি রাষ্ট্র থেকে সক্রিয়করণ এবং নিষ্ক্রিয়করণ আদেশগুলি শোনে এবং কিছু ক্রিয়া সম্পাদন করে: বিচ্ছিন্ন বা দীর্ঘমেয়াদী। ক্রিয়াগুলি সম্পূর্ণ আলাদা হতে পারে: তারা ক্ষতির কারণ হতে পারে, একটি মিত্রকে নিরাময় করতে পারে, একটি অ্যানিমেশন চালু করতে পারে এবং আরও অনেক কিছু।
শর্তটি পছন্দসই উপাদানটি কোন অবস্থায় আছে তা পরীক্ষা করে এবং রাষ্ট্র বা উপাদানকে এটি প্রতিবেদন করে। পরিস্থিতি জটিল হতে পারে। শর্ত পূরণ না হলে একটি রাজ্য অন্য রাজ্যে স্থানান্তরের অনুরোধ করে না। শর্ত পূরণ না হলে উপাদানটি একটি ক্রিয়া সম্পাদন করে না। শর্ত একটি ঐচ্ছিক সত্তা; সব ক্ষমতা তাদের আছে না.
চার্জ কন্টেইনার চার্জ ধারণ করে, তাদের রিচার্জ করে, প্রয়োজনে রিচার্জ করা বন্ধ করে এবং রাজ্যগুলিকে চার্জ প্রদান করে। এটি মাল্টি-চার্জ ক্ষমতায় ব্যবহৃত হয়, যখন আপনি প্লেয়ারকে এটিকে বেশ কয়েকবার ব্যবহার করার অনুমতি দিতে হবে, কিন্তু পরপর n বারের বেশি নয়।
টাইমার ব্যবহার করা হয় যখন বেশ কয়েকটি রাজ্যের একটি সাধারণ সময়কাল থাকে, তবে তাদের প্রতিটি কতক্ষণ স্থায়ী হবে তা জানা নেই। যেকোনো রাজ্য n সেকেন্ডের জন্য একটি টাইমার শুরু করতে পারে। সমস্ত প্রাসঙ্গিক রাজ্য টাইমার শেষ ইভেন্টে সদস্যতা নেয় এবং এটি শেষ হলে কিছু করে।
এখন এবিলিটি ডায়াগ্রামে ফিরে আসি। কিভাবে এর কার্যকারিতা পরিবর্তন হয়েছে?
রাজ্যগুলি একটি অতিরিক্ত রূপান্তর শর্ত হিসাবে চার্জ ব্যবহার করতে পারে৷ যদি এই ধরনের স্থানান্তর ঘটে তবে চার্জের সংখ্যা হ্রাস পায়। রাজ্যগুলি একটি সাধারণ টাইমারও ব্যবহার করতে পারে। এই ক্ষেত্রে, তাদের মৃত্যুদন্ড কার্যকর করার জন্য মোট সময় একটি টাইমার দ্বারা নির্ধারিত হবে এবং প্রতিটি রাজ্য পৃথকভাবে যে কোনও সময় স্থায়ী হতে পারে।
আমরা নতুন ক্ষমতা UI এর জন্য চাকাটি সম্পূর্ণরূপে পুনরুদ্ধার করিনি।
মূল বস্তুটির নিজস্ব UI আছে। এটি এমন কিছু উপাদানকে সংজ্ঞায়িত করে যা সর্বদা UI-তে থাকা উচিত এবং যা বর্তমানে সক্রিয় অবস্থার উপর নির্ভর করে না।
প্রতিটি রাজ্যের UI-তে নিজস্ব জোড়া থাকে এবং রাজ্যের UI শুধুমাত্র তখনই প্রদর্শিত হয় যখন তার অবস্থা সক্রিয় থাকে। এটি তার অবস্থা সম্পর্কে ডেটা গ্রহণ করে এবং এটি এক বা অন্য উপায়ে প্রদর্শন করতে পারে। উদাহরণস্বরূপ, সময়কাল অবস্থার সাধারণত তাদের UI এ একটি বার এবং পাঠ্য থাকে যা অবশিষ্ট সময় প্রদর্শন করে।
এমন একটি ক্ষেত্রে যেখানে রাজ্য একটি ক্ষমতা চালিয়ে যাওয়ার জন্য একটি বহিরাগত কমান্ডের জন্য অপেক্ষা করছে, তার UI একটি বোতাম প্রদর্শন করে এবং এটি টিপে রাজ্যের কাছে কমান্ড প্রেরণ করে।
আমরা নির্দিষ্ট উদাহরণ ব্যবহার করে ক্ষমতা কিভাবে কাজ করে তা দেখব; প্রথমে, আসুন "ইনকুইজিটর" নামে একটি রোবট দেখি। আমাদের চারটি রাজ্য রয়েছে যা একে অপরকে অনুসরণ করে – রাজ্যগুলির উপরে আপনি UI এ তাদের প্রদর্শন দেখতে পাবেন। তাদের দুজনের জন্য, আমরা তাদের অন্তর্গত উপাদানগুলিও দেখতে পাই; অন্য দুটি রাজ্যে কেবল উপাদান নেই।
এখানে ক্ষমতার প্রবাহ:
এটি সব "WaitForClick" অবস্থা দিয়ে শুরু হয়। এই সময়ে, ক্ষমতা কিছুই করে না; এটা শুধু কমান্ডের জন্য অপেক্ষা করে।
এই ধরনের একটি কমান্ড প্রাপ্ত হওয়ার সাথে সাথেই মূল বস্তুটি অবস্থা পরিবর্তন করে। পরবর্তী সক্রিয় অবস্থা হল "WaitForGrounded"।
এই অবস্থায় কিছু উপাদান আছে, এবং সেইজন্য, সক্রিয় হলে, রোবট লাফিয়ে পড়ে এবং একটি শব্দ এবং অ্যানিমেশন বাজায়। অন্যান্য জিনিসের মধ্যে, রাষ্ট্র সক্রিয় থাকাকালীন, রোবটটি জ্যামার প্রভাব দ্বারা প্রভাবিত হয়, যা রোবটকে লক্ষ্য করা নিষিদ্ধ করে।
রোবট অবতরণ করলে, এর ক্ষমতা পরবর্তী অবস্থায় চলে যায়।
এই অবস্থার তিনটি উপাদান রয়েছে: ইতিমধ্যে পরিচিত সাউন্ড এবং জ্যামার, সেইসাথে ঝাঁকুনি, যার ফলে n ব্যাসার্ধের মধ্যে সমস্ত খেলোয়াড়ের জন্য ক্যামেরা কাঁপতে পারে।
যেহেতু এই অবস্থার সময়কাল আছে, এটি n সেকেন্ডের জন্য কাজ করে, তারপর ক্ষমতাটি পরবর্তী অবস্থায় চলে যায়।
শেষ অবস্থাটিও একটি সময়কালের সাথে আসে, কিন্তু এতে কোনো উপাদান নেই: এটি নিয়মিত কুলডাউনে রয়েছে।
সমাপ্তির পরে, ক্ষমতা প্রথম অবস্থায় ফিরে আসে।
আরেকটি উদাহরণ হল "ফ্যান্টম"। এটি অনেকটা ইনকুইজিটরের মতো, তবে কিছু সূক্ষ্মতা রয়েছে:
আমরা WaitForClick দিয়ে শুরু করি।
তারপরে, সময়কাল, যেখানে টেলিপোর্ট ইনস্টল করা হয়, মেকের পরিসংখ্যান পরিবর্তন করা হয় এবং শব্দ এবং অ্যানিমেশন চালানো হয়।
এর পরে: DurationOrClick, যেখানে মেকের পরিসংখ্যান পরিবর্তন করা হয়, অ্যানিমেশন এবং FX চালানো হয়।
যদি একটি ক্লিক করা হয়, তাহলে আমরা অন্য একটি মেয়াদে যাই, যেখানে মেক টেলিপোর্ট, পরিসংখ্যান পরিবর্তন এবং অ্যানিমেশন, এফএক্স এবং সাউন্ড বাজানো হয়।
এই অবস্থার পরে (অথবা DurationOrClick এর মেয়াদ শেষ হওয়ার পরে), আমরা মেয়াদে চলে যাই।
এখানে প্রধান পার্থক্য হল যে আমরা শাখাগুলি সহ রাজ্যগুলি দেখি: নির্দিষ্ট সময় পেরিয়ে গেলে DurationOrClick স্টেট A-তে যায়, অথবা প্লেয়ার পূর্বে ক্ষমতা বোতাম টিপে থাকলে B তে যায়৷
যদিও এটা মনে হবে যে আমাদের সিস্টেমটি সাধারণ কিছু থেকে বেশ জটিল কিছুতে বিবর্তিত হয়েছে, এই পরিবর্তনটি প্রোগ্রামার এবং গেম ডিজাইনার উভয়ের জীবনকে সরল করেছে। ছোট ছোট উপাদান যোগ করার সময় প্রোগ্রামারদের সহায়তার এখন বেশিরভাগই প্রয়োজন হয়, যখন দলের সদস্যদের পরবর্তী গোষ্ঠীটি বৃহত্তর স্বায়ত্তশাসন অর্জন করেছে এবং এখন বিদ্যমান রাজ্য এবং উপাদানগুলি থেকে স্বাধীনভাবে নতুন ক্ষমতা সংগ্রহ করতে পারে। আরেকটি বোনাস হিসাবে, একই সময়ে, খেলোয়াড়রা মেচের আরও বৈচিত্র্যময় এবং জটিল দক্ষতার আকারে একটি লাভও পেয়েছে।