Skip to content

Commit 6d112e5

Browse files
authored
Show all players (#57)
* show all players * show all players * settlers can't attack * fix movement dialog, player status * fix movement dialog, player status * fix movement * add "back to modal dialog" * fmt
1 parent 22b52c7 commit 6d112e5

23 files changed

+467
-270
lines changed

client/src/advance_ui.rs

+12-11
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use server::playing_actions::PlayingAction;
1111
use server::resource_pile::AdvancePaymentOptions;
1212
use server::status_phase::{StatusPhaseAction, StatusPhaseState};
1313

14-
use crate::client_state::{can_play_action, ActiveDialog, StateUpdate};
14+
use crate::client_state::{ActiveDialog, ShownPlayer, StateUpdate};
1515
use crate::dialog_ui::dialog_window;
1616
use crate::payment_ui::{payment_dialog, HasPayment, Payment, ResourcePayment};
1717
use crate::resource_ui::{new_resource_map, ResourceType};
@@ -76,33 +76,33 @@ impl HasPayment for AdvancePayment {
7676
}
7777
}
7878

79-
pub fn show_advance_menu(game: &Game, player_index: usize) -> StateUpdate {
80-
show_generic_advance_menu("Advances", game, player_index, true, |name| {
79+
pub fn show_advance_menu(game: &Game, player: &ShownPlayer) -> StateUpdate {
80+
show_generic_advance_menu("Advances", game, player, true, |name| {
8181
StateUpdate::SetDialog(ActiveDialog::AdvancePayment(AdvancePayment::new(
8282
game,
83-
player_index,
83+
player.index,
8484
&name,
8585
)))
8686
})
8787
}
8888

89-
pub fn show_free_advance_menu(game: &Game, player_index: usize) -> StateUpdate {
90-
show_generic_advance_menu("Select a free advance", game, player_index, false, |name| {
89+
pub fn show_free_advance_menu(game: &Game, player: &ShownPlayer) -> StateUpdate {
90+
show_generic_advance_menu("Select a free advance", game, player, false, |name| {
9191
StateUpdate::status_phase(StatusPhaseAction::FreeAdvance(name))
9292
})
9393
}
9494

9595
pub fn show_generic_advance_menu(
9696
title: &str,
9797
game: &Game,
98-
player_index: usize,
98+
player: &ShownPlayer,
9999
close_button: bool,
100100
new_update: impl Fn(String) -> StateUpdate,
101101
) -> StateUpdate {
102-
dialog_window(title, close_button, |ui| {
102+
dialog_window(player, title, close_button, |ui| {
103103
for a in get_all() {
104104
let name = a.name;
105-
let p = game.get_player(player_index);
105+
let p = player.get(game);
106106
if p.has_advance(&name) {
107107
ui.label(None, &name);
108108
} else {
@@ -112,7 +112,7 @@ pub fn show_generic_advance_menu(
112112
) {
113113
p.can_advance_free(&name)
114114
} else {
115-
can_play_action(game) && p.can_advance(&name)
115+
player.can_control && p.can_advance(&name)
116116
};
117117
if can && ui.button(None, name.clone()) {
118118
return new_update(name);
@@ -123,8 +123,9 @@ pub fn show_generic_advance_menu(
123123
})
124124
}
125125

126-
pub fn pay_advance_dialog(ap: &AdvancePayment) -> StateUpdate {
126+
pub fn pay_advance_dialog(ap: &AdvancePayment, player: &ShownPlayer) -> StateUpdate {
127127
payment_dialog(
128+
player,
128129
&format!("Pay for advance {}", ap.name),
129130
ap,
130131
AdvancePayment::valid,

client/src/city_ui.rs

+12-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use server::player::Player;
88
use server::position::Position;
99
use server::unit::Units;
1010

11-
use crate::client_state::{can_play_action, ActiveDialog, State, StateUpdate, StateUpdates};
11+
use crate::client_state::{ActiveDialog, ShownPlayer, State, StateUpdate, StateUpdates};
1212
use crate::collect_ui::{possible_resource_collections, CollectResources};
1313
use crate::construct_ui::{add_construct_button, add_wonder_buttons};
1414
use crate::hex_ui::draw_hex_center_text;
@@ -17,48 +17,44 @@ use crate::recruit_unit_ui::RecruitAmount;
1717
use crate::{hex_ui, influence_ui, player_ui};
1818

1919
pub struct CityMenu {
20-
pub player_index: usize,
20+
pub player: ShownPlayer,
2121
pub city_owner_index: usize,
2222
pub city_position: Position,
2323
}
2424

2525
impl CityMenu {
26-
pub fn new(player_index: usize, city_owner_index: usize, city_position: Position) -> Self {
26+
pub fn new(player: &ShownPlayer, city_owner_index: usize, city_position: Position) -> Self {
2727
CityMenu {
28-
player_index,
28+
player: player.clone(),
2929
city_owner_index,
3030
city_position,
3131
}
3232
}
3333

34-
pub fn get_player<'a>(&self, game: &'a Game) -> &'a Player {
35-
game.get_player(self.player_index)
36-
}
37-
3834
pub fn get_city_owner<'a>(&self, game: &'a Game) -> &'a Player {
3935
game.get_player(self.city_owner_index)
4036
}
4137

4238
pub fn get_city<'a>(&self, game: &'a Game) -> &'a City {
43-
return game.get_city(self.city_owner_index, self.city_position);
39+
game.get_city(self.city_owner_index, self.city_position)
4440
}
4541

4642
pub fn is_city_owner(&self) -> bool {
47-
self.player_index == self.city_owner_index
43+
self.player.index == self.city_owner_index
4844
}
4945
}
5046

5147
pub fn show_city_menu(game: &Game, menu: &CityMenu) -> StateUpdate {
5248
let position = menu.city_position;
5349
let city = menu.get_city(game);
5450

55-
show_generic_tile_menu(game, position, city_label(game, city), |ui| {
56-
let can_play = can_play_action(game) && menu.is_city_owner() && city.can_activate();
51+
show_generic_tile_menu(game, position, &menu.player, city_label(game, city), |ui| {
52+
let can_play = menu.player.can_play_action && menu.is_city_owner() && city.can_activate();
5753
if can_play {
5854
if ui.button(None, "Collect Resources") {
5955
return StateUpdate::SetDialog(ActiveDialog::CollectResources(
6056
CollectResources::new(
61-
menu.player_index,
57+
menu.player.index,
6258
menu.city_position,
6359
possible_resource_collections(
6460
game,
@@ -71,7 +67,7 @@ pub fn show_city_menu(game: &Game, menu: &CityMenu) -> StateUpdate {
7167
if ui.button(None, "Recruit Units") {
7268
return RecruitAmount::new_selection(
7369
game,
74-
menu.player_index,
70+
menu.player.index,
7571
menu.city_position,
7672
Units::empty(),
7773
None,
@@ -127,11 +123,10 @@ fn city_label(game: &Game, city: &City) -> Vec<String> {
127123
}
128124

129125
fn add_building_actions(game: &Game, menu: &CityMenu, ui: &mut Ui) -> StateUpdate {
130-
let closest_city_pos = influence_ui::closest_city(game, menu);
131-
132-
if !can_play_action(game) {
126+
if !menu.player.can_play_action {
133127
return StateUpdate::None;
134128
}
129+
let closest_city_pos = influence_ui::closest_city(game, menu);
135130

136131
let mut updates = StateUpdates::new();
137132
for (building, name) in building_names() {

client/src/client.rs

+81-76
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use server::status_phase::StatusPhaseAction;
99

1010
use crate::advance_ui::{pay_advance_dialog, show_advance_menu, show_free_advance_menu};
1111
use crate::client_state::{
12-
ActiveDialog, ControlPlayers, PendingUpdate, State, StateUpdate, StateUpdates,
12+
ActiveDialog, PendingUpdate, ShownPlayer, State, StateUpdate, StateUpdates,
1313
};
1414
use crate::collect_ui::{click_collect_option, collect_resources_dialog};
1515
use crate::construct_ui::pay_construction_dialog;
@@ -33,20 +33,6 @@ pub fn render_and_update(
3333
sync_result: &GameSyncResult,
3434
features: &Features,
3535
) -> GameSyncRequest {
36-
match state.control_players {
37-
ControlPlayers::None => {
38-
// todo add spectator mode
39-
return GameSyncRequest::None;
40-
}
41-
ControlPlayers::All => {}
42-
ControlPlayers::Own(p) => {
43-
if game.active_player() != p {
44-
// todo add spectator mode
45-
return GameSyncRequest::None;
46-
}
47-
}
48-
}
49-
5036
match sync_result {
5137
GameSyncResult::None => {}
5238
GameSyncResult::Update => {
@@ -63,82 +49,97 @@ pub fn render_and_update(
6349

6450
fn render(game: &Game, state: &State, features: &Features) -> StateUpdate {
6551
let player_index = game.active_player();
52+
let player = &state.shown_player(game);
6653
clear_background(WHITE);
6754

6855
draw_map(game, state);
6956
let mut updates = StateUpdates::new();
70-
show_globals(game);
57+
let update = show_globals(game, player);
58+
updates.add(update);
7159
show_resources(game, player_index);
7260
show_wonders(game, player_index);
7361

74-
if root_ui().button(vec2(1200., 130.), "Log") {
75-
return StateUpdate::OpenDialog(ActiveDialog::Log);
76-
};
7762
if root_ui().button(vec2(1200., 100.), "Advances") {
7863
return StateUpdate::OpenDialog(ActiveDialog::AdvanceMenu);
7964
};
80-
if features.import_export {
65+
if root_ui().button(vec2(1200., 130.), "Log") {
66+
return StateUpdate::OpenDialog(ActiveDialog::Log);
67+
};
68+
let d = state.game_state_dialog(game, &ActiveDialog::None);
69+
if !matches!(d, ActiveDialog::None)
70+
&& d.title() != state.active_dialog.title()
71+
&& root_ui().button(vec2(1200., 160.), format!("Back to {}", d.title()))
72+
{
73+
return StateUpdate::OpenDialog(d);
74+
}
75+
76+
if features.import_export && player.can_control {
8177
if root_ui().button(vec2(1200., 290.), "Import") {
8278
return StateUpdate::Import;
8379
};
8480
if root_ui().button(vec2(1250., 290.), "Export") {
8581
return StateUpdate::Export;
8682
};
8783
}
88-
89-
if let Some(u) = &state.pending_update {
90-
updates.add(show_pending_update(u));
91-
return updates.result();
84+
if player.can_control {
85+
if let Some(u) = &state.pending_update {
86+
updates.add(show_pending_update(u, player));
87+
return updates.result();
88+
}
9289
}
9390

94-
if game.state == server::game::GameState::Playing {
91+
if player.can_play_action {
9592
updates.add(show_increase_happiness(game, player_index));
9693
}
9794
updates.add(show_global_controls(game, state));
9895

9996
updates.add(match &state.active_dialog {
10097
ActiveDialog::None => StateUpdate::None,
10198
ActiveDialog::Log => show_log(game),
102-
ActiveDialog::TileMenu(p) => show_tile_menu(game, *p),
99+
ActiveDialog::TileMenu(p) => show_tile_menu(game, *p, player),
103100
ActiveDialog::WaitingForUpdate => {
104-
active_dialog_window("Waiting for update", |_ui| StateUpdate::None)
101+
active_dialog_window(player, "Waiting for update", |_ui| StateUpdate::None)
105102
}
106103

107104
// playing actions
108-
ActiveDialog::IncreaseHappiness(h) => increase_happiness_menu(h),
109-
ActiveDialog::AdvanceMenu => show_advance_menu(game, player_index),
110-
ActiveDialog::AdvancePayment(p) => pay_advance_dialog(p),
111-
ActiveDialog::ConstructionPayment(p) => pay_construction_dialog(game, p),
112-
ActiveDialog::CollectResources(c) => collect_resources_dialog(game, c),
113-
ActiveDialog::RecruitUnitSelection(s) => recruit_unit_ui::select_dialog(game, s),
114-
ActiveDialog::ReplaceUnits(r) => recruit_unit_ui::replace_dialog(game, r),
115-
ActiveDialog::MoveUnits(s) => move_ui::move_units_dialog(game, s),
105+
ActiveDialog::IncreaseHappiness(h) => increase_happiness_menu(h, player),
106+
ActiveDialog::AdvanceMenu => show_advance_menu(game, player),
107+
ActiveDialog::AdvancePayment(p) => pay_advance_dialog(p, player),
108+
ActiveDialog::ConstructionPayment(p) => pay_construction_dialog(game, p, player),
109+
ActiveDialog::CollectResources(c) => collect_resources_dialog(game, c, player),
110+
ActiveDialog::RecruitUnitSelection(s) => recruit_unit_ui::select_dialog(game, s, player),
111+
ActiveDialog::ReplaceUnits(r) => recruit_unit_ui::replace_dialog(game, r, player),
112+
ActiveDialog::MoveUnits(s) => move_ui::move_units_dialog(game, s, player),
116113
ActiveDialog::CulturalInfluenceResolution(c) => {
117-
influence_ui::cultural_influence_resolution_dialog(c)
114+
influence_ui::cultural_influence_resolution_dialog(c, player)
118115
}
119116

120117
//status phase
121-
ActiveDialog::FreeAdvance => show_free_advance_menu(game, player_index),
122-
ActiveDialog::RaseSize1City => status_phase_ui::raze_city_dialog(),
123-
ActiveDialog::DetermineFirstPlayer => status_phase_ui::determine_first_player_dialog(game),
124-
ActiveDialog::ChangeGovernmentType => status_phase_ui::change_government_type_dialog(game),
118+
ActiveDialog::FreeAdvance => show_free_advance_menu(game, player),
119+
ActiveDialog::RazeSize1City => status_phase_ui::raze_city_dialog(player),
120+
ActiveDialog::DetermineFirstPlayer => {
121+
status_phase_ui::determine_first_player_dialog(game, player)
122+
}
123+
ActiveDialog::ChangeGovernmentType => {
124+
status_phase_ui::change_government_type_dialog(game, player)
125+
}
125126
ActiveDialog::ChooseAdditionalAdvances(a) => {
126-
status_phase_ui::choose_additional_advances_dialog(game, a)
127+
status_phase_ui::choose_additional_advances_dialog(game, a, player)
127128
}
128129

129130
//combat
130-
ActiveDialog::PlaceSettler => combat_ui::place_settler_dialog(),
131-
ActiveDialog::Retreat => combat_ui::retreat_dialog(),
132-
ActiveDialog::RemoveCasualties(s) => combat_ui::remove_casualties_dialog(game, s),
131+
ActiveDialog::PlaceSettler => combat_ui::place_settler_dialog(player),
132+
ActiveDialog::Retreat => combat_ui::retreat_dialog(player),
133+
ActiveDialog::RemoveCasualties(s) => combat_ui::remove_casualties_dialog(game, s, player),
133134
});
134135

135-
updates.add(try_click(game, state, player_index));
136+
updates.add(try_click(game, state, player));
136137

137138
updates.result()
138139
}
139140

140-
fn show_pending_update(update: &PendingUpdate) -> StateUpdate {
141-
active_dialog_window("Are you sure?", |ui| {
141+
fn show_pending_update(update: &PendingUpdate, player: &ShownPlayer) -> StateUpdate {
142+
active_dialog_window(player, "Are you sure?", |ui| {
142143
ui.label(None, &format!("Warning: {}", update.warning.join(", ")));
143144
if ui.button(None, "OK") {
144145
return StateUpdate::ResolvePendingUpdate(true);
@@ -150,7 +151,7 @@ fn show_pending_update(update: &PendingUpdate) -> StateUpdate {
150151
})
151152
}
152153

153-
pub fn try_click(game: &Game, state: &State, player_index: usize) -> StateUpdate {
154+
pub fn try_click(game: &Game, state: &State, player: &ShownPlayer) -> StateUpdate {
154155
if !is_mouse_button_pressed(MouseButton::Left) {
155156
return StateUpdate::None;
156157
}
@@ -161,38 +162,42 @@ pub fn try_click(game: &Game, state: &State, player_index: usize) -> StateUpdate
161162
return StateUpdate::None;
162163
}
163164

164-
match &state.active_dialog {
165-
ActiveDialog::MoveUnits(s) => move_ui::click(pos, s),
166-
ActiveDialog::ReplaceUnits(r) => recruit_unit_ui::click_replace(pos, r),
167-
ActiveDialog::RemoveCasualties(_s) => StateUpdate::None,
168-
ActiveDialog::CollectResources(col) => click_collect_option(col, pos),
169-
ActiveDialog::RaseSize1City => {
170-
if game.players[player_index].can_raze_city(pos) {
171-
StateUpdate::status_phase(StatusPhaseAction::RaseSize1City(Some(pos)))
172-
} else {
173-
StateUpdate::None
165+
if player.can_control {
166+
match &state.active_dialog {
167+
ActiveDialog::MoveUnits(s) => move_ui::click(pos, s),
168+
ActiveDialog::ReplaceUnits(r) => recruit_unit_ui::click_replace(pos, r),
169+
ActiveDialog::RemoveCasualties(_s) => StateUpdate::None,
170+
ActiveDialog::CollectResources(col) => click_collect_option(col, pos),
171+
ActiveDialog::RazeSize1City => {
172+
if player.get(game).can_raze_city(pos) {
173+
StateUpdate::status_phase(StatusPhaseAction::RaseSize1City(Some(pos)))
174+
} else {
175+
StateUpdate::None
176+
}
174177
}
175-
}
176-
ActiveDialog::PlaceSettler => {
177-
if game.players[player_index].get_city(pos).is_some() {
178-
StateUpdate::Execute(Action::PlaceSettler(pos))
179-
} else {
180-
StateUpdate::None
178+
ActiveDialog::PlaceSettler => {
179+
if player.get(game).get_city(pos).is_some() {
180+
StateUpdate::Execute(Action::PlaceSettler(pos))
181+
} else {
182+
StateUpdate::None
183+
}
181184
}
182-
}
183-
ActiveDialog::IncreaseHappiness(h) => {
184-
if let Some(city) = game.players[player_index].get_city(pos) {
185-
StateUpdate::SetDialog(ActiveDialog::IncreaseHappiness(add_increase_happiness(
186-
&game.players[player_index],
187-
city,
188-
pos,
189-
h,
190-
)))
191-
} else {
192-
StateUpdate::None
185+
ActiveDialog::IncreaseHappiness(h) => {
186+
if let Some(city) = player.get(game).get_city(pos) {
187+
StateUpdate::SetDialog(ActiveDialog::IncreaseHappiness(add_increase_happiness(
188+
player.get(game),
189+
city,
190+
pos,
191+
h,
192+
)))
193+
} else {
194+
StateUpdate::None
195+
}
193196
}
197+
_ => StateUpdate::OpenDialog(ActiveDialog::TileMenu(pos)),
194198
}
195-
_ => StateUpdate::OpenDialog(ActiveDialog::TileMenu(pos)),
199+
} else {
200+
StateUpdate::OpenDialog(ActiveDialog::TileMenu(pos))
196201
}
197202
}
198203

0 commit comments

Comments
 (0)