2ch本スレで話題になった課金ロジックについての翻訳です。(翻訳・文責:当サイト管理人 2013.7.31)
情報元Forum URL http://forum.supercell.net/showthread.php/23028-Gem-calculation-formulas
エメラルド費用は階層的基準値に基づいて計算されます。購入資源量や短縮時間の基準値が段階的に設定され、
それぞれにエメラルド基準値が定まっており、実際の費用計算にはその前後の基準値・エメラルド基準値が用いられます。
ゴールド・エリクサーを購入する場合の基準値・エメラルド基準値
基準値 | エメラルド基準値 |
/100 | 1 |
/1,000 | 5 |
/10,000 | 25 |
/100,000 | 125 |
/1,000,000 | 600 |
/10,000,000 | 3000 |
計算式
「資源購入に必要なエメラルド」
=(「購入したい資源量」‐「一つ前の基準値」) ÷ ( (「一つ後の基準値」-「一つ前の基準値」)÷(「一つ後のエメラルド基準値」-「一つ前のエメラルド基準値」) ) + 「一つ前のエメラルド基準値」
5,000のゴールド又はエリクサーを購入したい場合、/1000と/10,000
の基準値を使って計算します。
(5000 - 1000)/((10000 - 1000)/(25 - 5)) + 5
= 4000/(9000/20) + 5
= 4000/450 + 5
~14 gems
下記2点は例外処理となります。
1.購入したい資源量が100以下の場合 → いかなる場合も1
2.購入したい資源量が最大貯蔵量(現状8,001,000)を超える場合 →
単純に必要量に到達するまで積算する(※10,000,000の基準値があるのでこれに該当しない気がします。。。(管理人) )
ダークエリクサーを購入する場合の基準値・エメラルド基準値
基準値が100分の1になります。
基準値 | エメラルド基準値 |
1 | 1 |
10 | 5 |
100 | 25 |
1,000 | 125 |
10,000 | 600 |
100,000 | 3000 |
ゴールド・ダークエリクサーとの違いは最大基準値が最大貯蔵量より小さいということです。最大基準値より多く買いたい場合は最大の価格帯が適用されます。
15万のダークエリクサーを購入したい場合
(150000 - 10000)/((100000 - 10000)/(3000-600)) + 600
= 140000/(90000/2400) + 600
= 140000/37.5 + 600
~4333 gems
以下の計算でも算出可能
(150000 - 100000)/((100000 - 10000)/(3000-600)) +
3000
= 50000/37.5 + 3000
~4333 gems
時間短縮に対する基準値
基準値 | エメラルド基準値 |
60秒 (1分) | 1 |
3600秒 (1時間) | 20 |
86400秒 (1日) | 260 |
604800秒 (1週間) | 1000 |
もしアーチャータワーをLv11にアップグレードしたい場合7日かかり、1000かかるのですが、1秒たてば999に下がります。
以下は実際の公式Wiki上でのJavaスクリプトです。
function doCalcResourceToGems (resources) {
var ranges = [100,1000,10000,100000,1000000,10000000];
var gems = [1,5,25,125,600,3000];
var storagemax = 8001000;
if (isNaN(resources)) return("???");
if (resources < 0) return("???");
else if (resources == 0) return(0);
else if (resources <= ranges[0]) return(gems[0]);
for (var i = 1; i < ranges.length-1; i++)
if (resources <= ranges[i])
return(Math.round((resources - ranges[i-1])/((ranges[i] -
ranges[i-1])/(gems[i] - gems[i-1])) + gems[i-1]));
if (resources <= storagemax)
return(Math.round((resources -
ranges[ranges.length-2])/((ranges[ranges.length-1] -
ranges[ranges.length-2])/(gems[gems.length-1] - gems[gems.length-2])) +
gems[gems.length-2]));
else
return(doCalcResourceToGems(resources % storagemax) +
Math.floor(resources/storagemax)*doCalcResourceToGems(storagemax));
return("???");
}