diff --git a/game/rock/index.html b/game/rock/index.html index 8bba9cc..8a7f204 100644 --- a/game/rock/index.html +++ b/game/rock/index.html @@ -3007,10 +3007,84 @@ return resultFor(selfGesture, opponentGesture); } + function numberFromFields(source, fields) { + if (!source) return null; + for (var i = 0; i < fields.length; i += 1) { + if ( + !Object.prototype.hasOwnProperty.call( + source, + fields[i] + ) + ) { + continue; + } + var raw = source[fields[i]]; + if (raw === null || raw === undefined || raw === '') { + continue; + } + var value = Number(raw); + if (Number.isFinite(value)) return value; + } + return null; + } + + function totalFeeBPSForMatch(match) { + var config = state.config || {}; + var feeBPS = numberFromFields(match, [ + 'fee_bps', + 'feeBps', + ]); + var poolBPS = numberFromFields(match, [ + 'pool_bps', + 'poolBps', + ]); + if (feeBPS === null) { + feeBPS = numberFromFields(config, [ + 'fee_bps', + 'feeBps', + ]); + } + if (poolBPS === null) { + poolBPS = numberFromFields(config, [ + 'pool_bps', + 'poolBps', + ]); + } + if (feeBPS === null && poolBPS === null) return null; + return Math.max( + 0, + Math.min(10000, (feeBPS || 0) + (poolBPS || 0)) + ); + } + + function estimatedPayoutFromFee(match) { + var stakeCoin = + numberFromFields(match, ['stake_coin', 'stakeCoin']) || + state.selectedStake || + 0; + var totalFeeBPS = totalFeeBPSForMatch(match); + if (!stakeCoin || totalFeeBPS === null) return 0; + return Math.max( + 0, + Math.trunc( + (stakeCoin * 2 * (10000 - totalFeeBPS)) / 10000 + ) + ); + } + function payoutFromMatch(match, result) { var self = findSelfParticipant(match); - if (self && self.payout_coin > 0) return self.payout_coin; - if (result === 'draw') return 0; + var payoutCoin = numberFromFields(self, [ + 'payout_coin', + 'payoutCoin', + ]); + if (payoutCoin !== null) { + return Math.max(0, Math.trunc(payoutCoin)); + } + if (result !== 'win') return 0; + // 真实局缺少 payout_coin 时不能再展示未扣点的 2 倍押注。 + // 兜底只能按本局或配置里的 fee_bps + pool_bps 估算。 + if (match) return estimatedPayoutFromFee(match); return state.selectedStake * 2; }