public void Report(Bitmap bitmap)
        {
            var state = _previousState;

            // Map取得
            var map = GetMap(bitmap);

            switch (_previousState)
            {
            case WarState.Waiting:
                // 戦争待機中なら、戦争が開始したかどうかチェックする
                if (IsCostDisplayed(bitmap) && !map.IsEmpty())
                {
                    state = WarState.Waring;
                    WarStarted?.Invoke(this, map);
                }
                break;

            case WarState.Waring:
                // 戦争中なら、戦争が終了したかどうかチェックする
                // 考慮事項:FO・死んだときやMAP名上にマウスカーソル
                if (IsWarResultDisplayed(bitmap) && !map.IsEmpty())
                {
                    state = WarState.Waiting;
                    WarFinished?.Invoke(this, map);
                }
                // FOして別の戦場を入りなおしたとき、状態はAtWarのままのため、
                // 一度Waitingに状態変更通知を投げて、即座に戦争状態に戻す
                if (!map.IsEmpty() && map != _previousValidMap)
                {
                    WarCanceled?.Invoke(this, map);
                    WarStarted?.Invoke(this, map);
                }
                break;

            default:
                throw new Exception("invalid state");
            }

            // 状態更新
            _previousState = state;

            if (!map.IsEmpty())
            {
                _previousValidMap = map;
            }
        }
 public void Reset()
 {
     _previousValidMap = Map.Empty;
     _previousState    = WarState.Waiting;
 }