Server: fix release_mode (#1407)
* Server: fix release_mode * Core: actually rename forfeit to release across the program
This commit is contained in:
parent
1a44f5cf1c
commit
847582ff5f
|
@ -193,7 +193,7 @@ class CommonContext:
|
||||||
self.hint_cost = None
|
self.hint_cost = None
|
||||||
self.slot_info = {}
|
self.slot_info = {}
|
||||||
self.permissions = {
|
self.permissions = {
|
||||||
"forfeit": "disabled",
|
"release": "disabled",
|
||||||
"collect": "disabled",
|
"collect": "disabled",
|
||||||
"remaining": "disabled",
|
"remaining": "disabled",
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ class CommonContext:
|
||||||
self.server_task = None
|
self.server_task = None
|
||||||
self.hint_cost = None
|
self.hint_cost = None
|
||||||
self.permissions = {
|
self.permissions = {
|
||||||
"forfeit": "disabled",
|
"release": "disabled",
|
||||||
"collect": "disabled",
|
"collect": "disabled",
|
||||||
"remaining": "disabled",
|
"remaining": "disabled",
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,6 @@ class Context:
|
||||||
"location_check_points": int,
|
"location_check_points": int,
|
||||||
"server_password": str,
|
"server_password": str,
|
||||||
"password": str,
|
"password": str,
|
||||||
"forfeit_mode": str, # TODO remove around 0.4
|
|
||||||
"release_mode": str,
|
"release_mode": str,
|
||||||
"remaining_mode": str,
|
"remaining_mode": str,
|
||||||
"collect_mode": str,
|
"collect_mode": str,
|
||||||
|
@ -141,7 +140,7 @@ class Context:
|
||||||
non_hintable_names: typing.Dict[str, typing.Set[str]]
|
non_hintable_names: typing.Dict[str, typing.Set[str]]
|
||||||
|
|
||||||
def __init__(self, host: str, port: int, server_password: str, password: str, location_check_points: int,
|
def __init__(self, host: str, port: int, server_password: str, password: str, location_check_points: int,
|
||||||
hint_cost: int, item_cheat: bool, forfeit_mode: str = "disabled", collect_mode="disabled",
|
hint_cost: int, item_cheat: bool, release_mode: str = "disabled", collect_mode="disabled",
|
||||||
remaining_mode: str = "disabled", auto_shutdown: typing.SupportsFloat = 0, compatibility: int = 2,
|
remaining_mode: str = "disabled", auto_shutdown: typing.SupportsFloat = 0, compatibility: int = 2,
|
||||||
log_network: bool = False):
|
log_network: bool = False):
|
||||||
super(Context, self).__init__()
|
super(Context, self).__init__()
|
||||||
|
@ -157,7 +156,7 @@ class Context:
|
||||||
self.player_names: typing.Dict[team_slot, str] = {}
|
self.player_names: typing.Dict[team_slot, str] = {}
|
||||||
self.player_name_lookup: typing.Dict[str, team_slot] = {}
|
self.player_name_lookup: typing.Dict[str, team_slot] = {}
|
||||||
self.connect_names = {} # names of slots clients can connect to
|
self.connect_names = {} # names of slots clients can connect to
|
||||||
self.allow_forfeits = {}
|
self.allow_releases = {}
|
||||||
# player location_id item_id target_player_id
|
# player location_id item_id target_player_id
|
||||||
self.locations = {}
|
self.locations = {}
|
||||||
self.host = host
|
self.host = host
|
||||||
|
@ -174,7 +173,7 @@ class Context:
|
||||||
self.location_check_points = location_check_points
|
self.location_check_points = location_check_points
|
||||||
self.hints_used = collections.defaultdict(int)
|
self.hints_used = collections.defaultdict(int)
|
||||||
self.hints: typing.Dict[team_slot, typing.Set[NetUtils.Hint]] = collections.defaultdict(set)
|
self.hints: typing.Dict[team_slot, typing.Set[NetUtils.Hint]] = collections.defaultdict(set)
|
||||||
self.release_mode: str = forfeit_mode
|
self.release_mode: str = release_mode
|
||||||
self.remaining_mode: str = remaining_mode
|
self.remaining_mode: str = remaining_mode
|
||||||
self.collect_mode: str = collect_mode
|
self.collect_mode: str = collect_mode
|
||||||
self.item_cheat = item_cheat
|
self.item_cheat = item_cheat
|
||||||
|
@ -593,6 +592,8 @@ class Context:
|
||||||
|
|
||||||
def _set_options(self, server_options: dict):
|
def _set_options(self, server_options: dict):
|
||||||
for key, value in server_options.items():
|
for key, value in server_options.items():
|
||||||
|
if key == "forfeit_mode":
|
||||||
|
key = "release_mode"
|
||||||
data_type = self.simple_options.get(key, None)
|
data_type = self.simple_options.get(key, None)
|
||||||
if data_type is not None:
|
if data_type is not None:
|
||||||
if value not in {False, True, None}: # some can be boolean OR text, such as password
|
if value not in {False, True, None}: # some can be boolean OR text, such as password
|
||||||
|
@ -1229,7 +1230,7 @@ class ClientMessageProcessor(CommonCommandProcessor):
|
||||||
|
|
||||||
def _cmd_release(self) -> bool:
|
def _cmd_release(self) -> bool:
|
||||||
"""Sends remaining items in your world to their recipients."""
|
"""Sends remaining items in your world to their recipients."""
|
||||||
if self.ctx.allow_forfeits.get((self.client.team, self.client.slot), False):
|
if self.ctx.allow_releases.get((self.client.team, self.client.slot), False):
|
||||||
release_player(self.ctx, self.client.team, self.client.slot)
|
release_player(self.ctx, self.client.team, self.client.slot)
|
||||||
return True
|
return True
|
||||||
if "enabled" in self.ctx.release_mode:
|
if "enabled" in self.ctx.release_mode:
|
||||||
|
@ -1885,7 +1886,7 @@ class ServerCommandProcessor(CommonCommandProcessor):
|
||||||
player = self.resolve_player(player_name)
|
player = self.resolve_player(player_name)
|
||||||
if player:
|
if player:
|
||||||
team, slot, name = player
|
team, slot, name = player
|
||||||
self.ctx.allow_forfeits[(team, slot)] = True
|
self.ctx.allow_releases[(team, slot)] = True
|
||||||
self.output(f"Player {name} is now allowed to use the !release command at any time.")
|
self.output(f"Player {name} is now allowed to use the !release command at any time.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -1898,7 +1899,7 @@ class ServerCommandProcessor(CommonCommandProcessor):
|
||||||
player = self.resolve_player(player_name)
|
player = self.resolve_player(player_name)
|
||||||
if player:
|
if player:
|
||||||
team, slot, name = player
|
team, slot, name = player
|
||||||
self.ctx.allow_forfeits[(team, slot)] = False
|
self.ctx.allow_releases[(team, slot)] = False
|
||||||
self.output(f"Player {name} has to follow the server restrictions on use of the !release command.")
|
self.output(f"Player {name} has to follow the server restrictions on use of the !release command.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -2053,7 +2054,7 @@ class ServerCommandProcessor(CommonCommandProcessor):
|
||||||
return input_text
|
return input_text
|
||||||
setattr(self.ctx, option_name, attrtype(option))
|
setattr(self.ctx, option_name, attrtype(option))
|
||||||
self.output(f"Set option {option_name} to {getattr(self.ctx, option_name)}")
|
self.output(f"Set option {option_name} to {getattr(self.ctx, option_name)}")
|
||||||
if option_name in {"forfeit_mode", "release_mode", "remaining_mode", "collect_mode"}: # TODO remove forfeit_mode with 0.4
|
if option_name in {"release_mode", "remaining_mode", "collect_mode"}:
|
||||||
self.ctx.broadcast_all([{"cmd": "RoomUpdate", 'permissions': get_permissions(self.ctx)}])
|
self.ctx.broadcast_all([{"cmd": "RoomUpdate", 'permissions': get_permissions(self.ctx)}])
|
||||||
elif option_name in {"hint_cost", "location_check_points"}:
|
elif option_name in {"hint_cost", "location_check_points"}:
|
||||||
self.ctx.broadcast_all([{"cmd": "RoomUpdate", option_name: getattr(self.ctx, option_name)}])
|
self.ctx.broadcast_all([{"cmd": "RoomUpdate", option_name: getattr(self.ctx, option_name)}])
|
||||||
|
|
|
@ -43,7 +43,7 @@ class Permission(enum.IntFlag):
|
||||||
disabled = 0b000 # 0, completely disables access
|
disabled = 0b000 # 0, completely disables access
|
||||||
enabled = 0b001 # 1, allows manual use
|
enabled = 0b001 # 1, allows manual use
|
||||||
goal = 0b010 # 2, allows manual use after goal completion
|
goal = 0b010 # 2, allows manual use after goal completion
|
||||||
auto = 0b110 # 6, forces use after goal completion, only works for forfeit
|
auto = 0b110 # 6, forces use after goal completion, only works for release
|
||||||
auto_enabled = 0b111 # 7, forces use after goal completion, allows manual use any time
|
auto_enabled = 0b111 # 7, forces use after goal completion, allows manual use any time
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -29,7 +29,7 @@ their game.
|
||||||
|
|
||||||
## What happens if a person has to leave early?
|
## What happens if a person has to leave early?
|
||||||
|
|
||||||
If a player must leave early, they can use Archipelago's forfeit system. When a player forfeits their game, all the
|
If a player must leave early, they can use Archipelago's release system. When a player releases their game, all the
|
||||||
items in that game which belong to other players are sent out automatically, so other players can continue to play.
|
items in that game which belong to other players are sent out automatically, so other players can continue to play.
|
||||||
|
|
||||||
## What does multi-game mean?
|
## What does multi-game mean?
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
</label>
|
</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select name="release_mode" id="forfeit_mode">
|
<select name="release_mode" id="release_mode">
|
||||||
<option value="auto">Automatic on goal completion</option>
|
<option value="auto">Automatic on goal completion</option>
|
||||||
<option value="goal">Allow !release after goal completion</option>
|
<option value="goal">Allow !release after goal completion</option>
|
||||||
<option value="auto-enabled">
|
<option value="auto-enabled">
|
||||||
|
|
|
@ -148,7 +148,7 @@ The next step is to know what you need to make the game do now that you can modi
|
||||||
- Listen for messages from the Archipelago server
|
- Listen for messages from the Archipelago server
|
||||||
- Modify the game to display messages from the Archipelago server
|
- Modify the game to display messages from the Archipelago server
|
||||||
- Add interface for connecting to the Archipelago server with passwords and sessions
|
- Add interface for connecting to the Archipelago server with passwords and sessions
|
||||||
- Add commands for manually rewarding, re-syncing, forfeiting, and other actions
|
- Add commands for manually rewarding, re-syncing, releasing, and other actions
|
||||||
|
|
||||||
To elaborate, you need to be able to inform the server whenever you check locations, print out messages that you receive
|
To elaborate, you need to be able to inform the server whenever you check locations, print out messages that you receive
|
||||||
from the server in-game so players can read them, award items when the server tells you to, sync and re-sync when necessary,
|
from the server in-game so players can read them, award items when the server tells you to, sync and re-sync when necessary,
|
||||||
|
|
|
@ -70,7 +70,7 @@ Sent to clients when they connect to an Archipelago server.
|
||||||
| version | [NetworkVersion](#NetworkVersion) | Object denoting the version of Archipelago which the server is running. |
|
| version | [NetworkVersion](#NetworkVersion) | Object denoting the version of Archipelago which the server is running. |
|
||||||
| tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. Example: `WebHost` |
|
| tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. Example: `WebHost` |
|
||||||
| password | bool | Denoted whether a password is required to join this room.|
|
| password | bool | Denoted whether a password is required to join this room.|
|
||||||
| permissions | dict\[str, [Permission](#Permission)\[int\]\] | Mapping of permission name to [Permission](#Permission), keys are: "forfeit", "collect" and "remaining". |
|
| permissions | dict\[str, [Permission](#Permission)\[int\]\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". |
|
||||||
| hint_cost | int | The amount of points it costs to receive a hint from the server. |
|
| hint_cost | int | The amount of points it costs to receive a hint from the server. |
|
||||||
| location_check_points | int | The amount of hint points you receive per item/location check completed. ||
|
| location_check_points | int | The amount of hint points you receive per item/location check completed. ||
|
||||||
| games | list\[str\] | List of games present in this multiworld. |
|
| games | list\[str\] | List of games present in this multiworld. |
|
||||||
|
@ -78,14 +78,14 @@ Sent to clients when they connect to an Archipelago server.
|
||||||
| seed_name | str | uniquely identifying name of this generation |
|
| seed_name | str | uniquely identifying name of this generation |
|
||||||
| time | float | Unix time stamp of "now". Send for time synchronization if wanted for things like the DeathLink Bounce. |
|
| time | float | Unix time stamp of "now". Send for time synchronization if wanted for things like the DeathLink Bounce. |
|
||||||
|
|
||||||
#### forfeit
|
#### release
|
||||||
Dictates what is allowed when it comes to a player forfeiting their run. A forfeit is an action which distributes the rest of the items in a player's run to those other players awaiting them.
|
Dictates what is allowed when it comes to a player releasing their run. A release is an action which distributes the rest of the items in a player's run to those other players awaiting them.
|
||||||
|
|
||||||
* `auto`: Distributes a player's items to other players when they complete their goal.
|
* `auto`: Distributes a player's items to other players when they complete their goal.
|
||||||
* `enabled`: Denotes that players may forfeit at any time in the game.
|
* `enabled`: Denotes that players may release at any time in the game.
|
||||||
* `auto-enabled`: Both of the above options together.
|
* `auto-enabled`: Both of the above options together.
|
||||||
* `disabled`: All forfeit modes disabled.
|
* `disabled`: All release modes disabled.
|
||||||
* `goal`: Allows for manual use of forfeit command once a player completes their goal. (Disabled until goal completion)
|
* `goal`: Allows for manual use of release command once a player completes their goal. (Disabled until goal completion)
|
||||||
|
|
||||||
#### collect
|
#### collect
|
||||||
Dictates what is allowed when it comes to a player collecting their run. A collect is an action which sends the rest of the items in a player's run.
|
Dictates what is allowed when it comes to a player collecting their run. A collect is an action which sends the rest of the items in a player's run.
|
||||||
|
@ -596,7 +596,7 @@ class Permission(enum.IntEnum):
|
||||||
disabled = 0b000 # 0, completely disables access
|
disabled = 0b000 # 0, completely disables access
|
||||||
enabled = 0b001 # 1, allows manual use
|
enabled = 0b001 # 1, allows manual use
|
||||||
goal = 0b010 # 2, allows manual use after goal completion
|
goal = 0b010 # 2, allows manual use after goal completion
|
||||||
auto = 0b110 # 6, forces use after goal completion, only works for forfeit and collect
|
auto = 0b110 # 6, forces use after goal completion, only works for release and collect
|
||||||
auto_enabled = 0b111 # 7, forces use after goal completion, allows manual use any time
|
auto_enabled = 0b111 # 7, forces use after goal completion, allows manual use any time
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -70,10 +70,9 @@ including the exclamation point.
|
||||||
names such as Factorio.
|
names such as Factorio.
|
||||||
- `!hint <item name>` Tells you at which location in whose game your Item is. Note you need to have checked some
|
- `!hint <item name>` Tells you at which location in whose game your Item is. Note you need to have checked some
|
||||||
locations to earn a hint. You can check how many you have by just running `!hint`
|
locations to earn a hint. You can check how many you have by just running `!hint`
|
||||||
- `!forfeit` If you didn't turn on auto-forfeit or if you allowed forfeiting prior to goal completion. Remember that "
|
- `!release` If you didn't turn on auto-release or if you allowed releasing prior to goal completion. Remember that "
|
||||||
forfeiting" actually means sending out your remaining items in your world.
|
releasing" actually means sending out your remaining items in your world.
|
||||||
- `!collect` Grants you all the remaining checks in your world. Can only be used after your goal is complete or when you
|
- `!collect` Grants you all the remaining checks in your world. Typically used after goal completion.
|
||||||
have forfeited.
|
|
||||||
|
|
||||||
#### Host only (on Archipelago.gg or in your server console)
|
#### Host only (on Archipelago.gg or in your server console)
|
||||||
|
|
||||||
|
@ -87,9 +86,9 @@ including the exclamation point.
|
||||||
- `/exit` Shutdown the server
|
- `/exit` Shutdown the server
|
||||||
- `/alias <player name> <alias name>` Assign a player an alias.
|
- `/alias <player name> <alias name>` Assign a player an alias.
|
||||||
- `/collect <player name>` Send out any items remaining in the multiworld belonging to the given player.
|
- `/collect <player name>` Send out any items remaining in the multiworld belonging to the given player.
|
||||||
- `/forfeit <player name>` Forfeits someone regardless of settings and game completion status
|
- `/release <player name>` Releases someone regardless of settings and game completion status
|
||||||
- `/allow_forfeit <player name>` Allows the given player to use the `!forfeit` command.
|
- `/allow_release <player name>` Allows the given player to use the `!release` command.
|
||||||
- `/forbid_forfeit <player name>` Bars the given player from using the `!forfeit` command.
|
- `/forbid_release <player name>` Bars the given player from using the `!release` command.
|
||||||
- `/send <player name> <item name>` Grants the given player the specified item.
|
- `/send <player name> <item name>` Grants the given player the specified item.
|
||||||
- `/send_multiple <amount> <player name> <item name>` Grants the given player the stated amount of the specified item.
|
- `/send_multiple <amount> <player name> <item name>` Grants the given player the stated amount of the specified item.
|
||||||
- `/send_location <player name> <location name>` Send out the given location for the specified player as if the player checked it
|
- `/send_location <player name> <location name>` Send out the given location for the specified player as if the player checked it
|
||||||
|
|
|
@ -69,7 +69,7 @@ multiworld. The output of this process is placed in the `output` folder.
|
||||||
#### Changing local host settings for generation
|
#### Changing local host settings for generation
|
||||||
|
|
||||||
Sometimes there are various settings that you may want to change before rolling a seed such as enabling race mode,
|
Sometimes there are various settings that you may want to change before rolling a seed such as enabling race mode,
|
||||||
auto-forfeit, plando support, or setting a password.
|
auto-release, plando support, or setting a password.
|
||||||
|
|
||||||
All of these settings plus other options are able to be changed by modifying the `host.yaml` file in the Archipelago
|
All of these settings plus other options are able to be changed by modifying the `host.yaml` file in the Archipelago
|
||||||
installation folder. The settings chosen here are baked into the `.archipelago` file that gets output with the other
|
installation folder. The settings chosen here are baked into the `.archipelago` file that gets output with the other
|
||||||
|
|
|
@ -8,7 +8,7 @@ should only take a couple of minutes to read.
|
||||||
1. After gathering the YAML files together in one location, select all the files and compress them into a `.ZIP` file.
|
1. After gathering the YAML files together in one location, select all the files and compress them into a `.ZIP` file.
|
||||||
2. Next go to the "Generate Game" page. Generate game
|
2. Next go to the "Generate Game" page. Generate game
|
||||||
page: [Archipelago Seed Generation Page](/generate). Here, you can adjust some server settings
|
page: [Archipelago Seed Generation Page](/generate). Here, you can adjust some server settings
|
||||||
such as forfeit rules and the cost for a player to use a hint before generation.
|
such as release rules and the cost for a player to use a hint before generation.
|
||||||
3. After adjusting the host settings to your liking click on the Upload File button and using the explorer window that
|
3. After adjusting the host settings to your liking click on the Upload File button and using the explorer window that
|
||||||
opens, navigate to the location where you zipped the player files and upload this zip. The page will generate your
|
opens, navigate to the location where you zipped the player files and upload this zip. The page will generate your
|
||||||
game and refresh multiple times to check on completion status.
|
game and refresh multiple times to check on completion status.
|
||||||
|
|
|
@ -48,7 +48,7 @@ At minimum, every seed will require you to find the Cursed Seal and bring it bac
|
||||||
- `any_ending`: You must defeat the final boss.
|
- `any_ending`: You must defeat the final boss.
|
||||||
- `true_ending`: You must first explore all 3000 rooms of the Atlas Dome and find the Agate Knife, then fight the final boss' true form.
|
- `true_ending`: You must first explore all 3000 rooms of the Atlas Dome and find the Agate Knife, then fight the final boss' true form.
|
||||||
|
|
||||||
Once the goal has been completed, you may press F to send a forfeit, sending out all of your world's remaining items to their respective players, and C to send a collect, which gathers up all of your world's items from their shuffled locations in other player's worlds. You may also press S to view your statistics, if you're a fan of numbers.
|
Once the goal has been completed, you may press F to send a release, sending out all of your world's remaining items to their respective players, and C to send a collect, which gathers up all of your world's items from their shuffled locations in other player's worlds. You may also press S to view your statistics, if you're a fan of numbers.
|
||||||
|
|
||||||
More in-depth information about the game can be found in the game's help file, accessed by pressing H while playing.
|
More in-depth information about the game can be found in the game's help file, accessed by pressing H while playing.
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ class ShuffleVaultBoxes(Toggle):
|
||||||
|
|
||||||
class ShufflePostgame(Toggle):
|
class ShufflePostgame(Toggle):
|
||||||
"""Adds locations into the pool that are guaranteed to become accessible after or at the same time as your goal.
|
"""Adds locations into the pool that are guaranteed to become accessible after or at the same time as your goal.
|
||||||
Use this if you don't play with forfeit on victory. IMPORTANT NOTE: The possibility of your second
|
Use this if you don't play with release on victory. IMPORTANT NOTE: The possibility of your second
|
||||||
"Progressive Dots" showing up in the Caves is ignored, they will still be considered "postgame" in base settings."""
|
"Progressive Dots" showing up in the Caves is ignored, they will still be considered "postgame" in base settings."""
|
||||||
display_name = "Shuffle Postgame"
|
display_name = "Shuffle Postgame"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue