コード例 #1
0
 public PlayerMovePieceUseCase(IGame game, IPlayer player, IValueInputProvider <int> inputProvider, ILogger logger)
 {
     this.game          = game;
     this.player        = player;
     this.inputProvider = inputProvider;
     this.logger        = logger;
 }
コード例 #2
0
        public PieceMoveTransaction(IPlayer player, VerifiedMove verifiedMove, PositionArrayAccessor <IPiece> pieces, IFieldEffectChecker fieldEffectChecker,
                                    IValueInputProvider <int> valueProvider, bool isTurnEnd)
        {
            Assert.IsNotNull(verifiedMove);
            Assert.IsNotNull(verifiedMove.Player);
            Assert.IsNotNull(player);
            Assert.AreEqual(verifiedMove.Player, player);
            Assert.IsNotNull(pieces);
            Assert.IsNotNull(fieldEffectChecker);
            Assert.IsNotNull(valueProvider);

            this.player        = player;
            this.pieces        = pieces;
            this.valueProvider = valueProvider;

            startPosition = verifiedMove.MovingPiece.Position;    //worldPathに開始地点は含まれないのでこの方法で開始地点を取得
            viaPosition   = verifiedMove.ViaPositionNode;
            endPosition   = verifiedMove.WorldPath.Last();

            this.worldPath = verifiedMove.WorldPath;
            this.isTurnEnd = isTurnEnd;

            pieceMover        = new Mover(pieces);
            waterEntryChecker = new WaterEntryChecker(3, fieldEffectChecker, valueProvider);
            moveFinisher      = new MoveFinisher(pieceMover, new Capturer(pieces));
        }
コード例 #3
0
 public WaterEntryChecker(int threshold, IFieldEffectChecker fieldEffectChecker,
                          IValueInputProvider <int> valueProvider)
 {
     this.threshold          = threshold;
     this.fieldEffectChecker = fieldEffectChecker;
     this.valueProvider      = valueProvider;
 }
コード例 #4
0
        public async UniTask <PieceMoveResult> MovePiece(PublicDataType.IntegerVector2 startPosition,
                                                         PublicDataType.IntegerVector2 viaPosition,
                                                         PublicDataType.IntegerVector2 endPosition,
                                                         IPlayer player, IValueInputProvider <int> valueProvider)
        {
            if (isLocked)
            {
                return(new PieceMoveResult(false, false, null));
            }

            var verifiedMove = moveVerifier.VerifyMove(player, startPosition, viaPosition, endPosition);

            if (verifiedMove == VerifiedMove.InvalidMove)
            {
                return(new PieceMoveResult(false, false, null));
            }


            //1ターンに複数回動作する駒のためのロジック
            //ターン管理をここでするな!
            var movingPiece = verifiedMove.MovingPiece;

            if (movingPiece == operationStatus.PreviousPiece)
            {
                operationStatus.AddCount();
            }
            else
            {
                if (operationStatus.PreviousPiece != null)
                {
                    return(new PieceMoveResult(false, false, null));
                }
                else
                {
                    operationStatus.Reset(movingPiece);
                }
            }
            bool isTurnEnd = operationStatus.Count >= movingPiece.NumberOfMoves;

            if (isTurnEnd)
            {
                operationStatus.Reset(null);
            }

            isLocked = true;
            IPieceMoveTransaction pieceMoveAction = pieceMoveActionFactory.Create(player, verifiedMove, pieces, fieldEffectChecker, valueProvider, isTurnEnd);

            PieceMoveResult result = await pieceMoveAction.StartMove();

            if (result.isSuccess)
            {
                onEveryValueChanged.OnNext(Unit.Default);
            }
            isLocked = false;

            return(result);
        }
コード例 #5
0
        public static IMovePieceUseCase Create(FirstOrSecond firstOrSecond, IValueInputProvider <int> valueProvider)
        {
            var game = GameController.Instance.Game;

            if (game == null)
            {
                return(null);
            }

            var player = game.GetPlayer(firstOrSecond);
            var logger = GameController.Instance.SystemLogger;

            return(new PlayerMovePieceUseCase(game, player, valueProvider, logger.ToUseCaseLogger()));
        }
コード例 #6
0
 //PositionArrayAccessor<IPiece> pieces, IFieldEffectChecker fieldEffectCheckerをコンストラクタの引数にすることも検討
 public IPieceMoveTransaction Create(IPlayer player, VerifiedMove verifiedMove, PositionArrayAccessor <IPiece> pieces, IFieldEffectChecker fieldEffectChecker, IValueInputProvider <int> valueProvider, bool isTurnEnd)
 {
     return(new PieceMoveTransaction(player, verifiedMove, pieces, fieldEffectChecker, valueProvider, isTurnEnd));
 }
コード例 #7
0
 public UniTask <PieceMoveResult> MovePiece(IntegerVector2 startPosition, IntegerVector2 viaPosition, IntegerVector2 endPosition, IPlayer player, IValueInputProvider <int> valueProvider)
 {
     throw new NotImplementedException();
 }
コード例 #8
0
        protected void Start()
        {
            valueProvider = GetComponent <IValueInputProvider <int> >();

            GameController.Instance.OnGameReset.TakeUntilDestroy(this).Subscribe(OnGameReset);
        }
コード例 #9
0
 public UniTask <PieceMoveResult> MovePiece(PublicDataType.IntegerVector2 startPosition, PublicDataType.IntegerVector2 lastPosition, IPlayer player, IValueInputProvider <int> valueProvider)
 => MovePiece(startPosition, lastPosition, lastPosition, player, valueProvider);