/// <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); }
/// <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)); } }
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();
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); }