static Buki SelectUnPreferredBuki(Slot slot, Sinma.Base sinma)
        {
            var candidates = slot.Bukis
                             .Where(buki => !sinma.DoesPrefer(buki))
                             .ToArray();

            if (!candidates.Any())
            {
                candidates = slot.Bukis;
            }

            var index = Environment.RandomRange(0, candidates.Length);

            return(candidates[index]);
        }
        public List <Record> Act(int id, Sinma.Base sinma)
        {
            if (sinma != null && sinma.SinmaState == SinmaState.NoSign)
            {
                _remainTurnToCompletePrepare = Constant.TurnToCompletePrepare;
            }

            if (sinma != null && sinma.SinmaState == SinmaState.Signed)
            {
                _remainTurnToCompletePrepare--;
            }

            var sinmaCountDown = sinma != null && sinma.SinmaState == SinmaState.Signed
                ? _remainTurnToCompletePrepare
                : null;

            var records = new List <Record>();

            foreach (var member in Members)
            {
                var buki = member.Act(sinmaCountDown, sinma);

                if (buki == null)
                {
                    continue;
                }

                var record = new Record(
                    id: id,
                    actor: member.Name,
                    sinmaState: sinma?.SinmaState ?? SinmaState.NoSign,
                    isStrong: Environment.DoesJobStrongWith(member.Job, buki),
                    didSinmaPrefer: sinma?.DoesPrefer(buki) ?? false
                    );

                sinma?.Watch(buki);

                records.Add(record);
            }

            _records.AddRange(records);

            return(records);
        }