課金について

「課金について」の編集履歴(バックアップ)一覧に戻る

課金について - (2013/07/31 (水) 15:51:43) の編集履歴(バックアップ)


2ch本スレで話題になった課金ロジックについての翻訳です。(翻訳・文責:当サイト管理人 2013.7.31)

情報元Forum URL http://forum.supercell.net/showthread.php/23028-Gem-calculation-formulas

 

エメラルド費用は階層的基準値に基づいて計算されます。購入資源量や短縮時間の基準値が段階的に設定され、

それぞれにエメラルド基準値が定まっており、実際の費用計算にはその前後の基準値・エメラルド基準値が用いられます。

 

ゴールド・エリクサーを購入する場合の基準値・エメラルド基準値

基準値 エメラルド基準値
/Elixir100 Gem1
/Elixir1,000 Gem5
/Elixir10,000 Gem25
/Elixir100,000 Gem125
/Elixir1,000,000 Gem600
/Elixir10,000,000 Gem3000

 

計算式

「資源購入に必要なエメラルド」

=(「購入したい資源量」‐「一つ前の基準値」) ÷ ( (「一つ後の基準値」-「一つ前の基準値」)÷(「一つ後のエメラルド基準値」-「一つ前のエメラルド基準値」) ) + 「一つ前のエメラルド基準値」

5,000のゴールド又はエリクサーを購入したい場合、/Elixir1000と/Elixir10,000 の基準値を使って計算します。

(5000 - 1000)/((10000 - 1000)/(25 - 5)) + 5
= 4000/(9000/20) + 5
= 4000/450 + 5
~14 gems
 

下記2点は例外処理となります。

1.購入したい資源量が100以下の場合 → いかなる場合もGem1

2.購入したい資源量が最大貯蔵量(現状8,001,000)を超える場合 → 単純に必要量に到達するまで積算する(※10,000,000の基準値があるのでこれに該当しない気がします。。。(管理人) )

 

ダークエリクサーを購入する場合の基準値・エメラルド基準値
基準値が100分の1になります。

 

基準値 エメラルド基準値
Dark elixir1 Gem1
Dark elixir10 Gem5
Dark elixir100 Gem25
Dark elixir1,000 Gem125
Dark elixir10,000 Gem600
Dark elixir100,000 Gem3000

ゴールド・ダークエリクサーとの違いは最大基準値が最大貯蔵量より小さいということです。最大基準値より多く買いたい場合は最大の価格帯が適用されます。

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分) Gem1
3600秒 (1時間) Gem20
86400秒 (1日) Gem260
604800秒 (1週間) Gem1000


違いとしては、常に端数が切り捨て計算されるということです。

もしアーチャータワーをLv11にアップグレードしたい場合7日かかり、Gem1000かかるのですが、1秒たてばGem999に下がります。

以下は実際の公式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("???");
}