コーディングテスト-リソース機能実装問題

あなたはソーシャルゲーム会社の社員であり, クエストについての機能を担当することになりました. 以下, ゲーム内で得たり, 消費できたりするアイテムやゲーム内通貨のことを リソース と呼びます.
リソースの種類は ゲーム内通貨, アイテム の2種類があり, ユーザーは各リソースを保持しています. ユーザーデータをJSONデータとして表すと以下のようになります.

ユーザーデータ

{
  "userId":"user",
  "resources":{
    "money":{
      "type":"money",
      "value":400
    },
    "itemstacks":{
      "type":"itemstacks",
      "items":{
        "item001":4,
        "item002":6
      }
    }
  }
}

ゲーム内通貨は識別用のプロパティ(type) と値からなり,
アイテムはアイテムIDと個数のハッシュマップとなっていて(itemstacks)
具体的には以下のようなJSONデータとして表されます.

ゲーム内通貨

{
  "type":"money",
  "value":200
}

アイテム

{
  "type":"itemstacks",
  "items":{
    "item001":2,
    "item002":1
  }
}

クエスト

クエストには

  • クエストを開始する際にかかるコスト(costs)
  • クエストをクリアした際の報酬(rewards)
    がリソースの配列として定義されています.
    ユーザーはクエスト開始前にコストを支払い, クエストをクリアしユーザーが報酬を得ると各リソースについて報酬分のリソースが加算されます.
    また, ゲームにはキャンペーンがあり特定期間中はクエストの全ての報酬が2倍になることがあります.
{
  "questId":"quest001",
  "costs":[
    {
      "type":"money",
      "value":100
    }
  ],
  "rewards":[
    {
      "type":"money",
      "value":200
    },
    {
      "type":"itemstacks",
      "items":{
        "item001":2,
        "item002":1
      }
    }
  ]
}

あなたは,

  • [チェック機能] クエスト開始の際, ユーザーがコストを支払えるかどうかのチェック
  • [消費機能] クエスト開始の際のユーザーがリソースを消費する機能
  • [報酬機能] クエストクリアの際のユーザーがリソースを得る機能
  • [増量機能] クエストの報酬をn倍にする機能

の実装をしてください. 実行性能は気にしなくてよく, 任意のプログラミング言語を使って構いません. またJSONのデコード等問題に関係ない部分は実装しなくて結構です.

備考

  • 今後, リソースの種類は増える可能性があります.
  • リソースの配列は同じ種類がまとまっているとは限りません.