예제 #1
0
        /// <summary>
        ///     Prepare to set up a new game in a specified channel.
        /// </summary>
        /// <param name="context">
        ///     Context of where this game is intended to be opened.
        /// </param>
        /// <returns>
        ///     <see langword="true"/> if the operation succeeded, otherwise <see langword="false"/>.
        /// </returns>
        public async Task <bool> OpenNewGameAsync(ICommandContext context)
        {
            if (GameTracker.Instance.TryAddGameString(context.Channel, GameName))
            {
                await Logger(new LogMessage(LogSeverity.Verbose, LogSource,
                                            _mpconfig.LogStrings.CreatingGame(context.Channel, _gameName))).ConfigureAwait(false);

                var data = new PersistentGameData(context.Channel, context.User, this);
                return(_dataList.TryAdd(context.Channel, data) &&
                       data.TryUpdateOpenToJoin(newValue: true, oldValue: false));
            }
            return(false);
        }
예제 #2
0
        /// <summary> Prepare to set up a new game in a specified channel. </summary>
        /// <param name="channel">Public facing channel of this game.</param>
        /// <returns><see langword="true"/> if the operation succeeded, otherwise <see langword="false"/>.</returns>
        public bool OpenNewGame(ICommandContext context)
        {
            lock (_lock)
            {
                if (GameTracker.Instance.TryGetGameString(context.Channel, out var _))
                {
                    return(false);
                }

                var data = new PersistentGameData(context.Channel, context.User);
                GameTracker.Instance.TryAddGameString(context.Channel, GameName);
                data.NewPlayerList();
                _dataList.AddOrUpdate(context.Channel, data, (k, v) => data);
                return(data.TryUpdateOpenToJoin(newValue: true, oldValue: false));
            }
        }
예제 #3
0
            internal MpGameData(PersistentGameData data, ICommandContext context)
            {
                OpenToJoin  = data.OpenToJoin;
                JoinedUsers = data.JoinedUsers;
                Game        = data.Game;
                Player      = Game?.Players.SingleOrDefault(p => p.User.Id == context.User.Id);

                GameInProgress = GameTracker.Instance.TryGetGameString(context.Channel, out var name)
                    ? (name == _gameFullName ? CurrentlyPlaying.ThisGame : CurrentlyPlaying.DifferentGame)
                    : CurrentlyPlaying.None;

                // Prep C# 8.0 pattern matching feature: switch expression
                // Sure, it'll compile into the exact code I already have,
                // BUT LOOKIT HOW CLEAN IT IS!
                //GameInProgress = GameTracker.Instance.TryGetGameString(Context.Channel, out var name) switch
                //{
                //    true when name == GameService.GameName => CurrentlyPlaying.ThisGame,
                //    true  => CurrentlyPlaying.DifferentGame,
                //    false => CurrentlyPlaying.None
                //};
            }
            internal MpGameData(PersistentGameData data, ICommandContext context)
            {
                OpenToJoin  = data.OpenToJoin;
                JoinedUsers = data.JoinedUsers;
                Game        = data.Game;
                Player      = Game?.Players.SingleOrDefault(p => p.User.Id == context.User.Id);

                GameInProgress = GameTracker.Instance.TryGetGameString(context.Channel, out var name) switch
                {
                    true when(name == _gameFullName) => CurrentlyPlaying.ThisGame,
                    true => CurrentlyPlaying.DifferentGame,
                    false => CurrentlyPlaying.None
                };
            }

            /// <inheritdoc/>
            ulong?IMpGameData.PlayerUserId => Player?.User.Id;
            /// <inheritdoc/>
            ulong?IMpGameData.GameChannelId => Game?.Channel.Id;
            /// <inheritdoc/>
            IReadOnlyCollection <ulong> IMpGameData.JoinedUsers => JoinedUsers.Select(u => u.Id).ToImmutableArray();
예제 #5
0
    public override void Initialize()
    {
        Instance = this;

        persistentGameData = PersistentGameData.Instance;
        achievementsData   = persistentGameData.gameData.achievementsData;

        if (achievementsData.Count <= 0)
        {
            achievementsData = new Dictionary <Achievements, bool>();
            achievementsData.Add(Achievements.EARN_MORE_THAN_100_COINS, false);
            achievementsData.Add(Achievements.EARN_MORE_THAN_500_COINS, false);
            achievementsData.Add(Achievements.EARN_MORE_THAN_1000_COINS, false);
            achievementsData.Add(Achievements.COLLECT_5_STARS, false);
            achievementsData.Add(Achievements.COLLECT_10_STARS, false);
            achievementsData.Add(Achievements.COLLECT_30_STARS, false);

            PersistentGameData.Instance.UpdateAchivements(achievementsData);
        }

        DontDestroyOnLoad(this.gameObject);
    }