Exemple #1
0
        // 35 / 25 => 1.23

        public static string GetRandomStat(ArcadeUser user, IEnumerable <string> chosen)
        => Randomizer.ChooseOrDefault(user.Stats.Keys.Where(x =>
                                                            user.GetVar(x) != 0 &&
                                                            !x.EqualsAny(Vars.Balance, Vars.Debt, Vars.Chips, Vars.Tokens) &&
                                                            Var.TypeOf(x) == VarType.Stat &&
                                                            !ItemHelper.Exists(Var.GetGroup(x)) &&
                                                            !ShopHelper.Exists(Var.GetGroup(x)) &&
                                                            (Check.NotNullOrEmpty(chosen) ? !chosen.Contains(x) : true)));
Exemple #2
0
        public static string TossSlot(ArcadeUser user, int index)
        {
            QuestData slot = GetSlot(user, index);

            if (slot == null)
            {
                return($"> {Icons.Warning} There isn't an assigned objective in this slot.");
            }

            if (user.GetVar(Stats.LastSkippedQuest) > 0)
            {
                if (StatHelper.SinceLast(user, Stats.LastSkippedQuest) >= SkipCooldown)
                {
                    return($"> {Icons.Warning} You have skipped an objective too recently. Try again in {Format.Countdown(SkipCooldown - StatHelper.SinceLast(user, Stats.LastSkippedQuest))}.");
                }
            }

            Quest quest = GetQuest(slot.Id);

            if (quest == null)
            {
                throw new Exception("Expected to find a parent quest but returned null");
            }

            user.Quests.RemoveAt(index);
            user.SetVar(Stats.LastSkippedQuest, DateTime.UtcNow.Ticks);

            TimeSpan since = StatHelper.SinceLast(user, Stats.LastAssignedQuest);

            bool canAssign = since >= AssignCooldown;

            if (!canAssign)
            {
                TimeSpan toSkip = (AssignCooldown - since) / 2; // skip 50% of the remaining time
                user.SetVar(Stats.LastAssignedQuest, new DateTime(user.GetVar(Stats.LastAssignedQuest)).Add(toSkip).Ticks);
            }

            return($"> 🗑️ You have declined the **{quest.Name}** objective.");
        }
        private static bool TryWriteCooldown(ArcadeUser user, string name, string id, TimeSpan duration, out string row)
        {
            row = null;
            if (user.GetVar(id) > 0)
            {
                TimeSpan since = StatHelper.SinceLast(user, id);

                if (since < duration)
                {
                    row = $"> • **{name}:** **{Format.Countdown(duration - since)}** until reset";
                    return(true);
                }
            }

            return(false);
        }
Exemple #4
0
        // This just reads the boost multiplier
        public static DateTime?GetLastUsed(ArcadeUser user, string itemId, string uniqueId = null)
        {
            Item item = GetItem(itemId);

            if (item == null)
            {
                throw new ArgumentException("Could not find an item with the specified ID.");
            }

            if (item.Usage == null)
            {
                throw new Exception("Expected item usage to be specified but returned null");
            }

            string statGroup = item.Usage?.CooldownMode switch
            {
                CooldownMode.Instance => uniqueId ?? throw new Exception("Expected a unique item reference but was unspecified"),
                      CooldownMode.Item => itemId,
                      CooldownMode.Group => item.GroupId ?? throw new Exception("Expected an item group but was empty"),
                            CooldownMode.Global => "global",
                            _ => null
            };

            if (statGroup == null)
            {
                return(null);
            }

            if (statGroup == uniqueId)
            {
                ItemData data = GetFromInventory(user, itemId, uniqueId);
                return(data.Data.LastUsed);
            }

            var ticks = user.GetVar(GetCooldownId(statGroup));

            if (ticks == 0)
            {
                return(null);
            }

            return(new DateTime(ticks));
        }
Exemple #5
0
        public static Message AssignAndDisplay(ArcadeUser user)
        {
            Var.SetIfEmpty(user, Stats.QuestCapacity, DefaultQuestCapacity);

            if (!CanAssign(user))
            {
                return(new Message($"> 🚫 You have already been assigned your daily objectives.\n> Check back in **{Format.Countdown(StatHelper.GetRemainder(user, Stats.LastAssignedQuest, AssignCooldown))}**."));
            }

            if (!HasAnyAssignable(user))
            {
                return(new Message($"> 🚫 You do not meet the criteria to be assigned an objective."));
            }

            IEnumerable <Quest> assignable = GetAssignable(user);

            long available = GetCurrentCapacity(user);

            if (available == 0)
            {
                return(new Message($"> 🚫 You don't currently have any room to be assigned any new objectives."));
            }

            var info = new StringBuilder();

            info.AppendLine($"> {Icons.Assign} You have been assigned new objectives!");

            // If you want to allow for preservation of existing quests, ignore ones already specified
            for (int i = 0; i < available; i++)
            {
                Quest toAssign = Randomizer.Choose(assignable);
                user.Quests.Add(new QuestData(toAssign));
                info.AppendLine($"**Slot {i + 1}: {toAssign.Name}** ({toAssign.Difficulty.ToString()})");
            }

            TimeSpan amountToSkip = AssignCooldown - ((AssignCooldown / user.GetVar(Stats.QuestCapacity)) * available);

            user.SetVar(Stats.LastAssignedQuest, DateTime.UtcNow.Add(amountToSkip).Ticks);
            user.AddToVar(Stats.TotalAssignedQuests, available);

            return(new Message(info.ToString()));
        }
Exemple #6
0
        public static bool CanAssign(ArcadeUser user)
        {
            TimeSpan since = StatHelper.SinceLast(user, Stats.LastAssignedQuest);

            return(since >= AssignCooldown && user.Quests.Count <= user.GetVar(Stats.QuestCapacity));
        }
Exemple #7
0
 public static RecipeStatus GetRecipeStatus(ArcadeUser user, Recipe recipe)
 {
     return((RecipeStatus)user.GetVar(GetRecipeId(recipe)));
 }
Exemple #8
0
 public static bool KnowsRecipe(ArcadeUser user, Recipe recipe)
 {
     return(user.GetVar(GetRecipeId(recipe)) == (long)RecipeStatus.Known);
 }
Exemple #9
0
 public static TimeSpan SinceTime(ArcadeUser user, string statId, DateTime time)
 => TimeSpan.FromTicks(time.Ticks - user.GetVar(statId));
Exemple #10
0
 public static TimeSpan SinceLast(ArcadeUser user, string statId)
 => TimeSpan.FromTicks(DateTime.UtcNow.Ticks - user.GetVar(statId));
Exemple #11
0
 public static DateTime AsTime(ArcadeUser user, string statId)
 => new DateTime(user.GetVar(statId));