Skip to content

Commit 3a00e12

Browse files
authored
pirates (#166)
1 parent 5d05c93 commit 3a00e12

File tree

97 files changed

+7665
-3270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+7665
-3270
lines changed

client/Cargo.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/src/action_buttons.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ fn global_move(rc: &RenderContext) -> StateUpdate {
106106
StateUpdate::move_units(
107107
rc,
108108
pos,
109-
if pos.is_some_and(|t| rc.game.map.is_water(t)) {
109+
if pos.is_some_and(|t| rc.game.map.is_sea(t)) {
110110
MoveIntent::Sea
111111
} else {
112112
MoveIntent::Land

client/src/client.rs

+1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ fn render_active_dialog(rc: &RenderContext) -> StateUpdate {
165165
ActiveDialog::Theaters(p) => custom_actions_ui::theaters(rc, p),
166166

167167
ActiveDialog::PaymentRequest(c) => custom_phase_ui::custom_phase_payment_dialog(rc, c),
168+
ActiveDialog::PlayerRequest(r) => custom_phase_ui::player_request_dialog(rc, r),
168169
ActiveDialog::ResourceRewardRequest(p) => custom_phase_ui::payment_reward_dialog(rc, p),
169170
ActiveDialog::AdvanceRewardRequest(r) => {
170171
custom_phase_ui::advance_reward_dialog(rc, r, &custom_phase_event_origin(rc).name())

client/src/client_state.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ use macroquad::prelude::*;
1717
use server::action::Action;
1818
use server::city::{City, MoodState};
1919
use server::content::custom_phase_actions::{
20-
AdvanceRewardRequest, CustomPhaseRequest, PositionRequest, UnitTypeRequest,
20+
AdvanceRewardRequest, CustomPhaseRequest, PlayerRequest, PositionRequest, UnitTypeRequest,
2121
};
22+
use server::cultural_influence::CulturalInfluenceResolution;
2223
use server::events::EventOrigin;
23-
use server::game::{CulturalInfluenceResolution, CurrentMove, Game, GameState};
24+
use server::game::{Game, GameState};
25+
use server::move_units::CurrentMove;
2426
use server::position::Position;
2527
use server::status_phase::{StatusPhaseAction, StatusPhaseState};
2628

@@ -60,6 +62,7 @@ pub enum ActiveDialog {
6062
ResourceRewardRequest(Payment),
6163
AdvanceRewardRequest(AdvanceRewardRequest),
6264
PaymentRequest(Vec<Payment>),
65+
PlayerRequest(PlayerRequest),
6366
PositionRequest(PositionRequest),
6467
UnitTypeRequest(UnitTypeRequest),
6568
UnitsRequest(UnitsSelection),
@@ -98,6 +101,7 @@ impl ActiveDialog {
98101
ActiveDialog::ResourceRewardRequest(_) => "trade route selection",
99102
ActiveDialog::AdvanceRewardRequest(_) => "advance selection",
100103
ActiveDialog::PaymentRequest(_) => "custom phase payment request",
104+
ActiveDialog::PlayerRequest(_) => "custom phase player request",
101105
ActiveDialog::PositionRequest(_) => "custom phase position request",
102106
ActiveDialog::UnitTypeRequest(_) => "custom phase unit request",
103107
ActiveDialog::UnitsRequest(_) => "custom phase units request",
@@ -176,6 +180,7 @@ impl ActiveDialog {
176180
ActiveDialog::PositionRequest(r) => custom_phase_event_help(rc, r.description.as_ref()),
177181
ActiveDialog::UnitTypeRequest(r) => custom_phase_event_help(rc, r.description.as_ref()),
178182
ActiveDialog::UnitsRequest(r) => custom_phase_event_help(rc, r.description.as_ref()),
183+
ActiveDialog::PlayerRequest(r) => custom_phase_event_help(rc, Some(&r.description)),
179184
}
180185
}
181186

@@ -541,9 +546,15 @@ impl State {
541546
}
542547
CustomPhaseRequest::SelectPosition(r) => ActiveDialog::PositionRequest(r.clone()),
543548
CustomPhaseRequest::SelectUnitType(r) => ActiveDialog::UnitTypeRequest(r.clone()),
544-
CustomPhaseRequest::SelectUnits(r) => ActiveDialog::UnitsRequest(
545-
UnitsSelection::new(r.needed, r.choices.clone(), r.description.clone()),
546-
),
549+
CustomPhaseRequest::SelectUnits(r) => {
550+
ActiveDialog::UnitsRequest(UnitsSelection::new(
551+
r.player,
552+
r.needed,
553+
r.choices.clone(),
554+
r.description.clone(),
555+
))
556+
}
557+
CustomPhaseRequest::SelectPlayer(r) => ActiveDialog::PlayerRequest(r.clone()),
547558
CustomPhaseRequest::BoolRequest => ActiveDialog::BoolRequest,
548559
};
549560
}

client/src/construct_ui.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use server::content::custom_actions::CustomAction;
99
use server::map::Terrain;
1010
use server::playing_actions::{Construct, PlayingAction, Recruit};
1111
use server::position::Position;
12+
use server::recruit::recruit_cost;
1213

1314
pub fn new_building_positions(
1415
building: Building,
@@ -109,16 +110,15 @@ impl ConstructionPayment {
109110
city,
110111
None,
111112
),
112-
ConstructionProject::Units(sel) => rc
113-
.shown_player
114-
.recruit_cost(
115-
&sel.amount.units,
116-
city.position,
117-
sel.amount.leader_name.as_ref(),
118-
&sel.replaced_units,
119-
None,
120-
)
121-
.unwrap(),
113+
ConstructionProject::Units(sel) => recruit_cost(
114+
rc.shown_player,
115+
&sel.amount.units,
116+
city.position,
117+
sel.amount.leader_name.as_ref(),
118+
&sel.replaced_units,
119+
None,
120+
)
121+
.unwrap(),
122122
}
123123
.cost;
124124

client/src/custom_phase_ui.rs

+23-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ use crate::dialog_ui::{cancel_button_with_tooltip, ok_button, OkTooltip};
44
use crate::hex_ui::Point;
55
use crate::layout_ui::{bottom_center_anchor, icon_pos};
66
use crate::payment_ui::{multi_payment_dialog, payment_dialog, Payment};
7+
use crate::player_ui::choose_player_dialog;
78
use crate::render_context::RenderContext;
89
use crate::select_ui::ConfirmSelection;
910
use crate::unit_ui;
1011
use crate::unit_ui::{draw_unit_type, UnitHighlightType, UnitSelection};
1112
use macroquad::math::vec2;
1213
use server::action::Action;
1314
use server::content::custom_phase_actions::{
14-
AdvanceRewardRequest, CustomPhaseEventAction, UnitTypeRequest,
15+
AdvanceRewardRequest, CustomPhaseEventAction, PlayerRequest, UnitTypeRequest,
1516
};
1617
use server::game::Game;
1718
use server::unit::Unit;
@@ -77,7 +78,7 @@ pub fn unit_request_dialog(rc: &RenderContext, r: &UnitTypeRequest) -> StateUpda
7778

7879
if draw_unit_type(
7980
rc,
80-
&UnitHighlightType::None,
81+
UnitHighlightType::None,
8182
Point::from_vec2(p),
8283
*u,
8384
r.player_index,
@@ -96,14 +97,21 @@ pub fn unit_request_dialog(rc: &RenderContext, r: &UnitTypeRequest) -> StateUpda
9697
#[derive(Clone)]
9798
pub struct UnitsSelection {
9899
pub needed: u8,
100+
pub player: usize,
99101
pub selectable: Vec<u32>,
100102
pub units: Vec<u32>,
101103
pub description: Option<String>,
102104
}
103105

104106
impl UnitsSelection {
105-
pub fn new(needed: u8, selectable: Vec<u32>, description: Option<String>) -> Self {
107+
pub fn new(
108+
player: usize,
109+
needed: u8,
110+
selectable: Vec<u32>,
111+
description: Option<String>,
112+
) -> Self {
106113
UnitsSelection {
114+
player,
107115
needed,
108116
units: Vec::new(),
109117
selectable,
@@ -120,6 +128,10 @@ impl UnitSelection for UnitsSelection {
120128
fn can_select(&self, _game: &Game, unit: &Unit) -> bool {
121129
self.selectable.contains(&unit.id)
122130
}
131+
132+
fn player_index(&self) -> usize {
133+
self.player
134+
}
123135
}
124136

125137
impl ConfirmSelection for UnitsSelection {
@@ -133,7 +145,7 @@ impl ConfirmSelection for UnitsSelection {
133145
} else {
134146
OkTooltip::Invalid(format!(
135147
"Need to select {} units",
136-
self.needed - self.units.len() as u8
148+
self.needed as i8 - self.units.len() as i8
137149
))
138150
}
139151
}
@@ -147,7 +159,7 @@ pub fn select_units_dialog(rc: &RenderContext, sel: &UnitsSelection) -> StateUpd
147159
})
148160
}
149161

150-
pub(crate) fn bool_request_dialog(rc: &RenderContext) -> StateUpdate {
162+
pub fn bool_request_dialog(rc: &RenderContext) -> StateUpdate {
151163
if ok_button(rc, OkTooltip::Valid("OK".to_string())) {
152164
return bool_answer(true);
153165
}
@@ -162,3 +174,9 @@ fn bool_answer(answer: bool) -> StateUpdate {
162174
answer,
163175
)))
164176
}
177+
178+
pub fn player_request_dialog(rc: &RenderContext, r: &PlayerRequest) -> StateUpdate {
179+
choose_player_dialog(rc, &r.choices, |p| {
180+
Action::CustomPhaseEvent(CustomPhaseEventAction::SelectPlayer(p))
181+
})
182+
}

client/src/event_ui.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub fn event_help(rc: &RenderContext, origin: &EventOrigin, do_break: bool) -> V
1616
EventOrigin::Incident(id) => get_incident(*id).description(),
1717
EventOrigin::Leader(l) => {
1818
let l = rc.shown_player.get_leader(l).unwrap();
19-
// todo: leader should have a 2 event sources
19+
// todo: leader should have a 2 event sources - no each event source should have a description
2020
format!(
2121
"{}, {}",
2222
l.first_ability_description, l.second_ability_description

client/src/influence_ui.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use macroquad::prelude::{draw_circle_lines, WHITE};
1414
use server::action::Action;
1515
use server::city::City;
1616
use server::content::custom_actions::CustomAction;
17-
use server::game::CulturalInfluenceResolution;
17+
use server::cultural_influence::{influence_culture_boost_cost, CulturalInfluenceResolution};
1818
use server::player::Player;
1919
use server::player_events::InfluenceCulturePossible;
2020
use server::playing_actions::{InfluenceCultureAttempt, PlayingAction};
@@ -78,7 +78,8 @@ fn show_city(
7878
closest_city_pos
7979
};
8080

81-
let info = rc.game.influence_culture_boost_cost(
81+
let info = influence_culture_boost_cost(
82+
rc.game,
8283
player.index,
8384
start_position,
8485
city.player_index,

client/src/local_client/bin/main.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ use client::client::{init, render_and_update, Features, GameSyncRequest, GameSyn
44
use macroquad::miniquad::window::set_window_size;
55
use macroquad::prelude::{next_frame, screen_width, vec2};
66
use macroquad::window::screen_height;
7+
use server::action::execute_action;
8+
use server::advance::do_advance;
79
use server::city::City;
10+
use server::content::advances::get_advance;
811
use server::game::{Game, GameData};
912
use server::map::Terrain;
1013
use server::position::Position;
1114
use server::resource_pile::ResourcePile;
12-
use server::unit::{UnitType, Units};
15+
use server::unit::UnitType;
1316
use std::env;
1417
use std::fs::File;
1518
use std::io::BufReader;
@@ -52,8 +55,9 @@ pub async fn run(mut game: Game, features: &Features) {
5255
match message {
5356
GameSyncRequest::None => {}
5457
GameSyncRequest::ExecuteAction(a) => {
55-
game.execute_action(a, game.active_player());
56-
state.show_player = game.active_player();
58+
let player_index = game.active_player();
59+
execute_action(&mut game, a, player_index);
60+
state.show_player = player_index;
5761
sync_result = GameSyncResult::Update;
5862
}
5963
GameSyncRequest::Import => {
@@ -75,9 +79,8 @@ pub fn setup_local_game() -> Game {
7579
game.round = 6;
7680
game.dice_roll_outcomes = vec![1, 1, 10, 10, 10, 10, 10, 10, 10, 10];
7781
let add_unit = |game: &mut Game, pos: &str, player_index: usize, unit_type: UnitType| {
78-
let mut units = Units::empty();
79-
units += &unit_type;
80-
game.recruit(player_index, units, Position::from_offset(pos), None, &[]);
82+
game.get_player_mut(player_index)
83+
.add_unit(Position::from_offset(pos), unit_type);
8184
};
8285

8386
let player_index1 = 0;
@@ -240,9 +243,9 @@ pub fn setup_local_game() -> Game {
240243
.pieces
241244
.market = Some(1);
242245

243-
game.advance("Voting", player_index1);
244-
game.advance("Free Economy", player_index1);
245-
game.advance("Storage", player_index1);
246+
do_advance(&mut game, &get_advance("Voting"), player_index1);
247+
do_advance(&mut game, &get_advance("Free Economy"), player_index1);
248+
do_advance(&mut game, &get_advance("Storage"), player_index1);
246249
game.players[player_index1].gain_resources(ResourcePile::food(5));
247250

248251
game

client/src/move_ui.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1+
use crate::client_state::{ActiveDialog, StateUpdate};
2+
use crate::dialog_ui::cancel_button_with_tooltip;
3+
use crate::payment_ui::{payment_dialog, Payment};
4+
use crate::render_context::RenderContext;
5+
use crate::unit_ui::{click_unit, unit_selection_clicked};
16
use macroquad::math::{u32, Vec2};
27
use macroquad::prelude::Texture2D;
38
use server::action::Action;
49
use server::events::EventOrigin;
5-
use server::game::{CurrentMove, Game, GameState};
10+
use server::game::{Game, GameState};
11+
use server::move_units::{move_units_destinations, CurrentMove};
612
use server::payment::PaymentOptions;
713
use server::player::Player;
814
use server::position::Position;
915
use server::resource_pile::ResourcePile;
1016
use server::unit::{MoveUnits, MovementAction, Unit, UnitType};
1117
use std::collections::HashSet;
1218

13-
use crate::client_state::{ActiveDialog, StateUpdate};
14-
use crate::dialog_ui::cancel_button_with_tooltip;
15-
use crate::payment_ui::{payment_dialog, Payment};
16-
use crate::render_context::RenderContext;
17-
use crate::unit_ui::{click_unit, unit_selection_clicked};
18-
1919
#[derive(Clone, Copy)]
2020
pub enum MoveIntent {
2121
Land,
@@ -64,8 +64,7 @@ pub fn possible_destinations(
6464
let player = game.get_player(player_index);
6565
let mut modifiers = HashSet::new();
6666

67-
let mut res = player
68-
.move_units_destinations(game, units, start, None)
67+
let mut res = move_units_destinations(player, game, units, start, None)
6968
.unwrap_or_default()
7069
.into_iter()
7170
.map(|route| {
@@ -78,8 +77,7 @@ pub fn possible_destinations(
7877

7978
player.units.iter().for_each(|u| {
8079
if u.unit_type.is_ship()
81-
&& player
82-
.move_units_destinations(game, units, start, Some(u.id))
80+
&& move_units_destinations(player, game, units, start, Some(u.id))
8381
.is_ok_and(|v| v.iter().any(|route| route.destination == u.position))
8482
{
8583
res.push(MoveDestination::Carrier(u.id));

client/src/player_ui.rs

+20-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use crate::action_buttons::action_buttons;
22
use crate::city_ui::city_labels;
33
use crate::client::Features;
44
use crate::client_state::StateUpdate;
5+
use crate::dialog_ui::{ok_button, OkTooltip};
56
use crate::layout_ui::{
6-
bottom_center_texture, bottom_right_texture, icon_pos, left_mouse_button_pressed_in_rect,
7-
top_center_texture, ICON_SIZE,
7+
bottom_center_texture, bottom_centered_text, bottom_right_texture, icon_pos,
8+
left_mouse_button_pressed_in_rect, top_center_texture, ICON_SIZE,
89
};
910
use crate::map_ui::terrain_name;
1011
use crate::render_context::RenderContext;
@@ -15,7 +16,8 @@ use macroquad::math::vec2;
1516
use macroquad::prelude::*;
1617
use server::action::Action;
1718
use server::consts::ARMY_MOVEMENT_REQUIRED_ADVANCE;
18-
use server::game::{CurrentMove, Game, GameState, MoveState};
19+
use server::game::{Game, GameState};
20+
use server::move_units::{CurrentMove, MoveState};
1921
use server::playing_actions::PlayingAction;
2022
use server::resource::ResourceType;
2123
use server::unit::MovementAction;
@@ -326,3 +328,18 @@ fn end_move(game: &Game) -> StateUpdate {
326328
},
327329
)
328330
}
331+
332+
pub fn choose_player_dialog(
333+
rc: &RenderContext,
334+
choices: &[usize],
335+
execute: impl Fn(usize) -> Action,
336+
) -> StateUpdate {
337+
let player = rc.shown_player.index;
338+
if rc.can_control_active_player() && choices.contains(&player) {
339+
bottom_centered_text(rc, &format!("Select {}", rc.shown_player.get_name()));
340+
if ok_button(rc, OkTooltip::Valid("Select".to_string())) {
341+
return StateUpdate::execute(execute(player));
342+
}
343+
}
344+
StateUpdate::None
345+
}

0 commit comments

Comments
 (0)