Skip to content

Wargroove: Implement New Game #1401

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 65 commits into from
Feb 24, 2023
Merged
Show file tree
Hide file tree
Changes from 57 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
030ca9f
first commit of Wargroove
FlySniper Nov 4, 2022
751b9b1
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 5, 2022
93c4111
wargroove - initial working implementation
FlySniper Nov 7, 2022
2b32504
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 8, 2022
b77465d
wargroove final level rules and some location name changes in wargroo…
FlySniper Nov 8, 2022
0d761a7
Wargroove - added to Launcher.py
FlySniper Nov 8, 2022
a0389b2
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 9, 2022
a7fc81f
Wargroove Client: added better error handling for an invalid host.yam…
FlySniper Nov 9, 2022
a49735d
Merge branch 'main' of https://github.com/FlySniper/Archipelago
FlySniper Nov 9, 2022
731cadb
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 9, 2022
be2d58d
Merge branch 'main' of https://github.com/FlySniper/Archipelago
FlySniper Nov 9, 2022
7ea5055
Wargroove - Corrupted Inlet now allows for Merfolk and Warships to wi…
FlySniper Nov 10, 2022
fd859dc
Wargroove - Fixed generator putting progression units in unreachable …
FlySniper Nov 11, 2022
cb40130
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 11, 2022
8c6ba0f
Wargroove - renamed set_exit_locations to set_region_exit_rules
FlySniper Nov 11, 2022
8e55566
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 11, 2022
ee225cd
Wargroove - Fixed too many items. Fixed Rules region exit rules using…
FlySniper Nov 12, 2022
2780a5b
Wargroove - added seed distribution and ingame messages
FlySniper Nov 12, 2022
7f596c5
Wargroove - Renamed Victory 1 and 2 locations to use faction colors i…
FlySniper Nov 13, 2022
af466e9
Wargroove - Random seeds are now based on the slot seed and the slot id
FlySniper Nov 13, 2022
d57484d
Merge branch 'ArchipelagoMW:main' into main
FlySniper Nov 13, 2022
8464565
WG: Start inventory compatibility and CO Choice generation option
Magnemania Nov 15, 2022
566e608
WG: Rename "CO" to "Commander" and add "Commanders" to faction items
Magnemania Nov 15, 2022
db7f04a
WG: Command line commander choices
Magnemania Nov 15, 2022
cab5ef2
WG: Ignoring faction items on Locked Random
Magnemania Nov 15, 2022
42afcd9
WG: Locked Random client fixes
Magnemania Nov 15, 2022
12d72a2
Merge pull request #1 from Magnemania/wargroove
FlySniper Nov 15, 2022
a054523
Wargroove - first commit of documentation
FlySniper Nov 16, 2022
c833b91
Wargroove - reworded some documentation
FlySniper Nov 17, 2022
5fb0330
WG: GUI Client for tracking and selecting commanders
Magnemania Nov 21, 2022
8e6026f
Merge pull request #2 from Magnemania/wargroove
FlySniper Nov 21, 2022
24e5b73
Wargroove: Fixed merge conflict by removing .dat file reference in up…
FlySniper Nov 21, 2022
78191ae
Wargroove: Fixed Wargroove client resize behavior. Fixed boosts stack…
FlySniper Nov 22, 2022
9452c44
Wargroove: Added Foolish Canal to the campaign and AP code
FlySniper Nov 22, 2022
2f3126a
Wargroove: Added extra seed file for Foolish Canal
FlySniper Nov 22, 2022
ed55878
Wargroove: Fixed Southern Walls rule for Archery Lessons. Removed Kni…
FlySniper Nov 23, 2022
cc8c877
Wargroove: adding extra troubleshooting step to the docs.
FlySniper Nov 23, 2022
75b1650
Wargroove: host.yaml root_directory reverted back to a proper default.
FlySniper Nov 23, 2022
8d3f6a8
Wargroove: Logic changes. Rifleman now a progressive item.
FlySniper Nov 26, 2022
5b23057
Wargroove: Changed game description so it no longer copies from the S…
FlySniper Nov 26, 2022
f5a0d19
Wargroove: Docs update
FlySniper Nov 29, 2022
daa380a
Merge branch 'ArchipelagoMW:main' into main
FlySniper Dec 20, 2022
eec82c6
Merge branch 'ArchipelagoMW:main' into main
FlySniper Jan 7, 2023
9dd4856
Merge branch 'ArchipelagoMW:main' into main
FlySniper Jan 8, 2023
cea3973
Wargroove - Docs now include troubleshooting for making the game easi…
FlySniper Jan 8, 2023
2048a1d
Wargroove - Wargroove client now installs the mod and campaign to War…
FlySniper Jan 11, 2023
6a0336d
Merge branch 'ArchipelagoMW:main' into main
FlySniper Jan 13, 2023
26940c0
flysniper - updating mod and campaign to fix enemy COs not randomizing
FlySniper Jan 16, 2023
c6557c5
Merge branch 'ArchipelagoMW:main' into main
FlySniper Jan 16, 2023
5ce2c74
Merge branch 'ArchipelagoMW:main' into main
FlySniper Jan 22, 2023
1151b79
Wargroove - Fixed camapaign descriptions in Frigid Archery and A Ball…
FlySniper Jan 22, 2023
d765b59
Wargroove - modified troubleshooting text.
FlySniper Jan 22, 2023
17cf2bb
Wargroove - added Wargroove default options to Utils.py
FlySniper Jan 22, 2023
ed68689
Merge branch 'main' into main
FlySniper Jan 23, 2023
dd4d204
Apply suggestions from code review
FlySniper Feb 10, 2023
282fb1d
Wargroove - removed It should start with no errors, if it does go bac…
FlySniper Feb 10, 2023
ac2234c
Wargroove - added link to the Archipelago discord.
FlySniper Feb 10, 2023
0ce06e1
Apply suggestions from code review
FlySniper Feb 12, 2023
52fdf40
Wargroove - added the backing up of playerPrgress files to the docs.
FlySniper Feb 12, 2023
0c9c0da
Merge branch 'main' into main
Berserker66 Feb 14, 2023
cb1cf88
Wargroove - Updating region creation to be in line with the region re…
FlySniper Feb 14, 2023
3c192c7
Merge branch 'main' into main
Berserker66 Feb 17, 2023
39d96d4
Wargroove - Removed forced_auto_forfeit. Removed an extra logging sta…
FlySniper Feb 17, 2023
891f222
Wargroove - Removed forced_auto_forfeit. Removed an extra logging sta…
FlySniper Feb 17, 2023
7de994a
Merge branch 'main' into main
FlySniper Feb 17, 2023
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
2 changes: 2 additions & 0 deletions Launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ def handles_file(self, path: str):
Component('ChecksFinder Client', 'ChecksFinderClient'),
# Starcraft 2
Component('Starcraft 2 Client', 'Starcraft2Client'),
# Wargroove
Component('Wargroove Client', 'WargrooveClient'),
# Zillion
Component('Zillion Client', 'ZillionClient',
file_identifier=SuffixIdentifier('.apzl')),
Expand Down
3 changes: 3 additions & 0 deletions Utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ def get_default_options() -> OptionsType:
"lufia2ac_options": {
"rom_file": "Lufia II - Rise of the Sinistrals (USA).sfc",
},
"wargroove_options": {
"root_directory": "C:/Program Files (x86)/Steam/steamapps/common/Wargroove"
}
}
return options

Expand Down
444 changes: 444 additions & 0 deletions WargrooveClient.py

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions host.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ pokemon_rb_options:
# True for operating system default program
# Alternatively, a path to a program to open the .gb file with
rom_start: true

wargroove_options:
# Locate the Wargroove root directory on your system.
# This is used by the Wargroove client, so it knows where to send communication files to
root_directory: "C:/Program Files (x86)/Steam/steamapps/common/Wargroove"

zillion_options:
# File name of the Zillion US rom
rom_file: "Zillion (UE) [!].sms"
Expand Down
104 changes: 104 additions & 0 deletions worlds/wargroove/Items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import typing

from BaseClasses import Item, ItemClassification
from typing import Dict, List

PROGRESSION = ItemClassification.progression
PROGRESSION_SKIP_BALANCING = ItemClassification.progression_skip_balancing
USEFUL = ItemClassification.useful
FILLER = ItemClassification.filler


class ItemData(typing.NamedTuple):
code: typing.Optional[int]
type: str
classification: ItemClassification = PROGRESSION


item_table: Dict[str, ItemData] = {
# Units
'Spearman': ItemData(52000, 'Unit'),
'Wagon': ItemData(52001, 'Unit', USEFUL),
'Mage': ItemData(52002, 'Unit'),
'Archer': ItemData(52003, 'Unit'),
'Knight': ItemData(52004, 'Unit'),
'Ballista': ItemData(52005, 'Unit'),
'Golem': ItemData(52006, 'Unit', USEFUL),
'Harpy': ItemData(52007, 'Unit'),
'Witch': ItemData(52008, 'Unit', USEFUL),
'Dragon': ItemData(52009, 'Unit'),
'Balloon': ItemData(52010, 'Unit', USEFUL),
'Barge': ItemData(52011, 'Unit'),
'Merfolk': ItemData(52012, 'Unit'),
'Turtle': ItemData(52013, 'Unit'),
'Harpoon Ship': ItemData(52014, 'Unit'),
'Warship': ItemData(52015, 'Unit'),
'Thief': ItemData(52016, 'Unit'),
'Rifleman': ItemData(52017, 'Unit'),

# Map Triggers
'Eastern Bridges': ItemData(52018, 'Trigger'),
'Southern Walls': ItemData(52019, 'Trigger'),
'Final Bridges': ItemData(52020, 'Trigger', PROGRESSION_SKIP_BALANCING),
'Final Walls': ItemData(52021, 'Trigger', PROGRESSION_SKIP_BALANCING),
'Final Sickle': ItemData(52022, 'Trigger', PROGRESSION_SKIP_BALANCING),

# Player Buffs
'Income Boost': ItemData(52023, 'Boost', FILLER),

'Commander Defense Boost': ItemData(52024, 'Boost', FILLER),

# Factions
'Cherrystone Commanders': ItemData(52025, 'Faction', USEFUL),
'Felheim Commanders': ItemData(52026, 'Faction', USEFUL),
'Floran Commanders': ItemData(52027, 'Faction', USEFUL),
'Heavensong Commanders': ItemData(52028, 'Faction', USEFUL),
'Requiem Commanders': ItemData(52029, 'Faction', USEFUL),
'Outlaw Commanders': ItemData(52030, 'Faction', USEFUL),

# Event Items
'Wargroove Victory': ItemData(None, 'Goal')

}


class CommanderData(typing.NamedTuple):
name: str
internal_name: str
alt_name: str = None


faction_table: Dict[str, List[CommanderData]] = {
'Starter': [
CommanderData('Mercival', 'commander_mercival')
],
'Cherrystone': [
CommanderData('Mercia', 'commander_mercia'),
CommanderData('Emeric', 'commander_emeric'),
CommanderData('Caesar', 'commander_caesar'),
],
'Felheim': [
CommanderData('Valder', 'commander_valder'),
CommanderData('Ragna', 'commander_ragna'),
CommanderData('Sigrid', 'commander_sigrid')
],
'Floran': [
CommanderData('Greenfinger', 'commander_greenfinger'),
CommanderData('Sedge', 'commander_sedge'),
CommanderData('Nuru', 'commander_nuru')
],
'Heavensong': [
CommanderData('Tenri', 'commander_tenri'),
CommanderData('Koji', 'commander_koji'),
CommanderData('Ryota', 'commander_ryota')
],
'Requiem': [
CommanderData('Elodie', 'commander_elodie'),
CommanderData('Dark Mercia', 'commander_darkmercia')
],
'Outlaw': [
CommanderData('Wulfar', 'commander_wulfar'),
CommanderData('Twins', 'commander_twins', 'Errol & Orla'),
CommanderData('Vesper', 'commander_vesper')
]
}
41 changes: 41 additions & 0 deletions worlds/wargroove/Locations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
location_table = {
'Humble Beginnings: Caesar': 53001,
'Humble Beginnings: Chest 1': 53002,
'Humble Beginnings: Chest 2': 53003,
'Humble Beginnings: Victory': 53004,
'Best Friendssss: Find Sedge': 53005,
'Best Friendssss: Victory': 53006,
'A Knight\'s Folly: Caesar': 53007,
'A Knight\'s Folly: Victory': 53008,
'Denrunaway: Chest': 53009,
'Denrunaway: Victory': 53010,
'Dragon Freeway: Victory': 53011,
'Deep Thicket: Find Sedge': 53012,
'Deep Thicket: Victory': 53013,
'Corrupted Inlet: Victory': 53014,
'Mage Mayhem: Caesar': 53015,
'Mage Mayhem: Victory': 53016,
'Endless Knight: Victory': 53017,
'Ambushed in the Middle: Victory (Blue)': 53018,
'Ambushed in the Middle: Victory (Green)': 53019,
'The Churning Sea: Victory': 53020,
'Frigid Archery: Light the Torch': 53021,
'Frigid Archery: Victory': 53022,
'Archery Lessons: Chest': 53023,
'Archery Lessons: Victory': 53024,
'Surrounded: Caesar': 53025,
'Surrounded: Victory': 53026,
'Darkest Knight: Victory': 53027,
'Robbed: Victory': 53028,
'Open Season: Caesar': 53029,
'Open Season: Victory': 53030,
'Doggo Mountain: Find all the Dogs': 53031,
'Doggo Mountain: Victory': 53032,
'Tenri\'s Fall: Victory': 53033,
'Master of the Lake: Victory': 53034,
'A Ballista\'s Revenge: Victory': 53035,
'Rebel Village: Victory (Pink)': 53036,
'Rebel Village: Victory (Red)': 53037,
'Foolish Canal: Victory': 53038,
'Wargroove Finale: Victory': None,
}
38 changes: 38 additions & 0 deletions worlds/wargroove/Options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import typing
from Options import Choice, Option, Range


class IncomeBoost(Range):
"""How much extra income the player gets per turn per boost received."""
display_name = "Income Boost"
range_start = 0
range_end = 100
default = 25


class CommanderDefenseBoost(Range):
"""How much extra defense the player's commander gets per boost received."""
display_name = "Commander Defense Boost"
range_start = 0
range_end = 8
default = 2


class CommanderChoice(Choice):
"""How the player's commander is selected for missions.
Locked Random: The player's commander is randomly predetermined for each level.
Unlockable Factions: The player starts with Mercival and can unlock playable factions.
Random Starting Faction: The player starts with a random starting faction and can unlock the rest.
When playing with unlockable factions, faction items are added to the pool.
Extra faction items after the first also reward starting Groove charge."""
display_name = "Commander Choice"
option_locked_random = 0
option_unlockable_factions = 1
option_random_starting_faction = 2


wargroove_options: typing.Dict[str, type(Option)] = {
"income_boost": IncomeBoost,
"commander_defense_boost": CommanderDefenseBoost,
"commander_choice": CommanderChoice
}
169 changes: 169 additions & 0 deletions worlds/wargroove/Regions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
def create_regions(world, player: int):
from . import create_region
from .Locations import location_table

world.regions += [
create_region(world, player, 'Menu', None, ['Humble Beginnings']),
# Level 1
create_region(world, player, 'Humble Beginnings', [
'Humble Beginnings: Caesar',
'Humble Beginnings: Chest 1',
'Humble Beginnings: Chest 2',
'Humble Beginnings: Victory',
], ['Best Friendssss', 'A Knight\'s Folly', 'Denrunaway', 'Wargroove Finale']),

# Levels 2A-2C
create_region(world, player, 'Best Friendssss', [
'Best Friendssss: Find Sedge',
'Best Friendssss: Victory'
], ['Dragon Freeway', 'Deep Thicket', 'Corrupted Inlet']),

create_region(world, player, 'A Knight\'s Folly', [
'A Knight\'s Folly: Caesar',
'A Knight\'s Folly: Victory'
], ['Mage Mayhem', 'Endless Knight', 'Ambushed in the Middle']),

create_region(world, player, 'Denrunaway', [
'Denrunaway: Chest',
'Denrunaway: Victory'
], ['The Churning Sea', 'Frigid Archery', 'Archery Lessons']),

# Levels 3AA-3AC
create_region(world, player, 'Dragon Freeway', [
'Dragon Freeway: Victory',
], ['Surrounded']),

create_region(world, player, 'Deep Thicket', [
'Deep Thicket: Find Sedge',
'Deep Thicket: Victory',
], ['Darkest Knight']),

create_region(world, player, 'Corrupted Inlet', [
'Corrupted Inlet: Victory',
], ['Robbed']),

# Levels 3BA-3BC
create_region(world, player, 'Mage Mayhem', [
'Mage Mayhem: Caesar',
'Mage Mayhem: Victory',
], ['Open Season', 'Foolish Canal: Mage Mayhem Entrance']),

create_region(world, player, 'Endless Knight', [
'Endless Knight: Victory',
], ['Doggo Mountain', 'Foolish Canal: Endless Knight Entrance']),

create_region(world, player, 'Ambushed in the Middle', [
'Ambushed in the Middle: Victory (Blue)',
'Ambushed in the Middle: Victory (Green)',
], ['Tenri\'s Fall']),

# Levels 3CA-3CC
create_region(world, player, 'The Churning Sea', [
'The Churning Sea: Victory',
], ['Rebel Village']),

create_region(world, player, 'Frigid Archery', [
'Frigid Archery: Light the Torch',
'Frigid Archery: Victory',
], ['A Ballista\'s Revenge']),

create_region(world, player, 'Archery Lessons', [
'Archery Lessons: Chest',
'Archery Lessons: Victory',
], ['Master of the Lake']),

# Levels 4AA-4AC
create_region(world, player, 'Surrounded', [
'Surrounded: Caesar',
'Surrounded: Victory',
]),

create_region(world, player, 'Darkest Knight', [
'Darkest Knight: Victory',
]),

create_region(world, player, 'Robbed', [
'Robbed: Victory',
]),

# Levels 4BAA-4BCA
create_region(world, player, 'Open Season', [
'Open Season: Caesar',
'Open Season: Victory',
]),

create_region(world, player, 'Doggo Mountain', [
'Doggo Mountain: Find all the Dogs',
'Doggo Mountain: Victory',
]),

create_region(world, player, 'Tenri\'s Fall', [
'Tenri\'s Fall: Victory',
]),

# Level 4BAB
create_region(world, player, 'Foolish Canal', [
'Foolish Canal: Victory',
]),

# Levels 4CA-4CC
create_region(world, player, 'Master of the Lake', [
'Master of the Lake: Victory',
]),

create_region(world, player, 'A Ballista\'s Revenge', [
'A Ballista\'s Revenge: Victory',
]),

create_region(world, player, 'Rebel Village', [
'Rebel Village: Victory (Pink)',
'Rebel Village: Victory (Red)',
]),

# Final Level
create_region(world, player, 'Wargroove Finale', [
'Wargroove Finale: Victory'
]),
]

# link up our regions with the entrances
world.get_entrance('Humble Beginnings', player).connect(world.get_region('Humble Beginnings', player))
world.get_entrance('Best Friendssss', player).connect(world.get_region('Best Friendssss', player))
world.get_entrance('A Knight\'s Folly', player).connect(world.get_region('A Knight\'s Folly', player))
world.get_entrance('Denrunaway', player).connect(world.get_region('Denrunaway', player))
world.get_entrance('Wargroove Finale', player).connect(world.get_region('Wargroove Finale', player))

world.get_entrance('Dragon Freeway', player).connect(world.get_region('Dragon Freeway', player))
world.get_entrance('Deep Thicket', player).connect(world.get_region('Deep Thicket', player))
world.get_entrance('Corrupted Inlet', player).connect(world.get_region('Corrupted Inlet', player))

world.get_entrance('Mage Mayhem', player).connect(world.get_region('Mage Mayhem', player))
world.get_entrance('Endless Knight', player).connect(world.get_region('Endless Knight', player))
world.get_entrance('Ambushed in the Middle', player).connect(world.get_region('Ambushed in the Middle', player))

world.get_entrance('The Churning Sea', player).connect(world.get_region('The Churning Sea', player))
world.get_entrance('Frigid Archery', player).connect(world.get_region('Frigid Archery', player))
world.get_entrance('Archery Lessons', player).connect(world.get_region('Archery Lessons', player))

world.get_entrance('Surrounded', player).connect(world.get_region('Surrounded', player))

world.get_entrance('Darkest Knight', player).connect(world.get_region('Darkest Knight', player))

world.get_entrance('Robbed', player).connect(world.get_region('Robbed', player))

world.get_entrance('Open Season', player).connect(world.get_region('Open Season', player))

world.get_entrance('Doggo Mountain', player).connect(world.get_region('Doggo Mountain', player))

world.get_entrance('Tenri\'s Fall', player).connect(world.get_region('Tenri\'s Fall', player))

world.get_entrance('Foolish Canal: Mage Mayhem Entrance', player).connect(world.get_region('Foolish Canal', player))
world.get_entrance('Foolish Canal: Endless Knight Entrance', player).connect(
world.get_region('Foolish Canal', player)
)

world.get_entrance('Master of the Lake', player).connect(world.get_region('Master of the Lake', player))

world.get_entrance('A Ballista\'s Revenge', player).connect(world.get_region('A Ballista\'s Revenge', player))

world.get_entrance('Rebel Village', player).connect(world.get_region('Rebel Village', player))
Loading