// 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)));
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); }
// 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)); }
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())); }
public static bool CanAssign(ArcadeUser user) { TimeSpan since = StatHelper.SinceLast(user, Stats.LastAssignedQuest); return(since >= AssignCooldown && user.Quests.Count <= user.GetVar(Stats.QuestCapacity)); }
public static RecipeStatus GetRecipeStatus(ArcadeUser user, Recipe recipe) { return((RecipeStatus)user.GetVar(GetRecipeId(recipe))); }
public static bool KnowsRecipe(ArcadeUser user, Recipe recipe) { return(user.GetVar(GetRecipeId(recipe)) == (long)RecipeStatus.Known); }
public static TimeSpan SinceTime(ArcadeUser user, string statId, DateTime time) => TimeSpan.FromTicks(time.Ticks - user.GetVar(statId));
public static TimeSpan SinceLast(ArcadeUser user, string statId) => TimeSpan.FromTicks(DateTime.UtcNow.Ticks - user.GetVar(statId));
public static DateTime AsTime(ArcadeUser user, string statId) => new DateTime(user.GetVar(statId));