diff --git a/Buttons/Explore.py b/Buttons/Explore.py index fd365b8..ebb6234 100644 --- a/Buttons/Explore.py +++ b/Buttons/Explore.py @@ -115,6 +115,12 @@ async def exploreTile(game: GamestateHelper, player, interaction: discord.Intera player = game.get_player(interaction.user.id,interaction) msg = customID.split("_") position = msg[1] + + # Lock turn restart because of exposed hidden tile information. + player_helper = PlayerHelper(game.get_player_from_color(player['color']), player) + player_helper.setCannotRestart(True) + game.update_player(player_helper) + if len(msg) > 2: tileID = msg[2] game.tile_discard(msg[3]) diff --git a/Buttons/Research.py b/Buttons/Research.py index b5f2539..0e7ea78 100644 --- a/Buttons/Research.py +++ b/Buttons/Research.py @@ -111,6 +111,9 @@ async def handle_specific_tech_selection(interaction: discord.Interaction, game: game.addDiscTile(game.getLocationFromID(player["home_planet"])) await DiscoveryTileButtons.exploreDiscoveryTile(game, game.getLocationFromID(player["home_planet"]), interaction, player) + # Lock turn restart because of exposed hidden tile information. + player_helper.setCannotRestart(True) + game.update_player(player_helper) lenTech = len(player[f"{tech_type}_tech"]) if lenTech == 4 and "magDiscTileUsed" in player and not player.get("magDiscTileUsed"): await interaction.channel.send(player["player_name"] + " due to researching your fourth tech" @@ -119,6 +122,8 @@ async def handle_specific_tech_selection(interaction: discord.Interaction, game: game.useMagDisc(str(interaction.user.id)) await DiscoveryTileButtons.exploreDiscoveryTile(game, game.getLocationFromID(player["home_planet"]), interaction, player) + player_helper.setCannotRestart(True) + game.update_player(player_helper) @staticmethod async def placeWarpPortal(interaction: discord.Interaction, game: GamestateHelper, player, customID): diff --git a/Buttons/Turn.py b/Buttons/Turn.py index b8533dc..f37f959 100644 --- a/Buttons/Turn.py +++ b/Buttons/Turn.py @@ -36,6 +36,15 @@ def getFirstPlayer(game: GamestateHelper): @staticmethod async def restartTurn(player, game: GamestateHelper, interaction: discord.Interaction): + player_helper = PlayerHelper(game.getPlayersID(player), player) + # Enforce rule: No turn resets allowed after gaining tile information + if player_helper.cannotRestart(): + await interaction.followup.send( + f"❌ {player['player_name']}, you cannot restart your turn after revealing a tile!", + ephemeral=True + ) + return + try: await interaction.message.delete() game.backUpToLastSaveFile() @@ -55,6 +64,12 @@ async def restartTurn(player, game: GamestateHelper, interaction: discord.Intera async def endTurn(player, game: GamestateHelper, interaction: discord.Interaction): from helpers.CombatHelper import Combat nextPlayer = game.get_next_player(player) + + # Clear the restart lockout flag when the turn successfully concludes + player_helper = PlayerHelper(game.getPlayersID(player), player) + player_helper.setCannotRestart(False) + game.update_player(player_helper) + await game.updateNamesAndOutRimTiles(interaction) game.initilizeKey("20MinReminder") if nextPlayer is not None and not game.is_everyone_passed(): diff --git a/commands/player_commands.py b/commands/player_commands.py index 46b5be5..6ba4712 100644 --- a/commands/player_commands.py +++ b/commands/player_commands.py @@ -285,6 +285,19 @@ async def set_traitor(self, interaction: discord.Interaction, traitor: bool, game.update_player(player_helper) await interaction.response.send_message(f"{player.mention} set traitor status to {traitor}.") + @app_commands.command(name="set_cannot_restart") + async def set_cannot_restart(self, interaction: discord.Interaction, cannot_restart: bool, + player: Optional[discord.Member] = None): + if player is None: + player = interaction.user + game = GamestateHelper(interaction.channel) + p1 = game.get_player(player.id,interaction) + player_helper = PlayerHelper(player.id, p1) + player_helper.setCannotRestart(cannot_restart) + game.update_player(player_helper) + await interaction.response.send_message(f"{player.mention} set cannot_restart status to {cannot_restart}.") + + @app_commands.command(name="draw_reputation") async def draw_reputation(self, interaction: discord.Interaction, num_options: int): game = GamestateHelper(interaction.channel) diff --git a/helpers/PlayerHelper.py b/helpers/PlayerHelper.py index 25d9113..1bbbae9 100644 --- a/helpers/PlayerHelper.py +++ b/helpers/PlayerHelper.py @@ -13,6 +13,12 @@ def isTraitor(self): else: return False + def cannotRestart(self): + if self.stats.get("cannot_restart"): + return True + else: + return False + def adjust_materials(self, adjustment): before = self.stats["materials"] self.stats["materials"] += adjustment @@ -131,6 +137,9 @@ def passTurn(self, passed: bool): def setTraitor(self, traitor: bool): self.stats["traitor"] = traitor + + def setCannotRestart(self, cannot_restart: bool): + self.stats["cannot_restart"] = cannot_restart def setEliminated(self, eliminated: bool): self.stats["eliminated"] = eliminated