diff --git a/data/hints/chat_commands.csv b/data/hints/chat_commands.csv index b0650685a..5a3c3b1ae 100644 --- a/data/hints/chat_commands.csv +++ b/data/hints/chat_commands.csv @@ -54,4 +54,5 @@ The different versions [color=GOLD]attack[/color] vs [color=GOLD]friendly[/color [color=GOLD]/check-range-attack off[/color] to hide range checker. " -"/print-ranges-to-towers","Print ranges between selected tower and all other towers." \ No newline at end of file +"/print-ranges-to-towers","Print ranges between selected tower and all other towers." +"/allow-all","Enables shared build space for teammates so that they can build towers in each other's areas." diff --git a/src/game_scene/build_space.gd b/src/game_scene/build_space.gd index 378d5ca79..c0bded0ac 100644 --- a/src/game_scene/build_space.gd +++ b/src/game_scene/build_space.gd @@ -91,13 +91,29 @@ func get_build_info_for_pos(player: Player, pos_canvas: Vector2) -> Array: var quarter_pos: Vector2i = pos_map + offset quarter_list.append(quarter_pos) + var team: Team = player.get_team() + var allow_shared_build_space: bool = team.get_allow_shared_build_space() + +# NOTE: normally players can only build in their own areas +# but if this option is enabled, then players can build in +# teammate areas as well + var matching_player_id_list: Array[int] = [] + if allow_shared_build_space: + var player_list: Array[Player] = team.get_players() + + for team_player in player_list: + var team_player_id: int = team_player.get_id() + matching_player_id_list.append(team_player_id) + else: + matching_player_id_list.append(player_id) + var build_info: Array = [false, false, false, false] for i in range(0, 4): var quarter_pos: Vector2i = quarter_list[i] var quarter_pos_is_occupied: bool = _occupied_map.get(quarter_pos, false) var player_id_at_quarter_pos: int = _buildable_cells.get(quarter_pos, -1) - var quarter_is_buildable: bool = player_id_at_quarter_pos == player_id + var quarter_is_buildable: bool = matching_player_id_list.has(player_id_at_quarter_pos) build_info[i] = !quarter_pos_is_occupied && quarter_is_buildable diff --git a/src/game_scene/chat_commands.gd b/src/game_scene/chat_commands.gd index e311d473c..717b9b1e4 100644 --- a/src/game_scene/chat_commands.gd +++ b/src/game_scene/chat_commands.gd @@ -24,6 +24,7 @@ const UNPAUSE: Array[String] = ["/unpause"] const CHECK_RANGE_FRIENDLY: Array[String] = ["/check-range-friendly", "/crf"] const CHECK_RANGE_ATTACK: Array[String] = ["/check-range-attack", "/cra"] const PRINT_RANGES_TO_TOWERS: Array[String] = ["/print-ranges-to-towers", "/prtt"] +const ALLOW_ALL: Array[String] = ["/allow-all"] const CREATE_ITEM: Array[String] = ["/createitem", "/ci"] const PAUSE_WAVES: Array[String] = ["/pause-waves", "/pw"] @@ -178,6 +179,8 @@ func process_command(player: Player, command: String): _command_check_range_attack(player, command_args) elif PRINT_RANGES_TO_TOWERS.has(command_main): _command_print_ranges_to_towers(player) + elif ALLOW_ALL.has(command_main): + _command_allow_all(player) else: _add_error(player, "Unknown command: %s" % command_main) @@ -583,6 +586,14 @@ func _command_print_ranges_to_towers(player: Player): await get_tree().create_timer(1.0).timeout +func _command_allow_all(player: Player): + var team: Team = player.get_team() + + team.enable_allow_shared_build_space() + + _add_status_for_team(team, "Players in this team can now build towers in each other's area.") + + func _command_check_range_helper(player: Player, args: Array, friendly: bool): if args.size() != 1: _add_error(player, "Invalid command args. Must specify range value or \"off\" to disable range checker.") diff --git a/src/player/team.gd b/src/player/team.gd index e35cd04b5..2ae8f8ab8 100644 --- a/src/player/team.gd +++ b/src/player/team.gd @@ -21,6 +21,7 @@ var _level: int = 1 var _player_list: Array[Player] = [] var _finished_the_game: bool = false var _player_defined_autospawn_time: float = -1 +var _allow_shared_build_space: bool = false @export var _next_wave_timer: ManualTimer @export var _portal_damage_sound_cooldown_timer: Timer @@ -194,6 +195,14 @@ func get_start_wave_action_is_on_cooldown() -> bool: return is_on_cooldown +func enable_allow_shared_build_space(): + _allow_shared_build_space = true + + +func get_allow_shared_build_space() -> bool: + return _allow_shared_build_space + + ######################### ### Private ### #########################