حسب ضرورت گیمز - پروویبلی فیئر
حسب ضرورت گیمز میں اسے کیسے استعمال کیا جاتا ہے
YEET Originals میں ہر شرط ایک راؤنڈ سیڈ سے شروع ہوتی ہے۔ راؤنڈ سیڈ آپ کے کلائنٹ سیڈ اور شرط کے نونس (nonce) کا HMAC-SHA256 ہوتا ہے، جسے YEET کے منتخب کردہ سرور سیڈ کے ساتھ جوڑا جاتا ہے۔ گیم پھر اس شرط کے لیے درکار ہر رینڈم ویلیو اسی راؤنڈ سیڈ سے حاصل کرتی ہے۔ سرور سیڈ آپ کو کھیلنے سے پہلے ہیش شدہ شکل میں دکھایا جاتا ہے اور جب آپ اپنا سیڈ پیئر تبدیل کرتے ہیں تو ظاہر کر دیا جاتا ہے، تاکہ آپ کسی بھی پرانی شرط کا راؤنڈ سیڈ دوبارہ کیلکولیٹ کر سکیں اور تصدیق کر سکیں کہ شرط لگانے کے بعد اس کا نتیجہ تبدیل نہیں ہوا تھا۔
دیگر تصدیق کنندگان مماثل نہیں ہو سکتے
دوسرے کیسینو کے لیے بنائی گئی ویریفیکیشن سائٹس رینڈم نمبرز مختلف طریقے سے جنریٹ کر سکتی ہیں، اس لیے وہاں YEET کی شرط چیک کرنے سے نتیجہ مختلف آ سکتا ہے۔ YEET کی شرطوں کی تصدیق گیم کی فیئرنس ونڈو کے ویریفائی ٹیب میں، یا اس صفحہ پر موجود کوڈ کے ساتھ کریں۔
تبدیلیاں
ایک کنورژن راؤنڈ سیڈ کی اینٹروپی کو گیم کے نتیجے میں بدل دیتا ہے۔ بنیادی بلاک ہر اوریجنل گیم میں ایک ہی ہے: unbiasedUint مساوی امکان والی n پوزیشنوں میں سے ایک کا انتخاب کرتا ہے، اور گیم چیک کرتی ہے کہ آیا وہ پوزیشن ون کرتی ہے یا نہیں۔ n میں سے s جیتنے والی پوزیشنوں والے اسٹیپ کے جیتنے کا امکان s / n ہوتا ہے۔
یہ صفحہ ہر گیم کے لیے کنورژن کی فہرست نہیں دیتا۔ ذیل کی مثال ایک گیم کے ساتھ پیٹرن دکھاتی ہے۔
مثال: لیمب چاپ
لیمب چاپ کے 16 ہاپس ہوتے ہیں، اور ہر ہاپ اسی راؤنڈ سیڈ سے ایک ڈرا ہوتا ہے۔ ہاپ h پر لین میں totalStart − h پوزیشنز ہوتی ہیں، جن میں سے safeStart − h محفوظ ہوتی ہیں۔ محفوظ پوزیشنز کی تعداد سے کم رول سروائیو کرتا ہے۔ پہلا رول جو ایسا نہیں کرتا وہ راؤنڈ ختم کر دیتا ہے، اور ملٹی پلائر کو طے شدہ ہاپس کی تعداد کے لیے پے ٹیبل سے پڑھا جاتا ہے۔
const LAMB_CHOP_TOTAL_HOPS = 16;
const LAMB_CHOP_LANES = {
easy: [19, 21],
medium: [19, 23],
hard: [19, 25],
very_hard: [19, 27],
death_wish: [20, 32],
};
const LAMB_CHOP_PAYTABLE = {
easy: [
1.0721, 1.1912, 1.3313, 1.4977, 1.6975, 1.94, 2.2384, 2.6115,
3.0863, 3.7036, 4.5266, 5.6583, 7.275, 9.7, 13.58, 20.37,
],
medium: [
1.1742, 1.4351, 1.7728, 2.216, 2.8069, 3.6089, 4.7194, 6.2925,
8.5807, 12.013, 17.3522, 26.0283, 40.9016, 68.1694, 122.705, 245.41,
],
hard: [
1.2763, 1.7017, 2.3023, 3.1657, 4.432, 6.3315, 9.2537, 13.8806,
21.4519, 34.323, 57.2051, 100.1089, 185.9166, 371.8333, 818.0333, 2045.0833,
],
very_hard: [
1.3784, 1.991, 2.928, 4.392, 6.7344, 10.5826, 17.0951, 28.4918,
49.2132, 88.5838, 167.325, 334.65, 717.1071, 1673.25, 4350.45, 13051.35,
],
death_wish: [
1.552, 2.5322, 4.2203, 7.1994, 12.5989, 22.6781, 42.1166, 80.9934,
161.9869, 338.7, 745.1401, 1738.6604, 4346.651, 11798.0529, 35394.1588, 120340.14,
],
};
async function verifyLambChopBet(serverSeed, clientSeed, nonce, volatility) {
const seed = await deriveGameSeed(serverSeed, clientSeed, nonce);
const result = await verifyLambChopFromSeed(seed, volatility);
return { serverSeed, clientSeed, nonce, ...result };
}
async function verifyLambChopFromSeed(seed, volatility) {
const lane = LAMB_CHOP_LANES[volatility];
if (!lane) throw new Error(`No lamb-chop lane geometry for risk profile '${volatility}'.`);
const [safeStart, totalStart] = lane;
const entropy = new GameEntropy(hexToBytes(seed));
const hops = [];
let bustIndex = LAMB_CHOP_TOTAL_HOPS;
for (let hop = 0; hop < LAMB_CHOP_TOTAL_HOPS; hop++) {
const safePositions = safeStart - hop;
const totalPositions = totalStart - hop;
const roll = await unbiasedUint(entropy, totalPositions);
const survived = roll < safePositions;
hops.push({
hop,
safePositions,
totalPositions,
chance: safePositions / totalPositions,
roll,
survived,
});
if (!survived) {
bustIndex = hop;
break;
}
}
return {
seed,
entropyCursor: entropy.cursor,
volatility,
hops,
bustIndex,
clearedAllHops: bustIndex >= LAMB_CHOP_TOTAL_HOPS,
maxReachableMultiplier: lambChopMultiplierFor(volatility, bustIndex),
paytable: LAMB_CHOP_PAYTABLE[volatility],
};
}
function lambChopMultiplierFor(volatility, hopCount) {
if (hopCount < 1) return 0;
const row = LAMB_CHOP_PAYTABLE[volatility];
if (!row) throw new Error(`No lamb-chop paytable for risk profile '${volatility}'.`);
const multiplier = row[hopCount - 1];
if (multiplier === undefined) {
throw new Error(`No lamb-chop paytable row for ${volatility} at ${hopCount} hop(s).`);
}
return multiplier;
}
// Use the revealed server seed (64 hex characters) and the client seed and nonce shown on the bet.
console.log(await verifyLambChopBet(
'REVEALED_SERVER_SEED',
'yeetdemo-7f3a91',
'1842',
'easy'
));