Пример #1
0
        public void RemoveTribesman_ShouldRecordPlayerLeftInLeavingTribesmates(ITribesman tribesman, Tribe tribe)
        {
            SystemClock.SetClock(new DateTime(2000, 1, 1, 1, 1, 1));

            tribesman.Player.PlayerId.Returns <uint>(1234);

            tribe.AddTribesman(tribesman);
            tribe.RemoveTribesman(1234, false, false);

            tribe.LeavingTribesmates.Should().OnlyContain(p => p.PlayerId == 1234 && p.TimeLeft == SystemClock.Now);
        }
Пример #2
0
        public void AddTribesman_ShouldAllowTribesmanWhoLeftToRejoinAfterXHours(ITribesman tribesman, Tribe tribe)
        {
            SystemClock.SetClock(new DateTime(2000, 1, 1, 1, 1, 1));

            tribesman.Player.PlayerId.Returns((uint)1234);

            tribe.AddTribesman(tribesman);
            tribe.RemoveTribesman(1234, false, false);

            SystemClock.SetClock(SystemClock.Now.AddDays(Tribe.DAYS_BEFORE_REJOIN_ALLOWED));
            tribe.AddTribesman(tribesman).Should().Be(Error.Ok);
        }
Пример #3
0
        public void AddTribesman_ShouldNotAllowTribesmanWhoLeftToRejoinWithinXDays(ITribesman tribesman, Tribe tribe)
        {
            SystemClock.SetClock(new DateTime(2000, 1, 1, 1, 1, 1));

            tribesman.Player.PlayerId.Returns((uint)1234);

            tribe.AddTribesman(tribesman);
            tribe.RemoveTribesman(1234, false, false);

            SystemClock.SetClock(SystemClock.Now.AddDays(Tribe.DAYS_BEFORE_REJOIN_ALLOWED).AddMinutes(-1));
            tribe.AddTribesman(tribesman).Should().Be(Error.TribeCannotRejoinYet);
        }
Пример #4
0
        public void RemoveTribesman_ShouldSupportMultipleRemoves(ITribesman tribesman1, ITribesman tribesman2, Tribe tribe)
        {
            tribesman1.Player.PlayerId.Returns <uint>(1234);
            tribesman2.Player.PlayerId.Returns <uint>(1235);

            SystemClock.SetClock(new DateTime(2000, 1, 1, 1, 1, 1));
            tribe.AddTribesman(tribesman1);
            tribe.AddTribesman(tribesman2);
            tribe.RemoveTribesman(1234, false, false);
            tribe.RemoveTribesman(1235, false, false);
            tribe.LeavingTribesmates.Should().HaveCount(2)
            .And.Contain(p => p.PlayerId == 1234)
            .And.Contain(p => p.PlayerId == 1235);
        }
Пример #5
0
        public void RemoveTribesman_ShouldRemoveOlderRecords(ITribesman tribesman1, ITribesman tribesman2, Tribe tribe)
        {
            tribesman1.Player.PlayerId.Returns <uint>(1234);
            tribesman2.Player.PlayerId.Returns <uint>(1235);

            SystemClock.SetClock(new DateTime(2000, 1, 1, 1, 1, 1));
            tribe.AddTribesman(tribesman1);
            tribe.AddTribesman(tribesman2);
            tribe.RemoveTribesman(1234, false, false);
            tribe.LeavingTribesmates.Should().OnlyContain(p => p.PlayerId == 1234);

            SystemClock.SetClock(SystemClock.Now.AddDays(Tribe.DAYS_BEFORE_REJOIN_ALLOWED).AddSeconds(1));
            tribe.RemoveTribesman(1235, false, false);

            tribe.LeavingTribesmates.Should().OnlyContain(p => p.PlayerId == 1235);
        }
Пример #6
0
        public Error AddTribesman(ITribesman tribesman, bool ignoreRequirements = false)
        {
            if (tribesmen.ContainsKey(tribesman.Player.PlayerId))
            {
                return(Error.TribesmanAlreadyInTribe);
            }

            if (!ignoreRequirements)
            {
                if (LeavingTribesmates.Any(p =>
                                           p.PlayerId == tribesman.Player.PlayerId &&
                                           SystemClock.Now.Subtract(p.TimeLeft).TotalDays < DAYS_BEFORE_REJOIN_ALLOWED))
                {
                    return(Error.TribeCannotRejoinYet);
                }

                var totalSlots = Level * MEMBERS_PER_LEVEL -
                                 LeavingTribesmates.Count(p => SystemClock.Now.Subtract(p.TimeLeft).TotalHours < HOURS_BEFORE_SLOT_REOPENS);

                if (tribesmen.Count >= totalSlots)
                {
                    return(Error.TribeFull);
                }
            }

            DbLoaderAdd(tribesman);

            DefaultMultiObjectLock.ThrowExceptionIfNotLocked(tribesman);
            dbManager.Save(tribesman);

            if (tribesman.Player.Session != null)
            {
                channel.Subscribe(tribesman.Player.Session, "/TRIBE/" + Id);
            }

            TribesmanJoined.Raise(this, new TribesmanEventArgs {
                Tribe = this, Player = tribesman.Player
            });
            return(Error.Ok);
        }
Пример #7
0
 public void AddTribesman_ShouldReturnErrorIfTribesmanAlreadyExists(ITribesman tribesman, Tribe tribe)
 {
     tribe.AddTribesman(tribesman).Should().Be(Error.Ok);
     tribe.AddTribesman(tribesman).Should().Be(Error.TribesmanAlreadyInTribe);
 }
Пример #8
0
        public void RemoveTribesman_ShouldDeleteTribesman([Frozen] IDbManager dbManager, IPlayer player, ITribesman tribesman, Tribe tribe)
        {
            player.PlayerId.Returns <uint>(1234);
            tribesman.Player.Returns(player);

            tribe.AddTribesman(tribesman);
            tribe.RemoveTribesman(1234, false, false);

            player.Tribesman.Should().BeNull();
            dbManager.Received(1).Delete(tribesman);
            tribe.Tribesmen.Should().BeEmpty();
        }
Пример #9
0
        public void AddTribesman_ShouldAddPlayerToTribe([Frozen] IDbManager dbManager, IPlayer player, ITribesman tribesman, Tribe tribe)
        {
            tribesman.Player.Returns(player);

            tribe.AddTribesman(tribesman).Should().Be(Error.Ok);
            tribe.Tribesmen.Should().Equal(tribesman);
            player.Tribesman.Should().Be(tribesman);
            dbManager.Received(1).Save(tribesman);
        }
Пример #10
0
 public bool TryGetTribesman(uint playerId, out ITribesman tribesman)
 {
     return(tribesmen.TryGetValue(playerId, out tribesman));
 }
Пример #11
0
 public void DbLoaderAdd(ITribesman tribesman)
 {
     tribesman.Player.Tribesman = tribesman;
     tribesmen.Add(tribesman.Player.PlayerId, tribesman);
 }