Skip to content

Commit 66fb1ab

Browse files
authoredDec 31, 2024··
use icons (#93)
* cleanup * log cleanup * log cleanup * log cleanup * log cleanup * log cleanup * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * use icons * player select * player select * player select * player select
1 parent 33779ef commit 66fb1ab

32 files changed

+361
-117
lines changed
 

‎.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Server - Release
1+
name: Release
22

33
on:
44
release:
11.2 KB
Loading
15.6 KB
Loading
8.59 KB
Loading
6.9 KB
Loading
13 KB
Loading
9.48 KB
Loading
8.24 KB
Loading

‎client/assets/lab-svgrepo-com.png

11.7 KB
Loading
15.4 KB
Loading
16.3 KB
Loading
9.12 KB
Loading

‎client/assets/redo-svgrepo-com.png

5.28 KB
Loading

‎client/assets/reset-svgrepo-com.png

7.91 KB
Loading
15.5 KB
Loading

‎client/assets/rock-svgrepo-com.png

49.4 KB
Loading

‎client/assets/scroll-svgrepo-com.png

14.1 KB
Loading
14.9 KB
Loading
4.29 KB
Loading
15.4 KB
Loading

‎client/assets/undo-svgrepo-com.png

5.25 KB
Loading
15.7 KB
Loading

‎client/assets/walk-svgrepo-com.png

6.86 KB
Loading
15.8 KB
Loading
15.8 KB
Loading
8.97 KB
Loading
8.58 KB
Loading

‎client/src/assets.rs

+104-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::client::Features;
2-
use macroquad::prelude::{load_texture, load_ttf_font, Color, Image, RectOffset, Texture2D};
2+
use crate::resource_ui::ResourceType;
3+
use macroquad::prelude::{load_texture, load_ttf_font, Color, Image, ImageFormat, RectOffset};
4+
use macroquad::texture::Texture2D;
35
use macroquad::ui::{root_ui, Skin};
46
use server::map::Terrain;
57
use server::unit::UnitType;
@@ -9,18 +11,113 @@ pub struct Assets {
911
pub terrain: HashMap<Terrain, Texture2D>,
1012
pub units: HashMap<UnitType, Texture2D>,
1113
pub skin: Skin,
14+
15+
// mood icons
16+
pub angry: Texture2D,
17+
pub neutral: Texture2D,
18+
pub happy: Texture2D,
19+
20+
// action icons
21+
pub movement: Texture2D,
22+
pub log: Texture2D,
23+
pub end_turn: Texture2D,
24+
pub advances: Texture2D,
25+
pub redo: Texture2D,
26+
pub reset: Texture2D,
27+
pub undo: Texture2D,
28+
29+
// UI
30+
pub zoom_in: Texture2D,
31+
pub zoom_out: Texture2D,
32+
pub up: Texture2D,
33+
pub down: Texture2D,
34+
pub left: Texture2D,
35+
pub right: Texture2D,
36+
pub victory_points: Texture2D,
37+
pub active_player: Texture2D,
38+
39+
// Admin
40+
pub import: Texture2D,
41+
pub export: Texture2D,
42+
1243
// pub cities: HashMap<CityType, Texture2D>,
13-
// pub resources: HashMap<Resource, Texture2D>,
44+
pub resources: HashMap<ResourceType, Texture2D>,
1445
}
1546

1647
impl Assets {
1748
pub async fn new(features: &Features) -> Self {
49+
let happy = load_png(include_bytes!("../assets/happy-emoji-svgrepo-com.png"));
1850
Self {
1951
terrain: Self::terrain(features).await,
2052
units: HashMap::new(),
2153
skin: Self::skin(features).await,
54+
55+
// mood icons
56+
angry: load_png(include_bytes!("../assets/angry-face-svgrepo-com.png")),
57+
neutral: load_png(include_bytes!("../assets/neutral-face-svgrepo-com.png")),
58+
happy: happy.clone(),
59+
60+
// resource icons
61+
resources: [
62+
(
63+
ResourceType::Food,
64+
load_png(include_bytes!("../assets/wheat-grain-svgrepo-com.png")),
65+
),
66+
(
67+
ResourceType::Wood,
68+
load_png(include_bytes!("../assets/wood-nature-svgrepo-com.png")),
69+
),
70+
(
71+
ResourceType::Ore,
72+
load_png(include_bytes!("../assets/rock-svgrepo-com.png")),
73+
),
74+
(
75+
ResourceType::Ideas,
76+
load_png(include_bytes!("../assets/light-bulb-idea-svgrepo-com.png")),
77+
),
78+
(
79+
ResourceType::Gold,
80+
load_png(include_bytes!("../assets/gold-ingots-gold-svgrepo-com.png")),
81+
),
82+
(ResourceType::MoodTokens, happy.clone()),
83+
(
84+
ResourceType::CultureTokens,
85+
load_png(include_bytes!("../assets/theater-drama-svgrepo-com.png")),
86+
),
87+
]
88+
.iter()
89+
.cloned()
90+
.collect(),
91+
92+
// action icons
93+
advances: load_png(include_bytes!("../assets/lab-svgrepo-com.png")),
94+
end_turn: load_png(include_bytes!("../assets/hour-glass-svgrepo-com.png")),
95+
log: load_png(include_bytes!("../assets/scroll-svgrepo-com.png")),
96+
movement: load_png(include_bytes!("../assets/walk-svgrepo-com.png")),
97+
redo: load_png(include_bytes!("../assets/redo-svgrepo-com.png")),
98+
reset: load_png(include_bytes!("../assets/reset-svgrepo-com.png")),
99+
undo: load_png(include_bytes!("../assets/undo-svgrepo-com.png")),
100+
101+
// UI
102+
zoom_in: load_png(include_bytes!("../assets/zoom-in-1462-svgrepo-com.png")),
103+
zoom_out: load_png(include_bytes!("../assets/zoom-out-1460-svgrepo-com.png")),
104+
up: load_png(include_bytes!("../assets/up-arrow-circle-svgrepo-com.png")),
105+
down: load_png(include_bytes!(
106+
"../assets/down-arrow-circle-svgrepo-com.png"
107+
)),
108+
left: load_png(include_bytes!(
109+
"../assets/left-arrow-circle-svgrepo-com.png"
110+
)),
111+
right: load_png(include_bytes!(
112+
"../assets/right-arrow-circle-svgrepo-com.png"
113+
)),
114+
victory_points: load_png(include_bytes!("../assets/trophy-cup-svgrepo-com.png")),
115+
active_player: load_png(include_bytes!("../assets/triangle-svgrepo-com.png")),
116+
117+
// Admin
118+
import: load_png(include_bytes!("../assets/import-3-svgrepo-com.png")),
119+
export: load_png(include_bytes!("../assets/export-2-svgrepo-com.png")),
22120
// cities: HashMap::new(),
23-
// resources: HashMap::new(),
24121
}
25122
}
26123

@@ -142,3 +239,7 @@ impl Assets {
142239
}
143240
}
144241
}
242+
243+
fn load_png(bytes: &[u8]) -> Texture2D {
244+
Texture2D::from_file_with_format(bytes, Some(ImageFormat::Png))
245+
}

‎client/src/client.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::happiness_ui::{increase_happiness_dialog, increase_happiness_menu};
1616
use crate::hex_ui::pixel_to_coordinate;
1717
use crate::log_ui::show_log;
1818
use crate::map_ui::{draw_map, show_tile_menu};
19-
use crate::player_ui::{show_global_controls, show_globals};
19+
use crate::player_ui::{player_select, show_global_controls, show_top_center, show_top_left};
2020
use crate::status_phase_ui::raze_city_confirm_dialog;
2121
use crate::{combat_ui, dialog_ui, influence_ui, move_ui, recruit_unit_ui, status_phase_ui};
2222

@@ -47,7 +47,7 @@ pub fn render_and_update(
4747
}
4848

4949
fn render(game: &Game, state: &mut State, features: &Features) -> StateUpdate {
50-
clear_background(BLACK);
50+
clear_background(WHITE);
5151

5252
let player = &state.shown_player(game);
5353

@@ -64,8 +64,13 @@ fn render(game: &Game, state: &mut State, features: &Features) -> StateUpdate {
6464
draw_map(game, state);
6565
}
6666
let mut updates = StateUpdates::new();
67-
updates.add(show_globals(game, player));
67+
show_top_left(game, player);
68+
show_top_center(game, player, state);
69+
updates.add(player_select(game, player, state));
6870
updates.add(show_global_controls(game, state, features));
71+
if !matches!(state.active_dialog, ActiveDialog::None) || state.active_dialog.is_map_dialog() {
72+
updates.clear();
73+
}
6974

7075
if player.can_control {
7176
if let Some(u) = &state.pending_update {

‎client/src/client_state.rs

+4
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ impl StateUpdates {
206206
}
207207
}
208208

209+
pub fn clear(&mut self) {
210+
self.updates.clear();
211+
}
212+
209213
pub fn result(self) -> StateUpdate {
210214
self.updates
211215
.into_iter()

‎client/src/layout_ui.rs

+69-14
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,90 @@
1-
use crate::client_state::ShownPlayer;
1+
use crate::client_state::{ShownPlayer, State};
2+
use macroquad::color::WHITE;
23
use macroquad::math::{vec2, Vec2};
4+
use macroquad::prelude::*;
35
use macroquad::ui::root_ui;
46

7+
pub const ICON_SIZE: f32 = 30.;
8+
9+
pub const MARGIN: f32 = 10.;
10+
11+
pub fn icon_offset(i: i8) -> f32 {
12+
f32::from(i) * 1.4 * ICON_SIZE
13+
}
14+
15+
pub fn icon_pos(x: i8, y: i8) -> Vec2 {
16+
vec2(icon_offset(x), icon_offset(y))
17+
}
18+
519
pub fn top_left_label(p: Vec2, label: &str) {
6-
root_ui().label(p, label);
20+
root_ui().label(p + vec2(-40., 0.), label);
721
}
822

923
pub fn top_center_label(player: &ShownPlayer, p: Vec2, label: &str) {
1024
root_ui().label(vec2(player.screen_size.x / 2.0, 0.) + p, label);
1125
}
1226

13-
pub fn right_center_label(player: &ShownPlayer, p: Vec2, label: &str) {
14-
root_ui().label(
15-
vec2(player.screen_size.x, player.screen_size.y / 2.0) + p,
16-
label,
17-
);
27+
pub fn top_center_texture(state: &State, texture: &Texture2D, p: Vec2) -> bool {
28+
relative_texture(state, texture, vec2(state.screen_size.x / 2., MARGIN), p)
1829
}
1930

20-
pub fn right_center_button(player: &ShownPlayer, p: Vec2, label: &str) -> bool {
21-
root_ui().button(
22-
vec2(player.screen_size.x, player.screen_size.y / 2.0) + p,
23-
label,
31+
pub fn top_right_texture(state: &State, texture: &Texture2D, p: Vec2) -> bool {
32+
relative_texture(
33+
state,
34+
texture,
35+
vec2(state.screen_size.x - MARGIN, MARGIN),
36+
p,
37+
)
38+
}
39+
40+
pub fn bottom_left_texture(state: &State, texture: &Texture2D, p: Vec2) -> bool {
41+
relative_texture(
42+
state,
43+
texture,
44+
vec2(MARGIN, state.screen_size.y - MARGIN),
45+
p,
2446
)
2547
}
2648

2749
pub fn bottom_left_button(player: &ShownPlayer, p: Vec2, label: &str) -> bool {
28-
root_ui().button(vec2(0., player.screen_size.y) + p, label)
50+
root_ui().button(vec2(MARGIN, player.screen_size.y - MARGIN) + p, label)
51+
}
52+
53+
pub fn bottom_right_texture(state: &State, texture: &Texture2D, p: Vec2) -> bool {
54+
relative_texture(
55+
state,
56+
texture,
57+
vec2(state.screen_size.x - MARGIN, state.screen_size.y - MARGIN),
58+
p,
59+
)
60+
}
61+
62+
fn relative_texture(state: &State, texture: &Texture2D, anchor: Vec2, offset: Vec2) -> bool {
63+
let origin = anchor + offset;
64+
set_default_camera();
65+
draw_texture_ex(
66+
texture,
67+
origin.x,
68+
origin.y,
69+
WHITE,
70+
DrawTextureParams {
71+
dest_size: Some(vec2(ICON_SIZE, ICON_SIZE)),
72+
..Default::default()
73+
},
74+
);
75+
76+
let pressed = left_mouse_button(Rect::new(origin.x, origin.y, ICON_SIZE, ICON_SIZE));
77+
set_camera(&state.camera);
78+
pressed
2979
}
3080

31-
pub fn bottom_right_button(player: &ShownPlayer, p: Vec2, label: &str) -> bool {
32-
root_ui().button(vec2(player.screen_size.x, player.screen_size.y) + p, label)
81+
pub fn left_mouse_button(rect: Rect) -> bool {
82+
if is_mouse_button_pressed(MouseButton::Left) {
83+
let (x, y) = mouse_position();
84+
rect.contains(vec2(x, y))
85+
} else {
86+
false
87+
}
3388
}
3489

3590
pub fn cancel_pos(player: &ShownPlayer) -> Vec2 {

‎client/src/player_ui.rs

+175-96
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ use crate::client::Features;
22
use crate::client_state::{ActiveDialog, ShownPlayer, State, StateUpdate, OFFSET, ZOOM};
33
use crate::happiness_ui::start_increase_happiness;
44
use crate::layout_ui::{
5-
bottom_left_button, bottom_right_button, right_center_button, right_center_label,
6-
top_center_label, top_left_label,
5+
bottom_left_button, bottom_left_texture, bottom_right_texture, icon_pos, left_mouse_button,
6+
top_center_label, top_center_texture, top_left_label, top_right_texture, ICON_SIZE,
77
};
8-
use macroquad::math::vec2;
8+
use crate::resource_ui::ResourceType;
9+
use macroquad::math::{u32, vec2};
910
use macroquad::prelude::*;
1011
use macroquad::ui::{root_ui, Ui};
1112
use server::action::Action;
@@ -14,12 +15,7 @@ use server::player::Player;
1415
use server::playing_actions::PlayingAction;
1516
use server::resource_pile::ResourcePile;
1617

17-
pub fn show_globals(game: &Game, player: &ShownPlayer) -> StateUpdate {
18-
show_top_left(game);
19-
show_top_center(game, player);
20-
21-
let mut y = -100.;
22-
18+
pub fn player_select(game: &Game, player: &ShownPlayer, state: &State) -> StateUpdate {
2319
let i = game
2420
.players
2521
.iter()
@@ -28,77 +24,147 @@ pub fn show_globals(game: &Game, player: &ShownPlayer) -> StateUpdate {
2824
let mut players: Vec<_> = game.players.iter().map(|p| p.index).collect();
2925
players.rotate_left(i);
3026

27+
let mut y = (players.len() as f32 * -ICON_SIZE) / 2.;
28+
3129
for p in players {
32-
let p = game.get_player(p);
33-
let shown = player.index == p.index;
34-
let prefix = if shown { "* " } else { "" };
35-
let name = p.get_name();
36-
let x = -200.;
37-
let label = format!("{prefix}{name}");
38-
if shown {
39-
right_center_label(player, vec2(x, y), &label);
40-
} else if right_center_button(player, vec2(x, y), &label) {
41-
return StateUpdate::SetShownPlayer(p.index);
30+
let pl = game.get_player(p);
31+
let shown = player.index == pl.index;
32+
let pos = vec2(player.screen_size.x, player.screen_size.y / 2.0) + vec2(-20., y);
33+
34+
let color = player_color(pl.index);
35+
set_default_camera();
36+
37+
let w = if shown { ICON_SIZE + 10. } else { ICON_SIZE };
38+
let x = pos.x - w + ICON_SIZE;
39+
draw_rectangle(x, pos.y, w, ICON_SIZE, color);
40+
draw_rectangle_lines(x, pos.y, w, ICON_SIZE, 2.0, BLACK);
41+
let text = format!("{}", pl.victory_points());
42+
43+
draw_text(&text, pos.x + 5., pos.y + 20., 20.0, BLACK);
44+
45+
let active = game.active_player();
46+
if active == pl.index {
47+
draw_texture_ex(
48+
&state.assets.active_player,
49+
x - 25.,
50+
pos.y + 5.,
51+
WHITE,
52+
DrawTextureParams {
53+
dest_size: Some(vec2(20., 20.)),
54+
..Default::default()
55+
},
56+
);
57+
}
58+
59+
set_camera(&state.camera);
60+
61+
if !shown && left_mouse_button(Rect::new(x, pos.y, w, ICON_SIZE)) {
62+
return StateUpdate::SetShownPlayer(pl.index);
4263
}
43-
y += 40.;
64+
65+
y += ICON_SIZE;
4466
}
4567

4668
StateUpdate::None
4769
}
4870

49-
fn show_top_center(game: &Game, player: &ShownPlayer) {
71+
pub fn resource_label(
72+
player: &ShownPlayer,
73+
state: &State,
74+
label: &str,
75+
resource_type: ResourceType,
76+
p: Vec2,
77+
) {
78+
top_icon_with_label(
79+
player,
80+
state,
81+
label,
82+
&state.assets.resources[&resource_type],
83+
p,
84+
);
85+
}
86+
87+
pub fn top_icon_with_label(
88+
player: &ShownPlayer,
89+
state: &State,
90+
label: &str,
91+
texture: &Texture2D,
92+
p: Vec2,
93+
) {
94+
top_center_texture(state, texture, p);
95+
top_center_label(player, p + vec2(-30. - label.len() as f32 * 5., 40.), label);
96+
}
97+
98+
pub fn show_top_center(game: &Game, player: &ShownPlayer, state: &State) {
5099
let p = game.get_player(player.index);
51100

52-
top_center_label(player, vec2(-400., 0.), &resource_ui(p, "Fd", |r| r.food));
53-
top_center_label(player, vec2(-320., 0.), &resource_ui(p, "Wd", |r| r.wood));
54-
top_center_label(player, vec2(-240., 0.), &resource_ui(p, "Ore", |r| r.ore));
55-
top_center_label(player, vec2(-160., 0.), &resource_ui(p, "Id", |r| r.ideas));
56-
top_center_label(
101+
resource_label(
57102
player,
58-
vec2(-80., 0.),
59-
&resource_ui(p, "Gld", |r| r.gold as u32),
103+
state,
104+
&resource_ui(p, |r| r.food),
105+
ResourceType::Food,
106+
icon_pos(-4, 0),
60107
);
61-
top_center_label(
108+
resource_label(
62109
player,
63-
vec2(0., 0.),
64-
&resource_ui(p, "Md", |r| r.mood_tokens),
110+
state,
111+
&resource_ui(p, |r| r.wood),
112+
ResourceType::Wood,
113+
icon_pos(-3, 0),
65114
);
66-
top_center_label(
115+
resource_label(
67116
player,
68-
vec2(80., 0.),
69-
&resource_ui(p, "Cul", |r| r.culture_tokens),
117+
state,
118+
&resource_ui(p, |r| r.ore),
119+
ResourceType::Ore,
120+
icon_pos(-2, 0),
70121
);
71-
72-
top_center_label(
122+
resource_label(
73123
player,
74-
vec2(170., 0.),
75-
&format!("Civ {}", p.civilization.name),
124+
state,
125+
&resource_ui(p, |r| r.ideas),
126+
ResourceType::Ideas,
127+
icon_pos(-1, 0),
76128
);
77-
top_center_label(
129+
resource_label(
78130
player,
79-
vec2(250., 0.),
80-
&format!("VP {}", p.victory_points()),
131+
state,
132+
&resource_ui(p, |r| r.gold as u32),
133+
ResourceType::Gold,
134+
icon_pos(0, 0),
81135
);
82-
top_center_label(
136+
resource_label(
83137
player,
84-
vec2(300., 0.),
85-
&format!(
86-
"Ldr {}",
87-
if let Some(l) = &p.active_leader {
88-
&l.name
89-
} else {
90-
"-"
91-
}
92-
),
138+
state,
139+
&resource_ui(p, |r| r.mood_tokens),
140+
ResourceType::MoodTokens,
141+
icon_pos(1, 0),
142+
);
143+
resource_label(
144+
player,
145+
state,
146+
&resource_ui(p, |r| r.culture_tokens),
147+
ResourceType::CultureTokens,
148+
icon_pos(2, 0),
149+
);
150+
151+
top_icon_with_label(
152+
player,
153+
state,
154+
&format!("{}", &p.victory_points()),
155+
&state.assets.victory_points,
156+
icon_pos(3, 0),
93157
);
158+
94159
show_wonders(game, player, &mut root_ui());
95160
}
96161

97-
fn show_top_left(game: &Game) {
162+
pub fn show_top_left(game: &Game, player: &ShownPlayer) {
98163
let mut y = 0.;
99164
let mut label = |label: String| {
100-
top_left_label(vec2(0., y), &label);
101-
y += 30.;
165+
let p = vec2(0., y * 25.);
166+
y += 1.;
167+
top_left_label(p, &label);
102168
};
103169

104170
match &game.state {
@@ -110,31 +176,42 @@ fn show_top_left(game: &Game) {
110176
_ => label(format!("Round {}", game.round)),
111177
}
112178

113-
let current = game.current_player_index;
114-
label(format!("Playing {}", &game.get_player(current).get_name()));
179+
let p = game.get_player(player.index);
115180

116-
match &game.state {
117-
GameState::StatusPhase(_) | GameState::Finished => {}
118-
_ => label(format!("Actions {}", game.actions_left)),
119-
}
181+
label(p.get_name());
120182

121-
match &game.state {
122-
GameState::Movement { .. } => label("Movement".to_string()),
123-
GameState::CulturalInfluenceResolution(_) => {
124-
label("Cultural Influence Resolution".to_string());
183+
label(format!("Civ {}", p.civilization.name));
184+
185+
label(format!(
186+
"Leader {}",
187+
if let Some(l) = &p.active_leader {
188+
&l.name
189+
} else {
190+
"-"
125191
}
126-
GameState::Combat(c) => label(format!("Combat Round {} Phase {:?}", c.round, c.phase)),
127-
GameState::PlaceSettler { .. } => label("Place Settler".to_string()),
128-
_ => {}
129-
}
192+
));
130193

131-
if let Some(m) = moves_left(&game.state) {
132-
label(format!("Moves left {m}"));
133-
}
194+
if game.current_player_index == p.index {
195+
label("Your turn".to_string());
196+
197+
match &game.state {
198+
GameState::StatusPhase(_) | GameState::Finished => {}
199+
_ => label(format!("Actions {}", game.actions_left)),
200+
}
201+
202+
match &game.state {
203+
GameState::Movement { .. } => label("Movement".to_string()),
204+
GameState::CulturalInfluenceResolution(_) => {
205+
label("Cultural Influence Resolution".to_string());
206+
}
207+
GameState::Combat(c) => label(format!("Combat Round {} Phase {:?}", c.round, c.phase)),
208+
GameState::PlaceSettler { .. } => label("Place Settler".to_string()),
209+
_ => {}
210+
}
134211

135-
let active = game.active_player();
136-
if active != current {
137-
label(format!("Active {}", game.get_player(active).get_name()));
212+
if let Some(m) = moves_left(&game.state) {
213+
label(format!("Moves left {m}"));
214+
}
138215
}
139216
}
140217

@@ -176,54 +253,55 @@ pub fn show_wonders(game: &Game, player: &ShownPlayer, ui: &mut Ui) {
176253
}
177254
}
178255

179-
fn resource_ui(player: &Player, name: &str, f: impl Fn(&ResourcePile) -> u32) -> String {
256+
fn resource_ui(player: &Player, f: impl Fn(&ResourcePile) -> u32) -> String {
180257
let r: &ResourcePile = &player.resources;
181258
let l: &ResourcePile = &player.resource_limit;
182-
format!("{name} {}/{}", f(r), f(l))
259+
format!("{}/{}", f(r), f(l))
183260
}
184261

185262
pub fn show_global_controls(game: &Game, state: &mut State, features: &Features) -> StateUpdate {
186263
let player = &state.shown_player(game);
187264

188-
if bottom_left_button(player, vec2(0., -50.), "+") {
265+
let assets = &state.assets;
266+
if bottom_left_texture(state, &assets.zoom_in, icon_pos(1, -1)) {
189267
state.zoom *= 1.1;
190268
return StateUpdate::None;
191269
}
192-
if bottom_left_button(player, vec2(70., -50.), "-") {
270+
if bottom_left_texture(state, &assets.zoom_out, icon_pos(0, -1)) {
193271
state.zoom /= 1.1;
194272
return StateUpdate::None;
195273
}
196-
if bottom_left_button(player, vec2(140., -50.), "0") {
274+
if bottom_left_texture(state, &assets.reset, icon_pos(2, -1)) {
197275
state.zoom = ZOOM;
198276
state.offset = OFFSET;
199277
return StateUpdate::None;
200278
}
201-
if bottom_left_button(player, vec2(210., -80.), "") {
202-
state.offset += vec2(-0.1, 0.);
279+
if bottom_left_texture(state, &assets.up, icon_pos(4, -2)) {
280+
state.offset += vec2(0., 0.1);
203281
return StateUpdate::None;
204282
}
205-
if bottom_left_button(player, vec2(310., -80.), "") {
206-
state.offset += vec2(0.1, 0.);
283+
if bottom_left_texture(state, &assets.down, icon_pos(4, -1)) {
284+
state.offset += vec2(0., -0.1);
207285
return StateUpdate::None;
208286
}
209-
if bottom_left_button(player, vec2(260., -110.), "") {
210-
state.offset += vec2(0., 0.1);
287+
if bottom_left_texture(state, &assets.left, icon_pos(3, -1)) {
288+
state.offset += vec2(-0.1, 0.);
211289
return StateUpdate::None;
212290
}
213-
if bottom_left_button(player, vec2(260., -50.), "") {
214-
state.offset += vec2(0., -0.1);
291+
if bottom_left_texture(state, &assets.right, icon_pos(5, -1)) {
292+
state.offset += vec2(0.1, 0.);
215293
return StateUpdate::None;
216294
}
217295

218-
if game.can_undo() && bottom_right_button(player, vec2(-400., -50.), "Undo") {
296+
if game.can_undo() && bottom_right_texture(state, &assets.undo, icon_pos(-6, -1)) {
219297
return StateUpdate::Execute(Action::Undo);
220298
}
221-
if game.can_redo() && bottom_right_button(player, vec2(-300., -50.), "Redo") {
299+
if game.can_redo() && bottom_right_texture(state, &assets.redo, icon_pos(-5, -1)) {
222300
return StateUpdate::Execute(Action::Redo);
223301
}
224302
if player.can_control
225303
&& matches!(game.state, GameState::Playing)
226-
&& bottom_right_button(player, vec2(-180., -50.), "End Turn")
304+
&& bottom_right_texture(state, &assets.end_turn, icon_pos(-4, -1))
227305
{
228306
let left = game.actions_left;
229307
return StateUpdate::execute_with_warning(
@@ -236,16 +314,17 @@ pub fn show_global_controls(game: &Game, state: &mut State, features: &Features)
236314
);
237315
}
238316

239-
if player.can_play_action && bottom_left_button(player, vec2(0., -170.), "Move") {
317+
if player.can_play_action && bottom_left_texture(state, &assets.movement, icon_pos(0, -3)) {
240318
return StateUpdate::execute(Action::Playing(PlayingAction::MoveUnits));
241319
}
242-
if player.can_play_action && bottom_left_button(player, vec2(0., -140.), "Inc. Hap.") {
320+
if player.can_play_action && bottom_left_texture(state, &assets.happy, icon_pos(0, -2)) {
243321
return start_increase_happiness(game, player);
244322
}
245-
if bottom_left_button(player, vec2(0., -110.), "Advances") {
323+
if top_right_texture(state, &assets.advances, icon_pos(-2, 0)) {
246324
return StateUpdate::OpenDialog(ActiveDialog::AdvanceMenu);
247325
};
248-
if bottom_left_button(player, vec2(0., -80.), "Log") {
326+
327+
if top_right_texture(state, &assets.log, icon_pos(-1, 0)) {
249328
return StateUpdate::OpenDialog(ActiveDialog::Log);
250329
};
251330
let d = state.game_state_dialog(game, &ActiveDialog::None);
@@ -257,10 +336,10 @@ pub fn show_global_controls(game: &Game, state: &mut State, features: &Features)
257336
}
258337

259338
if features.import_export {
260-
if bottom_right_button(player, vec2(-300., -100.), "Import") {
339+
if bottom_right_texture(state, &assets.import, icon_pos(-2, -3)) {
261340
return StateUpdate::Import;
262341
};
263-
if bottom_right_button(player, vec2(-150., -100.), "Export") {
342+
if bottom_right_texture(state, &assets.export, icon_pos(-1, -3)) {
264343
return StateUpdate::Export;
265344
};
266345
}

0 commit comments

Comments
 (0)
Please sign in to comment.