Exemplo n.º 1
0
            protected override MovePart OnComplete(Actor self, Mobile mobile, Move parent)
            {
                var map = self.World.Map;
                var fromSubcellOffset = map.Grid.OffsetOfSubCell(mobile.FromSubCell);
                var toSubcellOffset   = map.Grid.OffsetOfSubCell(mobile.ToSubCell);


                if (!IsCanceled || self.Location.Layer == CustomMovementLayerType.Tunnel)
                {
                    var nextCell = parent.PopPath(self);
                    if (nextCell != null)
                    {
                        if (IsTurn(mobile, nextCell.Value.First))
                        {
                            var nextSubcellOffset = map.Grid.OffsetOfSubCell(nextCell.Value.Second);

                            var ret = new MoveFirstHalf(
                                Move,
                                Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                                Util.BetweenCells(self.World, mobile.ToCell, nextCell.Value.First) + (toSubcellOffset + nextSubcellOffset) / 2,
                                mobile.Facing,
                                Util.GetNearestFacing(mobile.Facing, map.FacingBetween(mobile.ToCell, nextCell.Value.First, mobile.Facing)),
                                moveFraction - MoveFractionTotal
                                );

                            mobile.FinishedMoving(self);
                            mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.First, nextCell.Value.Second);
                            return(ret);
                        }

                        parent.path.Add(nextCell.Value.First);
                    }
                }

                var toPos = mobile.ToCell.Layer == 0 ? map.CenterOfCell(mobile.ToCell) :
                            self.World.GetCustomMovementLayers()[mobile.ToCell.Layer].CenterOfCell(mobile.ToCell);

                var ret2 = new MoveSecondHalf(
                    Move,
                    Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                    toPos + toSubcellOffset,
                    mobile.Facing,
                    mobile.Facing,
                    moveFraction - MoveFractionTotal
                    );

                mobile.EnteringCell(self);
                mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, mobile.ToCell, mobile.ToSubCell);
                return(ret2);
            }
Exemplo n.º 2
0
            protected override MovePart OnComplete(Actor self, Mobile mobile, Move parent)
            {
                var fromSubcellOffset = self.World.Map.OffsetOfSubCell(mobile.FromSubCell);
                var toSubcellOffset   = self.World.Map.OffsetOfSubCell(mobile.ToSubCell);

                var nextCell = parent.PopPath(self);

                if (nextCell != null)
                {
                    if (IsTurn(mobile, nextCell.Value.First))
                    {
                        var nextSubcellOffset = self.World.Map.OffsetOfSubCell(nextCell.Value.Second);
                        var ret = new MoveFirstHalf(
                            Move,
                            Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                            Util.BetweenCells(self.World, mobile.ToCell, nextCell.Value.First) + (toSubcellOffset + nextSubcellOffset) / 2,
                            mobile.Facing,
                            Util.GetNearestFacing(mobile.Facing, self.World.Map.FacingBetween(mobile.ToCell, nextCell.Value.First, mobile.Facing)),
                            moveFraction - MoveFractionTotal);

                        mobile.FinishedMoving(self);
                        mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.First, nextCell.Value.Second);
                        return(ret);
                    }

                    parent.path.Add(nextCell.Value.First);
                }

                var ret2 = new MoveSecondHalf(
                    Move,
                    Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                    self.World.Map.CenterOfCell(mobile.ToCell) + toSubcellOffset,
                    mobile.Facing,
                    mobile.Facing,
                    moveFraction - MoveFractionTotal);

                mobile.EnteringCell(self);
                mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, mobile.ToCell, mobile.ToSubCell);
                return(ret2);
            }
Exemplo n.º 3
0
            protected override MovePart OnComplete(Actor self, Mobile mobile, Move parent)
            {
                var fromSubcellOffset = MobileInfo.SubCellOffsets[mobile.fromSubCell];
                var toSubcellOffset   = MobileInfo.SubCellOffsets[mobile.toSubCell];

                var nextCell = parent.PopPath(self, mobile);

                if (nextCell != null)
                {
                    if (IsTurn(mobile, nextCell.Value.First))
                    {
                        var nextSubcellOffset = MobileInfo.SubCellOffsets[nextCell.Value.Second];
                        var ret = new MoveFirstHalf(
                            move,
                            Util.BetweenCells(mobile.fromCell, mobile.toCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                            Util.BetweenCells(mobile.toCell, nextCell.Value.First) + (toSubcellOffset + nextSubcellOffset) / 2,
                            mobile.Facing,
                            Util.GetNearestFacing(mobile.Facing, Util.GetFacing(nextCell.Value.First - mobile.toCell, mobile.Facing)),
                            moveFraction - moveFractionTotal);

                        mobile.SetLocation(mobile.toCell, mobile.toSubCell, nextCell.Value.First, nextCell.Value.Second);
                        return(ret);
                    }

                    parent.path.Add(nextCell.Value.First);
                }

                var ret2 = new MoveSecondHalf(
                    move,
                    Util.BetweenCells(mobile.fromCell, mobile.toCell) + (fromSubcellOffset + toSubcellOffset) / 2,
                    mobile.toCell.CenterPosition + toSubcellOffset,
                    mobile.Facing,
                    mobile.Facing,
                    moveFraction - moveFractionTotal);

                mobile.EnteringCell(self);
                mobile.SetLocation(mobile.toCell, mobile.toSubCell, mobile.toCell, mobile.toSubCell);
                return(ret2);
            }
Exemplo n.º 4
0
            protected override MovePart OnComplete( Actor self, Mobile mobile, Move parent )
            {
                var unit = self.traits.Get<Unit>();

                var nextCell = parent.PopPath( self, mobile );
                if( nextCell != null )
                {
                    if( ( nextCell - mobile.toCell ) != ( mobile.toCell - mobile.fromCell ) )
                    {
                        var ret = new MoveFirstHalf(
                            Util.BetweenCells( mobile.fromCell, mobile.toCell ),
                            Util.BetweenCells( mobile.toCell, nextCell.Value ),
                            unit.Facing,
                            Util.GetNearestFacing( unit.Facing, Util.GetFacing( nextCell.Value - mobile.toCell, unit.Facing ) ),
                            moveFraction - moveFractionTotal );
                        mobile.fromCell = mobile.toCell;
                        mobile.toCell = nextCell.Value;
                        return ret;
                    }
                    else
                        parent.path.Add( nextCell.Value );
                }
                var ret2 = new MoveSecondHalf(
                    Util.BetweenCells( mobile.fromCell, mobile.toCell ),
                    Util.CenterOfCell( mobile.toCell ),
                    unit.Facing,
                    unit.Facing,
                    moveFraction - moveFractionTotal );
                mobile.fromCell = mobile.toCell;
                return ret2;
            }