From b5c5c4a1decb3f1044401a67c3c7a63e95e79c08 Mon Sep 17 00:00:00 2001 From: Monty Marz Date: Thu, 23 May 2019 22:45:48 +0000 Subject: [PATCH] Disclaimer Former-commit-id: dd115bb1971f066b19c3424c0a1352eb37dcb159 --- assets/voxygen/element/frames/disclaimer.vox | Bin 0 -> 71908 bytes voxygen/src/menu/main/ui.rs | 566 +++++++++++-------- 2 files changed, 319 insertions(+), 247 deletions(-) create mode 100644 assets/voxygen/element/frames/disclaimer.vox diff --git a/assets/voxygen/element/frames/disclaimer.vox b/assets/voxygen/element/frames/disclaimer.vox new file mode 100644 index 0000000000000000000000000000000000000000..7e0d7d946a18e0040cd2020137c74780c20ed560 GIT binary patch literal 71908 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 IwEW*c0#@u& bg: "voxygen/background/bg_main.png", @@ -93,6 +102,7 @@ pub struct MainMenuUi { login_error: Option, connecting: Option, show_servers: bool, + show_disclaimer: bool, } impl MainMenuUi { @@ -119,6 +129,7 @@ impl MainMenuUi { login_error: None, connecting: None, show_servers: false, + show_disclaimer: true, } } @@ -126,6 +137,7 @@ impl MainMenuUi { let mut events = Vec::new(); let ref mut ui_widgets = self.ui.set_widgets(); let version = env!("CARGO_PKG_VERSION"); + const TEXT_COLOR: Color = Color::Rgba(1.0, 1.0, 1.0, 1.0); // Background image, Veloren logo, Alpha-Version Label Image::new(self.imgs.bg) .middle_of(ui_widgets.window) @@ -141,282 +153,342 @@ impl MainMenuUi { .color(TEXT_COLOR) .set(self.ids.version, ui_widgets); - // TODO: Don't use macros for this? - // Input fields - // Used when the login button is pressed, or enter is pressed within input field - macro_rules! login { - () => { - self.login_error = None; - self.connecting = Some(std::time::Instant::now()); - events.push(Event::LoginAttempt { - username: self.username.clone(), - server_address: self.server_address.clone(), - }); - }; - } + if self.show_disclaimer { + Image::new(self.imgs.disclaimer) + .w_h(1800.0, 800.0) + .middle_of(ui_widgets.window) + .scroll_kids() + .scroll_kids_vertically() + .set(self.ids.disc_window, ui_widgets); - // Singleplayer - // Used when the singleplayer button is pressed - macro_rules! singleplayer { - () => { - self.login_error = None; - events.push(Event::StartSingleplayer); - events.push(Event::LoginAttempt { - username: "singleplayer".to_string(), - server_address: "localhost".to_string(), - }); - }; - } - - const TEXT_COLOR: Color = Color::Rgba(1.0, 1.0, 1.0, 1.0); - // Username - Rectangle::fill_with([320.0, 50.0], color::rgba(0.0, 0.0, 0.0, 0.97)) - .middle_of(ui_widgets.window) - .set(self.ids.usrnm_bg, ui_widgets); - Image::new(self.imgs.input_bg) - .w_h(337.0, 67.0) - .middle_of(self.ids.usrnm_bg) - .set(self.ids.username_bg, ui_widgets); - for event in TextBox::new(&self.username) - .w_h(290.0, 30.0) - .mid_bottom_with_margin_on(self.ids.username_bg, 44.0 / 2.0) - .font_size(22) + Text::new("Disclaimer") + .top_left_with_margins_on(self.ids.disc_window, 30.0, 40.0) + .font_id(self.fonts.metamorph) + .font_size(35) + .font_id(self.fonts.metamorph) + .color(TEXT_COLOR) + .set(self.ids.disc_text_1, ui_widgets); + Text::new( + "Welcome to the alpha version of Veloren!\n\ + \n\ + \n\ + Before you dive into the fun, please keep a few things in mind:\n\ + \n\ + - This is a very early alpha. Expect bugs, extremely unfinished gameplay, unpolished mechanics, and missing features. \n\ + If you are a reviewer, please DO NOT review this version.\n\ + \n\ + - If you have constructive feedback or bug reports, you can contact us via Reddit, GitLab, or our community Discord server.\n\ + \n\ + - Veloren is licensed under the GPL 3 open-source licence. That means you're free to play, modify, and redistribute the game however you wish \n\ + (provided derived work is also under GPL 3). + \n\ + - Veloren is a non-profit community project, and everybody working on it is a volunteer.\n\ + If you like what you see, you're welcome to join the development or art teams! + \n\ + - 'Voxel RPG' is a genre in its own right. First-person shooters used to be called Doom clones.\n\ + Like them, we're trying to build a niche. This game is not a clone, and its development will diverge from existing games in the future.\n\ + \n\ + Thanks for taking the time to read this notice, we hope you enjoy the game!\n\ + \n\ + ~ The Veloren Devs") + .top_left_with_margins_on(self.ids.disc_window, 110.0, 40.0) + .font_id(self.fonts.metamorph) + .font_size(26) .font_id(self.fonts.opensans) - .text_color(TEXT_COLOR) - // transparent background - .color(TRANSPARENT) - .border_color(TRANSPARENT) - .set(self.ids.username_field, ui_widgets) - { - match event { - TextBoxEvent::Update(username) => { - // Note: TextBox limits the input string length to what fits in it - self.username = username.to_string(); - } - TextBoxEvent::Enter => { - login!(); - } - } - } - // Login error - if let Some(msg) = &self.login_error { - let text = Text::new(&msg) - .rgba(1.0, 1.0, 1.0, 1.0) - .font_size(30) - .font_id(self.fonts.opensans); - Rectangle::fill_with([400.0, 100.0], color::TRANSPARENT) - .rgba(0.1, 0.1, 0.1, 1.0) - .parent(ui_widgets.window) - .mid_top_with_margin_on(self.ids.username_bg, -35.0) - .set(self.ids.login_error_bg, ui_widgets); - Image::new(self.imgs.error_frame) - .w_h(400.0, 100.0) - .middle_of(self.ids.login_error_bg) - .set(self.ids.error_frame, ui_widgets); - text.mid_top_with_margin_on(self.ids.error_frame, 10.0) - .set(self.ids.login_error, ui_widgets); + .color(TEXT_COLOR) + .set(self.ids.disc_text_2, ui_widgets); if Button::image(self.imgs.button) - .w_h(100.0, 30.0) - .mid_bottom_with_margin_on(self.ids.login_error_bg, 5.0) + .w_h(300.0, 50.0) + .mid_bottom_with_margin_on(self.ids.disc_window, 30.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .label_y(Relative::Scalar(2.0)) - .label("Okay") - .label_font_size(10) + .label("Accept") + .label_font_size(18) .label_color(TEXT_COLOR) - .set(self.ids.button_ok, ui_widgets) + .set(self.ids.disc_button, ui_widgets) .was_clicked() { - self.login_error = None + self.show_disclaimer = false }; - } - if self.show_servers { - Image::new(self.imgs.error_frame) - .top_left_with_margins_on(ui_widgets.window, 3.0, 3.0) - .w_h(400.0, 400.0) - .set(self.ids.servers_frame, ui_widgets); + } else { + // TODO: Don't use macros for this? + // Input fields + // Used when the login button is pressed, or enter is pressed within input field + macro_rules! login { + () => { + self.login_error = None; + self.connecting = Some(std::time::Instant::now()); + events.push(Event::LoginAttempt { + username: self.username.clone(), + server_address: self.server_address.clone(), + }); + }; + } - let netsettings = &global_state.settings.networking; + // Singleplayer + // Used when the singleplayer button is pressed + macro_rules! singleplayer { + () => { + self.login_error = None; + events.push(Event::StartSingleplayer); + events.push(Event::LoginAttempt { + username: "singleplayer".to_string(), + server_address: "localhost".to_string(), + }); + }; + } - // TODO: Draw scroll bar or remove it. - let (mut items, scrollbar) = List::flow_down(netsettings.servers.len()) - .top_left_with_margins_on(self.ids.servers_frame, 0.0, 5.0) - .w_h(400.0, 300.0) - .scrollbar_next_to() - .scrollbar_thickness(18.0) - .scrollbar_color(TEXT_COLOR) - .set(self.ids.servers_text, ui_widgets); - - while let Some(item) = items.next(ui_widgets) { - let mut text = "".to_string(); - if &netsettings.servers[item.i] == &self.server_address { - text.push_str("* ") - } else { - text.push_str(" ") + // Username + Rectangle::fill_with([320.0, 50.0], color::rgba(0.0, 0.0, 0.0, 0.97)) + .middle_of(ui_widgets.window) + .set(self.ids.usrnm_bg, ui_widgets); + Image::new(self.imgs.input_bg) + .w_h(337.0, 67.0) + .middle_of(self.ids.usrnm_bg) + .set(self.ids.username_bg, ui_widgets); + for event in TextBox::new(&self.username) + .w_h(290.0, 30.0) + .mid_bottom_with_margin_on(self.ids.username_bg, 44.0 / 2.0) + .font_size(22) + .font_id(self.fonts.opensans) + .text_color(TEXT_COLOR) + // transparent background + .color(TRANSPARENT) + .border_color(TRANSPARENT) + .set(self.ids.username_field, ui_widgets) + { + match event { + TextBoxEvent::Update(username) => { + // Note: TextBox limits the input string length to what fits in it + self.username = username.to_string(); + } + TextBoxEvent::Enter => { + login!(); + } } - text.push_str(&netsettings.servers[item.i]); - - if item - .set( - Button::image(self.imgs.button) - .w_h(100.0, 53.0) - .mid_bottom_with_margin_on(self.ids.servers_frame, 5.0) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .label_y(Relative::Scalar(2.0)) - .label(&text) - .label_font_size(20) - .label_color(TEXT_COLOR), - ui_widgets, - ) + } + // Login error + if let Some(msg) = &self.login_error { + let text = Text::new(&msg) + .rgba(1.0, 1.0, 1.0, 1.0) + .font_size(30) + .font_id(self.fonts.opensans); + Rectangle::fill_with([400.0, 100.0], color::TRANSPARENT) + .rgba(0.1, 0.1, 0.1, 1.0) + .parent(ui_widgets.window) + .mid_top_with_margin_on(self.ids.username_bg, -35.0) + .set(self.ids.login_error_bg, ui_widgets); + Image::new(self.imgs.error_frame) + .w_h(400.0, 100.0) + .middle_of(self.ids.login_error_bg) + .set(self.ids.error_frame, ui_widgets); + text.mid_top_with_margin_on(self.ids.error_frame, 10.0) + .set(self.ids.login_error, ui_widgets); + if Button::image(self.imgs.button) + .w_h(100.0, 30.0) + .mid_bottom_with_margin_on(self.ids.login_error_bg, 5.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label_y(Relative::Scalar(2.0)) + .label("Okay") + .label_font_size(10) + .label_color(TEXT_COLOR) + .set(self.ids.button_ok, ui_widgets) .was_clicked() { - // TODO: Set as current server address - self.server_address = netsettings.servers[item.i].clone(); + self.login_error = None + }; + } + if self.show_servers { + Image::new(self.imgs.error_frame) + .top_left_with_margins_on(ui_widgets.window, 3.0, 3.0) + .w_h(400.0, 400.0) + .set(self.ids.servers_frame, ui_widgets); + + let netsettings = &global_state.settings.networking; + + // TODO: Draw scroll bar or remove it. + let (mut items, scrollbar) = List::flow_down(netsettings.servers.len()) + .top_left_with_margins_on(self.ids.servers_frame, 0.0, 5.0) + .w_h(400.0, 300.0) + .scrollbar_next_to() + .scrollbar_thickness(18.0) + .scrollbar_color(TEXT_COLOR) + .set(self.ids.servers_text, ui_widgets); + + while let Some(item) = items.next(ui_widgets) { + let mut text = "".to_string(); + if &netsettings.servers[item.i] == &self.server_address { + text.push_str("* ") + } else { + text.push_str(" ") + } + text.push_str(&netsettings.servers[item.i]); + + if item + .set( + Button::image(self.imgs.button) + .w_h(100.0, 53.0) + .mid_bottom_with_margin_on(self.ids.servers_frame, 5.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label_y(Relative::Scalar(2.0)) + .label(&text) + .label_font_size(20) + .label_color(TEXT_COLOR), + ui_widgets, + ) + .was_clicked() + { + // TODO: Set as current server address + self.server_address = netsettings.servers[item.i].clone(); + } + } + + if Button::image(self.imgs.button) + .w_h(200.0, 53.0) + .mid_bottom_with_margin_on(self.ids.servers_frame, 5.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label_y(Relative::Scalar(2.0)) + .label("Close") + .label_font_size(20) + .label_color(TEXT_COLOR) + .set(self.ids.servers_close, ui_widgets) + .was_clicked() + { + self.show_servers = false + }; + } + // Server address + Rectangle::fill_with([320.0, 50.0], color::rgba(0.0, 0.0, 0.0, 0.97)) + .down_from(self.ids.usrnm_bg, 30.0) + .set(self.ids.srvr_bg, ui_widgets); + Image::new(self.imgs.input_bg) + .w_h(337.0, 67.0) + .middle_of(self.ids.srvr_bg) + .set(self.ids.address_bg, ui_widgets); + for event in TextBox::new(&self.server_address) + .w_h(290.0, 30.0) + .mid_bottom_with_margin_on(self.ids.address_bg, 44.0 / 2.0) + .font_size(22) + .font_id(self.fonts.opensans) + .text_color(TEXT_COLOR) + // transparent background + .color(TRANSPARENT) + .border_color(TRANSPARENT) + .set(self.ids.address_field, ui_widgets) + { + match event { + TextBoxEvent::Update(server_address) => { + self.server_address = server_address.to_string(); + } + TextBoxEvent::Enter => { + login!(); + } } } - - if Button::image(self.imgs.button) - .w_h(200.0, 53.0) - .mid_bottom_with_margin_on(self.ids.servers_frame, 5.0) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .label_y(Relative::Scalar(2.0)) - .label("Close") - .label_font_size(20) - .label_color(TEXT_COLOR) - .set(self.ids.servers_close, ui_widgets) - .was_clicked() - { - self.show_servers = false - }; - } - // Server address - Rectangle::fill_with([320.0, 50.0], color::rgba(0.0, 0.0, 0.0, 0.97)) - .down_from(self.ids.usrnm_bg, 30.0) - .set(self.ids.srvr_bg, ui_widgets); - Image::new(self.imgs.input_bg) - .w_h(337.0, 67.0) - .middle_of(self.ids.srvr_bg) - .set(self.ids.address_bg, ui_widgets); - for event in TextBox::new(&self.server_address) - .w_h(290.0, 30.0) - .mid_bottom_with_margin_on(self.ids.address_bg, 44.0 / 2.0) - .font_size(22) - .font_id(self.fonts.opensans) - .text_color(TEXT_COLOR) - // transparent background - .color(TRANSPARENT) - .border_color(TRANSPARENT) - .set(self.ids.address_field, ui_widgets) - { - match event { - TextBoxEvent::Update(server_address) => { - self.server_address = server_address.to_string(); - } - TextBoxEvent::Enter => { + // Login button + // Change button text and remove hover/press images if a connection is in progress + if let Some(start) = self.connecting { + Button::image(self.imgs.button) + .w_h(258.0, 55.0) + .down_from(self.ids.address_bg, 20.0) + .align_middle_x_of(self.ids.address_bg) + .label("Connecting...") + .label_color({ + let pulse = + ((start.elapsed().as_millis() as f32 * 0.008).sin() + 1.0) / 2.0; + Color::Rgba( + TEXT_COLOR.red() * (pulse / 2.0 + 0.5), + TEXT_COLOR.green() * (pulse / 2.0 + 0.5), + TEXT_COLOR.blue() * (pulse / 2.0 + 0.5), + pulse / 4.0 + 0.75, + ) + }) + .label_font_size(22) + .label_y(Relative::Scalar(5.0)) + .set(self.ids.login_button, ui_widgets); + } else { + if Button::image(self.imgs.button) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .w_h(258.0, 55.0) + .down_from(self.ids.address_bg, 20.0) + .align_middle_x_of(self.ids.address_bg) + .label("Login") + .label_color(TEXT_COLOR) + .label_font_size(24) + .label_y(Relative::Scalar(5.0)) + .set(self.ids.login_button, ui_widgets) + .was_clicked() + { login!(); } - } - } - // Login button - // Change button text and remove hover/press images if a connection is in progress - if let Some(start) = self.connecting { - Button::image(self.imgs.button) - .w_h(258.0, 55.0) - .down_from(self.ids.address_bg, 20.0) - .align_middle_x_of(self.ids.address_bg) - .label("Connecting...") - .label_color({ - let pulse = ((start.elapsed().as_millis() as f32 * 0.008).sin() + 1.0) / 2.0; - Color::Rgba( - TEXT_COLOR.red() * (pulse / 2.0 + 0.5), - TEXT_COLOR.green() * (pulse / 2.0 + 0.5), - TEXT_COLOR.blue() * (pulse / 2.0 + 0.5), - pulse / 4.0 + 0.75, - ) - }) - .label_font_size(22) - .label_y(Relative::Scalar(5.0)) - .set(self.ids.login_button, ui_widgets); - } else { + }; + + // Singleplayer button if Button::image(self.imgs.button) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .w_h(258.0, 55.0) - .down_from(self.ids.address_bg, 20.0) + .down_from(self.ids.login_button, 20.0) .align_middle_x_of(self.ids.address_bg) - .label("Login") + .label("Singleplayer") .label_color(TEXT_COLOR) - .label_font_size(24) + .label_font_size(22) .label_y(Relative::Scalar(5.0)) - .set(self.ids.login_button, ui_widgets) + .label_x(Relative::Scalar(2.0)) + .set(self.ids.singleplayer_button, ui_widgets) .was_clicked() { - login!(); + singleplayer!(); } - }; - - // Singleplayer button - if Button::image(self.imgs.button) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .w_h(258.0, 55.0) - .down_from(self.ids.login_button, 20.0) - .align_middle_x_of(self.ids.address_bg) - .label("Singleplayer") - .label_color(TEXT_COLOR) - .label_font_size(22) - .label_y(Relative::Scalar(5.0)) - .label_x(Relative::Scalar(2.0)) - .set(self.ids.singleplayer_button, ui_widgets) - .was_clicked() - { - singleplayer!(); + // Quit + if Button::image(self.imgs.button) + .w_h(190.0, 40.0) + .bottom_left_with_margins_on(ui_widgets.window, 60.0, 30.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label("Quit") + .label_color(TEXT_COLOR) + .label_font_size(20) + .label_y(Relative::Scalar(3.0)) + .set(self.ids.quit_button, ui_widgets) + .was_clicked() + { + events.push(Event::Quit); + }; + // Settings + if Button::image(self.imgs.button) + .w_h(190.0, 40.0) + .up_from(self.ids.quit_button, 8.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label("Settings") + .label_color(TEXT_COLOR) + .label_font_size(20) + .label_y(Relative::Scalar(3.0)) + .set(self.ids.settings_button, ui_widgets) + .was_clicked() + {}; + // Servers + if Button::image(self.imgs.button) + .w_h(190.0, 40.0) + .up_from(self.ids.settings_button, 8.0) + .hover_image(self.imgs.button_hover) + .press_image(self.imgs.button_press) + .label("Servers") + .label_color(TEXT_COLOR) + .label_font_size(20) + .label_y(Relative::Scalar(3.0)) + .set(self.ids.servers_button, ui_widgets) + .was_clicked() + { + self.show_servers = true; + }; } - // Quit - if Button::image(self.imgs.button) - .w_h(190.0, 40.0) - .bottom_left_with_margins_on(ui_widgets.window, 60.0, 30.0) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .label("Quit") - .label_color(TEXT_COLOR) - .label_font_size(20) - .label_y(Relative::Scalar(3.0)) - .set(self.ids.quit_button, ui_widgets) - .was_clicked() - { - events.push(Event::Quit); - }; - // Settings - if Button::image(self.imgs.button) - .w_h(190.0, 40.0) - .up_from(self.ids.quit_button, 8.0) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .label("Settings") - .label_color(TEXT_COLOR) - .label_font_size(20) - .label_y(Relative::Scalar(3.0)) - .set(self.ids.settings_button, ui_widgets) - .was_clicked() - {}; - // Servers - if Button::image(self.imgs.button) - .w_h(190.0, 40.0) - .up_from(self.ids.settings_button, 8.0) - .hover_image(self.imgs.button_hover) - .press_image(self.imgs.button_press) - .label("Servers") - .label_color(TEXT_COLOR) - .label_font_size(20) - .label_y(Relative::Scalar(3.0)) - .set(self.ids.servers_button, ui_widgets) - .was_clicked() - { - self.show_servers = true; - }; events }