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>()); }
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); }
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(); }
public int RadiusDistance(ISimpleGameObject obj1, ISimpleGameObject obj2) { return(RadiusDistance(obj1.PrimaryPosition, obj1.Size, obj2.PrimaryPosition, obj2.Size)); }
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(); }
public void Remove(ISimpleGameObject obj, uint origX, uint origY) { primaryLock.EnterWriteLock(); primaryObjects.Remove(obj, origX, origY); MarkAsDirty(); primaryLock.ExitWriteLock(); }
public void Add(ISimpleGameObject obj) { primaryLock.EnterWriteLock(); primaryObjects.Add(obj, obj.PrimaryPosition.X, obj.PrimaryPosition.Y); MarkAsDirty(); primaryLock.ExitWriteLock(); }
public void DbLoaderAdd(ISimpleGameObject obj) { if (obj.InWorld) { Add(obj); } }
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); }
public void Add_WhenObjectDoesNotYetExist_AddsObject( ISimpleGameObject simpleGameObject, RegionObjectList objectList) { objectList.Add(simpleGameObject, 10, 13); objectList.Get(10, 13).Should().Equal(simpleGameObject); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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>()); }
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); }
public ObjectEvent(ISimpleGameObject gameObject) { this.GameObject = gameObject; }
public SimpleGameObjectArgs(ISimpleGameObject simpleGameObject) { SimpleGameObject = simpleGameObject; }
public ushort GetRegionIndex(ISimpleGameObject obj) { return(GetRegionIndex(obj.PrimaryPosition.X, obj.PrimaryPosition.Y)); }
public void RemoveObjectFromTile(ISimpleGameObject obj, uint x, uint y) { tileLock.EnterWriteLock(); tileObjects.Remove(obj, x, y); tileLock.ExitWriteLock(); }
public void AddObjectToTile(ISimpleGameObject obj, uint x, uint y) { tileLock.EnterWriteLock(); tileObjects.Add(obj, x, y); tileLock.ExitWriteLock(); }
public IEnumerable <Position> ForeachMultitile(ISimpleGameObject obj) { return(ForeachMultitile(obj.PrimaryPosition.X, obj.PrimaryPosition.Y, obj.Size)); }
private void DeregisterObjectEventListeners(ISimpleGameObject simpleGameObject) { simpleGameObject.ObjectUpdated -= SimpleGameObjectOnObjectUpdated; }
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); }