diff --git a/myning/changelog.yaml b/myning/changelog.yaml index fbc86f7..9f1511f 100644 --- a/myning/changelog.yaml +++ b/myning/changelog.yaml @@ -1,3 +1,7 @@ +- name: Disable Purchase Confirmation + description: Add option to disable purchase confirmation screen. + date: 09-08-2023 + - name: Research Species Stats description: Ever wanted to know the EXACT stats of a species? It's possible now thanks to research! date: 08-30-23 diff --git a/myning/chapters/base_store.py b/myning/chapters/base_store.py index 5852884..85b9059 100644 --- a/myning/chapters/base_store.py +++ b/myning/chapters/base_store.py @@ -1,9 +1,10 @@ from abc import ABC, abstractmethod from functools import partial +from typing import TYPE_CHECKING from rich.text import Text -from myning.chapters import Option, PickArgs, main_menu +from myning.chapters import DynamicArgs, Option, PickArgs, main_menu from myning.config import UPGRADES from myning.objects.buying_option import BuyingOption from myning.objects.equipment import EQUIPMENT_TYPES @@ -15,6 +16,9 @@ from myning.utilities.file_manager import FileManager from myning.utilities.formatter import Formatter +if TYPE_CHECKING: + from myning.tui.chapter import ChapterWidget + player = Player() stats = Stats() settings = Settings() @@ -117,6 +121,9 @@ def confirm_buy(self, item: Item): message="Not enough gold!", options=[Option("Bummer!", self.pick_buy)], ) + if not settings.purchase_confirmation: + self.buy(item) + return self.pick_preserve_cursor(self.pick_buy()) return PickArgs( message=f"Are you sure you want to buy {item} for {Formatter.gold(item.value)}?", # pylint: disable=line-too-long options=[ @@ -134,7 +141,11 @@ def buy(self, item: Item): elif item.type in EQUIPMENT_TYPES: stats.increment_int_stat(IntegerStatKeys.ARMOR_PURCHASED) FileManager.multi_save(player, item, stats, inventory) - return self.enter() + + if settings.purchase_confirmation: + return self.enter() + + return self.pick_buy() def confirm_multi_buy(self, items: list[Item]): assert self.buying_option @@ -144,6 +155,9 @@ def confirm_multi_buy(self, items: list[Item]): message="Not enough gold!", options=[Option("Bummer!", self.pick_buy)], ) + if not settings.purchase_confirmation: + self.multi_buy(items) + return self.pick_preserve_cursor(self.pick_buy()) return PickArgs( message=f"Are you sure you want to buy {self.buying_option.name} for {Formatter.gold(cost)}?", # pylint: disable=line-too-long options=[ @@ -158,7 +172,9 @@ def multi_buy(self, items: list[Item]): inventory.add_items(items) self.remove_items(*items) FileManager.multi_save(player, *items, inventory) - return self.enter() + if settings.purchase_confirmation: + return self.enter() + return self.pick_buy() def hint_symbol(self, item: Item) -> str: if item.type not in EQUIPMENT_TYPES: @@ -185,3 +201,15 @@ def is_useful_item(self, item: Item): if equipped is None or item.main_affect > equipped.main_affect: return True return False + + def pick_preserve_cursor(self, args: PickArgs): + def callback(chapter: "ChapterWidget"): + highlighted_index = chapter.option_table.cursor_row + chapter.pick(args) + last_index = len(chapter.option_table.rows) - 1 + if highlighted_index >= last_index: + chapter.option_table.move_cursor(row=last_index - 1) + else: + chapter.option_table.move_cursor(row=highlighted_index) + + return DynamicArgs(callback) diff --git a/myning/chapters/settings.py b/myning/chapters/settings.py index a4ee29b..def0b72 100644 --- a/myning/chapters/settings.py +++ b/myning/chapters/settings.py @@ -13,6 +13,10 @@ def enter(): options = [ Option(["Minigames", f"({settings.mini_games_status})"], toggle_minigames), Option(["Compact Mode", f"({settings.compact_status})"], toggle_compact_mode), + Option( + ["Purchase Confirmation", f"({settings.purchase_confirmation_status})"], + toggle_purchase_confirmation, + ), ] if player.has_upgrade("sort_by_value"): @@ -63,3 +67,20 @@ def toggle_sort_order(): message=f"Sort Order is now {settings.sort_order}", options=[Option("Done", enter)], ) + + +@confirm( + lambda: f"Are you sure you want to {'disable' if settings.purchase_confirmation else 'enable'} " + "purchase confirmation?\n" + + Formatter.locked( + "If disabled, you will not be prompted to confirm before purchasing items from a store and will stay on the items screen." + ), + enter, +) +def toggle_purchase_confirmation(): + settings.toggle_purchase_confirmation() + FileManager.save(settings) + return PickArgs( + message=f"Purchase confirmation is now {settings.purchase_confirmation_status}", + options=[Option("Done", enter)], + ) diff --git a/myning/objects/settings.py b/myning/objects/settings.py index bdf0281..26e7558 100644 --- a/myning/objects/settings.py +++ b/myning/objects/settings.py @@ -25,12 +25,14 @@ def __init__( hard_combat_disabled=True, compact_mode=False, sort_order=SortOrder.TYPE, + purchase_confirmation=True, ) -> None: self.army_columns = army_columns self.mini_games_disabled = mini_games_disabled self.hard_combat_disabled = hard_combat_disabled self.compact_mode = compact_mode self.sort_order: SortOrder = sort_order + self.purchase_confirmation = purchase_confirmation @classmethod def from_dict(cls, attrs: dict): @@ -43,6 +45,7 @@ def to_dict(self) -> dict: "hard_combat_disabled": self.hard_combat_disabled, "compact_mode": self.compact_mode, "sort_order": self.sort_order, + "purchase_confirmation": self.purchase_confirmation, } @classmethod @@ -66,6 +69,9 @@ def toggle_compact_mode(self): def toggle_sort_order(self): self.sort_order = SortOrder.TYPE if self.sort_order == SortOrder.VALUE else SortOrder.VALUE + def toggle_purchase_confirmation(self): + self.purchase_confirmation = not self.purchase_confirmation + @property def mini_games_status(self) -> str: return "disabled" if self.mini_games_disabled else "enabled" @@ -77,3 +83,7 @@ def hard_combat_status(self) -> str: @property def compact_status(self) -> str: return "enabled" if self.compact_mode else "disabled" + + @property + def purchase_confirmation_status(self) -> str: + return "enabled" if self.purchase_confirmation else "disabled" diff --git a/myning/research.yaml b/myning/research.yaml index 269097a..1d27f27 100644 --- a/myning/research.yaml +++ b/myning/research.yaml @@ -156,3 +156,39 @@ time_travel_species: - 4500 - 7500 - 12500 + +seed_quality: + name: Seed Quality + descriptions: + - Increase base seed level (10% of garden level) + - Increase base seed level (20% of garden level) + - Increase base seed level (30% of garden level) + - Increase base seed level (40% of garden level) + - Increase base seed level (50% of garden level) + - Increase base seed level (60% of garden level) + - Increase base seed level (70% of garden level) + - Increase base seed level (80% of garden level) + - Increase base seed level (90% of garden level) + - Increase base seed level (100% of garden level) + values: + - .1 + - .2 + - .3 + - .4 + - .5 + - .6 + - .7 + - .8 + - .9 + - 1 + costs: + - 10 + - 25 + - 50 + - 80 + - 150 + - 200 + - 325 + - 500 + - 850 + - 1200 \ No newline at end of file diff --git a/myning/strings.yaml b/myning/strings.yaml index 1c5ea8f..d48162f 100644 --- a/myning/strings.yaml +++ b/myning/strings.yaml @@ -81,6 +81,66 @@ sizes: - Vast - Behemoth - Big Boi + - Enormous + - Huge + - Immense + - Tremendous + - Goliath + - Humongous + - Giant + - Grand + - Mighty + - Herculean + - Stupendous + - Astronomical + - Prodigious + - Monumental + - Towering + - Majestic + - King-sized + - Oversized + - Bulky + - Hulking + - Brobdingnagian + - Whopping + - Whalesize + - Elephantine + - Mountainous + - Cyclopean + - Godzilla-sized + - Colossus + - Leviathan + - Jupiter-sized + - Saturn-sized + - Cosmic + - Galactic + - Universal + - Infinite + - Boundless + - Endless + - Limitless + - Immortal + - Unfathomable + - Incomprehensible + - Unimaginable + - Unthinkable + - Unprecedented + - Inconceivable + - Mind-boggling + - Jaw-dropping + - Astounding + - Staggering + - Mind-blowing + - Breathtaking + - Overwhelming + - Phenomenal + - Miraculous + - Supernatural + - Divine + - God-like + - Giga-berlin + + minerals: - Copper Nugget diff --git a/myning/utilities/generators.py b/myning/utilities/generators.py index 029fa4b..9456611 100644 --- a/myning/utilities/generators.py +++ b/myning/utilities/generators.py @@ -1,12 +1,13 @@ import math import random -from myning.config import SPECIES, STRINGS +from myning.config import RESEARCH, SPECIES, STRINGS from myning.objects.army import Army from myning.objects.character import Character, CharacterSpecies from myning.objects.equipment import EQUIPMENT_TYPES from myning.objects.item import Item, ItemType from myning.objects.plant import PLANT_TYPES, Plant +from myning.objects.research_facility import ResearchFacility from myning.utilities import string_generation from myning.utilities.rand import ( get_random_array_item, @@ -14,6 +15,8 @@ get_random_int, ) +facility = ResearchFacility() + def generate_character( level_range, species=None, is_enemy=False, max_items=0, max_item_level=0, item_scale=1 @@ -122,7 +125,10 @@ def generate_reward(max_item_level, entities_killed): def generate_plant(garden_level: int): type = get_random_array_item(PLANT_TYPES) - level = get_random_int(1, garden_level + 1) + base_level = 1 + if facility.has_research("seed_quality"): + base_level = base_level + math.floor(garden_level * RESEARCH["seed_quality"].player_value) + level = get_random_int(base_level, garden_level + 1) value = 10 * level adjective = STRINGS["sizes"][level] name = f"{adjective} {type.value} seed"