SC2: GUI Mission Launcher (#586)
* SC2: Functioning Starcraft 2 Mission Launcher UI * AutoWorld: add .__file__ attribute to AutoWorlds This tries to help with a recurring easy to make mistake, where ./worlds/myworld does not exist in frozen form and is instead ./lib/worlds/myworld * SC2: get .kv file path correctly when frozen too Co-authored-by: TheCondor07 <TheCondorian07@gmail.com> Co-authored-by: Fabian Dill <fabian.dill@web.de>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import sys
|
||||
from typing import Dict, FrozenSet, Set, Tuple, List, Optional, TextIO, Any, Callable, Union, NamedTuple
|
||||
|
||||
from BaseClasses import MultiWorld, Item, CollectionState, Location, Tutorial
|
||||
@@ -41,6 +42,7 @@ class AutoWorldRegister(type):
|
||||
new_class = super().__new__(mcs, name, bases, dct)
|
||||
if "game" in dct:
|
||||
AutoWorldRegister.world_types[dct["game"]] = new_class
|
||||
new_class.__file__ = sys.modules[new_class.__module__].__file__
|
||||
return new_class
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ class MissionInfo(NamedTuple):
|
||||
id: int
|
||||
extra_locations: int
|
||||
required_world: List[int]
|
||||
category: str
|
||||
number: int = 0 # number of worlds need beaten
|
||||
completion_critical: bool = False # missions needed to beat game
|
||||
or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed
|
||||
@@ -22,74 +23,76 @@ class MissionInfo(NamedTuple):
|
||||
class FillMission(NamedTuple):
|
||||
type: str
|
||||
connect_to: List[int] # -1 connects to Menu
|
||||
category: str
|
||||
number: int = 0 # number of worlds need beaten
|
||||
completion_critical: bool = False # missions needed to beat game
|
||||
or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed
|
||||
|
||||
|
||||
|
||||
vanilla_shuffle_order = [
|
||||
FillMission("no_build", [-1], completion_critical=True),
|
||||
FillMission("easy", [0], completion_critical=True),
|
||||
FillMission("easy", [1], completion_critical=True),
|
||||
FillMission("easy", [2]),
|
||||
FillMission("medium", [3]),
|
||||
FillMission("hard", [4], number=7),
|
||||
FillMission("hard", [4], number=7),
|
||||
FillMission("easy", [2], completion_critical=True),
|
||||
FillMission("medium", [7], number=8, completion_critical=True),
|
||||
FillMission("hard", [8], number=11, completion_critical=True),
|
||||
FillMission("hard", [9], number=14, completion_critical=True),
|
||||
FillMission("hard", [10], completion_critical=True),
|
||||
FillMission("medium", [2], number=4),
|
||||
FillMission("medium", [12]),
|
||||
FillMission("hard", [13], number=8),
|
||||
FillMission("hard", [13], number=8),
|
||||
FillMission("medium", [2], number=6),
|
||||
FillMission("hard", [16]),
|
||||
FillMission("hard", [17]),
|
||||
FillMission("hard", [18]),
|
||||
FillMission("hard", [19]),
|
||||
FillMission("medium", [8]),
|
||||
FillMission("hard", [21]),
|
||||
FillMission("hard", [22]),
|
||||
FillMission("hard", [23]),
|
||||
FillMission("hard", [11], completion_critical=True),
|
||||
FillMission("hard", [25], completion_critical=True),
|
||||
FillMission("hard", [25], completion_critical=True),
|
||||
FillMission("all_in", [26, 27], completion_critical=True, or_requirements=True)
|
||||
FillMission("no_build", [-1], "Mar Sara", completion_critical=True),
|
||||
FillMission("easy", [0], "Mar Sara", completion_critical=True),
|
||||
FillMission("easy", [1], "Mar Sara", completion_critical=True),
|
||||
FillMission("easy", [2], "Colonist"),
|
||||
FillMission("medium", [3], "Colonist"),
|
||||
FillMission("hard", [4], "Colonist", number=7),
|
||||
FillMission("hard", [4], "Colonist", number=7),
|
||||
FillMission("easy", [2], "Artifact", completion_critical=True),
|
||||
FillMission("medium", [7], "Artifact", number=8, completion_critical=True),
|
||||
FillMission("hard", [8], "Artifact", number=11, completion_critical=True),
|
||||
FillMission("hard", [9], "Artifact", number=14, completion_critical=True),
|
||||
FillMission("hard", [10], "Artifact", completion_critical=True),
|
||||
FillMission("medium", [2], "Covert", number=4),
|
||||
FillMission("medium", [12], "Covert"),
|
||||
FillMission("hard", [13], "Covert", number=8),
|
||||
FillMission("hard", [13], "Covert", number=8),
|
||||
FillMission("medium", [2], "Rebellion", number=6),
|
||||
FillMission("hard", [16], "Rebellion"),
|
||||
FillMission("hard", [17], "Rebellion"),
|
||||
FillMission("hard", [18], "Rebellion"),
|
||||
FillMission("hard", [19], "Rebellion"),
|
||||
FillMission("medium", [8], "Prophecy"),
|
||||
FillMission("hard", [21], "Prophecy"),
|
||||
FillMission("hard", [22], "Prophecy"),
|
||||
FillMission("hard", [23], "Prophecy"),
|
||||
FillMission("hard", [11], "Char", completion_critical=True),
|
||||
FillMission("hard", [25], "Char", completion_critical=True),
|
||||
FillMission("hard", [25], "Char", completion_critical=True),
|
||||
FillMission("all_in", [26, 27], "Char", completion_critical=True, or_requirements=True)
|
||||
]
|
||||
|
||||
|
||||
vanilla_mission_req_table = {
|
||||
"Liberation Day": MissionInfo(1, 7, [], completion_critical=True),
|
||||
"The Outlaws": MissionInfo(2, 2, [1], completion_critical=True),
|
||||
"Zero Hour": MissionInfo(3, 4, [2], completion_critical=True),
|
||||
"Evacuation": MissionInfo(4, 4, [3]),
|
||||
"Outbreak": MissionInfo(5, 3, [4]),
|
||||
"Safe Haven": MissionInfo(6, 1, [5], number=7),
|
||||
"Haven's Fall": MissionInfo(7, 1, [5], number=7),
|
||||
"Smash and Grab": MissionInfo(8, 5, [3], completion_critical=True),
|
||||
"The Dig": MissionInfo(9, 4, [8], number=8, completion_critical=True),
|
||||
"The Moebius Factor": MissionInfo(10, 9, [9], number=11, completion_critical=True),
|
||||
"Supernova": MissionInfo(11, 5, [10], number=14, completion_critical=True),
|
||||
"Maw of the Void": MissionInfo(12, 6, [11], completion_critical=True),
|
||||
"Devil's Playground": MissionInfo(13, 3, [3], number=4),
|
||||
"Welcome to the Jungle": MissionInfo(14, 4, [13]),
|
||||
"Breakout": MissionInfo(15, 3, [14], number=8),
|
||||
"Ghost of a Chance": MissionInfo(16, 6, [14], number=8),
|
||||
"The Great Train Robbery": MissionInfo(17, 4, [3], number=6),
|
||||
"Cutthroat": MissionInfo(18, 5, [17]),
|
||||
"Engine of Destruction": MissionInfo(19, 6, [18]),
|
||||
"Media Blitz": MissionInfo(20, 5, [19]),
|
||||
"Piercing the Shroud": MissionInfo(21, 6, [20]),
|
||||
"Whispers of Doom": MissionInfo(22, 4, [9]),
|
||||
"A Sinister Turn": MissionInfo(23, 4, [22]),
|
||||
"Echoes of the Future": MissionInfo(24, 3, [23]),
|
||||
"In Utter Darkness": MissionInfo(25, 3, [24]),
|
||||
"Gates of Hell": MissionInfo(26, 2, [12], completion_critical=True),
|
||||
"Belly of the Beast": MissionInfo(27, 4, [26], completion_critical=True),
|
||||
"Shatter the Sky": MissionInfo(28, 5, [26], completion_critical=True),
|
||||
"All-In": MissionInfo(29, -1, [27, 28], completion_critical=True, or_requirements=True)
|
||||
"Liberation Day": MissionInfo(1, 7, [], "Mar Sara", completion_critical=True),
|
||||
"The Outlaws": MissionInfo(2, 2, [1], "Mar Sara", completion_critical=True),
|
||||
"Zero Hour": MissionInfo(3, 4, [2], "Mar Sara", completion_critical=True),
|
||||
"Evacuation": MissionInfo(4, 4, [3], "Colonist"),
|
||||
"Outbreak": MissionInfo(5, 3, [4], "Colonist"),
|
||||
"Safe Haven": MissionInfo(6, 1, [5], "Colonist", number=7),
|
||||
"Haven's Fall": MissionInfo(7, 1, [5], "Colonist", number=7),
|
||||
"Smash and Grab": MissionInfo(8, 5, [3], "Artifact", completion_critical=True),
|
||||
"The Dig": MissionInfo(9, 4, [8], "Artifact", number=8, completion_critical=True),
|
||||
"The Moebius Factor": MissionInfo(10, 9, [9], "Artifact", number=11, completion_critical=True),
|
||||
"Supernova": MissionInfo(11, 5, [10], "Artifact", number=14, completion_critical=True),
|
||||
"Maw of the Void": MissionInfo(12, 6, [11], "Artifact", completion_critical=True),
|
||||
"Devil's Playground": MissionInfo(13, 3, [3], "Covert", number=4),
|
||||
"Welcome to the Jungle": MissionInfo(14, 4, [13], "Covert"),
|
||||
"Breakout": MissionInfo(15, 3, [14], "Covert", number=8),
|
||||
"Ghost of a Chance": MissionInfo(16, 6, [14], "Covert", number=8),
|
||||
"The Great Train Robbery": MissionInfo(17, 4, [3], "Rebellion", number=6),
|
||||
"Cutthroat": MissionInfo(18, 5, [17], "Rebellion"),
|
||||
"Engine of Destruction": MissionInfo(19, 6, [18], "Rebellion"),
|
||||
"Media Blitz": MissionInfo(20, 5, [19], "Rebellion"),
|
||||
"Piercing the Shroud": MissionInfo(21, 6, [20], "Rebellion"),
|
||||
"Whispers of Doom": MissionInfo(22, 4, [9], "Prophecy"),
|
||||
"A Sinister Turn": MissionInfo(23, 4, [22], "Prophecy"),
|
||||
"Echoes of the Future": MissionInfo(24, 3, [23], "Prophecy"),
|
||||
"In Utter Darkness": MissionInfo(25, 3, [24], "Prophecy"),
|
||||
"Gates of Hell": MissionInfo(26, 2, [12], "Char", completion_critical=True),
|
||||
"Belly of the Beast": MissionInfo(27, 4, [26], "Char", completion_critical=True),
|
||||
"Shatter the Sky": MissionInfo(28, 5, [26], "Char", completion_critical=True),
|
||||
"All-In": MissionInfo(29, -1, [27, 28], "Char", completion_critical=True, or_requirements=True)
|
||||
}
|
||||
|
||||
lookup_id_to_mission: Dict[int, str] = {
|
||||
|
||||
@@ -203,8 +203,9 @@ def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData
|
||||
|
||||
mission_req_table.update({missions[i]: MissionInfo(
|
||||
vanilla_mission_req_table[missions[i]].id, vanilla_mission_req_table[missions[i]].extra_locations,
|
||||
connections, completion_critical=vanilla_shuffle_order[i].completion_critical,
|
||||
number=vanilla_shuffle_order[i].number, or_requirements=vanilla_shuffle_order[i].or_requirements)})
|
||||
connections, vanilla_shuffle_order[i].category, number=vanilla_shuffle_order[i].number,
|
||||
completion_critical=vanilla_shuffle_order[i].completion_critical,
|
||||
or_requirements=vanilla_shuffle_order[i].or_requirements)})
|
||||
|
||||
return mission_req_table
|
||||
|
||||
|
||||
16
worlds/sc2wol/Starcraft2.kv
Normal file
16
worlds/sc2wol/Starcraft2.kv
Normal file
@@ -0,0 +1,16 @@
|
||||
<MissionLayout>:
|
||||
rows: 1
|
||||
|
||||
<MissionCategory>:
|
||||
cols: 1
|
||||
padding: [10,5,10,5]
|
||||
spacing: [0,5]
|
||||
|
||||
<MissionButton>:
|
||||
text_size: self.size
|
||||
markup: True
|
||||
halign: 'center'
|
||||
valign: 'middle'
|
||||
padding_x: 5
|
||||
markup: True
|
||||
outline_width: 1
|
||||
Reference in New Issue
Block a user