void ShowLimitationConfig(MachineSeedGenConfig genConfig)
    {
        EditorGUILayout.LabelField("----- limitation config -----");

        for (int i = 0; i < genConfig._limitConfigs.Count; i++)
        {
            MachineSeedLimitationConfig limitConfig = genConfig._limitConfigs[i];

            GUILayout.BeginHorizontal();

            limitConfig._type = (MachineSeedLimitationType)EditorGUILayout.EnumPopup(limitConfig._type, GUILayout.ExpandWidth(false), GUILayout.MinWidth(70));

            if (limitConfig._type == MachineSeedLimitationType.Bankcrupt)
            {
                EditorGUILayout.LabelField("StartSpinCount", GUILayout.MaxWidth(100));
                limitConfig._startSpinCount = EditorGUILayout.IntField(limitConfig._startSpinCount);

                EditorGUILayout.LabelField("EndSpinCount", GUILayout.MaxWidth(100));
                limitConfig._endSpinCount = EditorGUILayout.IntField(limitConfig._endSpinCount);
            }
            else if (limitConfig._type == MachineSeedLimitationType.CreditRange)
            {
                EditorGUILayout.LabelField("SpinCount", GUILayout.MaxWidth(70));
                limitConfig._spinCount = EditorGUILayout.IntField(limitConfig._spinCount);

                EditorGUILayout.LabelField("MinCredit", GUILayout.MaxWidth(70));
                limitConfig._minCredit = EditorGUILayout.LongField(limitConfig._minCredit);

                EditorGUILayout.LabelField("MaxCredit", GUILayout.MaxWidth(70));
                limitConfig._maxCredit = EditorGUILayout.LongField(limitConfig._maxCredit);
            }
            else
            {
                Debug.Assert(false);
            }

            if (GUILayout.Button("-", GUILayout.Width(20)))
            {
                genConfig._limitConfigs.RemoveAt(i);
            }

            if (GUILayout.Button("+", GUILayout.Width(20)))
            {
                genConfig._limitConfigs.Insert(i + 1, new MachineSeedLimitationConfig());
            }

            GUILayout.EndHorizontal();
        }

        if (GUILayout.Button("+", GUILayout.Width(20)))
        {
            genConfig._limitConfigs.Add(new MachineSeedLimitationConfig());
        }
    }
    bool IsUserResultPassSingleLimitConfig(MachineTestUserResult userResult, MachineSeedLimitationConfig limitConfig)
    {
        bool result = false;
        List <MachineTestRoundResult> roundResults = userResult.RoundResults;

        if (limitConfig._type == MachineSeedLimitationType.Bankcrupt)
        {
            Debug.Assert(limitConfig._startSpinCount < limitConfig._endSpinCount);

            for (int i = limitConfig._startSpinCount; i < limitConfig._endSpinCount && i < roundResults.Count; i++)
            {
                MachineTestRoundResult roundResult = roundResults[i];
                if (roundResult._output._remainCredit <= 0)
                {
                    result = true;
                    break;
                }
            }
        }
        else if (limitConfig._type == MachineSeedLimitationType.CreditRange)
        {
            if (limitConfig._spinCount <= roundResults.Count)
            {
                MachineTestRoundResult roundResult = roundResults[limitConfig._spinCount - 1];
                long remainCredit = roundResult._output._remainCredit;
                result = (remainCredit >= limitConfig._minCredit && remainCredit <= limitConfig._maxCredit);
            }
            else
            {
                // just treat it as not passed
                result = false;
            }
        }
        else
        {
            Debug.Assert(false);
        }

        return(result);
    }