diff options
| author | davidovski <david@davidovski.xyz> | 2025-10-31 17:49:48 +0000 |
|---|---|---|
| committer | davidovski <david@davidovski.xyz> | 2025-10-31 17:49:48 +0000 |
| commit | 5a008748459e230de0e875afff59e3b92c7aca0c (patch) | |
| tree | 0d09aebd1bb5628237959a6d1b49d1a7772d86a6 /src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java | |
| parent | fff63aaea786a5f1c59bbf99c999a2aa7bb810e5 (diff) | |
Work on v0.6
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java')
| -rw-r--r-- | src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java b/src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java new file mode 100644 index 0000000..be3ad3c --- /dev/null +++ b/src/main/java/net/uomc/mineshaft/blacksmith/Blacksmith.java @@ -0,0 +1,320 @@ +package net.uomc.mineshaft.blacksmith; + +import java.util.Map; + +import org.apache.commons.math3.distribution.BinomialDistribution; + +import com.mouldycheerio.dbot.util.PeelingUtils; + +import java.util.Collections; + +import net.dv8tion.jda.api.entities.Member; +import net.uomc.mineshaft.Mineshaft; +import net.uomc.mineshaft.MineshaftItem; +import net.uomc.mineshaft.SavedStat; +import net.uomc.mineshaft.farm.Farm; + +class Blacksmith extends Farm { + + public static long UPDATES_PER_LEVEL = 10; + public static long MS_PER_UPDATE = 1000l * 60l * 10l; + private SavedStat questionsStat; + + public Blacksmith(Mineshaft bot) { + super(bot, MineshaftItem.BLACKSMITH); + questionsStat = getBot().getPlayerStats().getStat("blacksmith_questions"); + } + + public boolean upgradeArmour(Member member) { + int armourLevel = getBot().getArmour(member).getLevel(); + if (armourLevel >= Armour.MAX_ARMOUR_LEVEL) { + return false; + } + armourLevel += 1; + + setPlanted(member, -armourLevel); + + getBot().getArmour(member).setLevel(0); + + setQuantity(member, armourLevel * UPDATES_PER_LEVEL); + return true; + } + + public boolean upgradeSword(Member member) { + int swordLevel = getBot().getSword(member).getLevel(); + if (swordLevel >= Sword.MAX_SWORD_LEVEL) { + return false; + } + swordLevel += 1; + + setPlanted(member, -swordLevel); + + getBot().getSword(member).setLevel(0); + + setQuantity(member, swordLevel * UPDATES_PER_LEVEL); + return true; + } + + + public boolean isWorking(Member member) { + return getPlanted(member) != 0; + } + + public boolean isSword(Member member) { + return getPlanted(member) > 0; + } + + public int getWorkingLevel(Member member) { + return (int) Math.abs(getPlanted(member)); + } + + public boolean canUpgradeSword(Member member) { + return getBot().getSword(member).getLevel() < Sword.MAX_SWORD_LEVEL; + } + + public boolean canUpgradeArmour(Member member) { + return getBot().getArmour(member).getLevel() < Armour.MAX_ARMOUR_LEVEL; + } + + public String getNextSwordName(Member member) { + return Sword.swordLevelToName(getBot().getSword(member).getLevel() + 1) + " Sword"; + } + + public String getNextArmourName(Member member) { + return Armour.armourLevelToName(getBot().getArmour(member).getLevel() + 1) + " Armour"; + } + + public String getWorkingName(Member member) { + if (!isWorking(member)) { + return ""; + } + + if (isSword(member)) { + return Sword.swordLevelToName(getWorkingLevel(member)) + " Sword"; + } + + return Armour.armourLevelToName(getWorkingLevel(member)) + " Armour"; + } + + public void update(Member member) { + if (!isWorking(member)) + return; + + long next = getNextUpdate(member); + long now = System.currentTimeMillis(); + if (next == 0) { + next = now; + } + + if (next > now) + return; + + long since = now - next; + long updates = since / MS_PER_UPDATE; + + if (updates < 1) { + return; + } + + BinomialDistribution bd = new BinomialDistribution((int) updates, getProgressChance(member)); + setQuantity(member, getQuantity(member) - bd.sample()); + + setNextUpdate(member, getNextUpdate(member) + MS_PER_UPDATE*updates); + } + + public double getProgressChance(Member member) { + long forges = getValidForgeCount(member); + + if (forges < 1) { + return 0.0; + } + + return 1 - (0.5 * Math.pow(forges, -0.5)); + } + + public long getValidForgeCount(Member member) { + long forges = getBot().getItem(member, MineshaftItem.FORGE); + long blacksmiths = getBot().getItem(member, MineshaftItem.BLACKSMITH); + return Math.min(forges, blacksmiths); + } + + public double getProgress(Member member) { + if (!isWorking(member)) + return 0.0; + + long max = getWorkingLevel(member) * UPDATES_PER_LEVEL; + long current = getQuantity(member); + return (max - Math.min(current, 0)) / max; + } + + public long getTimeEstimate(Member member, long updates) { + return (long) (MS_PER_UPDATE * (1 - getProgressChance(member)) * updates); + } + + public long getTimeEstimateRemaining(Member member) { + return getTimeEstimate(member, getQuantity(member)); + } + + public long getTimeEstimateForNextArmour(Member member) { + int armourLevel = getBot().getArmour(member).getLevel(); + return getTimeEstimate(member, armourLevel + 1); + } + + public long getTimeEstimateForNextSword(Member member) { + int swordLevel = getBot().getSword(member).getLevel(); + return getTimeEstimate(member, swordLevel + 1); + } + + public Map<MineshaftItem, Long> getSwordUpgradeCost(Member member) { + int level = getBot().getSword(member).getLevel(); + + switch ((int) level) { + case 0: + return Collections.singletonMap(MineshaftItem.COPPER, 800l); + case 1: + return Collections.singletonMap(MineshaftItem.IRON, 1600l); + case 2: + return Collections.singletonMap(MineshaftItem.GOLD, 1600l); + case 3: + return Collections.singletonMap(MineshaftItem.DIAMOND, 1600l); + case 4: + return Collections.singletonMap(MineshaftItem.NETHERITE, 1600l); + } + + return Collections.emptyMap(); + } + + public Map<MineshaftItem, Long> getArmourUpgradeCost(Member member) { + int level = getBot().getArmour(member).getLevel(); + + switch ((int) level) { + case 0: + return Collections.singletonMap(MineshaftItem.COPPER, 600l); + case 1: + return Collections.singletonMap(MineshaftItem.IRON, 1200l); + case 2: + return Collections.singletonMap(MineshaftItem.GOLD, 1200l); + case 3: + return Collections.singletonMap(MineshaftItem.DIAMOND, 1200l); + case 4: + return Collections.singletonMap(MineshaftItem.NETHERITE, 1200l); + } + + return Collections.emptyMap(); + } + + public boolean isReady(Member member) { + if (!isWorking(member)) + return false; + + return getQuantity(member) < 0; + } + + public void incrementQuestions(Member member) { + questionsStat.increment(member, 1); + } + + public void resetQuestions(Member member) { + questionsStat.set(member, 0); + } + + public long getQuestions(Member member) { + return questionsStat.get(member); + } + + public String getWorkingString(Member member) { + long questions = getQuestions(member); + StringBuilder b = new StringBuilder(); + + long forges = getValidForgeCount(member); + if (forges > 1) + b.append("We are busy working on your "); + else + b.append("I am busy working on your "); + + b.append(getWorkingName(member)); + b.append(".\n"); + + if (questions < 1) + return b.toString(); + + if (questions == 1) + b.append("Please do not disturb me. "); + + if (questions == 2) + b.append("Go away I'm busy. "); + + if (questions == 3) + b.append("Leave me alone, let me work in peace... "); + + if (questions == 4) + b.append("Stop bugging me. "); + + if (questions == 5) + b.append("Fine, "); + + if (questions >= 5) { + double progress = getProgress(member); + b.append("I am about " + + Math.round(100*progress) + "** of the way to finishing.\n"); + } + + if (questions == 6) + b.append("Happy? Now leave me alone. "); + + if (questions == 7) + b.append("Is there anything more you want?"); + + if (questions == 8) + b.append("Thats the best I can give you "); + + if (questions == 9) + b.append("You want a time estimate? If you keep bugging me I will never finish"); + + if (questions == 10) + b.append("Seriously, leave me alone! "); + + if (questions == 11) + b.append("I have had it with you..."); + + if (questions >= 12) + b.append("It will be finished in *about* `" + PeelingUtils.formatTime(getTimeEstimateRemaining(member)) + "`\n"); + + if (questions == 12) + b.append("Happy now?"); + + if (questions == 13) + b.append("Is there anything else you want?"); + + if (questions == 14) + b.append("I can't give you any more info than that sorry..."); + + if (questions == 15) + b.append("Seriously that is all I know"); + + if (questions == 16) + b.append("If you keep asking then I won't ever finish"); + + if (questions == 17) + b.append("That is the best I have, sorry"); + + if (questions == 18) + b.append("Please be patient! "); + + if (questions >= 19) + b.append("Please come back later! "); + + if (questions == 50) + b.append("You sure are impatient aren't you?"); + + if (questions == 100) + b.append("This is the 100th time you've asked... I'm sure you are proud of yourself"); + + if (questions >= 500) + return "You have asked me too many times. No more updates sorry."; + + return b.toString(); + + } + + +} |
