/// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="cost">1回にかかるコスト</param>
 /// <param name="env">環境設定</param>
 public GatyaMachine(GatyaEnvironment env, uint cost)
 {
     this.env = env;
     this.InMoney = 0;
     this.InTryCount = 0;
     Init(cost);
 }
        /// <summary>
        /// カードを指定枚数だけ出力する
        /// </summary>
        /// <param name="env">環境設定</param>
        /// <returns>獲得できたカード</returns>
        public static Card[] CreateCards(GatyaEnvironment env)
        {
            Card[] cards = new Card[env.OutCount];	// 出力枚数だけ生成する

            for (int i = 0; i < cards.Length; i++)
                cards[i] = NewCard(env);

            // 先に登録を行っておく?
            // ちょっと汚いかも
            env.Database.EntryCards(cards);
            return cards;
        }
        /// <summary>
        /// カードを1枚獲得する
        /// </summary>
        /// <param name="env">環境設定</param>
        /// <returns></returns>
        private static Card NewCard(GatyaEnvironment env)
        {
            uint number = 0;
            CardRank rarerity = CardRank.Common;

            // ある確率以上なら無条件でレアがヒットする
            if (Random.RandomFloat() < env.RarePercent)
            {
                HitRare(env, out number, out rarerity);
            }
            else
            {
                // レアカードがヒットしなかった!
                number = Random.RandomIndex(env.CommonCount);
                rarerity = CardRank.Common;
            }

            return new Card(number, rarerity);
        }
        /// <summary>
        /// レアカードが獲得できた場合の処理
        /// </summary>
        /// <param name="env">環境設定</param>
        /// <param name="number">インデックス</param>
        /// <param name="rarerity">レアリティ</param>
        private static void HitRare(GatyaEnvironment env, out uint number, out CardRank rarerity)
        {
            uint result_num = Random.RandomIndex(env.CompleteCount);

            // 所持していないカードがヒットした場合、確変チェックを入れる
            if (env.Database.Rare[result_num] == 0)
            {
                if (env.Database.HitCount > env.StartUnhitCount)	// ここで確変チェック
                {
                    // 所持していないカードだったため、獲得できるか挑戦する
                    if (Random.RandomFloat() < env.UnhitPercent)
                    {
                        // 獲得成功!
                        number = result_num;
                        rarerity = CardRank.Rare;
                    }
                    else
                    {
                        // 失敗したので適当に所持している中から選ぶ
                        uint[] hitted = env.Database.HittedRareIndices;
                        number = Random.RandomIndex((uint)hitted.Length);
                        rarerity = CardRank.Rare;
                    }
                }
                else
                {
                    // 確変がまだ起きてないので通常通り
                    number = result_num;
                    rarerity = CardRank.Rare;
                }
            }
            else
            {
                // 所持しているカードがヒットしたので素通りする
                number = result_num;
                rarerity = CardRank.Rare;
            }
        }