Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1b035ea
add `--force-item-reward-checks` wip
kielbasiago Apr 24, 2022
9b284c6
fix menu from botched merge
kielbasiago Apr 24, 2022
5553837
add esper as reward for lone wolf, fanatics, weapon shop secondary ob…
kielbasiago Apr 24, 2022
7d8dd61
IDK WHAT IM DOING
kielbasiago Apr 28, 2022
69385d7
doing more
kielbasiago Apr 30, 2022
fc5aff9
wip narshe wor, cleanup
kielbasiago May 2, 2022
292aed3
fix narshe wor
kielbasiago May 4, 2022
334764d
const add_reward, add reward types to the check definition
kielbasiago May 5, 2022
1c6b150
fix format check list item
kielbasiago May 6, 2022
307d639
begin adding force-esper-reward-checks, general cleanup
kielbasiago May 19, 2022
8eb5d58
implement forced esper rewards
kielbasiago May 21, 2022
8c3d9ef
Merge asilverthorn/no_top_magic into force-item-reward-checks
kielbasiago May 22, 2022
ce0bd2b
chore: light cleanup
kielbasiago May 22, 2022
b8fd269
cleanup random comments(not sure why they're there)
kielbasiago Oct 20, 2022
6dc6fa4
fix checks/floating continent
kielbasiago Oct 22, 2022
c44b780
fix: veld char/esper only again
kielbasiago Oct 29, 2022
7f7b11d
Feature: Lone wolf can now be a character
kielbasiago Oct 29, 2022
f74d331
Chore: Cleanup code for PR
kielbasiago Oct 30, 2022
b5cca93
Chore: Cleanup character code in lone_wolf
kielbasiago Oct 30, 2022
a6d1cdd
Feature: Refactor lone wolf to handle music everywhere
kielbasiago Oct 30, 2022
6adba58
play character theme when recruiting in baren falls
kielbasiago Oct 31, 2022
48e2425
Fix: Undo dialog changes to lone wolf
kielbasiago Oct 31, 2022
9add265
dragons as character
kielbasiago Nov 2, 2022
9d57b93
take range to assign dragon characters
kielbasiago Nov 4, 2022
2ab7b11
Feature: add check presets, cleanup code
kielbasiago Nov 4, 2022
195c4e6
Feature: Doom Gaze can now reward a character
kielbasiago Nov 7, 2022
f3b7283
fix character gating - thanks Franklin!
kielbasiago Nov 11, 2022
917b841
Remove dragons character exclusivity, add event pathing
kielbasiago Nov 11, 2022
aea877f
Feature: add no-free-characters
kielbasiago Nov 17, 2022
6c0c9ab
remove unwanted presets
kielbasiago Dec 2, 2022
31ce33d
fix lone wolf rewards to be mutually exclusive
kielbasiago Dec 5, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 174 additions & 0 deletions args/advanced_checks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@

from event.event_reward import RewardType


def name():
return "Check Rewards"

def parse(parser):
from constants.check_presets import preset_keys
advanced_checks = parser.add_argument_group("Check Rewards")

presets = advanced_checks.add_mutually_exclusive_group()
presets.name = "Check Presets"

presets.add_argument('-checks', "--check-preset", type = str,
choices = preset_keys, help = "A preset used to modify certain checks to rewards characters, espers, or items.")

presets.add_argument("-nfce", "--no-free-characters-espers", action = "store_true",
help = "Remove character/esper rewards from: Auction House, Collapsing House, Figaro Castle Throne, Gau's Father's House, Kohlingen Inn, Mt. Zozo, Narshe Weapon Shop, Sealed Gate, South Figaro Basement, Tzen Thief, Zone Eater")

advanced_checks.add_argument("-firr", "--force-item-rewards", type = str,
help = "Forces list of checks to give an ITEM reward")

advanced_checks.add_argument("-ferr", "--force-esper-rewards", type = str,
help = "Forces list of checks to give an ESPER reward")

advanced_checks.add_argument("-feirr", "--force-esper-item-rewards", type = str,
help = "Forces list of checks to give an (ESPER | ITEM) reward")

advanced_checks.add_argument("-fcrr", "--force-character-rewards", type = str,
help = "Forces list of checks to give an CHARACTER reward")

advanced_checks.add_argument("-dchar", "--dragons-as-characters", default = [0, 0], type = int,
nargs = 2, metavar = ("MIN", "MAX"), choices = range(6),
help = "Up to 5 dragons are guranteed to reward characters. The dragon will have the recruited character's sprite. Kefka's Tower and Phoenix Cave dragons cannot be characters.")

character_title = "Character Checks"
esper_item_title = "Esper+Item Checks"
esper_title = "Esper Checks"
item_title = "Item Checks"

def process(args):
from constants.check_presets import key_preset, NO_FREE_CHARACTERS_ESPERS
args.character_rewards = []
args.esper_item_rewards = []
args.esper_rewards = []
args.item_rewards = []
args._process_min_max("dragons_as_characters")

if args.no_free_characters_espers:
args.check_preset = NO_FREE_CHARACTERS_ESPERS.key

if args.check_preset:
check_preset = key_preset[args.check_preset]
bits = [int(check.bit) for check in check_preset.locations]
if check_preset.reward == RewardType.CHARACTER:
args.character_rewards = bits
if check_preset.reward == (RewardType.ESPER | RewardType.ITEM):
args.esper_item_rewards = bits
if check_preset.reward == RewardType.ESPER:
args.esper_rewards = bits
if check_preset.reward == RewardType.ITEM:
args.item_rewards = bits
else:
if args.force_character_rewards:
args.character_rewards = [int(check) for check in args.force_character_rewards.split(',')]

if args.force_esper_item_rewards:
args.esper_item_rewards = [int(check) for check in args.force_esper_item_rewards.split(',')]

if args.force_esper_rewards:
args.esper_rewards = [int(check) for check in args.force_esper_rewards.split(',')]

if args.force_item_rewards:
args.item_rewards = [int(check) for check in args.force_item_rewards.split(',')]


def flags(args):
flags = ""

if args.check_preset:
flags += f" -checks {args.check_preset}"

if args.force_character_rewards:
flags += f" -fcrr {args.force_character_rewards}"

if args.force_esper_item_rewards:
flags += f" -feirr {args.force_esper_item_rewards}"

if args.force_esper_rewards:
flags += f" -ferr {args.force_esper_rewards}"

if args.force_item_rewards:
flags += f" -firr {args.force_item_rewards}"

if args.dragons_as_characters_min != 0 or args.dragons_as_characters_max != 0:
flags += f" -dchar {args.dragons_as_characters_min} {args.dragons_as_characters_max}"

return flags

def options(args):
opts = {}
if args.character_rewards:
opts[character_title] = args.character_rewards
if args.esper_item_rewards:
opts[esper_item_title] = args.esper_item_rewards
if args.esper_rewards:
opts[esper_title] = args.esper_rewards
if args.item_rewards:
opts[item_title] = args.item_rewards

if args.dragons_as_characters:
opts['Dragon Characters'] = f"{args.dragons_as_characters_min}-{args.dragons_as_characters_max}"

return [(key, value) for (key, value) in opts.items()]

def _format_check_log_entries(check_ids):
from constants.checks import check_name
check_entries = []
for check_id in check_ids:
check_entries.append(("", check_name[check_id]))
return check_entries

def menu(args):
from menus.submenu_force_item_reward_checks import FlagsForceCharacterRewardChecks, FlagsForceEsperItemRewardChecks, FlagsForceEsperRewardChecks, FlagsForceItemRewardChecks

entries = options(args)
for index, entry in enumerate(entries):
key, value = entry
if key == character_title:
if value:
entries[index] = (character_title, FlagsForceCharacterRewardChecks(character_title, value, args.check_preset)) # flags sub-menu
else:
entries[index] = (character_title, "None")

if key == esper_item_title:
if value:
entries[index] = (esper_item_title, FlagsForceEsperItemRewardChecks(esper_item_title, value, args.check_preset)) # flags sub-menu
else:
entries[index] = (esper_item_title, "None")

if key == esper_title:
if value:
entries[index] = (esper_title, FlagsForceEsperRewardChecks(esper_title, value, args.check_preset)) # flags sub-menu
else:
entries[index] = (esper_title, "None")

if key == item_title:
if value:
entries[index] = (item_title, FlagsForceItemRewardChecks(item_title, value, args.check_preset)) # flags sub-menu
else:
entries[index] = (item_title, "None")

return (name(), entries)

def log(args):
from log import format_option
log = [name()]

entries = options(args)
for entry in entries:
key, value = entry
if key == character_title or key == esper_item_title or key == esper_title or key == item_title:
if len(value) == 0:
entry = (key, "None")
else:
entry = (key, "") # The entries will show up on subsequent lines
log.append(format_option(*entry))
for check_entry in _format_check_log_entries(value):
log.append(format_option(*check_entry))
else:
log.append(format_option(*entry))

return log
3 changes: 2 additions & 1 deletion args/arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ def __init__(self):
self.groups = [
"settings",
"objectives",
"starting_party", "characters", "swdtechs", "blitzes", "lores", "rages", "dances", "steal", "commands",
"starting_party", "characters", "swdtechs", "blitzes", "lores", "rages", "dances", "steal", "commands",
"xpmpgp", "scaling", "bosses", "encounters", "boss_ai",
"espers", "natural_magic",
"starting_gold_items", "items", "shops", "chests",
"graphics",
"coliseum", "auction_house", "challenges", "bug_fixes", "misc",
"advanced_checks",
]
self.group_modules = {}
for group in self.groups:
Expand Down
8 changes: 3 additions & 5 deletions args/challenges.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from constants.checks import FIGARO_CASTLE_THRONE, KOHLINGEN_CAFE
from data.npc_bit import WEAPON_ELDER_NARSHE

def name():
return "Challenges"

Expand All @@ -13,8 +16,6 @@ def parse(parser):
help = "Ultima cannot be learned from espers/items/natural magic")
challenges.add_argument("-nfps", "--no-free-paladin-shields", action = "store_true",
help = "Paladin/Cursed Shields will not appear in coliseum/auction/shops/chests/events (Narshe WOR exclusive)")
challenges.add_argument("-nfce", "--no-free-characters-espers", action = "store_true",
help = "Remove character/esper rewards from: Auction House, Collapsing House, Figaro Castle Throne, Gau's Father's House, Kohlingen Inn, Narshe Weapon Shop, Sealed Gate, South Figaro Basement")
challenges.add_argument("-pd", "--permadeath", action = "store_true",
help = "Life spells cannot be learned. Fenix Downs unavailable (except from starting items). Buckets/inns/tents/events do not revive characters. Phoenix casts Life 3 on party instead of Life")

Expand All @@ -34,8 +35,6 @@ def flags(args):
flags += " -nu"
if args.no_free_paladin_shields:
flags += " -nfps"
if args.no_free_characters_espers:
flags += " -nfce"
if args.permadeath:
flags += " -pd"

Expand All @@ -48,7 +47,6 @@ def options(args):
("No Illuminas", args.no_illuminas),
("No Ultima", args.no_ultima),
("No Free Paladin Shields", args.no_free_paladin_shields),
("No Free Characters/Espers", args.no_free_characters_espers),
("Permadeath", args.permadeath),
]

Expand Down
3 changes: 2 additions & 1 deletion args/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ def log():
_log_tab("Magic", ["espers"], ["natural_magic"])
_log_tab("Items", ["starting_gold_items", "items"], ["shops", "chests"])
args.group_modules["graphics"].log(args)
_log_tab("Other", ["coliseum", "auction_house", "misc"], ["challenges", "bug_fixes"])
_log_tab("Other", ["coliseum", "misc", "challenges"], ["auction_house", "bug_fixes"])
_log_tab("Advanced", ["advanced_checks"], [])
61 changes: 61 additions & 0 deletions constants/check_presets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
from constants.checks import *

from collections import namedtuple
CheckPreset = namedtuple("CheckPreset", ["key", "name", "reward", "description", "locations"])

AH_CLOSED = CheckPreset(
"ah",
"Auction House is Closed",
RewardType.ITEM,
"The auction house will only have items available.",
[
AUCTION1,
AUCTION2
]
)

NO_FREE_CHARACTERS = CheckPreset(
'nfchar',
"No Free Characters",
RewardType.ESPER | RewardType.ITEM,
"All free checks that can reward characters are guaranteed to reward an ESPER or ITEM",
[
COLLAPSING_HOUSE,
FIGARO_CASTLE_THRONE,
GAUS_FATHERS_HOUSE,
KOHLINGEN_CAFE,
MT_ZOZO,
SEALED_GATE,
SOUTH_FIGARO_PRISONER,
]
)

NO_FREE_CHARACTERS_ESPERS = CheckPreset(
'nfce',
"No Free C+E",
RewardType.ITEM,
"All free checks are guaranteed to reward an ITEM. Includes Auction House and Tzen Thief.",
[
AUCTION1,
AUCTION2,
COLLAPSING_HOUSE,
FIGARO_CASTLE_THRONE,
GAUS_FATHERS_HOUSE,
KOHLINGEN_CAFE,
MT_ZOZO,
NARSHE_WEAPON_SHOP,
NARSHE_WEAPON_SHOP_MINES,
SEALED_GATE,
SOUTH_FIGARO_PRISONER,
TZEN_THIEF,
]
)

all_presets = [
AH_CLOSED,
NO_FREE_CHARACTERS,
NO_FREE_CHARACTERS_ESPERS,
]

preset_keys = [preset.key for preset in all_presets]
key_preset = {preset.key: preset for (idx, preset) in enumerate(all_presets)}
Loading