1
1
use crate :: client:: Features ;
2
2
use crate :: client_state:: {
3
- ActiveDialog , ShownPlayer , State , StateUpdate , StateUpdates , OFFSET , ZOOM ,
3
+ ActiveDialog , ShownPlayer , State , StateUpdate , OFFSET , ZOOM ,
4
4
} ;
5
- use crate :: dialog_ui:: show_window;
6
5
use crate :: happiness_ui:: start_increase_happiness;
7
- use macroquad:: hash;
8
6
use macroquad:: math:: vec2;
9
7
use macroquad:: prelude:: * ;
10
- use macroquad:: ui:: widgets:: Window ;
11
- use macroquad:: ui:: Ui ;
8
+ use macroquad:: ui:: { root_ui, Ui } ;
12
9
use server:: action:: Action ;
13
10
use server:: game:: { Game , GameState } ;
14
11
use server:: player:: Player ;
15
12
use server:: playing_actions:: PlayingAction ;
16
13
use server:: resource_pile:: ResourcePile ;
17
14
18
15
pub fn show_globals ( game : & Game , player : & ShownPlayer ) -> StateUpdate {
19
- let y = 0. ;
20
- let width = screen_width ( ) - 20. ;
21
- let window = Window :: new ( hash ! ( ) , vec2 ( 10. , 5. ) , vec2 ( width, 20. ) )
22
- . titlebar ( false )
23
- . movable ( false )
24
- . close_button ( false ) ;
16
+ let y = 5. ;
25
17
26
- let mut updates = StateUpdates :: new ( ) ;
27
- let ( update, _open) = show_window ( window, |ui| {
28
- ui. label ( vec2 ( 10. , y) , & format ! ( "Age {}" , game. age) ) ;
29
- ui. label ( vec2 ( 40. , y) , & format ! ( "Round {}" , game. round) ) ;
18
+ let ui = & mut root_ui ( ) ;
19
+ ui. label ( vec2 ( 10. , y) , & format ! ( "Age {}" , game. age) ) ;
20
+ ui. label ( vec2 ( 45. , y) , & format ! ( "Round {}" , game. round) ) ;
30
21
31
- show_player_status ( game, player, ui) ;
32
- show_wonders ( game, player, ui) ;
33
- StateUpdate :: None
34
- } ) ;
22
+ show_player_status ( game, player, ui) ;
23
+ show_wonders ( game, player, ui) ;
35
24
36
- updates. add ( update) ;
37
- let window = Window :: new ( hash ! ( ) , vec2 ( 10. , 50. ) , vec2 ( width, 20. ) )
38
- . titlebar ( false )
39
- . movable ( false )
40
- . close_button ( false ) ;
41
- let ( update, _open) = show_window ( window, |ui| {
42
- let i = game
43
- . players
44
- . iter ( )
45
- . position ( |p| p. index == game. starting_player_index )
46
- . unwrap ( ) ;
47
- let mut players: Vec < _ > = game. players . iter ( ) . map ( |p| p. index ) . collect ( ) ;
48
- players. rotate_left ( i) ;
25
+ let y = 50. ;
49
26
50
- for ( i, & p) in players. iter ( ) . enumerate ( ) {
51
- let p = game. get_player ( p) ;
52
- let shown = player. index == p. index ;
53
- let prefix = if shown { "* " } else { "" } ;
54
- let suffix = & player_suffix ( game, p) ;
55
- let name = p. get_name ( ) ;
56
- let y = 0. ;
57
- let x = i as f32 * 500. ;
58
- let label = format ! ( "{prefix}{name}{suffix}" ) ;
59
- if shown {
60
- ui. label ( vec2 ( x, y) , & label) ;
61
- } else if ui. button ( vec2 ( x, y) , label) {
62
- return StateUpdate :: SetShownPlayer ( p. index ) ;
63
- }
27
+ let i = game
28
+ . players
29
+ . iter ( )
30
+ . position ( |p| p. index == game. starting_player_index )
31
+ . unwrap ( ) ;
32
+ let mut players: Vec < _ > = game. players . iter ( ) . map ( |p| p. index ) . collect ( ) ;
33
+ players. rotate_left ( i) ;
34
+
35
+ for ( i, & p) in players. iter ( ) . enumerate ( ) {
36
+ let p = game. get_player ( p) ;
37
+ let shown = player. index == p. index ;
38
+ let prefix = if shown { "* " } else { "" } ;
39
+ let suffix = & player_suffix ( game, p) ;
40
+ let name = p. get_name ( ) ;
41
+ let x = i as f32 * 500. ;
42
+ let label = format ! ( "{prefix}{name}{suffix}" ) ;
43
+ if shown {
44
+ ui. label ( vec2 ( x, y) , & label) ;
45
+ } else if ui. button ( vec2 ( x, y) , label) {
46
+ return StateUpdate :: SetShownPlayer ( p. index ) ;
64
47
}
65
- StateUpdate :: None
66
- } ) ;
67
- updates. add ( update) ;
68
- updates. result ( )
48
+ }
49
+ StateUpdate :: None
69
50
}
70
51
71
52
fn player_suffix ( game : & Game , player : & Player ) -> String {
@@ -132,16 +113,17 @@ fn moves_left(state: &GameState) -> Option<u32> {
132
113
133
114
pub fn show_wonders ( game : & Game , player : & ShownPlayer , ui : & mut Ui ) {
134
115
let player = game. get_player ( player. index ) ;
116
+ let y = 5. ;
135
117
for ( i, name) in player. wonders . iter ( ) . enumerate ( ) {
136
- ui. label ( vec2 ( 500. + i as f32 * 30.0 , 0. ) , & format ! ( "Wonder {name}" ) ) ;
118
+ ui. label ( vec2 ( 500. + i as f32 * 30.0 , y ) , & format ! ( "Wonder {name}" ) ) ;
137
119
}
138
120
for ( i, card) in player. wonder_cards . iter ( ) . enumerate ( ) {
139
121
let req = match card. required_advances [ ..] {
140
122
[ ] => String :: from ( "no advances" ) ,
141
123
_ => card. required_advances . join ( ", " ) ,
142
124
} ;
143
125
ui. label (
144
- vec2 ( 900. + i as f32 * 30.0 , 0. ) ,
126
+ vec2 ( 900. + i as f32 * 30.0 , y ) ,
145
127
& format ! (
146
128
"Wonder Card {} cost {} requires {}" ,
147
129
& card. name, card. cost, req
@@ -154,7 +136,7 @@ pub fn show_player_status(game: &Game, player: &ShownPlayer, ui: &mut Ui) {
154
136
let player = game. get_player ( player. index ) ;
155
137
let mut i: f32 = 0. ;
156
138
let mut res = |label : String | {
157
- ui. label ( vec2 ( 110. + i, 0 .) , & label) ;
139
+ ui. label ( vec2 ( 110. + i, 5 .) , & label) ;
158
140
i += 70. ;
159
141
} ;
160
142
@@ -186,97 +168,89 @@ fn resource_ui(player: &Player, name: &str, f: impl Fn(&ResourcePile) -> u32) ->
186
168
187
169
pub fn show_global_controls ( game : & Game , state : & mut State , features : & Features ) -> StateUpdate {
188
170
let player = state. shown_player ( game) ;
189
- let y = 0. ;
190
- let width = screen_width ( ) - 20. ;
191
- let window = Window :: new ( hash ! ( ) , vec2 ( 10. , 30. ) , vec2 ( width, 20. ) )
192
- . titlebar ( false )
193
- . movable ( false )
194
- . close_button ( false ) ;
171
+ let y = 30. ;
195
172
196
- let ( update , _open ) = show_window ( window , |ui| {
197
- if ui. button ( vec2 ( 10. , y) , "+" ) {
198
- state. zoom *= 1.1 ;
199
- return StateUpdate :: None ;
200
- }
201
- if ui. button ( vec2 ( 25. , y) , "-" ) {
202
- state. zoom /= 1.1 ;
203
- return StateUpdate :: None ;
204
- }
205
- if ui. button ( vec2 ( 40. , y) , "Reset" ) {
206
- state. zoom = ZOOM ;
207
- state. offset = OFFSET ;
208
- return StateUpdate :: None ;
209
- }
210
- if ui. button ( vec2 ( 100. , y) , "L" ) {
211
- state. offset += vec2 ( -0.1 , 0. ) ;
212
- return StateUpdate :: None ;
213
- }
214
- if ui. button ( vec2 ( 120. , y) , "R" ) {
215
- state. offset += vec2 ( 0.1 , 0. ) ;
216
- return StateUpdate :: None ;
217
- }
218
- if ui. button ( vec2 ( 140. , y) , "U" ) {
219
- state. offset += vec2 ( 0. , 0.1 ) ;
220
- return StateUpdate :: None ;
221
- }
222
- if ui. button ( vec2 ( 160. , y) , "D" ) {
223
- state. offset += vec2 ( 0. , -0.1 ) ;
224
- return StateUpdate :: None ;
225
- }
173
+ let ui = & mut root_ui ( ) ;
174
+ if ui. button ( vec2 ( 10. , y) , "+" ) {
175
+ state. zoom *= 1.1 ;
176
+ return StateUpdate :: None ;
177
+ }
178
+ if ui. button ( vec2 ( 25. , y) , "-" ) {
179
+ state. zoom /= 1.1 ;
180
+ return StateUpdate :: None ;
181
+ }
182
+ if ui. button ( vec2 ( 40. , y) , "Reset" ) {
183
+ state. zoom = ZOOM ;
184
+ state. offset = OFFSET ;
185
+ return StateUpdate :: None ;
186
+ }
187
+ if ui. button ( vec2 ( 100. , y) , "L" ) {
188
+ state. offset += vec2 ( -0.1 , 0. ) ;
189
+ return StateUpdate :: None ;
190
+ }
191
+ if ui. button ( vec2 ( 120. , y) , "R" ) {
192
+ state. offset += vec2 ( 0.1 , 0. ) ;
193
+ return StateUpdate :: None ;
194
+ }
195
+ if ui. button ( vec2 ( 140. , y) , "U" ) {
196
+ state. offset += vec2 ( 0. , 0.1 ) ;
197
+ return StateUpdate :: None ;
198
+ }
199
+ if ui. button ( vec2 ( 160. , y) , "D" ) {
200
+ state. offset += vec2 ( 0. , -0.1 ) ;
201
+ return StateUpdate :: None ;
202
+ }
226
203
227
- if game. can_undo ( ) && ui. button ( vec2 ( 180. , y) , "Undo" ) {
228
- return StateUpdate :: Execute ( Action :: Undo ) ;
229
- }
230
- // todo close active dialog button
231
- if game. can_redo ( ) && ui. button ( vec2 ( 220. , y) , "Redo" ) {
232
- return StateUpdate :: Execute ( Action :: Redo ) ;
233
- }
234
- if player. can_control
235
- && matches ! ( game. state, GameState :: Playing )
236
- && ui. button ( vec2 ( 270. , y) , "End Turn" )
237
- {
238
- let left = game. actions_left ;
239
- return StateUpdate :: execute_with_warning (
240
- Action :: Playing ( PlayingAction :: EndTurn ) ,
241
- if left > 0 {
242
- vec ! [ format!( "{left} actions left" ) ]
243
- } else {
244
- vec ! [ ]
245
- } ,
246
- ) ;
247
- }
204
+ if game. can_undo ( ) && ui. button ( vec2 ( 180. , y) , "Undo" ) {
205
+ return StateUpdate :: Execute ( Action :: Undo ) ;
206
+ }
207
+ if game. can_redo ( ) && ui. button ( vec2 ( 220. , y) , "Redo" ) {
208
+ return StateUpdate :: Execute ( Action :: Redo ) ;
209
+ }
210
+ if player. can_control
211
+ && matches ! ( game. state, GameState :: Playing )
212
+ && ui. button ( vec2 ( 270. , y) , "End Turn" )
213
+ {
214
+ let left = game. actions_left ;
215
+ return StateUpdate :: execute_with_warning (
216
+ Action :: Playing ( PlayingAction :: EndTurn ) ,
217
+ if left > 0 {
218
+ vec ! [ format!( "{left} actions left" ) ]
219
+ } else {
220
+ vec ! [ ]
221
+ } ,
222
+ ) ;
223
+ }
248
224
249
- if player. can_play_action && ui. button ( vec2 ( 340. , y) , "Move" ) {
250
- return StateUpdate :: execute ( Action :: Playing ( PlayingAction :: MoveUnits ) ) ;
251
- }
252
- if player. can_play_action && ui. button ( vec2 ( 390. , y) , "Happiness" ) {
253
- return start_increase_happiness ( game, & player) ;
254
- }
255
- if ui. button ( vec2 ( 490. , y) , "Advances" ) {
256
- return StateUpdate :: OpenDialog ( ActiveDialog :: AdvanceMenu ) ;
225
+ if player. can_play_action && ui. button ( vec2 ( 340. , y) , "Move" ) {
226
+ return StateUpdate :: execute ( Action :: Playing ( PlayingAction :: MoveUnits ) ) ;
227
+ }
228
+ if player. can_play_action && ui. button ( vec2 ( 390. , y) , "Happiness" ) {
229
+ return start_increase_happiness ( game, & player) ;
230
+ }
231
+ if ui. button ( vec2 ( 490. , y) , "Advances" ) {
232
+ return StateUpdate :: OpenDialog ( ActiveDialog :: AdvanceMenu ) ;
233
+ } ;
234
+ if ui. button ( vec2 ( 560. , y) , "Log" ) {
235
+ return StateUpdate :: OpenDialog ( ActiveDialog :: Log ) ;
236
+ } ;
237
+ let d = state. game_state_dialog ( game, & ActiveDialog :: None ) ;
238
+ if !matches ! ( d, ActiveDialog :: None )
239
+ && d. title ( ) != state. active_dialog . title ( )
240
+ && ui. button ( vec2 ( 600. , y) , format ! ( "Back to {}" , d. title( ) ) )
241
+ {
242
+ return StateUpdate :: OpenDialog ( d) ;
243
+ }
244
+
245
+ if features. import_export {
246
+ if ui. button ( vec2 ( 1000. , y) , "Import" ) {
247
+ return StateUpdate :: Import ;
257
248
} ;
258
- if ui. button ( vec2 ( 560 ., y) , "Log " ) {
259
- return StateUpdate :: OpenDialog ( ActiveDialog :: Log ) ;
249
+ if ui. button ( vec2 ( 1100 ., y) , "Export " ) {
250
+ return StateUpdate :: Export ;
260
251
} ;
261
- let d = state. game_state_dialog ( game, & ActiveDialog :: None ) ;
262
- if !matches ! ( d, ActiveDialog :: None )
263
- && d. title ( ) != state. active_dialog . title ( )
264
- && ui. button ( vec2 ( 600. , y) , format ! ( "Back to {}" , d. title( ) ) )
265
- {
266
- return StateUpdate :: OpenDialog ( d) ;
267
- }
268
-
269
- if features. import_export {
270
- if ui. button ( vec2 ( 1000. , y) , "Import" ) {
271
- return StateUpdate :: Import ;
272
- } ;
273
- if ui. button ( vec2 ( 1100. , y) , "Export" ) {
274
- return StateUpdate :: Export ;
275
- } ;
276
- }
277
- StateUpdate :: None
278
- } ) ;
279
- update
252
+ }
253
+ StateUpdate :: None
280
254
}
281
255
282
256
pub fn player_color ( player_index : usize ) -> Color {
0 commit comments