diff --git a/data/ui/menu/brown/b.png b/data/ui/menu/brown/b.png new file mode 100644 index 00000000..0680fde5 Binary files /dev/null and b/data/ui/menu/brown/b.png differ diff --git a/data/ui/menu/brown/bl.png b/data/ui/menu/brown/bl.png new file mode 100644 index 00000000..0d32f1ac Binary files /dev/null and b/data/ui/menu/brown/bl.png differ diff --git a/data/ui/menu/brown/br.png b/data/ui/menu/brown/br.png new file mode 100644 index 00000000..af37f5d1 Binary files /dev/null and b/data/ui/menu/brown/br.png differ diff --git a/data/ui/menu/brown/c.png b/data/ui/menu/brown/c.png new file mode 100644 index 00000000..51015fb4 Binary files /dev/null and b/data/ui/menu/brown/c.png differ diff --git a/data/ui/menu/brown/divider-blue-c.png b/data/ui/menu/brown/divider-blue-c.png new file mode 100644 index 00000000..7ba0a324 Binary files /dev/null and b/data/ui/menu/brown/divider-blue-c.png differ diff --git a/data/ui/menu/brown/divider-blue-l.png b/data/ui/menu/brown/divider-blue-l.png new file mode 100644 index 00000000..987ff3e2 Binary files /dev/null and b/data/ui/menu/brown/divider-blue-l.png differ diff --git a/data/ui/menu/brown/divider-blue-r.png b/data/ui/menu/brown/divider-blue-r.png new file mode 100644 index 00000000..9fe8e7ef Binary files /dev/null and b/data/ui/menu/brown/divider-blue-r.png differ diff --git a/data/ui/menu/brown/divider-orange-c.png b/data/ui/menu/brown/divider-orange-c.png new file mode 100644 index 00000000..c40c8734 Binary files /dev/null and b/data/ui/menu/brown/divider-orange-c.png differ diff --git a/data/ui/menu/brown/divider-orange-l.png b/data/ui/menu/brown/divider-orange-l.png new file mode 100644 index 00000000..32bece1d Binary files /dev/null and b/data/ui/menu/brown/divider-orange-l.png differ diff --git a/data/ui/menu/brown/divider-orange-r.png b/data/ui/menu/brown/divider-orange-r.png new file mode 100644 index 00000000..f1bfdbd3 Binary files /dev/null and b/data/ui/menu/brown/divider-orange-r.png differ diff --git a/data/ui/menu/brown/l.png b/data/ui/menu/brown/l.png new file mode 100644 index 00000000..beff3347 Binary files /dev/null and b/data/ui/menu/brown/l.png differ diff --git a/data/ui/menu/brown/r.png b/data/ui/menu/brown/r.png new file mode 100644 index 00000000..f21ad3c5 Binary files /dev/null and b/data/ui/menu/brown/r.png differ diff --git a/data/ui/menu/brown/t.png b/data/ui/menu/brown/t.png new file mode 100644 index 00000000..52f21c94 Binary files /dev/null and b/data/ui/menu/brown/t.png differ diff --git a/data/ui/menu/brown/tabt.png b/data/ui/menu/brown/tabt.png new file mode 100644 index 00000000..7a580df2 Binary files /dev/null and b/data/ui/menu/brown/tabt.png differ diff --git a/data/ui/menu/brown/tl.png b/data/ui/menu/brown/tl.png new file mode 100644 index 00000000..b06c5ae3 Binary files /dev/null and b/data/ui/menu/brown/tl.png differ diff --git a/data/ui/menu/brown/tr.png b/data/ui/menu/brown/tr.png new file mode 100644 index 00000000..88be215e Binary files /dev/null and b/data/ui/menu/brown/tr.png differ diff --git a/data/ui/menu/grey/b.png b/data/ui/menu/grey/b.png new file mode 100644 index 00000000..781be46b Binary files /dev/null and b/data/ui/menu/grey/b.png differ diff --git a/data/ui/menu/grey/bl.png b/data/ui/menu/grey/bl.png new file mode 100644 index 00000000..2472767f Binary files /dev/null and b/data/ui/menu/grey/bl.png differ diff --git a/data/ui/menu/grey/br.png b/data/ui/menu/grey/br.png new file mode 100644 index 00000000..dcff8865 Binary files /dev/null and b/data/ui/menu/grey/br.png differ diff --git a/data/ui/menu/grey/c.png b/data/ui/menu/grey/c.png new file mode 100644 index 00000000..56ab6379 Binary files /dev/null and b/data/ui/menu/grey/c.png differ diff --git a/data/ui/menu/grey/l.png b/data/ui/menu/grey/l.png new file mode 100644 index 00000000..327c6c59 Binary files /dev/null and b/data/ui/menu/grey/l.png differ diff --git a/data/ui/menu/grey/r.png b/data/ui/menu/grey/r.png new file mode 100644 index 00000000..39968e4f Binary files /dev/null and b/data/ui/menu/grey/r.png differ diff --git a/data/ui/menu/grey/t.png b/data/ui/menu/grey/t.png new file mode 100644 index 00000000..6c6e64f0 Binary files /dev/null and b/data/ui/menu/grey/t.png differ diff --git a/data/ui/menu/grey/tabt.png b/data/ui/menu/grey/tabt.png new file mode 100644 index 00000000..9c424a6e Binary files /dev/null and b/data/ui/menu/grey/tabt.png differ diff --git a/data/ui/menu/grey/tl.png b/data/ui/menu/grey/tl.png new file mode 100644 index 00000000..87b0706d Binary files /dev/null and b/data/ui/menu/grey/tl.png differ diff --git a/data/ui/menu/grey/tr.png b/data/ui/menu/grey/tr.png new file mode 100644 index 00000000..324a7ff8 Binary files /dev/null and b/data/ui/menu/grey/tr.png differ diff --git a/data/ui/play/achiev_d.png b/data/ui/play/achiev_d.png new file mode 100644 index 00000000..0359dbd7 Binary files /dev/null and b/data/ui/play/achiev_d.png differ diff --git a/data/ui/play/achiev_h.png b/data/ui/play/achiev_h.png new file mode 100644 index 00000000..d6228240 Binary files /dev/null and b/data/ui/play/achiev_h.png differ diff --git a/data/ui/play/achiev_i.png b/data/ui/play/achiev_i.png new file mode 100644 index 00000000..4529f3c2 Binary files /dev/null and b/data/ui/play/achiev_i.png differ diff --git a/data/ui/play/achiev_n.png b/data/ui/play/achiev_n.png new file mode 100644 index 00000000..3fc1fc9a Binary files /dev/null and b/data/ui/play/achiev_n.png differ diff --git a/data/ui/play/change_marble_text.png b/data/ui/play/change_marble_text.png new file mode 100644 index 00000000..17b3ccec Binary files /dev/null and b/data/ui/play/change_marble_text.png differ diff --git a/data/ui/play/custommenu2_d.png b/data/ui/play/custommenu2_d.png new file mode 100644 index 00000000..a78e7a8c Binary files /dev/null and b/data/ui/play/custommenu2_d.png differ diff --git a/data/ui/play/custommenu2_h.png b/data/ui/play/custommenu2_h.png new file mode 100644 index 00000000..a78e7a8c Binary files /dev/null and b/data/ui/play/custommenu2_h.png differ diff --git a/data/ui/play/custommenu2_n.png b/data/ui/play/custommenu2_n.png new file mode 100644 index 00000000..a78e7a8c Binary files /dev/null and b/data/ui/play/custommenu2_n.png differ diff --git a/data/ui/play/custommenu_d.png b/data/ui/play/custommenu_d.png new file mode 100644 index 00000000..123a2f11 Binary files /dev/null and b/data/ui/play/custommenu_d.png differ diff --git a/data/ui/play/custommenu_h.png b/data/ui/play/custommenu_h.png new file mode 100644 index 00000000..123a2f11 Binary files /dev/null and b/data/ui/play/custommenu_h.png differ diff --git a/data/ui/play/custommenu_n.png b/data/ui/play/custommenu_n.png new file mode 100644 index 00000000..123a2f11 Binary files /dev/null and b/data/ui/play/custommenu_n.png differ diff --git a/data/ui/play/difficulty_advanced_d.png b/data/ui/play/difficulty_advanced_d.png new file mode 100644 index 00000000..c0aef938 Binary files /dev/null and b/data/ui/play/difficulty_advanced_d.png differ diff --git a/data/ui/play/difficulty_advanced_h.png b/data/ui/play/difficulty_advanced_h.png new file mode 100644 index 00000000..e2c5ac9a Binary files /dev/null and b/data/ui/play/difficulty_advanced_h.png differ diff --git a/data/ui/play/difficulty_advanced_i.png b/data/ui/play/difficulty_advanced_i.png new file mode 100644 index 00000000..4a8e7b38 Binary files /dev/null and b/data/ui/play/difficulty_advanced_i.png differ diff --git a/data/ui/play/difficulty_advanced_n.png b/data/ui/play/difficulty_advanced_n.png new file mode 100644 index 00000000..ae88c7c0 Binary files /dev/null and b/data/ui/play/difficulty_advanced_n.png differ diff --git a/data/ui/play/difficulty_beginner_d.png b/data/ui/play/difficulty_beginner_d.png new file mode 100644 index 00000000..85d2d29f Binary files /dev/null and b/data/ui/play/difficulty_beginner_d.png differ diff --git a/data/ui/play/difficulty_beginner_h.png b/data/ui/play/difficulty_beginner_h.png new file mode 100644 index 00000000..eb2361af Binary files /dev/null and b/data/ui/play/difficulty_beginner_h.png differ diff --git a/data/ui/play/difficulty_beginner_i.png b/data/ui/play/difficulty_beginner_i.png new file mode 100644 index 00000000..2fae6a9c Binary files /dev/null and b/data/ui/play/difficulty_beginner_i.png differ diff --git a/data/ui/play/difficulty_beginner_n.png b/data/ui/play/difficulty_beginner_n.png new file mode 100644 index 00000000..1dafae45 Binary files /dev/null and b/data/ui/play/difficulty_beginner_n.png differ diff --git a/data/ui/play/difficulty_custom_d.png b/data/ui/play/difficulty_custom_d.png new file mode 100644 index 00000000..9ca4dce7 Binary files /dev/null and b/data/ui/play/difficulty_custom_d.png differ diff --git a/data/ui/play/difficulty_custom_h.png b/data/ui/play/difficulty_custom_h.png new file mode 100644 index 00000000..25476c26 Binary files /dev/null and b/data/ui/play/difficulty_custom_h.png differ diff --git a/data/ui/play/difficulty_custom_i.png b/data/ui/play/difficulty_custom_i.png new file mode 100644 index 00000000..eb5334b3 Binary files /dev/null and b/data/ui/play/difficulty_custom_i.png differ diff --git a/data/ui/play/difficulty_custom_n.png b/data/ui/play/difficulty_custom_n.png new file mode 100644 index 00000000..fd7f9405 Binary files /dev/null and b/data/ui/play/difficulty_custom_n.png differ diff --git a/data/ui/play/difficulty_expert_d.png b/data/ui/play/difficulty_expert_d.png new file mode 100644 index 00000000..077b377d Binary files /dev/null and b/data/ui/play/difficulty_expert_d.png differ diff --git a/data/ui/play/difficulty_expert_h.png b/data/ui/play/difficulty_expert_h.png new file mode 100644 index 00000000..1f9d40c6 Binary files /dev/null and b/data/ui/play/difficulty_expert_h.png differ diff --git a/data/ui/play/difficulty_expert_i.png b/data/ui/play/difficulty_expert_i.png new file mode 100644 index 00000000..7c892c3f Binary files /dev/null and b/data/ui/play/difficulty_expert_i.png differ diff --git a/data/ui/play/difficulty_expert_n.png b/data/ui/play/difficulty_expert_n.png new file mode 100644 index 00000000..9d1eb1bd Binary files /dev/null and b/data/ui/play/difficulty_expert_n.png differ diff --git a/data/ui/play/difficulty_highlight-120_d.png b/data/ui/play/difficulty_highlight-120_d.png new file mode 100644 index 00000000..88d400de Binary files /dev/null and b/data/ui/play/difficulty_highlight-120_d.png differ diff --git a/data/ui/play/difficulty_highlight-120_h.png b/data/ui/play/difficulty_highlight-120_h.png new file mode 100644 index 00000000..2678e67e Binary files /dev/null and b/data/ui/play/difficulty_highlight-120_h.png differ diff --git a/data/ui/play/difficulty_highlight-120_i.png b/data/ui/play/difficulty_highlight-120_i.png new file mode 100644 index 00000000..85ee56a5 Binary files /dev/null and b/data/ui/play/difficulty_highlight-120_i.png differ diff --git a/data/ui/play/difficulty_highlight-120_n.png b/data/ui/play/difficulty_highlight-120_n.png new file mode 100644 index 00000000..910250d1 Binary files /dev/null and b/data/ui/play/difficulty_highlight-120_n.png differ diff --git a/data/ui/play/difficulty_highlight-140_d.png b/data/ui/play/difficulty_highlight-140_d.png new file mode 100644 index 00000000..d9e1d225 Binary files /dev/null and b/data/ui/play/difficulty_highlight-140_d.png differ diff --git a/data/ui/play/difficulty_highlight-140_h.png b/data/ui/play/difficulty_highlight-140_h.png new file mode 100644 index 00000000..aaf86e06 Binary files /dev/null and b/data/ui/play/difficulty_highlight-140_h.png differ diff --git a/data/ui/play/difficulty_highlight-140_i.png b/data/ui/play/difficulty_highlight-140_i.png new file mode 100644 index 00000000..6d91dc08 Binary files /dev/null and b/data/ui/play/difficulty_highlight-140_i.png differ diff --git a/data/ui/play/difficulty_highlight-140_n.png b/data/ui/play/difficulty_highlight-140_n.png new file mode 100644 index 00000000..c637c2b2 Binary files /dev/null and b/data/ui/play/difficulty_highlight-140_n.png differ diff --git a/data/ui/play/difficulty_intermediate_d.png b/data/ui/play/difficulty_intermediate_d.png new file mode 100644 index 00000000..9efc7236 Binary files /dev/null and b/data/ui/play/difficulty_intermediate_d.png differ diff --git a/data/ui/play/difficulty_intermediate_h.png b/data/ui/play/difficulty_intermediate_h.png new file mode 100644 index 00000000..045b8627 Binary files /dev/null and b/data/ui/play/difficulty_intermediate_h.png differ diff --git a/data/ui/play/difficulty_intermediate_i.png b/data/ui/play/difficulty_intermediate_i.png new file mode 100644 index 00000000..66732b26 Binary files /dev/null and b/data/ui/play/difficulty_intermediate_i.png differ diff --git a/data/ui/play/difficulty_intermediate_n.png b/data/ui/play/difficulty_intermediate_n.png new file mode 100644 index 00000000..4027aeef Binary files /dev/null and b/data/ui/play/difficulty_intermediate_n.png differ diff --git a/data/ui/play/difficultymenu_d.png b/data/ui/play/difficultymenu_d.png new file mode 100644 index 00000000..2aa11141 Binary files /dev/null and b/data/ui/play/difficultymenu_d.png differ diff --git a/data/ui/play/difficultymenu_h.png b/data/ui/play/difficultymenu_h.png new file mode 100644 index 00000000..2aa11141 Binary files /dev/null and b/data/ui/play/difficultymenu_h.png differ diff --git a/data/ui/play/difficultymenu_n.png b/data/ui/play/difficultymenu_n.png new file mode 100644 index 00000000..2aa11141 Binary files /dev/null and b/data/ui/play/difficultymenu_n.png differ diff --git a/data/ui/play/editor_d.png b/data/ui/play/editor_d.png new file mode 100644 index 00000000..cbed2ffc Binary files /dev/null and b/data/ui/play/editor_d.png differ diff --git a/data/ui/play/editor_h.png b/data/ui/play/editor_h.png new file mode 100644 index 00000000..af2d5964 Binary files /dev/null and b/data/ui/play/editor_h.png differ diff --git a/data/ui/play/editor_i.png b/data/ui/play/editor_i.png new file mode 100644 index 00000000..56a4a11f Binary files /dev/null and b/data/ui/play/editor_i.png differ diff --git a/data/ui/play/editor_n.png b/data/ui/play/editor_n.png new file mode 100644 index 00000000..6bd73fc9 Binary files /dev/null and b/data/ui/play/editor_n.png differ diff --git a/data/ui/play/eggfound.png b/data/ui/play/eggfound.png new file mode 100644 index 00000000..c3bfb504 Binary files /dev/null and b/data/ui/play/eggfound.png differ diff --git a/data/ui/play/eggnotfound.png b/data/ui/play/eggnotfound.png new file mode 100644 index 00000000..0a0b7166 Binary files /dev/null and b/data/ui/play/eggnotfound.png differ diff --git a/data/ui/play/levelframe.png b/data/ui/play/levelframe.png new file mode 100644 index 00000000..661bfcee Binary files /dev/null and b/data/ui/play/levelframe.png differ diff --git a/data/ui/play/levelframe_d.png b/data/ui/play/levelframe_d.png new file mode 100644 index 00000000..35e7c034 Binary files /dev/null and b/data/ui/play/levelframe_d.png differ diff --git a/data/ui/play/levelframe_h.png b/data/ui/play/levelframe_h.png new file mode 100644 index 00000000..35e7c034 Binary files /dev/null and b/data/ui/play/levelframe_h.png differ diff --git a/data/ui/play/levelframe_i.png b/data/ui/play/levelframe_i.png new file mode 100644 index 00000000..35e7c034 Binary files /dev/null and b/data/ui/play/levelframe_i.png differ diff --git a/data/ui/play/levelframe_n.png b/data/ui/play/levelframe_n.png new file mode 100644 index 00000000..35e7c034 Binary files /dev/null and b/data/ui/play/levelframe_n.png differ diff --git a/data/ui/play/marble_d.png b/data/ui/play/marble_d.png new file mode 100644 index 00000000..82ab927f Binary files /dev/null and b/data/ui/play/marble_d.png differ diff --git a/data/ui/play/marble_gold.png b/data/ui/play/marble_gold.png new file mode 100644 index 00000000..19de858a Binary files /dev/null and b/data/ui/play/marble_gold.png differ diff --git a/data/ui/play/marble_h.png b/data/ui/play/marble_h.png new file mode 100644 index 00000000..34ddce05 Binary files /dev/null and b/data/ui/play/marble_h.png differ diff --git a/data/ui/play/marble_i.png b/data/ui/play/marble_i.png new file mode 100644 index 00000000..c8945be8 Binary files /dev/null and b/data/ui/play/marble_i.png differ diff --git a/data/ui/play/marble_n.png b/data/ui/play/marble_n.png new file mode 100644 index 00000000..9d94fd6a Binary files /dev/null and b/data/ui/play/marble_n.png differ diff --git a/data/ui/play/marble_platinum.png b/data/ui/play/marble_platinum.png new file mode 100644 index 00000000..3e0a7067 Binary files /dev/null and b/data/ui/play/marble_platinum.png differ diff --git a/data/ui/play/marble_ultra.png b/data/ui/play/marble_ultra.png new file mode 100644 index 00000000..c4ba9e40 Binary files /dev/null and b/data/ui/play/marble_ultra.png differ diff --git a/data/ui/play/menu_d.png b/data/ui/play/menu_d.png new file mode 100644 index 00000000..9ddbee34 Binary files /dev/null and b/data/ui/play/menu_d.png differ diff --git a/data/ui/play/menu_h.png b/data/ui/play/menu_h.png new file mode 100644 index 00000000..7a4721ae Binary files /dev/null and b/data/ui/play/menu_h.png differ diff --git a/data/ui/play/menu_i.png b/data/ui/play/menu_i.png new file mode 100644 index 00000000..0ac77691 Binary files /dev/null and b/data/ui/play/menu_i.png differ diff --git a/data/ui/play/menu_n.png b/data/ui/play/menu_n.png new file mode 100644 index 00000000..ccaef25f Binary files /dev/null and b/data/ui/play/menu_n.png differ diff --git a/data/ui/play/more_d.png b/data/ui/play/more_d.png new file mode 100644 index 00000000..ca9f961b Binary files /dev/null and b/data/ui/play/more_d.png differ diff --git a/data/ui/play/more_h.png b/data/ui/play/more_h.png new file mode 100644 index 00000000..aade5a1b Binary files /dev/null and b/data/ui/play/more_h.png differ diff --git a/data/ui/play/more_i.png b/data/ui/play/more_i.png new file mode 100644 index 00000000..f3d14b8c Binary files /dev/null and b/data/ui/play/more_i.png differ diff --git a/data/ui/play/more_n.png b/data/ui/play/more_n.png new file mode 100644 index 00000000..40933e1b Binary files /dev/null and b/data/ui/play/more_n.png differ diff --git a/data/ui/play/moremenu_d.png b/data/ui/play/moremenu_d.png new file mode 100644 index 00000000..0ab503f2 Binary files /dev/null and b/data/ui/play/moremenu_d.png differ diff --git a/data/ui/play/moremenu_h.png b/data/ui/play/moremenu_h.png new file mode 100644 index 00000000..0ab503f2 Binary files /dev/null and b/data/ui/play/moremenu_h.png differ diff --git a/data/ui/play/moremenu_i.png b/data/ui/play/moremenu_i.png new file mode 100644 index 00000000..0ab503f2 Binary files /dev/null and b/data/ui/play/moremenu_i.png differ diff --git a/data/ui/play/moremenu_n.png b/data/ui/play/moremenu_n.png new file mode 100644 index 00000000..0ab503f2 Binary files /dev/null and b/data/ui/play/moremenu_n.png differ diff --git a/data/ui/play/next_d.png b/data/ui/play/next_d.png index 7b3dccd8..8ca13858 100644 Binary files a/data/ui/play/next_d.png and b/data/ui/play/next_d.png differ diff --git a/data/ui/play/next_h.png b/data/ui/play/next_h.png index e64ebe24..b563ee1b 100644 Binary files a/data/ui/play/next_h.png and b/data/ui/play/next_h.png differ diff --git a/data/ui/play/next_i.png b/data/ui/play/next_i.png index d21727fe..a367fd70 100644 Binary files a/data/ui/play/next_i.png and b/data/ui/play/next_i.png differ diff --git a/data/ui/play/next_n.png b/data/ui/play/next_n.png index e00bb7c8..244bab8c 100644 Binary files a/data/ui/play/next_n.png and b/data/ui/play/next_n.png differ diff --git a/data/ui/play/play_d.png b/data/ui/play/play_d.png index 11d35680..00f63bcb 100644 Binary files a/data/ui/play/play_d.png and b/data/ui/play/play_d.png differ diff --git a/data/ui/play/play_h.png b/data/ui/play/play_h.png index ddc4c93f..408f3a82 100644 Binary files a/data/ui/play/play_h.png and b/data/ui/play/play_h.png differ diff --git a/data/ui/play/play_i.png b/data/ui/play/play_i.png index 3e9a92f3..85c0b9fc 100644 Binary files a/data/ui/play/play_i.png and b/data/ui/play/play_i.png differ diff --git a/data/ui/play/play_n.png b/data/ui/play/play_n.png index 5caafa0c..feed0fb8 100644 Binary files a/data/ui/play/play_n.png and b/data/ui/play/play_n.png differ diff --git a/data/ui/play/prev_d.png b/data/ui/play/prev_d.png index 34b20805..83d97913 100644 Binary files a/data/ui/play/prev_d.png and b/data/ui/play/prev_d.png differ diff --git a/data/ui/play/prev_h.png b/data/ui/play/prev_h.png index 3c4bd0ef..ffe7fcc2 100644 Binary files a/data/ui/play/prev_h.png and b/data/ui/play/prev_h.png differ diff --git a/data/ui/play/prev_i.png b/data/ui/play/prev_i.png index e71740ef..9d8578ab 100644 Binary files a/data/ui/play/prev_i.png and b/data/ui/play/prev_i.png differ diff --git a/data/ui/play/prev_n.png b/data/ui/play/prev_n.png index b1ef44ba..30aef5b4 100644 Binary files a/data/ui/play/prev_n.png and b/data/ui/play/prev_n.png differ diff --git a/data/ui/play/replay_d.png b/data/ui/play/replay_d.png new file mode 100644 index 00000000..70de44b3 Binary files /dev/null and b/data/ui/play/replay_d.png differ diff --git a/data/ui/play/replay_h.png b/data/ui/play/replay_h.png new file mode 100644 index 00000000..024489da Binary files /dev/null and b/data/ui/play/replay_h.png differ diff --git a/data/ui/play/replay_i.png b/data/ui/play/replay_i.png new file mode 100644 index 00000000..7e6c1a3e Binary files /dev/null and b/data/ui/play/replay_i.png differ diff --git a/data/ui/play/replay_n.png b/data/ui/play/replay_n.png new file mode 100644 index 00000000..3a37ecd9 Binary files /dev/null and b/data/ui/play/replay_n.png differ diff --git a/data/ui/play/search_d.png b/data/ui/play/search_d.png new file mode 100644 index 00000000..32905a99 Binary files /dev/null and b/data/ui/play/search_d.png differ diff --git a/data/ui/play/search_h.png b/data/ui/play/search_h.png new file mode 100644 index 00000000..17a36fcf Binary files /dev/null and b/data/ui/play/search_h.png differ diff --git a/data/ui/play/search_i.png b/data/ui/play/search_i.png new file mode 100644 index 00000000..9d3eaa05 Binary files /dev/null and b/data/ui/play/search_i.png differ diff --git a/data/ui/play/search_n.png b/data/ui/play/search_n.png new file mode 100644 index 00000000..2faa0452 Binary files /dev/null and b/data/ui/play/search_n.png differ diff --git a/data/ui/play/statistics_d.png b/data/ui/play/statistics_d.png new file mode 100644 index 00000000..f8a84a69 Binary files /dev/null and b/data/ui/play/statistics_d.png differ diff --git a/data/ui/play/statistics_h.png b/data/ui/play/statistics_h.png new file mode 100644 index 00000000..9813feb1 Binary files /dev/null and b/data/ui/play/statistics_h.png differ diff --git a/data/ui/play/statistics_i.png b/data/ui/play/statistics_i.png new file mode 100644 index 00000000..cb12f1ab Binary files /dev/null and b/data/ui/play/statistics_i.png differ diff --git a/data/ui/play/statistics_n.png b/data/ui/play/statistics_n.png new file mode 100644 index 00000000..6535038b Binary files /dev/null and b/data/ui/play/statistics_n.png differ diff --git a/data/ui/play/statistics_text.png b/data/ui/play/statistics_text.png new file mode 100644 index 00000000..ddd29575 Binary files /dev/null and b/data/ui/play/statistics_text.png differ diff --git a/data/ui/play/tab.png b/data/ui/play/tab.png new file mode 100644 index 00000000..e3a33b0b Binary files /dev/null and b/data/ui/play/tab.png differ diff --git a/data/ui/play/text_window.png b/data/ui/play/text_window.png index a50467c0..da73508b 100644 Binary files a/data/ui/play/text_window.png and b/data/ui/play/text_window.png differ diff --git a/data/ui/play/window.png b/data/ui/play/window.png new file mode 100644 index 00000000..9acece0b Binary files /dev/null and b/data/ui/play/window.png differ diff --git a/src/MissionList.hx b/src/MissionList.hx index 085d613b..e6350a8c 100644 --- a/src/MissionList.hx +++ b/src/MissionList.hx @@ -52,7 +52,7 @@ class MissionList { intermediateMissions = parseDifficulty("intermediate"); advancedMissions = parseDifficulty("advanced"); expertMissions = parseDifficulty("expert"); - customMissions = parseDifficulty("expert"); + customMissions = parseDifficulty("custom"); @:privateAccess beginnerMissions[beginnerMissions.length - 1].next = intermediateMissions[0]; @:privateAccess intermediateMissions[intermediateMissions.length - 1].next = advancedMissions[0]; diff --git a/src/gui/Canvas.hx b/src/gui/Canvas.hx index 0252e931..f9be47b6 100644 --- a/src/gui/Canvas.hx +++ b/src/gui/Canvas.hx @@ -32,8 +32,9 @@ class Canvas extends GuiControl { this.render(scene2d); } - public function popDialog(content:GuiControl) { - content.dispose(); + public function popDialog(content:GuiControl, dispose:Bool = true) { + if (dispose) + content.dispose(); this.removeChild(content); this.render(scene2d); } diff --git a/src/gui/GuiButtonText.hx b/src/gui/GuiButtonText.hx index 6e900335..d3904f0e 100644 --- a/src/gui/GuiButtonText.hx +++ b/src/gui/GuiButtonText.hx @@ -6,6 +6,8 @@ import h2d.Tile; class GuiButtonText extends GuiButton { var txtCtrl:GuiText; + public var ratio = 0.25; + public function new(images:Array, font:h2d.Font) { super(images); txtCtrl = new GuiText(font); @@ -19,6 +21,6 @@ class GuiButtonText extends GuiButton { public function setExtent(extent:Vector) { this.extent = extent; txtCtrl.extent = extent; - txtCtrl.position.y = 4 * extent.y / 16; // Weird ratio shit that makes it as centered as possible + txtCtrl.position.y = extent.y * ratio; // Weird ratio shit that makes it as centered as possible } } diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index e759ef67..6fe287e5 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -1,5 +1,6 @@ package gui; +import h2d.filter.DropShadow; import src.Replay; import haxe.ds.Option; import hxd.Key; @@ -21,6 +22,7 @@ import hxd.res.BitmapFont; import src.ResourceLoader; import h3d.Vector; import src.Util; +import src.MarbleGame; class PlayMissionGui extends GuiImage { static var currentSelectionStatic:Int = -1; @@ -31,9 +33,15 @@ class PlayMissionGui extends GuiImage { var currentList:Array; var setSelectedFunc:Int->Void; + var setScoreHover:Bool->Void; var setCategoryFunc:(String, ?Bool) -> Void; var buttonHoldFunc:(dt:Float, mouseState:MouseState) -> Void; + var pmScoreButton:GuiButton; + var scoreButtonHover:Bool = false; + var scoreButtonDirty:Bool = true; + var scoreShowing:Bool = false; + var buttonCooldown:Float = 0.5; var maxButtonCooldown:Float = 0.5; @@ -46,12 +54,12 @@ class PlayMissionGui extends GuiImage { if (currentSelectionStatic == -1) currentSelectionStatic = cast Math.min(MissionList.beginnerMissions.length - 1, - Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)]); + Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)]); currentSelection = PlayMissionGui.currentSelectionStatic; currentCategory = PlayMissionGui.currentCategoryStatic; - var img = ResourceLoader.getImage("data/ui/background.jpg"); + var img = ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg'); super(img.resource.toTile()); this.horizSizing = Width; @@ -59,12 +67,12 @@ class PlayMissionGui extends GuiImage { this.extent = new Vector(640, 480); this.position = new Vector(0, 0); - var localContainer = new GuiControl(); - localContainer.horizSizing = Center; - localContainer.vertSizing = Center; - localContainer.position = new Vector(-1, 44); - localContainer.extent = new Vector(651, 392); - this.addChild(localContainer); + var container = new GuiControl(); + container.horizSizing = Width; + container.vertSizing = Height; + container.extent = new Vector(640, 480); + container.position = new Vector(0, 0); + this.addChild(container); function loadButtonImages(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -74,110 +82,6 @@ class PlayMissionGui extends GuiImage { return [normal, hover, pressed, disabled]; } - var tabAdvanced = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_adv.png", ResourceLoader.getImage, this.imageResources).toTile()); - tabAdvanced.position = new Vector(410, 21); - tabAdvanced.extent = new Vector(166, 43); - tabAdvanced.pressedAction = (sender) -> { - currentList = MissionList.advancedMissions; - currentCategory = "advanced"; - setCategoryFunc("advanced"); - } - localContainer.addChild(tabAdvanced); - - var tabIntermediate = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_inter.png", ResourceLoader.getImage, this.imageResources).toTile()); - tabIntermediate.position = new Vector(213, 6); - tabIntermediate.extent = new Vector(205, 58); - tabIntermediate.pressedAction = (sender) -> { - currentList = MissionList.intermediateMissions; - currentCategory = "intermediate"; - setCategoryFunc("intermediate"); - } - localContainer.addChild(tabIntermediate); - - var tabCustom = new GuiImage(ResourceLoader.getResource("data/ui/play/cust_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); - tabCustom.position = new Vector(589, 91); - tabCustom.extent = new Vector(52, 198); - tabCustom.pressedAction = (sender) -> { - currentList = MissionList.customMissions; - currentCategory = "custom"; - setCategoryFunc("custom"); - } - localContainer.addChild(tabCustom); - - var pmBox = new GuiImage(ResourceLoader.getResource("data/ui/play/playgui.png", ResourceLoader.getImage, this.imageResources).toTile()); - pmBox.position = new Vector(0, 42); - pmBox.extent = new Vector(610, 351); - pmBox.horizSizing = Width; - pmBox.vertSizing = Height; - localContainer.addChild(pmBox); - - var textWnd = new GuiImage(ResourceLoader.getResource("data/ui/play/text_window.png", ResourceLoader.getImage, this.imageResources).toTile()); - textWnd.horizSizing = Width; - textWnd.vertSizing = Height; - textWnd.position = new Vector(31, 29); - textWnd.extent = new Vector(276, 229); - pmBox.addChild(textWnd); - - var temprev = new BitmapData(1, 1); - temprev.setPixel(0, 0, 0); - var tmpprevtile = Tile.fromBitmap(temprev); - - var pmPreview = new GuiImage(tmpprevtile); - pmPreview.position = new Vector(312, 42); - pmPreview.extent = new Vector(258, 193); - pmBox.addChild(pmPreview); - var filt = new ColorMatrix(Matrix.I()); - pmPreview.bmp.filter = filt; - - var replayPlayButton = new GuiImage(ResourceLoader.getResource("data/ui/play/playback.png", ResourceLoader.getImage, this.imageResources).toTile()); - replayPlayButton.position = new Vector(38, 315); - replayPlayButton.extent = new Vector(18, 18); - replayPlayButton.pressedAction = (sender) -> { - hxd.File.browse((replayToLoad) -> { - replayToLoad.load((replayData) -> { - var replay = new Replay(""); - if (!replay.read(replayData)) { - cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - // Idk do something to notify the user here - } else { - var repmis = replay.mission; - #if js - repmis = StringTools.replace(repmis, "data/", ""); - #end - var playMis = MissionList.missions.get(repmis); - if (playMis != null) { - cast(this.parent, Canvas).marbleGame.watchMissionReplay(playMis, replay); - } else { - cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); - } - } - }); - }, { - title: "Select replay file", - fileTypes: [ - { - name: "Replay (*.mbr)", - extensions: ["mbr"] - } - ], - }); - }; - pmBox.addChild(replayPlayButton); - - var replayRecordButton = new GuiImage(ResourceLoader.getResource("data/ui/play/record.png", ResourceLoader.getImage, this.imageResources).toTile()); - replayRecordButton.position = new Vector(56, 315); - replayRecordButton.extent = new Vector(18, 18); - replayRecordButton.pressedAction = (sender) -> { - cast(this.parent, Canvas).marbleGame.toRecord = true; - cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); - }; - pmBox.addChild(replayRecordButton); - - var levelWnd = new GuiImage(ResourceLoader.getResource("data/ui/play/level_window.png", ResourceLoader.getImage, this.imageResources).toTile()); - levelWnd.position = new Vector(); - levelWnd.extent = new Vector(258, 194); - pmPreview.addChild(levelWnd); - var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); var domcasual24b = new BitmapFont(domcasual24fontdata.entry); @:privateAccess domcasual24b.loader = ResourceLoader.loader; @@ -195,59 +99,561 @@ class PlayMissionGui extends GuiImage { @:privateAccess arialb14b.loader = ResourceLoader.loader; var arialBold14 = arialb14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - var levelBkgnd = new GuiText(domcasual24); - levelBkgnd.position = new Vector(5, 156); - levelBkgnd.extent = new Vector(254, 24); - levelBkgnd.text.textColor = 0x000000; - levelBkgnd.justify = Center; - levelBkgnd.text.text = "Beginner Level 3"; - levelWnd.addChild(levelBkgnd); + var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); + var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); + @:privateAccess markerFelt32b.loader = ResourceLoader.loader; + var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + var markerFelt24 = markerFelt32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + var markerFelt20 = markerFelt32b.toSdfFont(cast 18.5 * Settings.uiScale, MultiChannel); + var markerFelt18 = markerFelt32b.toSdfFont(cast 17 * Settings.uiScale, MultiChannel); + var markerFelt26 = markerFelt32b.toSdfFont(cast 22 * Settings.uiScale, MultiChannel); - var levelFgnd = new GuiText(domcasual24); - levelFgnd.position = new Vector(4, 155); - levelFgnd.extent = new Vector(254, 24); - levelFgnd.text.textColor = 0xFFFFFF; - levelFgnd.justify = Center; - levelFgnd.text.text = "Beginner Level 3"; - levelWnd.addChild(levelFgnd); + function mlFontLoader(text:String) { + switch (text) { + case "DomCasual24": + return domcasual24; + case "Arial14": + return arial14; + case "ArialBold14": + return arialBold14; + case "MarkerFelt32": + return markerFelt32; + case "MarkerFelt24": + return markerFelt24; + case "MarkerFelt18": + return markerFelt18; + case "MarkerFelt20": + return markerFelt20; + case "MarkerFelt26": + return markerFelt26; + default: + return null; + } + } - var noQualText = new GuiText(domcasual32); - noQualText.position = new Vector(0, 84); - noQualText.extent = new Vector(254, 32); - noQualText.text.textColor = 0xCCCCCC; - noQualText.justify = Center; - noQualText.text.text = "Not Qualified!"; - levelWnd.addChild(noQualText); + var pmBox = new GuiImage(ResourceLoader.getResource('data/ui/play/window.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmBox.horizSizing = Center; + pmBox.vertSizing = Center; + pmBox.position = new Vector(-80. - 10); + pmBox.extent = new Vector(800, 500); + container.addChild(pmBox); + + var pmDifficultyPopup:GuiControl = null; + + var pmDifficulty = new GuiButton(loadButtonImages("data/ui/play/difficulty_beginner")); + pmDifficulty.position = new Vector(168, 98); + pmDifficulty.extent = new Vector(203, 43); + pmDifficulty.pressedAction = (e) -> { + MarbleGame.canvas.pushDialog(pmDifficultyPopup); + }; + pmBox.addChild(pmDifficulty); + + var pmDifficultyMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_platinum.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDifficultyMarble.position = new Vector(151, 11); + pmDifficultyMarble.extent = new Vector(21, 22); + pmDifficulty.addChild(pmDifficultyMarble); + + var pmMenuButton = new GuiButton(loadButtonImages("data/ui/play/menu")); + pmMenuButton.position = new Vector(119, 325); + pmMenuButton.extent = new Vector(92, 43); + pmMenuButton.pressedAction = (sender) -> { + cast(this.parent, Canvas).setContent(new MainMenuGui()); + }; + pmBox.addChild(pmMenuButton); + + var pmMorePop:GuiControl = null; + + var pmMore = new GuiButton(loadButtonImages("data/ui/play/more")); + pmMore.position = new Vector(217, 325); + pmMore.extent = new Vector(92, 43); + pmMore.pressedAction = (e) -> { + MarbleGame.canvas.pushDialog(pmMorePop); + }; + pmBox.addChild(pmMore); + + var pmSearch = new GuiButton(loadButtonImages("data/ui/play/search")); + pmSearch.position = new Vector(315, 325); + pmSearch.extent = new Vector(43, 43); + // todo search button functionality + pmBox.addChild(pmSearch); + + var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); + pmPrev.position = new Vector(436, 325); + pmPrev.extent = new Vector(72, 43); + pmPrev.pressedAction = (sender) -> { + setSelectedFunc(currentSelection - 1); + } + pmBox.addChild(pmPrev); var pmPlay = new GuiButton(loadButtonImages("data/ui/play/play")); - pmPlay.position = new Vector(391, 257); - pmPlay.extent = new Vector(121, 62); + pmPlay.position = new Vector(510, 325); + pmPlay.extent = new Vector(92, 43); pmPlay.pressedAction = (sender) -> { // Wacky hacks currentList[currentSelection].index = currentSelection; - currentList[currentSelection].difficultyIndex = ["beginner", "intermediate", "advanced"].indexOf(currentCategory); + currentList[currentSelection].difficultyIndex = ["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory); currentSelectionStatic = currentSelection; currentCategoryStatic = currentCategory; cast(this.parent, Canvas).marbleGame.playMission(currentList[currentSelection]); } pmBox.addChild(pmPlay); - var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); - pmPrev.position = new Vector(321, 260); - pmPrev.extent = new Vector(77, 58); - pmPrev.pressedAction = (sender) -> { - setSelectedFunc(currentSelection - 1); - } - pmBox.addChild(pmPrev); - var pmNext = new GuiButton(loadButtonImages("data/ui/play/next")); - pmNext.position = new Vector(507, 262); - pmNext.extent = new Vector(75, 60); + pmNext.position = new Vector(604, 325); + pmNext.extent = new Vector(72, 43); pmNext.pressedAction = (sender) -> { setSelectedFunc(currentSelection + 1); } pmBox.addChild(pmNext); + var temprev = new BitmapData(1, 1); + temprev.setPixel(0, 0, 0); + var tmpprevtile = Tile.fromBitmap(temprev); + + var pmPreview = new GuiImage(tmpprevtile); + pmPreview.position = new Vector(429, 96); + pmPreview.extent = new Vector(256, 194); + var filt = new ColorMatrix(Matrix.I()); + pmPreview.bmp.filter = filt; + pmBox.addChild(pmPreview); + + var pmPreviewFrame = new GuiImage(ResourceLoader.getResource('data/ui/play/levelframe.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmPreviewFrame.position = new Vector(0, 0); + pmPreviewFrame.extent = new Vector(256, 194); + pmPreview.addChild(pmPreviewFrame); + + var noQualText = new GuiText(markerFelt32); + noQualText.position = new Vector(0, 78); + noQualText.extent = new Vector(256, 14); + noQualText.text.textColor = 0xCCCCCC; + noQualText.justify = Center; + noQualText.text.text = "Not Qualified!"; + pmPreview.addChild(noQualText); + + var pmEgg = new GuiImage(ResourceLoader.getResource('data/ui/play/eggfound.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmEgg.position = new Vector(228, 157); + pmEgg.extent = new Vector(14, 21); + pmPreview.addChild(pmEgg); + + var pmDescription = new GuiMLText(markerFelt18, mlFontLoader); + pmDescription.position = new Vector(110, 145); + pmDescription.extent = new Vector(320, 146); + pmBox.addChild(pmDescription); + + var pmDescriptionRight = new GuiMLText(markerFelt18, mlFontLoader); + pmDescriptionRight.position = new Vector(110, 145); + pmDescriptionRight.extent = new Vector(320, 146); + pmBox.addChild(pmDescriptionRight); + + var pmParText = new GuiMLText(markerFelt18, mlFontLoader); + pmParText.position = new Vector(110, 292); + pmParText.extent = new Vector(320, 14); + pmBox.addChild(pmParText); + + var pmParTextRight = new GuiMLText(markerFelt18, mlFontLoader); + pmParTextRight.position = new Vector(110, 292); + pmParTextRight.extent = new Vector(320, 14); + pmBox.addChild(pmParTextRight); + + var pmScoreText = new GuiMLText(markerFelt18, mlFontLoader); + pmScoreText.position = new Vector(441, 292); + pmScoreText.extent = new Vector(235, 14); + pmBox.addChild(pmScoreText); + + pmScoreButton = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]); + pmScoreButton.position = new Vector(438, 282); + pmScoreButton.extent = new Vector(240, 39); + pmScoreButton.pressedAction = (e) -> { + scoreShowing = !scoreShowing; + setSelectedFunc(currentSelection); + }; + pmBox.addChild(pmScoreButton); + + // Difficulty popup + pmDifficultyPopup = new GuiControl(); + pmDifficultyPopup.horizSizing = Width; + pmDifficultyPopup.vertSizing = Height; + pmDifficultyPopup.position = new Vector(0, 0); + pmDifficultyPopup.extent = new Vector(640, 480); + + var pmDifficultyPopupInner = new GuiImage(tmpprevtile); + pmDifficultyPopupInner.position = new Vector(-80, -10); + pmDifficultyPopupInner.extent = new Vector(800, 500); + pmDifficultyPopupInner.horizSizing = Center; + pmDifficultyPopupInner.vertSizing = Center; + pmDifficultyPopup.addChild(pmDifficultyPopupInner); + pmDifficultyPopupInner.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(pmDifficultyPopup, false); + } + + var pmDifficultyCtrl = new GuiImage(tmpprevtile); + pmDifficultyCtrl.position = new Vector(-19, 116); + pmDifficultyCtrl.extent = new Vector(583, 252); + pmDifficultyPopupInner.addChild(pmDifficultyCtrl); + + var pmDifficultyBgCtrl = new GuiControl(); + pmDifficultyBgCtrl.position = new Vector(0, 0); + pmDifficultyBgCtrl.extent = new Vector(583, 252); + pmDifficultyBgCtrl.horizSizing = Width; + pmDifficultyBgCtrl.vertSizing = Height; + pmDifficultyCtrl.addChild(pmDifficultyBgCtrl); + + var pmDifficultyBgTL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tl.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgTL.position = new Vector(0, 0); + pmDifficultyBgTL.extent = new Vector(49, 45); + pmDifficultyBgTL.horizSizing = Right; + pmDifficultyBgTL.vertSizing = Bottom; + pmDifficultyBgCtrl.addChild(pmDifficultyBgTL); + + var pmDifficultyBgTR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tr.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgTR.position = new Vector(534, 0); + pmDifficultyBgTR.extent = new Vector(49, 45); + pmDifficultyBgTR.horizSizing = Left; + pmDifficultyBgTR.vertSizing = Bottom; + pmDifficultyBgCtrl.addChild(pmDifficultyBgTR); + + var pmDifficultyBgBL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/bl.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgBL.position = new Vector(0, 190); + pmDifficultyBgBL.extent = new Vector(49, 62); + pmDifficultyBgBL.horizSizing = Right; + pmDifficultyBgBL.vertSizing = Top; + pmDifficultyBgCtrl.addChild(pmDifficultyBgBL); + + var pmDifficultyBgBR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/br.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgBR.position = new Vector(534, 190); + pmDifficultyBgBR.extent = new Vector(49, 62); + pmDifficultyBgBR.horizSizing = Left; + pmDifficultyBgBR.vertSizing = Top; + pmDifficultyBgCtrl.addChild(pmDifficultyBgBR); + + var pmDifficultyBgL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/l.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgL.position = new Vector(0, 45); + pmDifficultyBgL.extent = new Vector(49, 145); + pmDifficultyBgL.horizSizing = Right; + pmDifficultyBgL.vertSizing = Height; + pmDifficultyBgCtrl.addChild(pmDifficultyBgL); + + var pmDifficultyBgR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/r.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgR.position = new Vector(534, 45); + pmDifficultyBgR.extent = new Vector(49, 145); + pmDifficultyBgR.horizSizing = Left; + pmDifficultyBgR.vertSizing = Height; + pmDifficultyBgCtrl.addChild(pmDifficultyBgR); + + var pmDifficultyBgB = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/b.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgB.position = new Vector(49, 190); + pmDifficultyBgB.extent = new Vector(485, 62); + pmDifficultyBgB.horizSizing = Width; + pmDifficultyBgB.vertSizing = Top; + pmDifficultyBgCtrl.addChild(pmDifficultyBgB); + + var pmDifficultyBgC = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/c.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyBgC.position = new Vector(49, 45); + pmDifficultyBgC.extent = new Vector(485, 145); + pmDifficultyBgC.horizSizing = Width; + pmDifficultyBgC.vertSizing = Height; + pmDifficultyBgCtrl.addChild(pmDifficultyBgC); + + var pmDifficultyTopC = new GuiControl(); + pmDifficultyTopC.horizSizing = Width; + pmDifficultyTopC.vertSizing = Bottom; + pmDifficultyTopC.position = new Vector(49, 0); + pmDifficultyTopC.extent = new Vector(485, 45); + pmDifficultyBgCtrl.addChild(pmDifficultyTopC); + + var pmDifficultyTopCT = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/t.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyTopCT.position = new Vector(0, 0); + pmDifficultyTopCT.extent = new Vector(231, 45); + pmDifficultyTopCT.horizSizing = Width; + pmDifficultyTopCT.vertSizing = Bottom; + pmDifficultyTopC.addChild(pmDifficultyTopCT); + + var pmDifficultyTopCTab = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tabt.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDifficultyTopCTab.position = new Vector(231, 0); + pmDifficultyTopCTab.extent = new Vector(25, 45); + pmDifficultyTopCTab.horizSizing = Left; + pmDifficultyTopCTab.vertSizing = Bottom; + pmDifficultyTopC.addChild(pmDifficultyTopCTab); + + var pmDifficultyTopC2 = new GuiControl(); + pmDifficultyTopC2.horizSizing = Relative; + pmDifficultyTopC2.vertSizing = Bottom; + pmDifficultyTopC2.position = new Vector(293, 0); + pmDifficultyTopC2.extent = new Vector(243, 45); + pmDifficultyBgCtrl.addChild(pmDifficultyTopC2); + + var pmDifficultyTopCT2 = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/t.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmDifficultyTopCT2.position = new Vector(13, 0); + pmDifficultyTopCT2.extent = new Vector(230, 45); + pmDifficultyTopCT2.horizSizing = Width; + pmDifficultyTopCT2.vertSizing = Bottom; + pmDifficultyTopC2.addChild(pmDifficultyTopCT2); + + var pmDifficultyTopCTab2 = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/tabt.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDifficultyTopCTab2.position = new Vector(-12, 0); + pmDifficultyTopCTab2.extent = new Vector(25, 45); + pmDifficultyTopCTab2.horizSizing = Right; + pmDifficultyTopCTab2.vertSizing = Bottom; + pmDifficultyTopC2.addChild(pmDifficultyTopCTab2); + + var pmDifficultyUltraAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyUltraAdvanced.position = new Vector(277, 134); + pmDifficultyUltraAdvanced.ratio = -1 / 16; + pmDifficultyUltraAdvanced.setExtent(new Vector(120, 31)); + pmDifficultyUltraAdvanced.txtCtrl.text.text = " Advanced"; + pmDifficultyUltraAdvanced.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyUltraAdvanced); + + var pmDifficultyUltraBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyUltraBeginner.position = new Vector(277, 75); + pmDifficultyUltraBeginner.ratio = -1 / 16; + pmDifficultyUltraBeginner.setExtent(new Vector(120, 31)); + pmDifficultyUltraBeginner.txtCtrl.text.text = " Beginner"; + pmDifficultyUltraBeginner.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyUltraBeginner); + + var pmDifficultyUltraIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyUltraIntermediate.position = new Vector(277, 104); + pmDifficultyUltraIntermediate.ratio = -1 / 16; + pmDifficultyUltraIntermediate.setExtent(new Vector(120, 31)); + pmDifficultyUltraIntermediate.txtCtrl.text.text = " Intermediate"; + pmDifficultyUltraIntermediate.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyUltraIntermediate); + + var pmDifficultyGoldAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyGoldAdvanced.position = new Vector(37, 134); + pmDifficultyGoldAdvanced.ratio = -1 / 16; + pmDifficultyGoldAdvanced.setExtent(new Vector(120, 31)); + pmDifficultyGoldAdvanced.txtCtrl.text.text = " Advanced"; + pmDifficultyGoldAdvanced.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyGoldAdvanced); + + var pmDifficultyGoldBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyGoldBeginner.position = new Vector(37, 75); + pmDifficultyGoldBeginner.ratio = -1 / 16; + pmDifficultyGoldBeginner.setExtent(new Vector(120, 31)); + pmDifficultyGoldBeginner.txtCtrl.text.text = " Beginner"; + pmDifficultyGoldBeginner.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyGoldBeginner); + + var pmDifficultyGoldIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyGoldIntermediate.position = new Vector(37, 104); + pmDifficultyGoldIntermediate.ratio = -1 / 16; + pmDifficultyGoldIntermediate.setExtent(new Vector(120, 31)); + pmDifficultyGoldIntermediate.txtCtrl.text.text = " Intermediate"; + pmDifficultyGoldIntermediate.disabled = true; + pmDifficultyCtrl.addChild(pmDifficultyGoldIntermediate); + + var pmDifficultyPlatinumAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyPlatinumAdvanced.position = new Vector(157, 134); + pmDifficultyPlatinumAdvanced.ratio = -1 / 16; + pmDifficultyPlatinumAdvanced.setExtent(new Vector(120, 31)); + pmDifficultyPlatinumAdvanced.txtCtrl.text.text = " Advanced"; + pmDifficultyPlatinumAdvanced.pressedAction = (e) -> { + currentList = MissionList.advancedMissions; + currentCategory = "advanced"; + setCategoryFunc("advanced"); + } + pmDifficultyCtrl.addChild(pmDifficultyPlatinumAdvanced); + + var pmDifficultyPlatinumBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyPlatinumBeginner.position = new Vector(157, 75); + pmDifficultyPlatinumBeginner.ratio = -1 / 16; + pmDifficultyPlatinumBeginner.setExtent(new Vector(120, 31)); + pmDifficultyPlatinumBeginner.txtCtrl.text.text = " Beginner"; + pmDifficultyPlatinumBeginner.pressedAction = (e) -> { + currentList = MissionList.beginnerMissions; + currentCategory = "beginner"; + setCategoryFunc("beginner"); + } + pmDifficultyCtrl.addChild(pmDifficultyPlatinumBeginner); + + var pmDifficultyPlatinumIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyPlatinumIntermediate.position = new Vector(157, 104); + pmDifficultyPlatinumIntermediate.ratio = -1 / 16; + pmDifficultyPlatinumIntermediate.setExtent(new Vector(120, 31)); + pmDifficultyPlatinumIntermediate.txtCtrl.text.text = " Intermediate"; + pmDifficultyPlatinumIntermediate.pressedAction = (e) -> { + currentList = MissionList.intermediateMissions; + currentCategory = "intermediate"; + setCategoryFunc("intermediate"); + } + pmDifficultyCtrl.addChild(pmDifficultyPlatinumIntermediate); + + var pmDifficultyPlatinumExpert = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); + pmDifficultyPlatinumExpert.position = new Vector(157, 164); + pmDifficultyPlatinumExpert.ratio = -1 / 16; + pmDifficultyPlatinumExpert.setExtent(new Vector(120, 31)); + pmDifficultyPlatinumExpert.txtCtrl.text.text = " Expert"; + pmDifficultyPlatinumExpert.pressedAction = (e) -> { + currentList = MissionList.expertMissions; + currentCategory = "expert"; + setCategoryFunc("expert"); + } + pmDifficultyCtrl.addChild(pmDifficultyPlatinumExpert); + + var pmGameUltra = new GuiText(markerFelt24); + pmGameUltra.text.text = " Ultra"; + pmGameUltra.text.textColor = 0; + pmGameUltra.position = new Vector(277, 33); + pmGameUltra.extent = new Vector(120, 31); + pmDifficultyCtrl.addChild(pmGameUltra); + + var pmGameUltraMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_ultra.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmGameUltraMarble.position = new Vector(95, 5); + pmGameUltraMarble.extent = new Vector(21, 22); + pmGameUltra.addChild(pmGameUltraMarble); + + var pmGameGold = new GuiText(markerFelt24); + pmGameGold.text.text = " Gold Levels"; + pmGameGold.text.textColor = 0; + pmGameGold.position = new Vector(37, 33); + pmGameGold.extent = new Vector(120, 31); + pmDifficultyCtrl.addChild(pmGameGold); + + var pmGameGoldMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_gold.png', ResourceLoader.getImage, this.imageResources).toTile()); + pmGameGoldMarble.position = new Vector(95, 5); + pmGameGoldMarble.extent = new Vector(21, 22); + pmGameGold.addChild(pmGameGoldMarble); + + var pmGamePlatinum = new GuiText(markerFelt24); + pmGamePlatinum.text.text = " Platinum"; + pmGamePlatinum.text.textColor = 0; + pmGamePlatinum.position = new Vector(157, 33); + pmGamePlatinum.extent = new Vector(120, 31); + pmDifficultyCtrl.addChild(pmGamePlatinum); + + var pmGamePlatinumMarble = new GuiImage(ResourceLoader.getResource('data/ui/play/marble_platinum.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmGamePlatinumMarble.position = new Vector(95, 5); + pmGamePlatinumMarble.extent = new Vector(21, 22); + pmGamePlatinum.addChild(pmGamePlatinumMarble); + + var pmGameCustom = new GuiText(markerFelt24); + pmGameCustom.horizSizing = Left; + pmGameCustom.text.text = " Custom Levels"; + pmGameCustom.text.textColor = 0; + pmGameCustom.position = new Vector(395, 33); + pmGameCustom.extent = new Vector(120, 31); + pmDifficultyCtrl.addChild(pmGameCustom); + + var pmDividerR = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-r.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDividerR.horizSizing = Left; + pmDividerR.position = new Vector(530, 62); + pmDividerR.extent = new Vector(12, 12); + pmDifficultyCtrl.addChild(pmDividerR); + + var pmDividerL = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-l.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDividerL.horizSizing = Right; + pmDividerL.position = new Vector(39, 62); + pmDividerL.extent = new Vector(12, 12); + pmDifficultyCtrl.addChild(pmDividerL); + + var pmDividerC = new GuiImage(ResourceLoader.getResource('data/ui/menu/brown/divider-orange-c.png', ResourceLoader.getImage, this.imageResources) + .toTile()); + pmDividerC.horizSizing = Width; + pmDividerC.position = new Vector(51, 62); + pmDividerC.extent = new Vector(479, 12); + pmDifficultyCtrl.addChild(pmDividerC); + + pmMorePop = new GuiControl(); + pmMorePop.horizSizing = Width; + pmMorePop.vertSizing = Height; + pmMorePop.position = new Vector(0, 0); + pmMorePop.extent = new Vector(640, 480); + + var pmMorePopInner = new GuiImage(tmpprevtile); + pmMorePopInner.position = new Vector(0, 0); + pmMorePopInner.extent = new Vector(640, 480); + pmMorePopInner.horizSizing = Center; + pmMorePopInner.vertSizing = Center; + pmMorePop.addChild(pmMorePopInner); + pmMorePopInner.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(pmMorePop, false); + } + + var pmMorePopCtrl = new GuiControl(); + pmMorePopCtrl.horizSizing = Center; + pmMorePopCtrl.vertSizing = Center; + pmMorePopCtrl.position = new Vector(-80, -10); + pmMorePopCtrl.extent = new Vector(800, 500); + pmMorePop.addChild(pmMorePopCtrl); + + var pmMorePopDlg = new GuiButton(loadButtonImages("data/ui/play/moremenu")); + pmMorePopDlg.position = new Vector(92, 204); + pmMorePopDlg.extent = new Vector(338, 146); + pmMorePopCtrl.addChild(pmMorePopDlg); + + var pmMarbleSelect = new GuiButton(loadButtonImages("data/ui/play/marble")); + pmMarbleSelect.position = new Vector(50, 46); + pmMarbleSelect.extent = new Vector(43, 43); + pmMorePopDlg.addChild(pmMarbleSelect); + + var pmStats = new GuiButton(loadButtonImages("data/ui/play/statistics")); + pmStats.position = new Vector(101, 46); + pmStats.extent = new Vector(43, 43); + pmMorePopDlg.addChild(pmStats); + + var pmAchievements = new GuiButton(loadButtonImages("data/ui/play/achiev")); + pmAchievements.position = new Vector(150, 46); + pmAchievements.extent = new Vector(43, 43); + pmMorePopDlg.addChild(pmAchievements); + + var pmEditorToggle = new GuiButton(loadButtonImages("data/ui/play/editor")); + pmEditorToggle.position = new Vector(198, 46); + pmEditorToggle.extent = new Vector(43, 43); + pmMorePopDlg.addChild(pmEditorToggle); + + var pmRecord = new GuiButton(loadButtonImages("data/ui/play/replay")); + pmRecord.position = new Vector(247, 46); + pmRecord.extent = new Vector(43, 43); + pmRecord.pressedAction = (sender) -> { + cast(this.parent, Canvas).marbleGame.toRecord = true; + cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); + }; + pmMorePopDlg.addChild(pmRecord); + + // var replayPlayButton = new GuiImage(ResourceLoader.getResource("data/ui/play/playback.png", ResourceLoader.getImage, this.imageResources).toTile()); + // replayPlayButton.position = new Vector(38, 315); + // replayPlayButton.extent = new Vector(18, 18); + // replayPlayButton.pressedAction = (sender) -> { + // hxd.File.browse((replayToLoad) -> { + // replayToLoad.load((replayData) -> { + // var replay = new Replay(""); + // if (!replay.read(replayData)) { + // cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); + // // Idk do something to notify the user here + // } else { + // var repmis = replay.mission; + // #if js + // repmis = StringTools.replace(repmis, "data/", ""); + // #end + // var playMis = MissionList.missions.get(repmis); + // if (playMis != null) { + // cast(this.parent, Canvas).marbleGame.watchMissionReplay(playMis, replay); + // } else { + // cast(this.parent, Canvas).pushDialog(new MessageBoxOkDlg("Cannot load replay.")); + // } + // } + // }); + // }, { + // title: "Select replay file", + // fileTypes: [ + // { + // name: "Replay (*.mbr)", + // extensions: ["mbr"] + // } + // ], + // }); + // }; + // pmBox.addChild(replayPlayButton); + buttonHoldFunc = (dt:Float, mouseState:MouseState) -> { var prevBox = pmPrev.getRenderRectangle(); var nextBox = pmNext.getRenderRectangle(); @@ -277,164 +683,68 @@ class PlayMissionGui extends GuiImage { } } - var pmBack = new GuiButton(loadButtonImages("data/ui/play/back")); - pmBack.position = new Vector(102, 260); - pmBack.extent = new Vector(79, 61); - pmBack.pressedAction = (sender) -> { - cast(this.parent, Canvas).setContent(new MainMenuGui()); - }; - pmBox.addChild(pmBack); - - var transparentbmp = new hxd.BitmapData(1, 1); - transparentbmp.setPixel(0, 0, 0); - var transparentTile = Tile.fromBitmap(transparentbmp); - - var skipButton = new GuiButton([transparentTile, transparentTile, transparentTile]); - skipButton.horizSizing = Left; - skipButton.vertSizing = Top; - skipButton.position = new Vector(625, 465); - skipButton.extent = new Vector(18, 19); - skipButton.pressedAction = (sender) -> { - var currentDifficulty = ["beginner", "intermediate", "advanced"].indexOf(currentCategory); - if (currentDifficulty == -1) - return; - var currentProgression = Settings.progression[currentDifficulty]; - if (currentProgression + 1 == currentSelection) { - Settings.progression[currentDifficulty]++; - } - setSelectedFunc(currentSelection); - }; - this.addChild(skipButton); - - function mlFontLoader(text:String) { - switch (text) { - case "DomCasual24": - return domcasual24; - case "Arial14": - return arial14; - case "ArialBold14": - return arialBold14; - default: - return null; - } - } - - var pmDescription = new GuiMLText(arial14, mlFontLoader); - pmDescription.position = new Vector(61, 52); - pmDescription.extent = new Vector(215, 174); - pmDescription.text.textColor = 0x000000; - // We're gonna use  to align shit lmao, its too hacky i know - var descText = 'Learn The Super Speed

' + 'ÂTest Align'; - descText += '

Best Times:
'; - for (i in 0...3) { - descText += '
ÂÂ${i + 1}. Nardo Polo'; - } - pmDescription.text.text = descText; - pmBox.addChild(pmDescription); - - // Oh god this is yet another hack cause I cant do that tab thing torque does so thats bruh - var pmDescriptionOther = new GuiMLText(arial14, mlFontLoader); - pmDescriptionOther.position = new Vector(61, 52); - pmDescriptionOther.extent = new Vector(215, 174); - pmDescriptionOther.text.textColor = 0x000000; - var descText2 = '

' + 'ÂTest Align'; - descText2 += '


'; - for (i in 0...3) { - descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ99:59.999'; - } - pmDescriptionOther.text.text = descText2; - pmBox.addChild(pmDescriptionOther); - - var tabBeginner = new GuiImage(ResourceLoader.getResource("data/ui/play/tab_begin.png", ResourceLoader.getImage, this.imageResources).toTile()); - tabBeginner.position = new Vector(29, 2); - tabBeginner.extent = new Vector(184, 55); - tabBeginner.pressedAction = (sender) -> { - currentList = MissionList.beginnerMissions; - currentCategory = "beginner"; - setSelectedFunc(cast Math.min(Settings.progression[0], currentList.length - 1)); - setCategoryFunc("beginner"); - } - localContainer.addChild(tabBeginner); - currentList = MissionList.beginnerMissions; setCategoryFunc = function(category:String, ?doRender:Bool = true) { - localContainer.removeChild(tabBeginner); - localContainer.removeChild(tabIntermediate); - localContainer.removeChild(tabAdvanced); - localContainer.removeChild(tabCustom); - localContainer.removeChild(pmBox); if (doRender) AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); if (category == "beginner") { - localContainer.addChild(tabIntermediate); - localContainer.addChild(tabAdvanced); - localContainer.addChild(tabCustom); - localContainer.addChild(pmBox); - localContainer.addChild(tabBeginner); currentList = MissionList.beginnerMissions; + @:privateAccess pmDifficulty.anim.frames = loadButtonImages("data/ui/play/difficulty_beginner"); } if (category == "intermediate") { - localContainer.addChild(tabBeginner); - localContainer.addChild(tabAdvanced); - localContainer.addChild(tabCustom); - localContainer.addChild(pmBox); - localContainer.addChild(tabIntermediate); currentList = MissionList.intermediateMissions; + @:privateAccess pmDifficulty.anim.frames = loadButtonImages("data/ui/play/difficulty_intermediate"); } if (category == "advanced") { - localContainer.addChild(tabBeginner); - localContainer.addChild(tabIntermediate); - localContainer.addChild(tabCustom); - localContainer.addChild(pmBox); - localContainer.addChild(tabAdvanced); currentList = MissionList.advancedMissions; + @:privateAccess pmDifficulty.anim.frames = loadButtonImages("data/ui/play/difficulty_advanced"); + } + if (category == "expert") { + currentList = MissionList.expertMissions; + @:privateAccess pmDifficulty.anim.frames = loadButtonImages("data/ui/play/difficulty_expert"); } if (category == "custom") { - localContainer.addChild(tabBeginner); - localContainer.addChild(tabIntermediate); - localContainer.addChild(tabAdvanced); - localContainer.addChild(pmBox); - localContainer.addChild(tabCustom); currentList = MissionList.customMissions; + @:privateAccess pmDifficulty.anim.frames = loadButtonImages("data/ui/play/difficulty_custom"); } currentCategoryStatic = currentCategory; if (currentCategory != "custom") setSelectedFunc(cast Math.min(currentList.length - 1, - Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)])); + Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)])); else setSelectedFunc(currentList.length - 1); if (doRender) this.render(cast(this.parent, Canvas).scene2d); } - function splitTextWithPadding(textElement:Text, textStr:String) { - var maxWidth = textElement.maxWidth; - textElement.maxWidth = null; - var splits = []; - var currentText = "Â"; - var textSplit = textStr.split(" "); - for (i in 0...textSplit.length) { - var prevText = currentText; - currentText += textSplit[i]; - if (i != textSplit.length - 1) - currentText += " "; - textElement.text = currentText; - if (textElement.textWidth > maxWidth) { - splits.push(StringTools.trim(prevText)); - currentText = "Â" + textSplit[i]; - if (i != textSplit.length - 1) - currentText += " "; - } - } - textElement.maxWidth = maxWidth; - splits.push(currentText); - return splits.join('\n'); - } + setScoreHover = (isHover) -> { + var currentMission = currentList[currentSelection]; - var goldBadge = ResourceLoader.getResource("data/ui/play/goldscore.png", ResourceLoader.getImage, this.imageResources).toTile(); - goldBadge.dy = 2.5; - goldBadge.dx = 8; + pmScoreText.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + + var scoreTextTime = ""; + var scoreData = Settings.getScores(currentMission.path); + if (scoreData.length == 0) { + scoreTextTime = '99:59.999'; + } else { + var topScore = scoreData[0]; + var scoreColor = "#FFFFFF"; + if (topScore.time < currentMission.ultimateTime) { + scoreColor = "#FFCC33"; + } else if (topScore.time < currentMission.goldTime) { + scoreColor = "#CCCCCC"; + } + + scoreTextTime = '${Util.formatTime(topScore.time)}'; + } + + if (isHover) { + pmScoreText.text.text = '

${this.scoreShowing ? "Hide" : "Show"} 5 Top Times

'; + } else { + pmScoreText.text.text = '

Best Time: ${scoreTextTime}

'; + } + } setSelectedFunc = function setSelected(index:Int) { if (index > currentList.length - 1) { @@ -459,7 +769,7 @@ class PlayMissionGui extends GuiImage { pmNext.disabled = false; if (currentCategory != "custom" - && Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)] < currentSelection) { + && Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)] < currentSelection) { noQualText.text.visible = true; filt.matrix.identity(); filt.matrix.colorGain(0, 96 / 255); @@ -485,38 +795,57 @@ class PlayMissionGui extends GuiImage { currentSelection = -1; } - var scoreData:Array = Settings.getScores(currentMission.path); - while (scoreData.length < 3) { - scoreData.push({name: "Nardo Polo", time: 5999.999}); - } + pmDescription.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmDescription.text.lineSpacing = -1; - var descText = '${currentMission.title}

' - + splitTextWithPadding(pmDescription.text, StringTools.htmlEscape(Util.unescape(currentMission.description))); - if (currentMission.qualifyTime != Math.POSITIVE_INFINITY) { - descText += '
Time To Qualify: ${Util.formatTime(currentMission.qualifyTime)}
'; - } - descText += '

Best Times:
'; - for (i in 0...3) { - descText += '
ÂÂ${i + 1}. ${scoreData[i].name}'; + pmDescriptionRight.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmDescriptionRight.text.lineSpacing = -1; + + var descText = '

#${currentList.indexOf(currentMission) + 1}: ${currentMission.title}

'; + + if (this.scoreShowing) { + var scoreData:Array = Settings.getScores(currentMission.path); + while (scoreData.length < 5) { + scoreData.push({name: "Matan W.", time: 5999.999}); + } + + var rightText = '
'; + + for (i in 0...5) { + var score = scoreData[i]; + + var scoreColor = "#FFFFFF"; + if (score.time < currentMission.ultimateTime) { + scoreColor = "#FFCC33"; + } else if (score.time < currentMission.goldTime) { + scoreColor = "#CCCCCC"; + } + + var scoreTextTime = '

${Util.formatTime(score.time)}

'; + rightText += scoreTextTime; + + descText += '${i + 1}. ${score.name}
'; + } + + pmDescriptionRight.text.text = rightText; + } else { + descText += '

Author: ${currentMission.artist}

'; + descText += '${currentMission.description}'; + pmDescriptionRight.text.text = ''; } pmDescription.text.text = descText; - var descText2 = '

' - + - '${splitTextWithPadding(pmDescriptionOther.text, StringTools.htmlEscape(Util.unescape(currentMission.description)))}'; - descText2 += '

'; - if (currentMission.qualifyTime != Math.POSITIVE_INFINITY) { - descText2 += '
Time To Qualify: ${Util.formatTime(currentMission.qualifyTime)}
'; + pmParText.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + pmParTextRight.text.filter = new DropShadow(1.414, 0.785, 0x0000000F, 1, 0, 0.4, 1, true); + if (this.scoreShowing) { + pmParText.text.text = 'Platinum: ${Util.formatTime(currentMission.goldTime)}'; + pmParTextRight.text.text = '

Ultimate: ${Util.formatTime(currentMission.ultimateTime)}

'; + } else { + pmParText.text.text = '

Par Time: ${(currentMission.qualifyTime != Math.POSITIVE_INFINITY) ? Util.formatTime(currentMission.qualifyTime) : "N/A"}

'; + pmParTextRight.text.text = ''; } - descText2 += '
'; - for (i in 0...3) { - descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ${Util.formatTime(scoreData[i].time)}'; - if (scoreData[i].time < currentMission.goldTime) { - descText2 += ''; - } - } - pmDescriptionOther.text.text = descText2; - pmDescriptionOther.text.loadImage = (name) -> goldBadge; + + setScoreHover(scoreButtonHover); pmPreview.bmp.tile = tmpprevtile; #if js @@ -541,10 +870,6 @@ class PlayMissionGui extends GuiImage { pmPreview.bmp.tile = prevImg; }); // Shit be sync #end - - levelBkgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; - - levelFgnd.text.text = currentCategory.charAt(0).toUpperCase() + currentCategory.substr(1) + ' Level ${currentSelection + 1}'; } setCategoryFunc(currentCategoryStatic, false); @@ -564,5 +889,22 @@ class PlayMissionGui extends GuiImage { setSelectedFunc(currentSelection - 1); if (Key.isPressed(Key.RIGHT)) setSelectedFunc(currentSelection + 1); + + if (scoreButtonDirty) { + setScoreHover(scoreButtonHover); + scoreButtonDirty = false; + } + + if (pmScoreButton.getHitTestRect().inRect(mouseState.position)) { + if (!scoreButtonHover) { + scoreButtonDirty = true; + } + scoreButtonHover = true; + } else { + if (scoreButtonHover) { + scoreButtonDirty = true; + } + scoreButtonHover = false; + } } }