Exemplo n.º 1
0
        public void Add_ShouldAddObjectToAllTiles(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            IRegion region1,
            IRegion region2,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 2));
            regionLocator.GetRegionIndex(0, 0).ReturnsForAnyArgs <ushort>(2);

            regionLocator.GetRegionIndex(1, 1).Returns <ushort>(0);
            regionLocator.GetRegionIndex(1, 2).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 1).Returns <ushort>(1);

            tileLocator.ForeachMultitile(simpleGameObject).Returns(new[]
            {
                new Position(1, 1),
                new Position(1, 2),
                new Position(2, 1),
            });

            regionManager.AddRegion(region0);
            regionManager.AddRegion(region1);
            regionManager.AddRegion(region2);

            regionManager.Add(simpleGameObject);

            region0.Received(1).AddObjectToTile(simpleGameObject, 1, 1);
            region0.Received(1).AddObjectToTile(simpleGameObject, 1, 2);
            region1.Received(1).AddObjectToTile(simpleGameObject, 2, 1);
            region2.DidNotReceive().AddObjectToTile(Arg.Any <ISimpleGameObject>(), Arg.Any <uint>(), Arg.Any <uint>());
        }
Exemplo n.º 2
0
        public void Remove_WhenATileIsInInvalidRegion_RemovesFromAllOtherTilesAndIgnoresInvalidTile(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.InWorld.Returns(true);
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 2));

            regionLocator.GetRegionIndex(1, 1).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 1).Returns <ushort>(1);

            tileLocator.ForeachMultitile(0, 0, 0).ReturnsForAnyArgs(new[]
            {
                new Position(1, 1),
                new Position(2, 1),
            });

            regionManager.AddRegion(region0);

            regionManager.Remove(simpleGameObject);

            region0.Received(1).Remove(simpleGameObject, 1, 2);
            region0.Received(1).RemoveObjectFromTile(simpleGameObject, 1, 1);
        }
Exemplo n.º 3
0
        public void Remove_ProperlyLocksRegions(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            IRegion region1,
            IRegion region2,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.InWorld.Returns(true);
            regionLocator.GetRegionIndex(0, 0).ReturnsForAnyArgs <ushort>(2);

            regionLocator.GetRegionIndex(1, 1).Returns <ushort>(0);
            regionLocator.GetRegionIndex(1, 2).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 1).Returns <ushort>(1);

            tileLocator.ForeachMultitile(0, 0, 0).ReturnsForAnyArgs(new[]
            {
                new Position(1, 1),
                new Position(2, 1),
            });

            regionManager.AddRegion(region0);
            regionManager.AddRegion(region1);
            regionManager.AddRegion(region2);

            regionManager.Remove(simpleGameObject);

            region0.Received(1).EnterWriteLock();
            region1.Received(1).EnterWriteLock();
            region0.Received(1).ExitWriteLock();
            region1.Received(1).ExitWriteLock();
            region2.DidNotReceive().EnterWriteLock();
        }
Exemplo n.º 4
0
 public int RadiusDistance(ISimpleGameObject obj1, ISimpleGameObject obj2)
 {
     return(RadiusDistance(obj1.PrimaryPosition,
                           obj1.Size,
                           obj2.PrimaryPosition,
                           obj2.Size));
 }
Exemplo n.º 5
0
        public void ObjectUpdateEvent_LocksBothPreviousAndCurrentRegions(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            IRegion region1,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.InWorld.Returns(true);
            simpleGameObject.Size.Returns <byte>(11);
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 2));

            regionManager.AddRegion(region0);
            regionManager.AddRegion(region1);

            regionLocator.GetRegionIndex(1, 9).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 9).Returns <ushort>(1);

            tileLocator.ForeachMultitile(1, 2, 11).Returns(new[]
            {
                new Position(1, 9)
            });

            tileLocator.ForeachMultitile(2, 3, 11).Returns(new[]
            {
                new Position(2, 9)
            });

            regionManager.UpdateObject(simpleGameObject, 2, 3);

            region0.Received(1).EnterWriteLock();
            region1.Received(1).EnterWriteLock();
            region0.Received(1).ExitWriteLock();
            region1.Received(1).ExitWriteLock();
        }
Exemplo n.º 6
0
 public void Remove(ISimpleGameObject obj, uint origX, uint origY)
 {
     primaryLock.EnterWriteLock();
     primaryObjects.Remove(obj, origX, origY);
     MarkAsDirty();
     primaryLock.ExitWriteLock();
 }
Exemplo n.º 7
0
 public void Add(ISimpleGameObject obj)
 {
     primaryLock.EnterWriteLock();
     primaryObjects.Add(obj, obj.PrimaryPosition.X, obj.PrimaryPosition.Y);
     MarkAsDirty();
     primaryLock.ExitWriteLock();
 }
Exemplo n.º 8
0
 public void DbLoaderAdd(ISimpleGameObject obj)
 {
     if (obj.InWorld)
     {
         Add(obj);
     }
 }
Exemplo n.º 9
0
        public void Add_WhenSomeTilesAreInInvalidRegion_ShouldIgnoreRegions(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 1));
            regionLocator.GetRegionIndex(0, 0).ReturnsForAnyArgs <ushort>(2);

            regionLocator.GetRegionIndex(1, 1).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 1).Returns <ushort>(1);

            tileLocator.ForeachMultitile(simpleGameObject).Returns(new[]
            {
                new Position(1, 1),
                new Position(2, 1),
            });

            regionManager.AddRegion(region0);

            regionManager.Add(simpleGameObject);

            region0.Received(1).AddObjectToTile(simpleGameObject, 1, 1);
        }
Exemplo n.º 10
0
        public void Add_WhenObjectDoesNotYetExist_AddsObject(
            ISimpleGameObject simpleGameObject,
            RegionObjectList objectList)
        {
            objectList.Add(simpleGameObject, 10, 13);

            objectList.Get(10, 13).Should().Equal(simpleGameObject);
        }
Exemplo n.º 11
0
        public void Add_WhenAnObjectAlreadyExistsInIndex_AddsObjectToExistingIndex(
            ISimpleGameObject simpleGameObject1,
            ISimpleGameObject simpleGameObject2,
            RegionObjectList objectList)
        {
            objectList.Add(simpleGameObject1, 10, 13);
            objectList.Add(simpleGameObject2, 10, 13);

            objectList.Get(10, 13).Should().Equal(simpleGameObject1, simpleGameObject2);
        }
Exemplo n.º 12
0
        public void UpdateObject(ISimpleGameObject sender, uint origX, uint origY)
        {
            if (!sender.InWorld)
            {
                throw new Exception(string.Format("Received update for obj that is not in world: eventOrigX[{1}] eventOrigY[{2}] {0}",
                                                  sender.ToString(),
                                                  origX,
                                                  origY));
            }

            var miniMapRegionObject = sender as IMiniMapRegionObject;

            if (miniMapRegionObject != null)
            {
                MiniMapRegions.UpdateObjectRegion(miniMapRegionObject, origX, origY);
            }

            // Lock regions from both old and new positions
            var lockedRegions = LockRegions(GetMultitileRegionIds(sender.PrimaryPosition.X, sender.PrimaryPosition.Y, sender.Size)
                                            .Concat(GetMultitileRegionIds(origX, origY, sender.Size)));

            ushort previousPrimaryRegionId = regionLocator.GetRegionIndex(origX, origY);
            ushort newPrimaryRegionId      = regionLocator.GetRegionIndex(sender);

            RemoveFromPrimaryRegionAndAllTiles(sender, origX, origY);
            AddToPrimaryRegionAndTiles(sender);

            if (previousPrimaryRegionId == newPrimaryRegionId)
            {
                var packet = new Packet(Command.ObjectUpdate);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + newPrimaryRegionId, packet);
            }
            else
            {
                var packet = new Packet(Command.ObjectMove);
                packet.AddUInt16(previousPrimaryRegionId);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + previousPrimaryRegionId, packet);

                packet = new Packet(Command.ObjectAdd);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + newPrimaryRegionId, packet);
            }

            UnlockRegions(lockedRegions);
        }
Exemplo n.º 13
0
        public void RadiusDistance_WithObj_ShouldReturnLowestRadiusDistanceBetweenObjTiles(
            int x, int y, int size,
            int x1, int y1, int size1,
            int expected,
            ISimpleGameObject obj1,
            ISimpleGameObject obj2,
            TileLocator tileLocator
            )
        {
            obj1.PrimaryPosition.Returns(new Position((uint)x, (uint)y));
            obj1.Size.Returns((byte)size);

            obj2.PrimaryPosition.Returns(new Position((uint)x1, (uint)y1));
            obj2.Size.Returns((byte)size1);

            tileLocator.RadiusDistance(obj1, obj2).Should().Be(expected);
        }
Exemplo n.º 14
0
        public void Add_ShouldAddObjectToPrimaryRegion(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            IRegion region1,
            RegionManager regionManager)
        {
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 2));
            regionLocator.GetRegionIndex(simpleGameObject.PrimaryPosition.X, simpleGameObject.PrimaryPosition.Y).Returns <ushort>(1);

            regionManager.AddRegion(region0);
            regionManager.AddRegion(region1);

            regionManager.Add(simpleGameObject);

            region0.DidNotReceive().Add(simpleGameObject);
            region1.Received(1).Add(simpleGameObject);
        }
Exemplo n.º 15
0
        private bool RemoveFromPrimaryRegionAndAllTiles(ISimpleGameObject obj, uint x, uint y)
        {
            var primaryRegion = GetRegion(x, y);

            if (primaryRegion == null)
            {
                return(false);
            }

            primaryRegion.Remove(obj, x, y);

            foreach (var position in tileLocator.ForeachMultitile(x, y, obj.Size))
            {
                var region = GetRegion(position.X, position.Y);
                if (region != null)
                {
                    region.RemoveObjectFromTile(obj, position.X, position.Y);
                }
            }

            return(true);
        }
Exemplo n.º 16
0
        private bool AddToPrimaryRegionAndTiles(ISimpleGameObject obj)
        {
            var primaryRegion = GetRegion(obj.PrimaryPosition.X, obj.PrimaryPosition.Y);

            if (primaryRegion == null)
            {
                return(false);
            }

            primaryRegion.Add(obj);

            foreach (var position in tileLocator.ForeachMultitile(obj))
            {
                var region = GetRegion(position.X, position.Y);

                if (region != null)
                {
                    region.AddObjectToTile(obj, position.X, position.Y);
                }
            }

            return(true);
        }
Exemplo n.º 17
0
        public void Remove(ISimpleGameObject obj)
        {
            if (!obj.InWorld)
            {
                return;
            }

            var lockedRegions = LockMultitileRegions(obj.PrimaryPosition.X, obj.PrimaryPosition.Y, obj.Size);

            if (RemoveFromPrimaryRegionAndAllTiles(obj, obj.PrimaryPosition.X, obj.PrimaryPosition.Y))
            {
                obj.InWorld = false;

                DeregisterObjectEventListeners(obj);

                IMiniMapRegionObject miniMapRegionObject = obj as IMiniMapRegionObject;
                if (miniMapRegionObject != null)
                {
                    MiniMapRegions.Remove(miniMapRegionObject);
                }

                ushort regionId = regionLocator.GetRegionIndex(obj);
                channel.Post("/WORLD/" + regionId, () =>
                {
                    var packet = new Packet(Command.ObjectRemove);
                    packet.AddUInt16(regionId);
                    packet.AddUInt32(obj.GroupId);
                    packet.AddUInt32(obj.ObjectId);
                    return(packet);
                });
            }

            UnlockRegions(lockedRegions);

            // Raise event
            ObjectRemoved.Raise(this, new ObjectEvent(obj));
        }
Exemplo n.º 18
0
        public void Remove_RemovesObjectFromAllTiles(
            ISimpleGameObject simpleGameObject,
            [Frozen] IRegionLocator regionLocator,
            IRegion region0,
            IRegion region1,
            IRegion region2,
            [Frozen] ITileLocator tileLocator,
            RegionManager regionManager)
        {
            simpleGameObject.InWorld.Returns(true);
            simpleGameObject.PrimaryPosition.Returns(new Position(1, 2));
            simpleGameObject.Size.Returns <byte>(10);
            regionLocator.GetRegionIndex(0, 0).ReturnsForAnyArgs <ushort>(2);

            regionLocator.GetRegionIndex(1, 1).Returns <ushort>(0);
            regionLocator.GetRegionIndex(1, 2).Returns <ushort>(0);
            regionLocator.GetRegionIndex(2, 1).Returns <ushort>(1);

            tileLocator.ForeachMultitile(1, 2, 10).Returns(new[]
            {
                new Position(1, 1),
                new Position(1, 2),
                new Position(2, 1),
            });

            regionManager.AddRegion(region0);
            regionManager.AddRegion(region1);
            regionManager.AddRegion(region2);

            regionManager.Remove(simpleGameObject);

            region0.Received(1).Remove(simpleGameObject, 1, 2);
            region0.Received(1).RemoveObjectFromTile(simpleGameObject, 1, 1);
            region0.Received(1).RemoveObjectFromTile(simpleGameObject, 1, 2);
            region1.Received(1).RemoveObjectFromTile(simpleGameObject, 2, 1);
            region2.DidNotReceive().RemoveObjectFromTile(Arg.Any <ISimpleGameObject>(), Arg.Any <uint>(), Arg.Any <uint>());
        }
Exemplo n.º 19
0
        public bool Add(ISimpleGameObject obj)
        {
            if (!AddToPrimaryRegionAndTiles(obj))
            {
                return(false);
            }

            // Keeps track of objects that exist in the map
            obj.InWorld = true;

            RegisterObjectEventListeners(obj);

            // Add appropriate objects to the minimap
            IMiniMapRegionObject miniMapRegionObject = obj as IMiniMapRegionObject;

            if (miniMapRegionObject != null)
            {
                MiniMapRegions.Add(miniMapRegionObject);
            }

            // Post to channel
            ushort regionId = regionLocator.GetRegionIndex(obj);

            channel.Post("/WORLD/" + regionId, () =>
            {
                var packet = new Packet(Command.ObjectAdd);
                packet.AddUInt16(regionId);
                PacketHelper.AddToPacket(obj, packet);
                return(packet);
            });

            // Raise event
            ObjectAdded.Raise(this, new ObjectEvent(obj));

            return(true);
        }
Exemplo n.º 20
0
 public ObjectEvent(ISimpleGameObject gameObject)
 {
     this.GameObject = gameObject;
 }
Exemplo n.º 21
0
 public SimpleGameObjectArgs(ISimpleGameObject simpleGameObject)
 {
     SimpleGameObject = simpleGameObject;
 }
Exemplo n.º 22
0
 public ushort GetRegionIndex(ISimpleGameObject obj)
 {
     return(GetRegionIndex(obj.PrimaryPosition.X, obj.PrimaryPosition.Y));
 }
Exemplo n.º 23
0
 public void RemoveObjectFromTile(ISimpleGameObject obj, uint x, uint y)
 {
     tileLock.EnterWriteLock();
     tileObjects.Remove(obj, x, y);
     tileLock.ExitWriteLock();
 }
Exemplo n.º 24
0
 public void AddObjectToTile(ISimpleGameObject obj, uint x, uint y)
 {
     tileLock.EnterWriteLock();
     tileObjects.Add(obj, x, y);
     tileLock.ExitWriteLock();
 }
Exemplo n.º 25
0
 public IEnumerable <Position> ForeachMultitile(ISimpleGameObject obj)
 {
     return(ForeachMultitile(obj.PrimaryPosition.X, obj.PrimaryPosition.Y, obj.Size));
 }
Exemplo n.º 26
0
 private void DeregisterObjectEventListeners(ISimpleGameObject simpleGameObject)
 {
     simpleGameObject.ObjectUpdated -= SimpleGameObjectOnObjectUpdated;
 }
Exemplo n.º 27
0
        public static void AddToPacket(ISimpleGameObject obj, Packet packet, bool forRegion = false)
        {
            packet.AddUInt16(obj.Type);

            packet.AddUInt16((ushort)(obj.PrimaryPosition.X % Config.region_width));
            packet.AddUInt16((ushort)(obj.PrimaryPosition.Y % Config.region_height));
            packet.AddByte(obj.Size);

            packet.AddUInt32(obj.GroupId);
            packet.AddUInt32(obj.ObjectId);

            var gameObj = obj as IGameObject;

            if (gameObj != null)
            {
                packet.AddUInt32(gameObj.City.Owner.PlayerId);
            }

            var troopObj = obj as ITroopObject;

            if (troopObj != null)
            {
                packet.AddString(troopObj.Theme);
            }

            IHasLevel objHasLevel = obj as IHasLevel;

            if (objHasLevel != null)
            {
                packet.AddByte(objHasLevel.Lvl);
            }

            var stronghold = obj as IStronghold;

            if (stronghold != null)
            {
                packet.AddUInt32(stronghold.StrongholdState == StrongholdState.Occupied ? stronghold.Tribe.Id : 0);
                packet.AddInt32(stronghold.GateMax);
                packet.AddString(stronghold.Theme);
            }

            var structure = obj as IStructure;

            if (structure != null)
            {
                packet.AddString(structure.Theme);

                if (!forRegion)
                {
                    packet.AddUInt16(structure.Stats.Labor);
                }

                if (structure.IsMainBuilding)
                {
                    packet.AddByte(gameObj.City.Radius);
                    packet.AddString(gameObj.City.WallTheme);
                }
            }

            var barbarianTribe = obj as IBarbarianTribe;

            if (barbarianTribe != null)
            {
                packet.AddByte(barbarianTribe.CampRemains);
            }

            AddToPacket(obj.State, packet);
        }