নমনীয় বাছা / ডাব্ফ সিস্টেমটি প্রয়োগ করার উপায় কী?


66

সংক্ষিপ্ত বিবরণ:

আরপিজির মতো পরিসংখ্যান সহ প্রচুর গেমস "বাফস" চরিত্রের জন্য, "ডিলের 25% অতিরিক্ত ক্ষতি" থেকে শুরু করে "আঘাতের সময় আক্রমণকারীদের 15 ডিল ক্ষতি করে" "

প্রতিটি ধরণের বাফের নির্দিষ্টকরণগুলি আসলে প্রাসঙ্গিক নয়। আমি স্বেচ্ছাচারিত বাষ্পদের পরিচালনা করার জন্য (সম্ভবত অবজেক্ট-ওরিয়েন্টেড) উপায় খুঁজছি।

বিবরণ:

আমার বিশেষ ক্ষেত্রে, আমার পালা-ভিত্তিক যুদ্ধের পরিবেশে একাধিক চরিত্র রয়েছে, তাই আমি কল্পনা করেছি যে "অন্টার্নস্টার্ট", ​​"অনরসিপ্যাডমেজ" ইত্যাদির মতো ঘটনার সাথে বন্ধুত্বগুলি রয়েছে সম্ভবত প্রতিটি বাফ একটি প্রধান বাফ বিমূর্ত শ্রেণীর সাবক্লাস, যেখানে শুধুমাত্র প্রাসঙ্গিক ইভেন্টগুলি ওভারলোড হয় ed তারপরে প্রতিটি চরিত্রটিতে বর্তমানে প্রয়োগ করা বাফসের একটি ভেক্টর থাকতে পারে।

এই সমাধানটি কি কোনও অর্থবোধ করে? আমি অবশ্যই কয়েক ডজন ইভেন্টের প্রকারের প্রয়োজনীয়তা দেখতে পাচ্ছি, মনে হচ্ছে প্রতিটি বাফের জন্য একটি নতুন সাবক্লাস তৈরি করা ওভারকিল, এবং এটি কোনও বাছুর "মিথস্ক্রিয়া" করার অনুমতি দেয় বলে মনে হয় না। এটি হ'ল, যদি আমি ক্ষয়ক্ষতি বাড়াতে ক্যাপটি প্রয়োগ করতে চাইতাম যাতে আপনার যদি 10 টি পৃথক বাফ থাকে যা সমস্ত 25% অতিরিক্ত ক্ষতি দেয় তবে আপনি কেবল 250% অতিরিক্তের পরিবর্তে 100% অতিরিক্ত করেন।

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

অপেক্ষাকৃত অনভিজ্ঞ সি ++ প্রোগ্রামার হিসাবে (আমি সাধারণত এমবেডড সিস্টেমে সি ব্যবহার করেছি), আমার মনে হয় আমার সমাধানটি সহজতর এবং সম্ভবত অবজেক্ট-ভিত্তিক ভাষার পুরো সুবিধা গ্রহণ করবে না।

থটস? এখানে কেউ এর আগে মোটামুটি শক্তিশালী বাফ সিস্টেম ডিজাইন করেছে?

সম্পাদনা: উত্তর (গুলি) সম্পর্কিত:

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

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

ডায়াবলো 3 (নীচে উল্লিখিত) এর মতো গেমের জন্য, যেখানে প্রায় কোনও বিট সরঞ্জামই একটি ছানকের শক্তি পরিবর্তন করতে পারে, বাফগুলি কেবলমাত্র চরিত্রের পরিসংখ্যান ব্যবস্থা যখনই সম্ভব সম্ভব বলে মনে হয় good

আমি যে পালা-ভিত্তিক পরিস্থিতিতে আছি তার জন্য ইভেন্ট-ভিত্তিক পদ্ধতিটি আরও উপযুক্ত হতে পারে।

যাই হোক না কেন, আমি এখনও আশা করছি যে কেউ অভিনব "ওও" ম্যাজিক বুলেটটি নিয়ে আসেন যা আমাকে ঘুরিয়া বাফের জন্য +2 সরানো দূরত্ব , আক্রমণকারীর বাফকে ফিরিয়ে নেওয়া ক্ষতির 50% চুক্তি করার অনুমতি দেবে এবং একক সিস্টেমে 3 বা তার বেশি টাইলস বাফ থেকে তার নিজের সাবক্লাসে +5 শক্তি বাফটি না ঘুরিয়ে আক্রমণ করার সময় একটি স্বয়ংক্রিয়ভাবে নিকটবর্তী টাইলটিতে টেলিপোর্ট

আমি মনে করি সবচেয়ে কাছের জিনিসটি আমি চিহ্নিত উত্তরটি করেছি, তবে তলটি এখনও খোলা রয়েছে। ইনপুট জন্য প্রত্যেককে ধন্যবাদ।


আমি এটি একটি উত্তর হিসাবে পোস্ট করছি না, আমি যেমন শুধু মন্ত্রমুগ্ধ করছি, তবে বাফের তালিকা সম্পর্কে কীভাবে? প্রতিটি বাফের একটি ধ্রুবক এবং একটি ফ্যাক্টর সংশোধক থাকে। ধীরে ধীরে +10 ক্ষতি হতে পারে, একটি 10% ক্ষতি বৃদ্ধির জন্য ফ্যাক্টরটি হবে 1.10। আপনার ক্ষতির গণনাগুলিতে, আপনি মোট পরিমার্জনকারী পেতে সমস্ত বাফগুলিকে পুনরাবৃত্তি করেন এবং তারপরে আপনি যে কোনও সীমাবদ্ধতা চাপিয়ে দেন। আপনি এটি কোনও ধরণের পরিবর্তনযোগ্য বৈশিষ্ট্যের জন্য করবেন do জটিল জিনিসগুলির জন্য আপনার বিশেষ কেস পদ্ধতি দরকার d
উইলিয়াম মারিয়েরার

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

1
আপনার যদি কোনও "অনেরিপেইমড্যামেজ" পদ্ধতি থাকে যা মেসেজিং সিস্টেম, বা ম্যানুয়ালি বা অন্য কোনও উপায়ে কল করে, আপনি / আপনি কী ক্ষতিগ্রস্থ হচ্ছেন তার একটি উল্লেখ উল্লেখ করা যথেষ্ট সহজ হওয়া উচিত। সুতরাং আপনি এই তথ্যটি আপনার

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

4
এটি ইন্টারঅ্যাকশন সমস্যার ভাল উত্তর নয়, তবে এটি আমার কাছে মনে হয় যে এখানে ডেকোরেটর প্যাটার্নটি ভালভাবে প্রয়োগ হয়েছে; একে অপরের উপরে কেবল আরও বাফ (আলংকারক) প্রয়োগ করুন। সম্ভবত "মার্জ" বাফগুলি একসাথে (যেমন 10x 25% এক 100% বাফের সাথে একীভূত করে) ইন্টারঅ্যাকশন পরিচালনা করার সিস্টেমের সাথে with
ashes999

উত্তর:


32

এটি একটি জটিল সমস্যা, কারণ আপনি কয়েকটি ভিন্ন ভিন্ন বিষয় নিয়ে কথা বলছেন যা (আজকাল) একসাথে 'বাফস' হিসাবে মিশে গেছে:

  • কোনও খেলোয়াড়ের বৈশিষ্ট্যে পরিবর্তনকারী
  • নির্দিষ্ট প্রভাব যা ঘটে বিশেষ প্রভাব
  • উপরের সংমিশ্রণ।

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

তারপরে পরিবর্তিত বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য আমি এটিকে ফাংশন দিয়ে মুড়িয়ে রাখি। যেমন .:

def get_current_attribute_value(attribute_id, criteria):
    val = character.raw_attribute_value[attribute_id]
    # Accumulate the modifiers
    for effect in character.all_effects:
        val = effect.apply_attribute_modifier(attribute_id, val, criteria)
    # Make sure it doesn't exceed game design boundaries
    val = apply_capping_to_final_value(val)
    return val

class Effect():
    def apply_attribute_modifier(attribute_id, val, criteria):
        if attribute_id in self.modifier_list:
            modifier = self.modifier_list[attribute_id]
            # Does the modifier apply at this time?
            if modifier.criteria == criteria:
                # Apply multiplicative modifier
                return val * modifier.amount
        else:
            return val

class Modifier():
    amount = 1.0 # default that has no effect
    criteria = None # applies all of the time

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

মানদণ্ডের মান হ'ল আপনাকে "+ ২০% বনাম আনডিয়াড" প্রয়োগ করতে দেওয়া - এফেক্টের উপরে ইউএনডিএইড মান সেট করে এবং get_current_attribute_value()যখন আপনি অনির্ধারিত শত্রুর বিরুদ্ধে কোনও ক্ষতি রোল গণনা করছেন তখনই ইউএনডিএইড মানটি পাস করুন ।

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

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

# This is a method on a Character, called during combat
def on_receive_damage(damage_info):
    for effect in character.all_effects:
        effect.on_receive_damage(character, damage_info)

class Effect():
    self.on_receive_damage_handler = DoNothing # a default function that does nothing
    def on_receive_damage(character, damage_info):
        self.on_receive_damage_handler(character, damage_info)

def reflect_damage(character, damage_info):
    damage_info.attacker.receive_damage(15)

reflect_damage_effect = new Effect()
reflect_damage_effect.on_receive_damage_handler = reflect_damage
my_character.all_effects.add(reflect_damage_effect)

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


2
চমৎকার বিশদ জন্য +1। আমি যেমন দেখেছি তেমনভাবে আমার প্রশ্নের উত্তর দেওয়ার নিকটতম প্রতিক্রিয়া। এখানে বেসিক সেটআপটি অনেক নমনীয়তা এবং অন্যথায় নোংরা গেম যুক্তি হতে পারে তার একটি ছোট বিমূর্ততা মঞ্জুর করে বলে মনে হচ্ছে। যেমনটি আপনি বলেছেন, আরও মজাদার প্রভাবগুলি এখনও তাদের নিজস্ব ক্লাসগুলির প্রয়োজন হবে, তবে এটি একটি সাধারণ "বাফ" সিস্টেমের প্রচুর প্রয়োজন পরিচালনা করে, আমি মনে করি।
gkimsey

এখানে লুকানো ধারণাগত পার্থক্য চিহ্নিত করার জন্য +1। তাদের সকলেই একই ইভেন্ট-ভিত্তিক আপডেট যুক্তি দিয়ে কাজ করবে না। সম্পূর্ণ ভিন্ন প্রয়োগের জন্য @ রসের উত্তর দেখুন। উভয়েরই একে অপরের পাশে থাকতে হবে।
সিটিটিজ

22

একটি খেলায় আমি একটি ক্লাসের জন্য বন্ধুর সাথে কাজ করেছিলাম যখন আমরা যখন ব্যবহারকারী লম্বা ঘাস এবং স্পিড-আপ টাইলগুলিতে আটকা পড়ে এবং কী না এবং কিছু ক্ষুদ্র জিনিস যেমন রক্ত ​​এবং বিষের মতো হয় তখন আমরা একটি বাফ / ডেফ সিস্টেম তৈরি করি।

ধারণাটি সহজ ছিল এবং আমরা পাইথনে এটি প্রয়োগ করার সময় এটি কার্যকর ছিল।

মূলত, এখানে এটি কীভাবে চলেছে:

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

এখন কীভাবে বিশ্ব থেকে বাফ প্রয়োগ করা যায় তা একটি ভিন্ন গল্প। যদিও চিন্তা করার জন্য এখানে আমার খাবার।


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

হ্যাঁ আমরা এর মতো কিছু বাস্তবায়ন করি নি। এটি সত্যিই ঝরঝরে এবং দুর্দান্ত ধারণা (এক ধরণের কাঁটা ছোঁড়ার মতো) শোনাচ্ছে।
রস

@gkimsey কাঁটা এবং অন্যান্য প্যাসিভ বাফের মতো জিনিসের জন্য, আমি আপনার মোব ক্লাসে যুক্তিটি ক্ষতি বা স্বাস্থ্যের অনুরূপ প্যাসিভ স্ট্যাটাস হিসাবে প্রয়োগ করব এবং বাফ প্রয়োগ করার সময় এই স্ট্যাটটি বাড়িয়ে দেব। এটি আপনার ক্ষেত্রে একাধিক কাঁটাযুক্ত ছাঁটাই থাকার পাশাপাশি ইন্টারফেসটি পরিষ্কার রাখার সাথে সাথে অনেকটা সহজ করে তোলে (10 বাফ 10 এর পরিবর্তে 1 রিটার্ন ক্ষতি দেখায়) এবং বাফ সিস্টেমটি সহজ থাকতে দেয়।
থ্রিডিউবলুনগুলি

এটি একটি প্রায় বিপরীতমুখী সহজ পদ্ধতি, তবে আমি ডায়াবলো ৩ খেলার সময় নিজের সম্পর্কে চিন্তাভাবনা শুরু করি I আমি লক্ষ্য করেছিলাম জীবন চুরি, আঘাতের জীবন, মেলি আক্রমণকারীদের ক্ষতি ইত্যাদি all সবই চরিত্রের উইন্ডোতে তাদের নিজস্ব পরিসংখ্যান ছিল। মঞ্জুর, ডি 3 এর বিশ্বের সবচেয়ে জটিল বাফিং সিস্টেম বা মিথস্ক্রিয়া নেই, তবে এটি খুব কমই তুচ্ছ। এই ধারণা অনেক জ্ঞান এর. তবুও, 12 টি বিভিন্ন প্রভাব সহ 15 টি পৃথক বাফ রয়েছে যা এর মধ্যে পড়বে। চরিত্রের পরিসংখ্যান পত্রকটি
অদ্ভুতভাবে ছড়িয়ে দেওয়া দেখে মনে হচ্ছে

11

আপনি এখনও এটি পড়ছেন কিনা তা সম্পর্কে আমি নিশ্চিত নই তবে আমি দীর্ঘদিন ধরে এই ধরণের সমস্যার সাথে লড়াই করেছি।

আমি বিভিন্ন ধরণের প্রভাবিত সিস্টেমগুলি ডিজাইন করেছি। আমি সংক্ষেপে এখন তাদের উপর যেতে হবে। এটি আমার অভিজ্ঞতার ভিত্তিতে তৈরি। আমি উত্তরগুলি সব জানার দাবি করি না।


স্ট্যাটিক মোডিফায়ার

এই ধরণের সিস্টেম বেশিরভাগ সহজ পরিবর্তনগুলি নির্ধারণ করতে সাধারণ পূর্ণসংখ্যার উপর নির্ভর করে। উদাহরণস্বরূপ, +100 থেকে সর্বোচ্চ এইচপি, আক্রমণ করতে +10 এবং আরও অনেক কিছু। এই সিস্টেমটি পাশাপাশি পার্সেন্টগুলিও পরিচালনা করতে পারে। আপনার কেবল এটি নিশ্চিত করা দরকার যে স্ট্যাকিং নিয়ন্ত্রণের বাইরে চলে যায় না।

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

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

সামগ্রিকভাবে, এটি কেবল ফ্ল্যাট আউট স্ট্যাটিক সংশোধকগুলির সাথে খুব ভালভাবে কাজ করে। যদিও, সংশোধনকারীদের ব্যবহারের জন্য উপযুক্ত জায়গাগুলিতে কোড অবশ্যই উপস্থিত থাকতে হবে: getAttack, getMaxHP, getMeleeDamage, এবং আরও অনেক কিছু।

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

একটি দ্রুত উদাহরণটি করা যাক: আপনি যদি অপরিবর্তিত প্রাণীর বিরুদ্ধে ক্ষতির পরিমাণ পরিবর্তন করতে সক্ষম হতে চান তবে আপনার এর মতো অর্ডারযুক্ত জুড়ি থাকতে পারে: (ড্যাম্পিক্স ইউনডিয়েড, 10) ড্যামেজটি এনাম এবং আনডিয়ড অতিরিক্ত পরিবর্তনশীল। সুতরাং আপনার লড়াইয়ের সময় আপনি এমন কিছু করতে পারেন:

dam += attacker.getMod(Mod.DAMAGE + npc.getRaceFamily()); //in this case the race family would be undead

যাইহোক, এটি মোটামুটি ভাল কাজ করে এবং দ্রুত। তবে এটি জটিল ক্রিয়াকলাপে এবং "বিশেষ" কোড সর্বত্রই ব্যর্থ। উদাহরণস্বরূপ, "মৃত্যুতে টেলিপোর্ট করার 25% সুযোগ" এর পরিস্থিতি বিবেচনা করুন। এটি একটি "মোটামুটি" জটিল একটি। উপরের সিস্টেমটি এটি পরিচালনা করতে পারে তবে সহজে নয়, আপনার নিম্নলিখিতগুলির প্রয়োজন হিসাবে:

  1. প্লেয়ারটির এই মোড রয়েছে কিনা তা নির্ধারণ করুন।
  2. কোথাও, টেলিপোর্টেশন কার্যকর করার জন্য কিছু কোড রয়েছে, যদি সফল হয়। এই কোডের অবস্থানটি নিজেই একটি আলোচনা!
  3. মোড মানচিত্র থেকে সঠিক তথ্য পান। মান বলতে কী বোঝায়? এটা কি সেই ঘর যেখানে তারা টেলিপোর্ট করে? কোন খেলোয়াড়ের উপর যদি দুটি টেলিপোর্ট মোড থাকে তবে কি হবে ?? পরিমাণগুলি একসাথে যুক্ত হবে না ?????? ব্যর্থতা!

সুতরাং এটি আমার পরবর্তী একটিকে নিয়ে আসে:


আলটিমেট কমপ্লেক্স বাফ সিস্টেম

আমি একবার নিজেই একটি 2D এমএমওআরপিজি লেখার চেষ্টা করেছি। এটি একটি ভয়াবহ ভুল ছিল কিন্তু আমি অনেক কিছু শিখেছি!

আমি প্রভাবিত সিস্টেমটি 3 বার পুনরায় লিখেছি। প্রথমটি উপরেরটির চেয়ে কম শক্তিশালী প্রকরণ ব্যবহার করেছে। দ্বিতীয়টি আমি যা সম্পর্কে কথা বলতে যাচ্ছি।

এই সিস্টেমে প্রতিটি সংশোধন করার জন্য ক্লাসগুলির একটি সিরিজ ছিল, তাই জিনিসগুলি: চেঞ্জএইচপি, চেঞ্জম্যাক্সএইচপি, চেঞ্জএইচপিবিপারেন্ট, চেঞ্জম্যাক্সবাইপারসেন্ট। আমার কাছে এই মিলিয়ন মিলিয়ন ছিল - এমনকি টেলিপোর্টঅনডিথের মতো জিনিস।

আমার ক্লাসে এমন জিনিস ছিল যা নিম্নলিখিতগুলি করতে পারে:

  • applyAffect
  • removeAffect
  • চেকফোরইন্ট্যাকশন <--- গুরুত্বপূর্ণ

প্রয়োগ করুন এবং মুছে ফেলুন তাদের ব্যাখ্যা করুন (যদিও পার্সেন্টের মতো জিনিসের জন্য, প্রভাবটি কখন প্রভাব ফেলেছিল তা নিশ্চিত করে এটি এইচপি কতটা বাড়িয়েছিল তা নজর রাখবে, এটি কেবল যুক্ত হওয়া পরিমাণটি সরিয়ে ফেলবে This এটি ছিল বগি, লওল এবং এটি সঠিক ছিল তা নিশ্চিত করতে আমাকে দীর্ঘ সময় নিয়েছে still এখনও আমি এটি সম্পর্কে ভাল অনুভূতি পাইনি))।

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

  • বাফ 1: ডিল 10 আক্রমণে আগুনের ক্ষতি
  • বাফ 2: সমস্ত আগুনের ক্ষতি 25% বাড়ায়।
  • বাফ 3: সমস্ত আগুনের ক্ষতি 15 দ্বারা বৃদ্ধি করে।

চেকফোরইন্টার্যাকশন পদ্ধতি এই সমস্ত প্রভাবিত করে। এটি করার জন্য, কাছাকাছি থাকা সমস্ত খেলোয়াড়ের উপর প্রতিটি প্রভাব ফেলতে হবে! এটি হ'ল কারণ প্রভাবিত হওয়ার ধরণের কারণে আমি একটি অঞ্চল জুড়ে একাধিক খেলোয়াড়ের সাথে আচরণ করেছি। এর অর্থ কোডের উপরের মতো কোনও বিশেষ বিবৃতি নেই - "যদি আমরা সবে মারা গেছি তবে আমাদের মৃত্যুতে টেলিপোর্টের জন্য পরীক্ষা করা উচিত"। এই সিস্টেমটি সঠিক সময়ে স্বয়ংক্রিয়ভাবে এটি সঠিকভাবে পরিচালনা করবে।

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

আমি উপরে উল্লিখিত হিসাবে, এই এই গেমের জন্য 3 য় প্রভাবিত সিস্টেম ছিল। আমি কেন এ থেকে সরে এসেছি?

এই সিস্টেমে আমার দেখা সবচেয়ে খারাপ পারফরম্যান্স ছিল! এটি চলমান প্রতিটি জিনিসের জন্য এত বেশি চেকিং করতে হওয়ায় এটি ভীষণ ধীর হয়ে গিয়েছিল। আমি এটিকে উন্নত করার চেষ্টা করেছি, তবে এটিকে ব্যর্থ বলে মনে করেছি।

সুতরাং আমরা আমার তৃতীয় সংস্করণে (এবং অন্য ধরণের বাফ সিস্টেমটিতে) আসি:


কমপ্লেক্স হ্যান্ডলারের সাথে ক্লাসকে প্রভাবিত করে

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

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

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

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

সুতরাং এটির প্রথম সিস্টেমটির প্রচুর পারফরম্যান্স রয়েছে এবং এখনও দ্বিতীয়টির মতো অনেক জটিলতা রয়েছে (তবে এএস তেমন নয়)। জাভাতে কমপক্ষে, বেশিরভাগ ক্ষেত্রে প্রায় প্রথমটির পারফরম্যান্স পেতে আপনি কিছু কৃপণ কাজ করতে পারেন (যেমন: এনাম ম্যাপ থাকা ( http://docs.oracle.com/javase/6/docs/api/java) /util/EnumMap.html ) কী হিসাবে এনামস এবং অ্যারেলিস্টের মান হিসাবে প্রভাব ফেলে with এটি আপনাকে দেখতে দেয় যে আপনি কীভাবে দ্রুত প্রভাব ফেলছেন [তালিকাটি 0 হবে বা মানচিত্রে এনাম থাকবে না] এবং না রয়েছে খেলোয়াড়ের প্রভাববিহীন তালিকার উপরে অকারণে ক্রমাগত পুনরাবৃত্তি করা। এই মুহুর্তে আমাদের যদি তাদের প্রয়োজন হয় তবে ওভারগুলি পুনরাবৃত্তি করতে আমি আপত্তি করি না it সমস্যা পরে গেলে আমি পরে অনুকূলিত করব)।

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

ঠিক আছে, আশা করি যে কেউ, কোথাও কোথাও এই অন্তর্দৃষ্টিগুলির কয়েকটি কার্যকর খুঁজে পাবেন।


6

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

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

আক্রমণচক্রের একটি উদাহরণ হতে পারে:

  • প্লেয়ার আক্রমণ (বেস + মোড) গণনা করুন;
  • প্রতিপক্ষের প্রতিরক্ষা গণনা করুন (বেস + মোডগুলি);
  • পার্থক্যটি করুন (এবং মোডগুলি প্রয়োগ করুন) এবং বেসের ক্ষতি নির্ধারণ করুন;
  • কোনও প্যারি / আর্মার ইফেক্ট (বেস ড্যামেজের মোডগুলি) গণনা করুন এবং ক্ষতি প্রয়োগ করুন;
  • যেকোন পুনরুদ্ধারের প্রভাব (বেস ড্যামেজের মোডগুলি) গণনা করুন এবং আক্রমণকারীর জন্য প্রয়োগ করুন।

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

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

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


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

3

আপনি এখনও এটি পড়ছেন কিনা তা আমি জানি না, তবে আমি এখন এটি কীভাবে করছি (কোডটি ইউই 4 এবং সি ++ এর উপর ভিত্তি করে)। দুই সপ্তাহেরও বেশি সময় ধরে সমস্যাটি চিন্তা করার পরে (!!), অবশেষে আমি এটি পেয়েছি:

http://gamedevelopment.tutsplus.com/tutorials/using-the-composite-design-pattern-for-an-rpg-attributes-system--gamedev-243

এবং আমি ভেবেছিলাম, ভাল, শ্রেণি / কাঠামোর মধ্যে একক গুণকে আবদ্ধ করা সর্বোপরি খারাপ ধারণা নয়। যদিও মনে রাখবেন, আমি কোড রিফ্লেকশন সিস্টেমে UE4 বিল্ডের সত্যিই বড় সুবিধা নিচ্ছি, তাই কিছুটা পুনরায় কাজ না করে, এটি সর্বত্র উপযুক্ত হতে পারে না।

যাইহোক, আমি একক কাঠামায় গুণ মোড়ক থেকে শুরু করেছি:

USTRUCT(BlueprintType)
struct GAMEATTRIBUTES_API FGAAttributeBase
{
    GENERATED_USTRUCT_BODY()
public:
    UPROPERTY()
        FName AttributeName;
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Value")
        float BaseValue;
    /*
        This is maxmum value of this attribute.
    */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Value")
        float ClampValue;
protected:
    float BonusValue;
    //float OldCurrentValue;
    float CurrentValue;
    float ChangedValue;

    //map of modifiers.
    //It could be TArray, but map seems easier to use in this case
    //we need to keep track of added/removed effects, and see 
    //if this effect affected this attribute.
    TMap<FGAEffectHandle, FGAModifier> Modifiers;

public:

    inline float GetFinalValue(){ return BaseValue + BonusValue; };
    inline float GetCurrentValue(){ return CurrentValue; };
    void UpdateAttribute();

    void Add(float ValueIn);
    void Subtract(float ValueIn);

    //inline float GetCurrentValue()
    //{
    //  return FMath::Clamp<float>(BaseValue + BonusValue + AccumulatedBonus, 0, GetFinalValue());;
    //}

    void AddBonus(const FGAModifier& ModifiersIn, const FGAEffectHandle& Handle);
    void RemoveBonus(const FGAEffectHandle& Handle);

    void InitializeAttribute();

    void CalculateBonus();

    inline bool operator== (const FGAAttributeBase& OtherAttribute) const
    {
        return (OtherAttribute.AttributeName == AttributeName);
    }

    inline bool operator!= (const FGAAttributeBase& OtherAttribute) const
    {
        return (OtherAttribute.AttributeName != AttributeName);
    }

    inline bool IsValid() const
    {
        return !AttributeName.IsNone();
    }
    friend uint32 GetTypeHash(const FGAAttributeBase& AttributeIn)
    {
        return AttributeIn.AttributeName.GetComparisonIndex();
    }
};

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

এর আসল গুরুত্বপূর্ণ অংশ টিএমএপ (টিএমএপ হ্যাশ ম্যাপ) map FGAModifier খুব সাধারণ কাঠামো:

struct FGAModifier
{
    EGAAttributeOp AttributeMod;
    float Value;
};

এটিতে পরিবর্তনের ধরণ রয়েছে:

UENUM()
enum class EGAAttributeOp : uint8
{
    Add,
    Subtract,
    Multiply,
    Divide,
    Set,
    Precentage,

    Invalid
};

এবং মান যা চূড়ান্ত গণনা করা মান আমরা গুণাবলীতে প্রয়োগ করতে যাচ্ছি।

আমরা সাধারণ ফাংশনটি ব্যবহার করে নতুন প্রভাব যুক্ত করি এবং তারপরে কল করুন:

void FGAAttributeBase::CalculateBonus()
{
    float AdditiveBonus = 0;
    auto ModIt = Modifiers.CreateConstIterator();
    for (ModIt; ModIt; ++ModIt)
    {
        switch (ModIt->Value.AttributeMod)
        {
        case EGAAttributeOp::Add:
            AdditiveBonus += ModIt->Value.Value;
                break;
            default:
                break;
        }
    }
    float OldBonus = BonusValue;
    //calculate final bonus from modifiers values.
    //we don't handle stacking here. It's checked and handled before effect is added.
    BonusValue = AdditiveBonus; 
    //this is absolute maximum (not clamped right now).
    float addValue = BonusValue - OldBonus;
    //reset to max = 200
    CurrentValue = CurrentValue + addValue;
}

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

আমার এখন সবচেয়ে বড় গ্রিপ হ'ল ড্যামেজিং / হিলিং অ্যাট্রিবিউট পরিচালনা করছে (পুরো স্ট্যাকটিকে পুনরায় গণনা না করে), আমি মনে করি আমার এটি কিছুটা সমাধান হয়েছে তবে এটি আরও 100% হতে আরও পরীক্ষার প্রয়োজন।

যেকোন ক্ষেত্রে আট্যাট্রিবিউটগুলি এর মতো সংজ্ঞায়িত হয় (+ অবাস্তব ম্যাক্রোগুলি, এখানে বাদ দেওয়া):

FGAAttributeBase Health;
FGAAttributeBase Energy;

প্রভৃতি

এছাড়াও আমি কারিগরিটির বর্তমানের মানটি পরিচালনা করার বিষয়ে 100% নিশ্চিত নই, তবে এটি কার্যকর হওয়া উচিত। তারা এখন এটি হয়।

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


আপনার কাজের লিঙ্ক এবং ব্যাখ্যার জন্য ধন্যবাদ! আমি মনে করি আপনি মূলত যা চাইছিলাম সেই দিকে আপনি এগিয়ে যাচ্ছেন। কিছু বিষয় যা মনে করে তা হ'ল অপারেশনের ক্রম (উদাহরণস্বরূপ, 3 "যুক্ত করুন" প্রভাবগুলি এবং একই বৈশিষ্ট্যের উপর 2 "গুণ" প্রভাবগুলি, যা প্রথমে হওয়া উচিত?) এবং এটি খাঁটি গুণাবলী সমর্থন। ট্রিগারগুলির ধারণাটিও রয়েছে (যেমন "প্রভাবিত হওয়ার ধরণের সময়" 1 এপি হারান "), তবে এটি সম্ভবত আলাদা তদন্ত হতে পারে।
gkimsey

ক্রিয়াকলাপের ক্রমটি, কেবলমাত্র গুণাবলীর বোনাস গণনা করা সহজ। আপনি দেখতে পাচ্ছেন যে আমি সেখানে এসেছি এবং স্যুইচ করতে পারি। সমস্ত বর্তমান বোনাস (যা যোগ, বিয়োগ, গুণ, ভাগ ইত্যাদি) এর উপর পুনরাবৃত্তি করতে এবং তারপরে সেগুলি কেবল জমা করুন। আপনি বোনাসভ্যালু = (বোনাসওয়ালু * মাল্টিপ্লাইবোনাস + অ্যাডবোনাস-সাবট্র্যাক্ট বনস) / ডিভাইডবোনাস এর মতো কিছু করেন বা আপনি এই সমীকরণটি দেখতে চান। একক প্রবেশের কারণে এটির সাথে পরীক্ষা করা সহজ। ট্রিগার হিসাবে, আমি এটি সম্পর্কে লিখিনি, কারণ এটি অন্য সমস্যা যা আমি ভেবে দেখছি, এবং আমি ইতিমধ্যে 3-4 (সীমা) চেষ্টা করেছি
asukasz বারান

সমাধানগুলি, তাদের মধ্যে কেউই আমার পছন্দ মতো কাজ করেনি (আমার মূল লক্ষ্য, তাদের জন্য ডিজাইনার বান্ধব হওয়া)। আমার সাধারণ ধারণাটি হ'ল ট্যাগ ব্যবহার করা এবং ট্যাগগুলির বিরুদ্ধে আগত প্রভাবগুলি পরীক্ষা করা। ট্যাগ ম্যাচ হলে, প্রভাব অন্যান্য প্রভাব ট্রিগার করতে পারে। (ট্যাগটি হ'ল ড্যামেজ.ফায়ার, অ্যাটাক.ফিজিকাল ইত্যাদি সাধারণ মানুষের পাঠযোগ্য নাম)। মূলটি খুব সহজ ধারণা, বিষয়টি সহজেই অ্যাক্সেসযোগ্য (অনুসন্ধানের জন্য দ্রুত) এবং নতুন প্রভাব যুক্ত করার স্বাচ্ছন্দ্যে ডেটা সংগঠিত করছে। আপনি এখানে github.com/iniside/ActionRPGGame কোড চেক করতে পারেন (গেমঅ্যাট্রিবিউটস আপনার আগ্রহী মডিউলটি)
asukasz বারান

2

আমি একটি ছোট এমএমওতে কাজ করেছি এবং সমস্ত আইটেম, ক্ষমতা, বাফস ইত্যাদির 'প্রভাব' রয়েছে। একটি প্রভাব এমন একটি শ্রেণীর ছিল যা 'অ্যাডডিফেন্স', 'ইনস্ট্যান্টড্যামেজ', 'হিল এইচপি' ইত্যাদির জন্য ভেরিয়েবল ছিল The

আপনি যখন কোনও শক্তি castালেন বা কোনও আইটেম রাখেন তখন এটি নির্দিষ্ট সময়ের জন্য অক্ষরটিতে প্রভাব প্রয়োগ করে। তারপরে মূল আক্রমণ ইত্যাদি গণনাগুলি প্রয়োগকৃত প্রভাবগুলিকে বিবেচনা করবে।

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

একটি আইটেম জন্য অন্য উদাহরণ, একই ক্ষেত্র হবে। তবে সময়সীমাটি অসীম বা আইটেমটিকে চরিত্রের বাইরে নিয়ে যাওয়ার ফলে প্রভাব সরিয়ে না দেওয়া পর্যন্ত।

এই পদ্ধতিটি আপনাকে বর্তমানে প্রয়োগ করা প্রভাবগুলির তালিকার উপরে পুনরাবৃত্তি করতে দেয়।

আশা করি আমি এই পদ্ধতিটি পরিষ্কারভাবে যথেষ্ট ব্যাখ্যা করেছি।


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

2
  1. একটি একতা ব্যবহারকারী শস্য, তবে এখানে কিছু শুরু করতে হল: http://www.stevegargolinski.com/armory-a-free-and-unfinished-stat-inventory-and-buffdebuff-framework-for-unity/

আমি স্ক্রিপ্টযোগ্য অবজেক্টগুলিকে ব্যাফ / মন্ত্র / প্রতিভা হিসাবে ব্যবহার করছি

public class Spell : ScriptableObject 
{
    public SpellType SpellType = SpellType.Ability;
    public SpellTargetType SpellTargetType = SpellTargetType.SingleTarget;
    public SpellCategory SpellCategory = SpellCategory.Ability;
    public MagicSchools MagicSchool = MagicSchools.Physical;
    public CharacterClass CharacterClass = CharacterClass.None;
    public string Description = "no description available";
    public SpellDragType DragType = SpellDragType.Active; 
    public bool Active = false;
    public int TargetCount = 1;
    public float CastTime = 0;
    public uint EffectRange = 3;
    public int RequiredLevel = 1;
    public virtual void OnGUI()
    {
    }
}

ইউনিটিইজাইন ব্যবহার করে; সিস্টেম.কলেশন.জেনারিক ব্যবহার করে;

পাবলিক এনাম বাফটাইপ {বাফ, ডেফ সর্বজনীন ভাসা ModValueInPercent = 0.1f; }

public class Buff : Spell
{
    public BuffType BuffType = BuffType.Buff;
    public BuffStat[] ModStats;
    public bool PersistsThroughDeath = false;
    public int AmountPerTick = 3;
    public bool UseTickTimer = false;
    public float TickTime = 1.5f;
    [HideInInspector]
    public float Ticktimer = 0;
    public float Duration = 360; // in seconds
    public float ModifierPerStack = 1.1f;
    [HideInInspector]
    public float Timer = 0;
    public int Stack = 1;
    public int MaxStack = 1;
}

BuffModul:

using System;
using RPGCore;
using UnityEngine;

public class Buff_Modul : MonoBehaviour
{
    private Unit _unit;

    // Use this for initialization
    private void Awake()
    {
        _unit = GetComponent<Unit>();
    }

    #region BUFF MODUL

    public virtual void RUN_BUFF_MODUL()
    {
        try
        {
            foreach (var buff in _unit.Attr.Buffs)
            {
                CeckBuff(buff);
            }
        }
        catch(Exception e) {throw new Exception(e.ToString());}
    }

    #endregion BUFF MODUL

    public void ClearBuffs()
    {
        _unit.Attr.Buffs.Clear();
    }

    public void AddBuff(string buffName)
    {
        var buff = Instantiate(Resources.Load("Scriptable/Buff/" + buffName, typeof(Buff))) as Buff;
        if (buff == null) return;
        buff.name = buffName;
        buff.Timer = buff.Duration;
        _unit.Attr.Buffs.Add(buff);
        foreach (var buffStat in buff.ModStats)
        {
            switch (buff.BuffType)
            {
                case BuffType.Buff:
                    _unit.Attr.AddBuffStatValue(buffStat.Stat, Mathf.RoundToInt((_unit.Attr.StatsBase[buffStat.Stat] + _unit.Attr.StatsItem[buffStat.Stat]) * buffStat.ModValueInPercent));
                    break;
                case BuffType.Debuff:
                    _unit.Attr.RemoveBuffStatValue(buffStat.Stat, Mathf.RoundToInt((_unit.Attr.StatsBase[buffStat.Stat] /*+ unit.character.StatsItem[_stat.stat]*/) * buffStat.ModValueInPercent));
                    break;
            }
            Core.StatController(_unit.Attr, buffStat.Stat);
        }
    }

    public void RemoveBuff(Buff buff)
    {
        foreach (var buffStat in buff.ModStats)
        {
            switch (buff.BuffType)
            {
                case BuffType.Buff:
                    _unit.Attr.RemoveBuffStatValue(buffStat.Stat, Mathf.RoundToInt((_unit.Attr.StatsBase[buffStat.Stat] + _unit.Attr.StatsItem[buffStat.Stat]) * buffStat.ModValueInPercent));
                    break;
                case BuffType.Debuff:
                    _unit.Attr.AddBuffStatValue(buffStat.Stat, Mathf.RoundToInt((_unit.Attr.StatsBase[buffStat.Stat]  /*+ unit.character.StatsItem[_stat.stat]*/) * buffStat.ModValueInPercent));
                    break;
            }
            Core.StatController(_unit.Attr, buffStat.Stat);
        }
        _unit.Attr.Buffs.Remove(buff);
    }

    void CeckBuff(Buff buff)
    {
        buff.Timer -= Time.deltaTime;
        if (!_unit.IsAlive && !buff.PersistsThroughDeath)
        {
            if (buff.ModStats != null)
                foreach (var stat in buff.ModStats)
                {
                    _unit.Attr.StatsBuff[stat.Stat] = 0;
                }

            RemoveBuff(buff);
        }
        if (_unit.IsAlive && buff.Timer <= 0)
        {
            RemoveBuff(buff);
        }
    }
}

0

এটি আমার কাছে একটি আসল প্রশ্ন ছিল। আমি এটি সম্পর্কে একটি ধারণা আছে।

  1. যেমনটি আগেই বলা হয়েছিল, আমাদের Buffবাফদের জন্য একটি তালিকা এবং একটি লজিক আপডেটের প্রয়োগ করতে হবে ।
  2. আমাদের তখন Buffক্লাসের সাবক্লাসে প্রতিটি ফ্রেমের সমস্ত নির্দিষ্ট প্লেয়ার সেটিংস পরিবর্তন করতে হবে ।
  3. এরপরে আমরা পরিবর্তনশীল সেটিংস ক্ষেত্র থেকে বর্তমান প্লেয়ার সেটিংস পাই।

class Player {
  settings: AllPlayerStats;

  private buffs: Array<Buff> = [];
  private baseSettings: AllPlayerStats;

  constructor(settings: AllPlayerStats) {
    this.baseSettings = settings;
    this.resetSettings();
  }

  addBuff(buff: Buff): void {
    this.buffs.push(buff);
    buff.start(this);
  }

  findBuff(predcate(buff: Buff) => boolean): Buff {...}

  removeBuff(buff: Buff): void {...}

  update(dt: number): void {
    this.resetSettings();
    this.buffs.forEach((item) => item.update(dt));
  }

  private resetSettings(): void {
    //some way to copy base to settings
    this.settings = this.baseSettings.copy();
  }
}

class Buff {
    private owner: Player;        

    start(owner: Player) { this.owner = owner; }

    update(dt: number): void {
      //here we change anything we want in subclasses like
      this.owner.settings.hp += 15;
      //if we need base value, just make owner.baseSettings public but don't change it! only read

      //also here logic for removal buff by time or something
    }
}

এইভাবে, Buffসাবক্লাসের যুক্তিতে কোনও পরিবর্তন না করে নতুন প্লেয়ারের পরিসংখ্যান যুক্ত করা সহজ হতে পারে ।


0

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

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

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

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

যদি আমি বাফ / ডেফ সিস্টেমটি ডিজাইন করতাম তবে আমি এখানে কিছু জিনিস বিবেচনা করব:

  • প্রভাবটি নিজে উপস্থাপন করার জন্য একটি বাফ / ডিফ ক্লাস।
  • বাফ / ডেফ টাইপ ক্লাসে বাফ কীভাবে প্রভাবিত হয় এবং কীভাবে তা সম্পর্কিত তথ্য অন্তর্ভুক্ত করে।
  • অক্ষর, আইটেম এবং সম্ভবত অবস্থানগুলির সকলেরই বাফ এবং ডেফগুলি ধারণ করার জন্য একটি তালিকা বা সংগ্রহের সম্পত্তি থাকা দরকার।

বাফ / ডাবের ধরণের কী কী থাকতে হবে তার জন্য কয়েকটি নির্দিষ্টকরণ:

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

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

যতক্ষণ না আমি যথাযথ প্রকারগুলি যথাযথভাবে রেখেছি ততক্ষণ এটি একটি বাফ রেকর্ড তৈরি করা সহজ যা বলে:

  • প্রকার: অভিশাপ
  • অবজেক্ট টাইপ: আইটেম
  • স্ট্যাটাসেচার: ইউটিলিটি
  • স্ট্যাটাসএফেক্টড: মুভমেন্টস্পিড
  • সময়কাল: অসীম
  • ট্রিগার: অনকুইপ

এবং এরপরে, এবং যখন আমি একটি বাফ তৈরি করি তখন আমি কেবল এটিকে অভিশাপের বাফটাইপ বরাদ্দ করি এবং সমস্ত কিছু ইঞ্জিনের উপর নির্ভর করে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.