+
+
+
+
+
+
# Build
+The `master` branch is currently for Marble Blast Platinum.
+If you want to build Marble Blast Gold, look for version [1.1.2 tag](https://github.com/RandomityGuy/MBHaxe/commits/1.1.2)
+
Requires Haxe 4.2.2 or above
You require the following Haxe libraries:
- heaps: The specific version located [here](https://github.com/RandomityGuy/heaps)
diff --git a/data/font/MarkerFelt.fnt b/data/font/MarkerFelt.fnt
new file mode 100644
index 00000000..749e353b
--- /dev/null
+++ b/data/font/MarkerFelt.fnt
@@ -0,0 +1,108 @@
+
+
+ The Marble Blast Platinum team + +Project Founders +Phil +Matan +Jase + +Marble Blast Platinum 1.50+ Project Leaders +Matan +HiGuy +Jeff + +Core Programming +Engine Modifications +amd42 +HiGuy +Jeff + +Gameplay and Features +HiGuy +Jeff +Seizure22 +Whirligig +Spy47 +ShadowMarble + +Online & Leaderboards +Programming and Protocol Design +HiGuy +Jeff +Aayrl +Spy47 + +Multiplayer & Challenges +Matan +HiGuy +Jeff + +Graphics & User Interface +HiGuy +Phil +Jase +Spy47 +MadMarioSkills + +Level Design +Matan +Phil +Pablo +Ian +Technostick +Andrew Sears +Perishingflames +Lonestar +Oaky +Jase +Moshe + +Additional Level Design +Xelna +Darkness Shadow + +Texture Design +Phil +Jase +Ian +Mkbul +Lonestar + +3D Modeling +CyberFox +Phil +RDs.Empire + +Music and Effects +Beau +Phil +Matan +Buzzmusic + +Community Hype-ist +Aayrl + +Special thanks to: + +GarageGames +Alex Swanson +Ben +Our parents and friends +Tsuf +Thistle +The Marble Blast community +
\ No newline at end of file diff --git a/data/ui/manual/pages/20.txt b/data/ui/manual/pages/20.txt new file mode 100644 index 00000000..3a16b7e6 --- /dev/null +++ b/data/ui/manual/pages/20.txt @@ -0,0 +1,21 @@ +Hidden Preferences + +If you would like to further customize MBP, here are some options which aren't shown in-game. Modify them in either MBPPrefs.cs in your platinum/client directory or prefs.cs in platinum/leaderboards/multiplayer directory. +Multiplayer related preferences usually begin with MPPref. + + +$MPPref::AllowServerChat - Defaulted to true. Change to false to get some peace and quiet. + +$MPPref::AllowQuickRespawn - Defaulted to true. Allow players to use quick respawn, change to false if you don't want them or yourself to be able to hit the respawn button in a desperate time of need. Multiplayer only. + +$MPPref::OverviewFinishSpeed - Defaulted to 0. A zoom-in animation of the camera towards the marble when starting a Multiplayer game. Value is in milliseconds of animation or 0 to disable. + +$MPPref::BackupClients - Defaulted to true. Save peoples' score progress when they leave and rejoin. Value is true/false. Multiplayer only. + +$MPPref::DisplayWinners - Defaulted to disable. Show winners' names in server chat when they win. Value is true/false. Multiplayer only. + +$pref::OpenGL::gammaCorrection - Defaulted to 0.5. We put this here as an option you can change even though you absolutely mustn't. If you want to play a prank on somebody, put it as 0 and launch Marble Blast. Values are 0.0 - 1.0. + +$pref::Music::Songs["LB"], $pref::Music::Songs["Menu"], $pref::Music::Songs["Game"] - Defaulted to "LB" => "Comforting Mystery.ogg", "Menu" => "Pianoforte.ogg", "Game" => "*" . Change which songs are played in which places, use "*" for wildcard (any song), value is a list of song file names with names separated by \t . + +$pref::UseLowResGlass - Defaulted to disable. Use the same looking glass shape in MBU/Multiplayer levels without collision on the borders. value is true/false. \ No newline at end of file diff --git a/data/ui/manual/pages/21.txt b/data/ui/manual/pages/21.txt new file mode 100644 index 00000000..3f10a087 --- /dev/null +++ b/data/ui/manual/pages/21.txt @@ -0,0 +1,23 @@ +Console, Bugs & Contact Us + +If you require further help or assistance, you are welcome to post on the Marble Blast Forums under the Support Board. You should read the board rules so that when you post an inquiry we may assist you better. You can also e-mail us at marbleblastforums@gmail.com + +We also welcome bug reports. Some bugs that you may encounter are known and documented, and may be fixed in the next patch or version. Some bugs will not be fixed as they are related to the Marble Blast engine. While we do our best to modify the engine to fix bugs, some would take too long and would have little compensation. Modifications of the engine are extremely hard and require good knowledge of how it's built; it is easy enough to miss a byte and have the game not even launch. + +The console has been equipped with several buttons that can help both you and us. From left to right order the buttons are: +Trace: A very useful button, it spams out all functions and calls in the console. It is recommended to use it before demonstrating a bug, as that it will help us identify how the bug has happened. Not that in some cases it doesn't tell us anything, but it is quite reliable. Note that it spams a lot very quickly and will cause Marble Blast to crash if left enabled for too long. Filesize on crash may very, but is usually 10 Megabytes or more. +Fast: Enables 'Fast' mode. Disables features like loading bars, marble smoothing and rotation among others. Not recommended unless you lag terribly during Multiplayer matches. +ModPaths: A quick 'relaunch' button that reloads the game's filesystem, so it can detect whether you changed files, added or removed. Great if you want to change custom levels without having to restart the game. Don't press too many times as it will crash Marble Blast. +Debug: Enabled 'Debug' mode. The console will output additional DEBUG information that can help in the identification of bugs. Useful when sending a crash report. + + +The following is a list of bugs and errors that are known at this point in time: + +1) Team score gem count ingame show 0/0/0/etc + +2) Team scores don't have platinum gems count (for PQ levels) in the end game screen + +3) Dedicated servers still have some odd bugs in them that have yet to be ironed out, such as the search showing levels incorrectly + + +For a further FAQ if you require, please check out this topic. \ No newline at end of file diff --git a/data/ui/manual/pages/22.txt b/data/ui/manual/pages/22.txt new file mode 100644 index 00000000..fa0f8e09 --- /dev/null +++ b/data/ui/manual/pages/22.txt @@ -0,0 +1,98 @@ +Libraries and Licensing + +MBExtender +Copyright (c) 2014 Aaron Dierking + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Theora +Copyright (C) 2002-2009 Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Vorbis +Copyright (c) 2002-2008 Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Ogg +Copyright (c) 2002, Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Crypto++ +The Crypto++ Library (as a compilation) is currently licensed under the Boost Software License 1.0 (http://www.boost.org/users/license.html). + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +The OpenGL Extension Wrangler Library +Copyright (C) 2008-2014, Nigel Stewart <nigels[]users sourceforge net> +Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org> +Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org> +Copyright (C) 2002, Lev Povalahev +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * The name of the author may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +MiniUPnPc +Copyright (c) 2005-2015, Thomas BERNARD +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +LibNAT-PMP +Copyright (c) 2007-2008, Thomas BERNARD +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/data/ui/manual/pages/3.txt b/data/ui/manual/pages/3.txt new file mode 100644 index 00000000..62d71888 --- /dev/null +++ b/data/ui/manual/pages/3.txt @@ -0,0 +1,21 @@ +New players: Start Here! + +Marble Blast is an excellent game that is pretty easy to pick up. However before you jump into it, you should know there is a certain game order. Follow it and you'll gain maximum enjoyment and you'll become good as well. + +Marble Blast Platinum (MBP) was developed and released at a time where hard and sometimes long levels were all the rage. As such its levels are much harder than those in Marble Blast Gold (MBG), and they offer advanced techniques to match. These techniques are used in many custom levels as well, making it a must to understand how they work and quickly get better at them. + +If this is your first time in Marble Blast, stop right here. Your first priority, after configuring the Options, is to go to Gold's levels from the singleplayer level select screen, and choose the beginner difficulty. Start progressing from there. These easy levels will help you to learn how to control the marble, and they will teach you the basic techniques of this game. It is recommended you play all of these levels (and Platinum's) on the leaderboards, as you can get ratings and achievements, talk to community members, and make friends. + +Once you're through beginner, continue to intermediate and then advanced. Levels will progressively get harder, but you will learn. If you get stuck, take advantage of the removal of any qualifications; you can pick any level to play, so skip right to the next one. Eventually you'll run out and just be stuck with a number of levels you cannot complete. + +At this stage you should go to Platinum's beginner levels, and start from there. You will immediately notice the difficulty increasing, and the techniques you learn are more advanced. For example, learning diagonal movement as the new basic form of movement, and advanced techniques like wall hit and edge hit. You will find them difficult, but keep pressing on and you'll pass them. + +After you've finished the beginners, you can continue with Platinum intermediates and onwards. Again you'll find the difficulty becoming harder pretty quickly, so once you're stuck, stop there and go back to Gold. You will find the previously hard levels much easier to beat, and you will be able to beat most if not all of them. + +Now that you've done that, start aiming to beat as many Gold Times as possible. Thanks to the techniques from Platinum, you'll be able to attain a lot of them. As you get better there, you will find yourself returning to Platinum and beating levels there more easily. Eventually you will get to the point where you can start beating the Ultimate Times, Platinum's hardest challenge. Further progress from there includes watching videos and mimicking others, learning their tricks and improving all the time. + +While you're doing all that, you can also hop in to Multiplayer. You will find a range of players with different skills. Don't worry if you get beaten down, as some players have played this game for years and have had thousands if not tens of thousands of hours of experience, grinding down many levels. Some players will be easier to beat and you'll learn how to play Multiplayer with their help; don't hesitate to ask for helpful advice as well, we'll be happy to teach. + +Our community is very friendly and we are always happy to meet new people. Don't be afraid if you feel bad, we all started where you are and got better with practice. Essentially if you are fun to play with, you will always get people to play with you, no matter your skill level. + +Enjoy Marble Blast! \ No newline at end of file diff --git a/data/ui/manual/pages/4.txt b/data/ui/manual/pages/4.txt new file mode 100644 index 00000000..076d32d5 --- /dev/null +++ b/data/ui/manual/pages/4.txt @@ -0,0 +1,10 @@ +Main Menu Interface + +The Main Menu is composed of seven buttons: +- The Play button allows you to play Marble Blast Gold and Platinum offline, as well as custom levels which you can download at MarbleBlast.com +- The Online button allows you to play competitively against users of the Marble Blast Community +- The Options button allows you to configure many basic options in Marble Blast Platinum to suit your liking +- The Quit button to quit the game. Don't press it :) +- The Tip of the Day button, which provides news and updates or just tips. Disclaimer: does not actually provide a tip on a daily basis. +- The Replay Center button allows you an easy access to all recordings you or other users have done in Marble Blast. +- The Help button, which leads you here. Not to this page, no, but the first one. \ No newline at end of file diff --git a/data/ui/manual/pages/5.txt b/data/ui/manual/pages/5.txt new file mode 100644 index 00000000..2cc7d2ed --- /dev/null +++ b/data/ui/manual/pages/5.txt @@ -0,0 +1,94 @@ +Options Menu + +You can access many configurable items in the Options menu. This page is dedicated to explain most of the options (as some are rather obvious), and it gives out a few recommendations and tips. +Please note that both General and Hotkeys tabs have a scrollbar on the right, so you can scroll down for more options. + +General Tab: + +Screen Resolution: Choose how big you want your Marble Blast window to be. If you choose Windowed mode in Screen Style, it will let you choose a maximum size that doesn't fill the whole window. We recommend 1280x720 and above for HD monitors, and 1024x768 or greater for SD monitors. + +Screen Style: Choose whether to play full-screen, or in a windowed mode so you can see other programs. + +Color Depth: 16-bit or 32-bit. Default to 32-bit, you should rarely change to 16-bit unless bad quality is something you like, or have a bad graphics card. + +Video Driver: Defaulted to OpenGL. Select OpenGL rendering or Direct3D, depending on your graphics card model and CPU. Note that some may get lag on OpenGL that doesn't exist in Direct3D, and vice versa. OpenGL is preferred. +Note: Mac users cannot choose Direct3D as it's a Microsoft product, and is not supported for Mac. The only option is OpenGL hence it is greyed out. + +Shadows: Defaulted to Disabled. Allows you to add shadows depending on sun position to the level. In some levels it looks great, but broken faces and polys can make it look bad. It can make dark levels be really dark. +Note: The Mac engine does not support shadows, so this option is greyed out. + +Frame Rate: Defaulted to Visible. Allows you to see your current framerate in-game. Windows users will find 64fps as maximum, while Mac users can go into the hundreds unless VSync is enabled, where it will then drop to 64fps as well. + +Out of Bounds (OoB) Insults: Defaulted to Disabled. If enabled, this will add a randomized insult every 200 OoBs. Some people like it. + +Free-Look: Defaulted to Enabled. Allows the camera to move in all directions just by moving the mouse/trackpad. Makes gameplay easier. + +Live Replays: Defaulted to Disabled. When enabled, it activates when you beat a level and then replay that level. It will show you your best-time live-replay recording so you can race against yourself and beat it ad infinitum. + +Invert Mouse: Defaulted to None. You can select between X axis, Y axis or both X and Y axes With an inverted X axis, moving the mouse right will move the camera left, and inverting the Y axis and moving the mouse up will move the camera down. + +Thousandths: Defaulted to Disabled. When Enabled, all in-game timers including displayed times will show time to the thousandths of a second. Makes you feel horrible to be beaten by one thousandth of a second. + +Music Volume: Move the slider to change the music volume. + +Sound Volume: Move the slider to change the sound volume. + +Mouse Speed: Move the slider to change the speed the camera will move when the mouse is moved. Put at the highest for super-crazy not-fun times! + +Keyboard Speed: Move the slider to change the speed the camera will move when the keyboard keys are pressed. Put at the highest for super-crazy not-fun times! + +Field of View: Defaulted to 90. Increase to see more of the level around you, and decrease to have the camera really close to the marble. Since the extremes are pretty unplayable, we kept it at levels that people often like playing, which are 60 to 140. + + +Hotkeys tab: + +This section is split into three main parts: Basic Controls, Online Controls, and Multiplayer Taunts. + +Basic Controls: + +Movement keys are self-explanatory: select the buttons on your keyboard and mouse which you want to use when moving your marble, your keyboard camera, jumping, and usage of powerups. + +Free Look: This only works when always free-look is disabled. This allows you to press a key before you can move your mouse to look anywhere freely. + +Respawn: Select a button which, when pressed, will respawn your marble. In Singleplayer games it will restart the level for you. If a checkpoint was hit, it will respawn you at the last checkpoint. A long press (1 second) will restart the level fully. Respawning in Multiplayer games will respawn your marble somewhere random on the map. To stop abuse of this ability in Multiplayer games, you can only respawn once every 25 seconds. If you are the host, holding the respawn button for 3 seconds will completely restart the match. You can respawn as many times as you want in Singleplayer; there is no limit. + +Screenshot mode: Hides the interface (time, chat, etc) so you can take awesome screenshots. Press once to hide the interface, and once more to show it again. + + +Online Controls: + +Use Blast: Defaulted to 'E'. Select a key which will allow you to use the blast in Ultra and Multiplayer levels/games. + +Toggle Radar: Defaulted to 'Tab'. Select a key which will allow you to toggle between the three radar modes (or disable radar). The purpose of the radar is to indicate where gems are and their type: red, yellow, blue or platinum colored. +The first radar mode shows you a small radar on the top right. The second radar mode has the radar take up the whole screen. The third radar mode will lock into the gems when they are in sight (small gem icons on-screen). When they are not on camera, gem arrows will point in their direction. + +Spectate Mode: Defaulted to 'C'. When spectating, this changes between being able to see the entire field and move the camera around (free-fly mode) or follow a player's marble. +Pressing Ctrl+C allows you to enter or leave Spectate Mode. This cannot be rebound. + +Score List: Defaulted to 'O'. Allows you to see detailed scores of all players in the match – including the number of red, yellow, and blue gems that every player caught. + +Global Chat: Defaulted to 'T'. Allows you to talk to other users online while playing in Singleplayer and Multiplayer matches, as well as during Challenges and Super Challenges. + +Server Chat: Defaulted to 'P'. Allows you to talk to users within the current server. Multiplayer only. + +Team Chat: Defaulted to 'M'. Allows you to talk to your team-mates without anyone else interfering. Multiplayer in-game only when Team mode is enabled. + +Multiplayer Taunts: Select keys to shout a taunt during those exciting Multiplayer matches. Available in Multiplayer only. +Alternatively you can write down ' /v1 ' to ' /v17 ' in server chat to shout taunts. As you may have noticed not all taunts have keys and that is intentional. + + +Online Tab: + +Score Predictor: Defaulted to Disabled. When enabled, the game will attempt to predict your end-game score as the game progresses based on the amount of points you have collected. It becomes pretty accurate as the game passes the half-way mark. Multiplayer only. + +Radar Z-Axis: Defaulted to Enabled. Makes gems appear smaller or larger on the radar depending on their height (Z-Axis) when compared to your marble. + +Server Port: Defaulted to 28000. Select a port number that you want to have Marble Blast Platinum be port-forwarded from. 28000 is a legacy number from when Marble Blast Gold was created. You can choose any other port number, such as 44431. Range of ports allowed: 1-65535. +When port forwarded, others may join your Multiplayer matches when you host. +To join matches, you do not need to port forward. + +Server: Defaulted to leaderboards.marbleblast.com. Cannot be changed as this is the server currently in-use when connecting online to the Marble Blast Platinum leaderboards. + +Overview Speed: Defaulted to 120. Click on the button and move it along the slider to change the speed in which the camera will rotate around levels in the preview screen. Multiplayer only. + +Auto-Login As: Defaulted to None. This enables you to automatically log in as a guest or a user to the Online section, bypassing the log in screen. If you select User, you need to enter your Online Username and Password to their respective fields. \ No newline at end of file diff --git a/data/ui/manual/pages/6.txt b/data/ui/manual/pages/6.txt new file mode 100644 index 00000000..297d9685 --- /dev/null +++ b/data/ui/manual/pages/6.txt @@ -0,0 +1,15 @@ +Replay Center / Demo Recording + +The Replay Center is the hub of saved demo recording in Marble Blast Platinum. When recording a demo anywhere in MBP, you are asked for a filename for the demo, and on completion of the demo (exiting the level counts as such) you can give a short description, the demo's actual name and your name as the author. + +When first choosing the demo recording option, it also asks you about an OOB count. This is the amount of times a player can go Out of Bounds and restart the level before the recording will automatically reload the level. Hitting a checkpoint and going Out of Bounds does not affect this. + +Every demo displayed in the Replay Center goes by the name you've given it at the end of your demo recording session. Click on any of the names to show the demo's level played, author and description. +You can then press Play to playback the demo file. Press Home to return to the Main Menu. + +You can find demo recording files (file type extensions .rec and .inf) in platinum/client/demos. .inf files contain info that is seen in the Replay Center. It is recommended not to edit this file as it can cause desyncs. + +Remember: +You cannot view .rec files using any other programs except Marble Blast. + +You can read more about the problems with Demo Recording in Marble Blast Platinum in its appropriate page later in this Help section. \ No newline at end of file diff --git a/data/ui/manual/pages/7.txt b/data/ui/manual/pages/7.txt new file mode 100644 index 00000000..ba1a888a --- /dev/null +++ b/data/ui/manual/pages/7.txt @@ -0,0 +1,34 @@ +Single-Player Level Select + +The Level Select screen is where you can choose which levels you want to play, and the game or category to play. Available to play are Marble Blast Gold levels, Platinum levels and Custom levels. + +Marble Blast Platinum 1.50 changed the way the interface works. +To access Gold, Platinum, and Custom levels, you will have to press on the difficulty dropdown menu on the top. This will also list the available difficulties playable: Beginner, Intermediate, Advanced, and if Platinum is selected, then Expert as well. Custom levels are accessible if Gold levels are chosen. + +Right below the difficulty tab you will see the level's name, description, author, and whether you need to beat a Qualify Time (if Gold) or Par Time (if Platinum). These times are a challenge, with the goal being to beat the level under a time pressure. If an Easter Egg is present in the level, then a small grey and white image of an Easter Egg will appear on the bottom right of the level picture. When you collect the egg, this small image will turn blue and white to match the egg's colors. + +Hover above 'Best Time' below the picture to see the text switch to 'Show 5 Top Times'. Pressing it will change the description display to your top times display. If you're playing Gold, the level's Qualify and Gold Times will appear on the bottom to show you what your goal is. If you are playing Platinum, it will instead show the level's Platinum and Ultimate Times. Hovering above the 'Best Time' again will change to 'Hide 5 Top Times,' and pressing it goes back to the level description text. + +The three buttons that appear on the bottom left of Level Select screen are: +Menu: Go back to the Main Menu +More...: Press it to reveal additional options +Magnifier icon: Press to open the Search window to search levels. + +Using the search: +When searching for levels, the search window will list all the levels in the current game: Gold levels in Gold, Platinum levels in Platinum, and Custom levels in Custom. +You can search using the level's name (Title) or press Options to search by the Artist or file name (e.g. Custom/MyLevelRules.mis). You can press the dice button to automatically load a random level; an excellent choice if you don't know which one to play. + +The More... tab lists the following buttons (Left to Right order): + +Marble Select: Choose between 40 default marbles with different skins and sizes. When pressing the 'Cat' (Category) buttons, you can switch to custom marbles like unique CyberFox marbles and the Marble Blast Ultra marbles. + +Statistics: Whether you are playing Platinum or Gold, you can see up-to-date statistics about your game, as well as some other tracked data. The 'Grand Total' is all your best times on all completed levels combined, and the 'Total Wasted Time' is how long you have played Platinum overall. It starts counting from the application's launch until you exit it, and updates every time you launch the statistics. +Statistics are disabled when Custom is selected. + +Achievements: 8 achievements are available when playing the Platinum levels. Can you beat them all? +Achievements are disabled when Gold or Custom are selected. + +Level Editor: Press to enable the Level Editor. When you first launch it, a help window will explain how to activate it and where. You can uncheck the 'Show that reminder again!' if you don't want this window to appear again when activating the Level Editor. +In case you forget, F11 activates the level editor. + +Demo Recording: Press to activate Demo Recording. Fill in the file name of the demo (e.g. AwesomeDemo) and move the slider to choose the amount of times you can go Out of Bounds before the recording will automatically reload the level. Hitting a checkpoint and going Out of Bounds does not affect this. \ No newline at end of file diff --git a/data/ui/manual/pages/8.txt b/data/ui/manual/pages/8.txt new file mode 100644 index 00000000..a3f8305a --- /dev/null +++ b/data/ui/manual/pages/8.txt @@ -0,0 +1,11 @@ +Jukebox + +The Jukebox can be entered anywhere from the game by pressing Ctrl+F5. In the window that opens, there will be a list of all available soundtracks and the one currently being played. +Ctrl+F6 plays the previous soundtrack. +Ctrl+F7 stops the resumes the current soundtrack. +Ctrl+F8 plays the next soundtrack. + +You can add your own soundtracks in platinum/data/sounds/music. These must be in .ogg (Ogg/Vorbis) format. +You can convert soundtracks from .wav and .mp3 to .ogg format using Audacity, which is available for Windows and Mac free of charge. + +The Jukebox also appears on the bottom right of the pause menu screen, so you can access it from there as well. \ No newline at end of file diff --git a/data/ui/manual/pages/9.txt b/data/ui/manual/pages/9.txt new file mode 100644 index 00000000..c080825b --- /dev/null +++ b/data/ui/manual/pages/9.txt @@ -0,0 +1,12 @@ +The End Game Screen + +The End Game screen is mostly self-explanatory. The only part to note is that the level picture on the bottom right of the screen can be clicked on to go immediately to the next level, whereas with 'Continue' you will be sent back to the Level Select screen. You can press Replay to play the level again. + +In Multiplayer, the End Game screen lists player names, teams names (if Team Mode is enabled), total score, a breakdown of gems collected, and marble skin used. Ratings are displayed if ratings are being calculated (otherwise it shows N/A), and how much a player won or lost. +On the right side of the screen, from top to bottom, the host of the match can: +Replay the level +Quit to Level Select +Quit to the Leaderboards chat +Save Spawns: Save the match's spawns as they appeared in the match. + +Note: When playing Singleplayer levels online, you will be shown the rank for that particular level on the leaderboards based on time you reach. \ No newline at end of file diff --git a/data/ui/manual/window.png b/data/ui/manual/window.png new file mode 100644 index 00000000..3e8647b8 Binary files /dev/null and b/data/ui/manual/window.png differ diff --git a/data/ui/marbleSelect/marbleSelect.png b/data/ui/marbleSelect/marbleSelect.png new file mode 100644 index 00000000..758f0f3c Binary files /dev/null and b/data/ui/marbleSelect/marbleSelect.png differ diff --git a/data/ui/marbleSelect/next_d.png b/data/ui/marbleSelect/next_d.png new file mode 100644 index 00000000..10874d42 Binary files /dev/null and b/data/ui/marbleSelect/next_d.png differ diff --git a/data/ui/marbleSelect/next_h.png b/data/ui/marbleSelect/next_h.png new file mode 100644 index 00000000..96e5190e Binary files /dev/null and b/data/ui/marbleSelect/next_h.png differ diff --git a/data/ui/marbleSelect/next_i.png b/data/ui/marbleSelect/next_i.png new file mode 100644 index 00000000..f694cc1b Binary files /dev/null and b/data/ui/marbleSelect/next_i.png differ diff --git a/data/ui/marbleSelect/next_n.png b/data/ui/marbleSelect/next_n.png new file mode 100644 index 00000000..6799267c Binary files /dev/null and b/data/ui/marbleSelect/next_n.png differ diff --git a/data/ui/marbleSelect/nextcat_d.png b/data/ui/marbleSelect/nextcat_d.png new file mode 100644 index 00000000..4dbfb78f Binary files /dev/null and b/data/ui/marbleSelect/nextcat_d.png differ diff --git a/data/ui/marbleSelect/nextcat_h.png b/data/ui/marbleSelect/nextcat_h.png new file mode 100644 index 00000000..3ad3ef99 Binary files /dev/null and b/data/ui/marbleSelect/nextcat_h.png differ diff --git a/data/ui/marbleSelect/nextcat_i.png b/data/ui/marbleSelect/nextcat_i.png new file mode 100644 index 00000000..4b966139 Binary files /dev/null and b/data/ui/marbleSelect/nextcat_i.png differ diff --git a/data/ui/marbleSelect/nextcat_n.png b/data/ui/marbleSelect/nextcat_n.png new file mode 100644 index 00000000..ff7afe24 Binary files /dev/null and b/data/ui/marbleSelect/nextcat_n.png differ diff --git a/data/ui/marbleSelect/prev_d.png b/data/ui/marbleSelect/prev_d.png new file mode 100644 index 00000000..f52b9bc5 Binary files /dev/null and b/data/ui/marbleSelect/prev_d.png differ diff --git a/data/ui/marbleSelect/prev_h.png b/data/ui/marbleSelect/prev_h.png new file mode 100644 index 00000000..6541dad1 Binary files /dev/null and b/data/ui/marbleSelect/prev_h.png differ diff --git a/data/ui/marbleSelect/prev_i.png b/data/ui/marbleSelect/prev_i.png new file mode 100644 index 00000000..e5728504 Binary files /dev/null and b/data/ui/marbleSelect/prev_i.png differ diff --git a/data/ui/marbleSelect/prev_n.png b/data/ui/marbleSelect/prev_n.png new file mode 100644 index 00000000..8beb0b94 Binary files /dev/null and b/data/ui/marbleSelect/prev_n.png differ diff --git a/data/ui/marbleSelect/prevcat_d.png b/data/ui/marbleSelect/prevcat_d.png new file mode 100644 index 00000000..ce136450 Binary files /dev/null and b/data/ui/marbleSelect/prevcat_d.png differ diff --git a/data/ui/marbleSelect/prevcat_h.png b/data/ui/marbleSelect/prevcat_h.png new file mode 100644 index 00000000..39ee9b8c Binary files /dev/null and b/data/ui/marbleSelect/prevcat_h.png differ diff --git a/data/ui/marbleSelect/prevcat_i.png b/data/ui/marbleSelect/prevcat_i.png new file mode 100644 index 00000000..a057f126 Binary files /dev/null and b/data/ui/marbleSelect/prevcat_i.png differ diff --git a/data/ui/marbleSelect/prevcat_n.png b/data/ui/marbleSelect/prevcat_n.png new file mode 100644 index 00000000..171b43f6 Binary files /dev/null and b/data/ui/marbleSelect/prevcat_n.png differ diff --git a/data/ui/marbleSelect/select_d.png b/data/ui/marbleSelect/select_d.png new file mode 100644 index 00000000..bd9fcf6b Binary files /dev/null and b/data/ui/marbleSelect/select_d.png differ diff --git a/data/ui/marbleSelect/select_h.png b/data/ui/marbleSelect/select_h.png new file mode 100644 index 00000000..05b368dc Binary files /dev/null and b/data/ui/marbleSelect/select_h.png differ diff --git a/data/ui/marbleSelect/select_i.png b/data/ui/marbleSelect/select_i.png new file mode 100644 index 00000000..0874978b Binary files /dev/null and b/data/ui/marbleSelect/select_i.png differ diff --git a/data/ui/marbleSelect/select_n.png b/data/ui/marbleSelect/select_n.png new file mode 100644 index 00000000..6905758c Binary files /dev/null and b/data/ui/marbleSelect/select_n.png differ 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/menu/help_d.png b/data/ui/menu/help_d.png new file mode 100644 index 00000000..028b8c1d Binary files /dev/null and b/data/ui/menu/help_d.png differ diff --git a/data/ui/menu/help_h.png b/data/ui/menu/help_h.png new file mode 100644 index 00000000..7ce2936f Binary files /dev/null and b/data/ui/menu/help_h.png differ diff --git a/data/ui/menu/help_i.png b/data/ui/menu/help_i.png new file mode 100644 index 00000000..3d0c5b54 Binary files /dev/null and b/data/ui/menu/help_i.png differ diff --git a/data/ui/menu/help_n.png b/data/ui/menu/help_n.png new file mode 100644 index 00000000..28fe2f91 Binary files /dev/null and b/data/ui/menu/help_n.png differ diff --git a/data/ui/menu/mbp-xmas.png b/data/ui/menu/mbp-xmas.png new file mode 100644 index 00000000..b00ec388 Binary files /dev/null and b/data/ui/menu/mbp-xmas.png differ diff --git a/data/ui/menu/mbp.png b/data/ui/menu/mbp.png new file mode 100644 index 00000000..33dd12da Binary files /dev/null and b/data/ui/menu/mbp.png differ diff --git a/data/ui/menu/online_d.png b/data/ui/menu/online_d.png new file mode 100644 index 00000000..38ca5aae Binary files /dev/null and b/data/ui/menu/online_d.png differ diff --git a/data/ui/menu/online_h.png b/data/ui/menu/online_h.png new file mode 100644 index 00000000..d6013b24 Binary files /dev/null and b/data/ui/menu/online_h.png differ diff --git a/data/ui/menu/online_i.png b/data/ui/menu/online_i.png new file mode 100644 index 00000000..a55f7d39 Binary files /dev/null and b/data/ui/menu/online_i.png differ diff --git a/data/ui/menu/online_n.png b/data/ui/menu/online_n.png new file mode 100644 index 00000000..5b68cdda Binary files /dev/null and b/data/ui/menu/online_n.png differ diff --git a/data/ui/menu/options_d.png b/data/ui/menu/options_d.png new file mode 100644 index 00000000..0f9207ca Binary files /dev/null and b/data/ui/menu/options_d.png differ diff --git a/data/ui/menu/options_h.png b/data/ui/menu/options_h.png new file mode 100644 index 00000000..c5a693f6 Binary files /dev/null and b/data/ui/menu/options_h.png differ diff --git a/data/ui/menu/options_n.png b/data/ui/menu/options_n.png new file mode 100644 index 00000000..29aea2b0 Binary files /dev/null and b/data/ui/menu/options_n.png differ diff --git a/data/ui/menu/play_d.png b/data/ui/menu/play_d.png new file mode 100644 index 00000000..7596d834 Binary files /dev/null and b/data/ui/menu/play_d.png differ diff --git a/data/ui/menu/play_h.png b/data/ui/menu/play_h.png new file mode 100644 index 00000000..1e9b5c18 Binary files /dev/null and b/data/ui/menu/play_h.png differ diff --git a/data/ui/menu/play_n.png b/data/ui/menu/play_n.png new file mode 100644 index 00000000..d42b30d7 Binary files /dev/null and b/data/ui/menu/play_n.png differ diff --git a/data/ui/menu/quit_d.png b/data/ui/menu/quit_d.png new file mode 100644 index 00000000..befea6e0 Binary files /dev/null and b/data/ui/menu/quit_d.png differ diff --git a/data/ui/menu/quit_h.png b/data/ui/menu/quit_h.png new file mode 100644 index 00000000..09e63134 Binary files /dev/null and b/data/ui/menu/quit_h.png differ diff --git a/data/ui/menu/quit_n.png b/data/ui/menu/quit_n.png new file mode 100644 index 00000000..60f69167 Binary files /dev/null and b/data/ui/menu/quit_n.png differ diff --git a/data/ui/menu/replay_d.png b/data/ui/menu/replay_d.png new file mode 100644 index 00000000..a639e44d Binary files /dev/null and b/data/ui/menu/replay_d.png differ diff --git a/data/ui/menu/replay_h.png b/data/ui/menu/replay_h.png new file mode 100644 index 00000000..3bad47d4 Binary files /dev/null and b/data/ui/menu/replay_h.png differ diff --git a/data/ui/menu/replay_n.png b/data/ui/menu/replay_n.png new file mode 100644 index 00000000..7c67ea01 Binary files /dev/null and b/data/ui/menu/replay_n.png differ diff --git a/data/ui/menu/site_d.png b/data/ui/menu/site_d.png new file mode 100644 index 00000000..16ce0106 Binary files /dev/null and b/data/ui/menu/site_d.png differ diff --git a/data/ui/menu/site_h.png b/data/ui/menu/site_h.png new file mode 100644 index 00000000..e43a46ca Binary files /dev/null and b/data/ui/menu/site_h.png differ diff --git a/data/ui/menu/site_n.png b/data/ui/menu/site_n.png new file mode 100644 index 00000000..273cb792 Binary files /dev/null and b/data/ui/menu/site_n.png differ diff --git a/data/ui/menu/totd_d.png b/data/ui/menu/totd_d.png new file mode 100644 index 00000000..39684b6f Binary files /dev/null and b/data/ui/menu/totd_d.png differ diff --git a/data/ui/menu/totd_h.png b/data/ui/menu/totd_h.png new file mode 100644 index 00000000..b603ab0f Binary files /dev/null and b/data/ui/menu/totd_h.png differ diff --git a/data/ui/menu/totd_i.png b/data/ui/menu/totd_i.png new file mode 100644 index 00000000..670ba37f Binary files /dev/null and b/data/ui/menu/totd_i.png differ diff --git a/data/ui/menu/totd_n.png b/data/ui/menu/totd_n.png new file mode 100644 index 00000000..c1c3c337 Binary files /dev/null and b/data/ui/menu/totd_n.png differ diff --git a/data/ui/menu/totdactive_d.png b/data/ui/menu/totdactive_d.png new file mode 100644 index 00000000..329eecf7 Binary files /dev/null and b/data/ui/menu/totdactive_d.png differ diff --git a/data/ui/menu/totdactive_h.png b/data/ui/menu/totdactive_h.png new file mode 100644 index 00000000..2455fa60 Binary files /dev/null and b/data/ui/menu/totdactive_h.png differ diff --git a/data/ui/menu/totdactive_n.png b/data/ui/menu/totdactive_n.png new file mode 100644 index 00000000..9f694748 Binary files /dev/null and b/data/ui/menu/totdactive_n.png differ diff --git a/data/ui/motd/mess_buttn_d.png b/data/ui/motd/mess_buttn_d.png deleted file mode 100644 index 16f8e54f..00000000 Binary files a/data/ui/motd/mess_buttn_d.png and /dev/null differ diff --git a/data/ui/motd/mess_buttn_h.png b/data/ui/motd/mess_buttn_h.png deleted file mode 100644 index 0fae3706..00000000 Binary files a/data/ui/motd/mess_buttn_h.png and /dev/null differ diff --git a/data/ui/motd/mess_buttn_n.png b/data/ui/motd/mess_buttn_n.png deleted file mode 100644 index eef3f861..00000000 Binary files a/data/ui/motd/mess_buttn_n.png and /dev/null differ diff --git a/data/ui/motd/mess_chkbx_d.png b/data/ui/motd/mess_chkbx_d.png index 6ae91436..51ed12d3 100644 Binary files a/data/ui/motd/mess_chkbx_d.png and b/data/ui/motd/mess_chkbx_d.png differ diff --git a/data/ui/motd/mess_chkbx_h.png b/data/ui/motd/mess_chkbx_h.png index b7126f31..ac43e81a 100644 Binary files a/data/ui/motd/mess_chkbx_h.png and b/data/ui/motd/mess_chkbx_h.png differ diff --git a/data/ui/motd/mess_chkbx_n.png b/data/ui/motd/mess_chkbx_n.png index 91f5b25b..e4d78667 100644 Binary files a/data/ui/motd/mess_chkbx_n.png and b/data/ui/motd/mess_chkbx_n.png differ diff --git a/data/ui/motd/messagewindow.png b/data/ui/motd/messagewindow.png new file mode 100644 index 00000000..a79c9295 Binary files /dev/null and b/data/ui/motd/messagewindow.png differ diff --git a/data/ui/motd/motd_buttn_d.png b/data/ui/motd/motd_buttn_d.png deleted file mode 100644 index 19d8a75e..00000000 Binary files a/data/ui/motd/motd_buttn_d.png and /dev/null differ diff --git a/data/ui/motd/motd_buttn_h.png b/data/ui/motd/motd_buttn_h.png deleted file mode 100644 index 928a538c..00000000 Binary files a/data/ui/motd/motd_buttn_h.png and /dev/null differ diff --git a/data/ui/motd/motd_buttn_n.png b/data/ui/motd/motd_buttn_n.png deleted file mode 100644 index 2813b8f6..00000000 Binary files a/data/ui/motd/motd_buttn_n.png and /dev/null differ diff --git a/data/ui/motd/new_mess_base.png b/data/ui/motd/new_mess_base.png index dfc9a52d..27ca1324 100644 Binary files a/data/ui/motd/new_mess_base.png and b/data/ui/motd/new_mess_base.png differ diff --git a/data/ui/motd/ok_d.png b/data/ui/motd/ok_d.png index 8c31991d..578e1a71 100644 Binary files a/data/ui/motd/ok_d.png and b/data/ui/motd/ok_d.png differ diff --git a/data/ui/motd/ok_h.png b/data/ui/motd/ok_h.png index b0f25781..d631295b 100644 Binary files a/data/ui/motd/ok_h.png and b/data/ui/motd/ok_h.png differ diff --git a/data/ui/motd/ok_i.png b/data/ui/motd/ok_i.png new file mode 100644 index 00000000..b20c3776 Binary files /dev/null and b/data/ui/motd/ok_i.png differ diff --git a/data/ui/motd/ok_n.png b/data/ui/motd/ok_n.png index 3f734b59..b20c3776 100644 Binary files a/data/ui/motd/ok_n.png and b/data/ui/motd/ok_n.png differ diff --git a/data/ui/ok_d.png b/data/ui/ok_d.png deleted file mode 100644 index 92206f35..00000000 Binary files a/data/ui/ok_d.png and /dev/null differ diff --git a/data/ui/ok_h.png b/data/ui/ok_h.png deleted file mode 100644 index 25014375..00000000 Binary files a/data/ui/ok_h.png and /dev/null differ diff --git a/data/ui/ok_n.png b/data/ui/ok_n.png deleted file mode 100644 index 55bef933..00000000 Binary files a/data/ui/ok_n.png and /dev/null differ diff --git a/data/ui/options/apply_d.png b/data/ui/options/apply_d.png new file mode 100644 index 00000000..01aa5ecb Binary files /dev/null and b/data/ui/options/apply_d.png differ diff --git a/data/ui/options/apply_h.png b/data/ui/options/apply_h.png new file mode 100644 index 00000000..0f96f758 Binary files /dev/null and b/data/ui/options/apply_h.png differ diff --git a/data/ui/options/apply_i.png b/data/ui/options/apply_i.png new file mode 100644 index 00000000..6dc02af9 Binary files /dev/null and b/data/ui/options/apply_i.png differ diff --git a/data/ui/options/apply_n.png b/data/ui/options/apply_n.png new file mode 100644 index 00000000..1c7c572d Binary files /dev/null and b/data/ui/options/apply_n.png differ diff --git a/data/ui/options/aud_mus_knb.png b/data/ui/options/aud_mus_knb.png deleted file mode 100644 index 4f84c66f..00000000 Binary files a/data/ui/options/aud_mus_knb.png and /dev/null differ diff --git a/data/ui/options/aud_mus_slide.png b/data/ui/options/aud_mus_slide.png deleted file mode 100644 index 47474104..00000000 Binary files a/data/ui/options/aud_mus_slide.png and /dev/null differ diff --git a/data/ui/options/aud_snd_knb.png b/data/ui/options/aud_snd_knb.png deleted file mode 100644 index 4ca45da1..00000000 Binary files a/data/ui/options/aud_snd_knb.png and /dev/null differ diff --git a/data/ui/options/aud_snd_slide.png b/data/ui/options/aud_snd_slide.png deleted file mode 100644 index 6a5abe82..00000000 Binary files a/data/ui/options/aud_snd_slide.png and /dev/null differ diff --git a/data/ui/options/aud_tab.png b/data/ui/options/aud_tab.png deleted file mode 100644 index a5b39198..00000000 Binary files a/data/ui/options/aud_tab.png and /dev/null differ diff --git a/data/ui/options/aud_txt_wndo.png b/data/ui/options/aud_txt_wndo.png deleted file mode 100644 index 992a46c3..00000000 Binary files a/data/ui/options/aud_txt_wndo.png and /dev/null differ diff --git a/data/ui/options/audio_drivers.png b/data/ui/options/audio_drivers.png new file mode 100644 index 00000000..2c3373f3 Binary files /dev/null and b/data/ui/options/audio_drivers.png differ diff --git a/data/ui/options/bar.png b/data/ui/options/bar.png new file mode 100644 index 00000000..3a632a82 Binary files /dev/null and b/data/ui/options/bar.png differ diff --git a/data/ui/options/bind_d.png b/data/ui/options/bind_d.png new file mode 100644 index 00000000..bbbd213b Binary files /dev/null and b/data/ui/options/bind_d.png differ diff --git a/data/ui/options/bind_h.png b/data/ui/options/bind_h.png new file mode 100644 index 00000000..2762385e Binary files /dev/null and b/data/ui/options/bind_h.png differ diff --git a/data/ui/options/bind_i.png b/data/ui/options/bind_i.png new file mode 100644 index 00000000..38cb02d3 Binary files /dev/null and b/data/ui/options/bind_i.png differ diff --git a/data/ui/options/bind_n.png b/data/ui/options/bind_n.png new file mode 100644 index 00000000..6e74a9fd Binary files /dev/null and b/data/ui/options/bind_n.png differ diff --git a/data/ui/options/cntr_cam_dwn_d.png b/data/ui/options/cntr_cam_dwn_d.png deleted file mode 100644 index d01467cc..00000000 Binary files a/data/ui/options/cntr_cam_dwn_d.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_dwn_h.png b/data/ui/options/cntr_cam_dwn_h.png deleted file mode 100644 index 245f91a9..00000000 Binary files a/data/ui/options/cntr_cam_dwn_h.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_dwn_n.png b/data/ui/options/cntr_cam_dwn_n.png deleted file mode 100644 index dc4aa0c7..00000000 Binary files a/data/ui/options/cntr_cam_dwn_n.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_lft_d.png b/data/ui/options/cntr_cam_lft_d.png deleted file mode 100644 index 0506c5c8..00000000 Binary files a/data/ui/options/cntr_cam_lft_d.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_lft_h.png b/data/ui/options/cntr_cam_lft_h.png deleted file mode 100644 index f8b27fb8..00000000 Binary files a/data/ui/options/cntr_cam_lft_h.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_lft_n.png b/data/ui/options/cntr_cam_lft_n.png deleted file mode 100644 index 4391b7f7..00000000 Binary files a/data/ui/options/cntr_cam_lft_n.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_rt_d.png b/data/ui/options/cntr_cam_rt_d.png deleted file mode 100644 index d5234388..00000000 Binary files a/data/ui/options/cntr_cam_rt_d.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_rt_h.png b/data/ui/options/cntr_cam_rt_h.png deleted file mode 100644 index 95c939f3..00000000 Binary files a/data/ui/options/cntr_cam_rt_h.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_rt_n.png b/data/ui/options/cntr_cam_rt_n.png deleted file mode 100644 index cd123e92..00000000 Binary files a/data/ui/options/cntr_cam_rt_n.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_up_d.png b/data/ui/options/cntr_cam_up_d.png deleted file mode 100644 index 6264fb12..00000000 Binary files a/data/ui/options/cntr_cam_up_d.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_up_h.png b/data/ui/options/cntr_cam_up_h.png deleted file mode 100644 index c53dc960..00000000 Binary files a/data/ui/options/cntr_cam_up_h.png and /dev/null differ diff --git a/data/ui/options/cntr_cam_up_n.png b/data/ui/options/cntr_cam_up_n.png deleted file mode 100644 index 01fe8a1a..00000000 Binary files a/data/ui/options/cntr_cam_up_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_bak_d.png b/data/ui/options/cntr_mrb_bak_d.png deleted file mode 100644 index 42bd7942..00000000 Binary files a/data/ui/options/cntr_mrb_bak_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_bak_h.png b/data/ui/options/cntr_mrb_bak_h.png deleted file mode 100644 index 979af577..00000000 Binary files a/data/ui/options/cntr_mrb_bak_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_bak_n.png b/data/ui/options/cntr_mrb_bak_n.png deleted file mode 100644 index ec32d207..00000000 Binary files a/data/ui/options/cntr_mrb_bak_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_fw_d.png b/data/ui/options/cntr_mrb_fw_d.png deleted file mode 100644 index 18a3e3ae..00000000 Binary files a/data/ui/options/cntr_mrb_fw_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_fw_h.png b/data/ui/options/cntr_mrb_fw_h.png deleted file mode 100644 index bf51fdde..00000000 Binary files a/data/ui/options/cntr_mrb_fw_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_fw_n.png b/data/ui/options/cntr_mrb_fw_n.png deleted file mode 100644 index 8d5ea32c..00000000 Binary files a/data/ui/options/cntr_mrb_fw_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_jmp_d.png b/data/ui/options/cntr_mrb_jmp_d.png deleted file mode 100644 index 4e693d6c..00000000 Binary files a/data/ui/options/cntr_mrb_jmp_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_jmp_h.png b/data/ui/options/cntr_mrb_jmp_h.png deleted file mode 100644 index fba24da2..00000000 Binary files a/data/ui/options/cntr_mrb_jmp_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_jmp_n.png b/data/ui/options/cntr_mrb_jmp_n.png deleted file mode 100644 index 71114312..00000000 Binary files a/data/ui/options/cntr_mrb_jmp_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_lft_d.png b/data/ui/options/cntr_mrb_lft_d.png deleted file mode 100644 index c66bc6af..00000000 Binary files a/data/ui/options/cntr_mrb_lft_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_lft_h.png b/data/ui/options/cntr_mrb_lft_h.png deleted file mode 100644 index 23a2c97e..00000000 Binary files a/data/ui/options/cntr_mrb_lft_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_lft_n.png b/data/ui/options/cntr_mrb_lft_n.png deleted file mode 100644 index 14447615..00000000 Binary files a/data/ui/options/cntr_mrb_lft_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_pwr_d.png b/data/ui/options/cntr_mrb_pwr_d.png deleted file mode 100644 index 60210d0f..00000000 Binary files a/data/ui/options/cntr_mrb_pwr_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_pwr_h.png b/data/ui/options/cntr_mrb_pwr_h.png deleted file mode 100644 index 4f9c0188..00000000 Binary files a/data/ui/options/cntr_mrb_pwr_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_pwr_n.png b/data/ui/options/cntr_mrb_pwr_n.png deleted file mode 100644 index ac05022e..00000000 Binary files a/data/ui/options/cntr_mrb_pwr_n.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_rt_d.png b/data/ui/options/cntr_mrb_rt_d.png deleted file mode 100644 index e771c78e..00000000 Binary files a/data/ui/options/cntr_mrb_rt_d.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_rt_h.png b/data/ui/options/cntr_mrb_rt_h.png deleted file mode 100644 index 1e7833e4..00000000 Binary files a/data/ui/options/cntr_mrb_rt_h.png and /dev/null differ diff --git a/data/ui/options/cntr_mrb_rt_n.png b/data/ui/options/cntr_mrb_rt_n.png deleted file mode 100644 index 622c3401..00000000 Binary files a/data/ui/options/cntr_mrb_rt_n.png and /dev/null differ diff --git a/data/ui/options/cntr_rwnd_d.png b/data/ui/options/cntr_rwnd_d.png deleted file mode 100644 index be3521f4..00000000 Binary files a/data/ui/options/cntr_rwnd_d.png and /dev/null differ diff --git a/data/ui/options/cntr_rwnd_h.png b/data/ui/options/cntr_rwnd_h.png deleted file mode 100644 index e69c5b61..00000000 Binary files a/data/ui/options/cntr_rwnd_h.png and /dev/null differ diff --git a/data/ui/options/cntr_rwnd_n.png b/data/ui/options/cntr_rwnd_n.png deleted file mode 100644 index 3c57d4a0..00000000 Binary files a/data/ui/options/cntr_rwnd_n.png and /dev/null differ diff --git a/data/ui/options/cntr_tab.png b/data/ui/options/cntr_tab.png deleted file mode 100644 index 1d6ffc40..00000000 Binary files a/data/ui/options/cntr_tab.png and /dev/null differ diff --git a/data/ui/options/cntrl_cam_bse.png b/data/ui/options/cntrl_cam_bse.png deleted file mode 100644 index bbd95a80..00000000 Binary files a/data/ui/options/cntrl_cam_bse.png and /dev/null differ diff --git a/data/ui/options/cntrl_marb_bse.png b/data/ui/options/cntrl_marb_bse.png deleted file mode 100644 index 8b9ec865..00000000 Binary files a/data/ui/options/cntrl_marb_bse.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_base.png b/data/ui/options/cntrl_mous_base.png deleted file mode 100644 index edd01c67..00000000 Binary files a/data/ui/options/cntrl_mous_base.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_bttn_d.png b/data/ui/options/cntrl_mous_bttn_d.png deleted file mode 100644 index ef1f9374..00000000 Binary files a/data/ui/options/cntrl_mous_bttn_d.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_bttn_h.png b/data/ui/options/cntrl_mous_bttn_h.png deleted file mode 100644 index 8528128c..00000000 Binary files a/data/ui/options/cntrl_mous_bttn_h.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_bttn_n.png b/data/ui/options/cntrl_mous_bttn_n.png deleted file mode 100644 index 8254e164..00000000 Binary files a/data/ui/options/cntrl_mous_bttn_n.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_freel_d.png b/data/ui/options/cntrl_mous_freel_d.png deleted file mode 100644 index 666d0f7d..00000000 Binary files a/data/ui/options/cntrl_mous_freel_d.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_freel_h.png b/data/ui/options/cntrl_mous_freel_h.png deleted file mode 100644 index 94c0568e..00000000 Binary files a/data/ui/options/cntrl_mous_freel_h.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_freel_n.png b/data/ui/options/cntrl_mous_freel_n.png deleted file mode 100644 index 6e64fc65..00000000 Binary files a/data/ui/options/cntrl_mous_freel_n.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_invrt_d.png b/data/ui/options/cntrl_mous_invrt_d.png deleted file mode 100644 index 01bbdccb..00000000 Binary files a/data/ui/options/cntrl_mous_invrt_d.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_invrt_h.png b/data/ui/options/cntrl_mous_invrt_h.png deleted file mode 100644 index 8d3982d8..00000000 Binary files a/data/ui/options/cntrl_mous_invrt_h.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_invrt_n.png b/data/ui/options/cntrl_mous_invrt_n.png deleted file mode 100644 index efd7db1e..00000000 Binary files a/data/ui/options/cntrl_mous_invrt_n.png and /dev/null differ diff --git a/data/ui/options/cntrl_mous_knb.png b/data/ui/options/cntrl_mous_knb.png deleted file mode 100644 index 429c43f4..00000000 Binary files a/data/ui/options/cntrl_mous_knb.png and /dev/null differ diff --git a/data/ui/options/delete_d.png b/data/ui/options/delete_d.png new file mode 100644 index 00000000..1181ece4 Binary files /dev/null and b/data/ui/options/delete_d.png differ diff --git a/data/ui/options/delete_h.png b/data/ui/options/delete_h.png new file mode 100644 index 00000000..6941b2de Binary files /dev/null and b/data/ui/options/delete_h.png differ diff --git a/data/ui/options/delete_i.png b/data/ui/options/delete_i.png new file mode 100644 index 00000000..2809928e Binary files /dev/null and b/data/ui/options/delete_i.png differ diff --git a/data/ui/options/delete_n.png b/data/ui/options/delete_n.png new file mode 100644 index 00000000..4da6e95e Binary files /dev/null and b/data/ui/options/delete_n.png differ diff --git a/data/ui/options/dropdown-large.png b/data/ui/options/dropdown-large.png new file mode 100644 index 00000000..1eaa48b8 Binary files /dev/null and b/data/ui/options/dropdown-large.png differ diff --git a/data/ui/options/dropdown-medium.png b/data/ui/options/dropdown-medium.png new file mode 100644 index 00000000..b15fe1af Binary files /dev/null and b/data/ui/options/dropdown-medium.png differ diff --git a/data/ui/options/dropdown-small.png b/data/ui/options/dropdown-small.png new file mode 100644 index 00000000..e6b77e27 Binary files /dev/null and b/data/ui/options/dropdown-small.png differ diff --git a/data/ui/options/dropdown-xlarge.png b/data/ui/options/dropdown-xlarge.png new file mode 100644 index 00000000..be549a21 Binary files /dev/null and b/data/ui/options/dropdown-xlarge.png differ diff --git a/data/ui/options/dropdown_d.png b/data/ui/options/dropdown_d.png new file mode 100644 index 00000000..bf53fd30 Binary files /dev/null and b/data/ui/options/dropdown_d.png differ diff --git a/data/ui/options/dropdown_h.png b/data/ui/options/dropdown_h.png new file mode 100644 index 00000000..a2e2b045 Binary files /dev/null and b/data/ui/options/dropdown_h.png differ diff --git a/data/ui/options/dropdown_i.png b/data/ui/options/dropdown_i.png new file mode 100644 index 00000000..46c4780a Binary files /dev/null and b/data/ui/options/dropdown_i.png differ diff --git a/data/ui/options/dropdown_n.png b/data/ui/options/dropdown_n.png new file mode 100644 index 00000000..521c7fe7 Binary files /dev/null and b/data/ui/options/dropdown_n.png differ diff --git a/data/ui/options/encode_d.png b/data/ui/options/encode_d.png new file mode 100644 index 00000000..1434409f Binary files /dev/null and b/data/ui/options/encode_d.png differ diff --git a/data/ui/options/encode_h.png b/data/ui/options/encode_h.png new file mode 100644 index 00000000..1945aff2 Binary files /dev/null and b/data/ui/options/encode_h.png differ diff --git a/data/ui/options/encode_i.png b/data/ui/options/encode_i.png new file mode 100644 index 00000000..1de11523 Binary files /dev/null and b/data/ui/options/encode_i.png differ diff --git a/data/ui/options/encode_n.png b/data/ui/options/encode_n.png new file mode 100644 index 00000000..4c425c64 Binary files /dev/null and b/data/ui/options/encode_n.png differ diff --git a/data/ui/options/general_d.png b/data/ui/options/general_d.png new file mode 100644 index 00000000..cb375a65 Binary files /dev/null and b/data/ui/options/general_d.png differ diff --git a/data/ui/options/general_h.png b/data/ui/options/general_h.png new file mode 100644 index 00000000..507b2fa5 Binary files /dev/null and b/data/ui/options/general_h.png differ diff --git a/data/ui/options/general_i.png b/data/ui/options/general_i.png new file mode 100644 index 00000000..d6d30c1e Binary files /dev/null and b/data/ui/options/general_i.png differ diff --git a/data/ui/options/general_n.png b/data/ui/options/general_n.png new file mode 100644 index 00000000..e060dd40 Binary files /dev/null and b/data/ui/options/general_n.png differ diff --git a/data/ui/options/graf1024_d.png b/data/ui/options/graf1024_d.png deleted file mode 100644 index 20e2ae9f..00000000 Binary files a/data/ui/options/graf1024_d.png and /dev/null differ diff --git a/data/ui/options/graf1024_h.png b/data/ui/options/graf1024_h.png deleted file mode 100644 index 0a06f391..00000000 Binary files a/data/ui/options/graf1024_h.png and /dev/null differ diff --git a/data/ui/options/graf1024_n.png b/data/ui/options/graf1024_n.png deleted file mode 100644 index e79dfe51..00000000 Binary files a/data/ui/options/graf1024_n.png and /dev/null differ diff --git a/data/ui/options/graf16bt_d.png b/data/ui/options/graf16bt_d.png deleted file mode 100644 index c1fe91ad..00000000 Binary files a/data/ui/options/graf16bt_d.png and /dev/null differ diff --git a/data/ui/options/graf16bt_h.png b/data/ui/options/graf16bt_h.png deleted file mode 100644 index 4903b22f..00000000 Binary files a/data/ui/options/graf16bt_h.png and /dev/null differ diff --git a/data/ui/options/graf16bt_n.png b/data/ui/options/graf16bt_n.png deleted file mode 100644 index 5162810f..00000000 Binary files a/data/ui/options/graf16bt_n.png and /dev/null differ diff --git a/data/ui/options/graf32bt_d.png b/data/ui/options/graf32bt_d.png deleted file mode 100644 index 6bf02bfc..00000000 Binary files a/data/ui/options/graf32bt_d.png and /dev/null differ diff --git a/data/ui/options/graf32bt_h.png b/data/ui/options/graf32bt_h.png deleted file mode 100644 index 1834809b..00000000 Binary files a/data/ui/options/graf32bt_h.png and /dev/null differ diff --git a/data/ui/options/graf32bt_n.png b/data/ui/options/graf32bt_n.png deleted file mode 100644 index 9cef231e..00000000 Binary files a/data/ui/options/graf32bt_n.png and /dev/null differ diff --git a/data/ui/options/graf640_d.png b/data/ui/options/graf640_d.png deleted file mode 100644 index c30ebed2..00000000 Binary files a/data/ui/options/graf640_d.png and /dev/null differ diff --git a/data/ui/options/graf640_h.png b/data/ui/options/graf640_h.png deleted file mode 100644 index 4efd22d4..00000000 Binary files a/data/ui/options/graf640_h.png and /dev/null differ diff --git a/data/ui/options/graf640_n.png b/data/ui/options/graf640_n.png deleted file mode 100644 index 05620fff..00000000 Binary files a/data/ui/options/graf640_n.png and /dev/null differ diff --git a/data/ui/options/graf800_d.png b/data/ui/options/graf800_d.png deleted file mode 100644 index c9dd0674..00000000 Binary files a/data/ui/options/graf800_d.png and /dev/null differ diff --git a/data/ui/options/graf800_h.png b/data/ui/options/graf800_h.png deleted file mode 100644 index fe8a6406..00000000 Binary files a/data/ui/options/graf800_h.png and /dev/null differ diff --git a/data/ui/options/graf800_n.png b/data/ui/options/graf800_n.png deleted file mode 100644 index 4a046424..00000000 Binary files a/data/ui/options/graf800_n.png and /dev/null differ diff --git a/data/ui/options/graf_chkbx_d.png b/data/ui/options/graf_chkbx_d.png deleted file mode 100644 index 0307c490..00000000 Binary files a/data/ui/options/graf_chkbx_d.png and /dev/null differ diff --git a/data/ui/options/graf_chkbx_h.png b/data/ui/options/graf_chkbx_h.png deleted file mode 100644 index 4a9700ea..00000000 Binary files a/data/ui/options/graf_chkbx_h.png and /dev/null differ diff --git a/data/ui/options/graf_chkbx_n.png b/data/ui/options/graf_chkbx_n.png deleted file mode 100644 index f4851aa2..00000000 Binary files a/data/ui/options/graf_chkbx_n.png and /dev/null differ diff --git a/data/ui/options/graf_tab.png b/data/ui/options/graf_tab.png deleted file mode 100644 index dc80e8d5..00000000 Binary files a/data/ui/options/graf_tab.png and /dev/null differ diff --git a/data/ui/options/graf_txt.png b/data/ui/options/graf_txt.png deleted file mode 100644 index 627b2b55..00000000 Binary files a/data/ui/options/graf_txt.png and /dev/null differ diff --git a/data/ui/options/grafapply_d.png b/data/ui/options/grafapply_d.png deleted file mode 100644 index 0430ca81..00000000 Binary files a/data/ui/options/grafapply_d.png and /dev/null differ diff --git a/data/ui/options/grafapply_h.png b/data/ui/options/grafapply_h.png deleted file mode 100644 index 0f729449..00000000 Binary files a/data/ui/options/grafapply_h.png and /dev/null differ diff --git a/data/ui/options/grafapply_n.png b/data/ui/options/grafapply_n.png deleted file mode 100644 index 41b69222..00000000 Binary files a/data/ui/options/grafapply_n.png and /dev/null differ diff --git a/data/ui/options/grafdir3d_d.png b/data/ui/options/grafdir3d_d.png deleted file mode 100644 index 776bb04b..00000000 Binary files a/data/ui/options/grafdir3d_d.png and /dev/null differ diff --git a/data/ui/options/grafdir3d_h.png b/data/ui/options/grafdir3d_h.png deleted file mode 100644 index b57bace5..00000000 Binary files a/data/ui/options/grafdir3d_h.png and /dev/null differ diff --git a/data/ui/options/grafdir3d_n.png b/data/ui/options/grafdir3d_n.png deleted file mode 100644 index bfe14bcf..00000000 Binary files a/data/ui/options/grafdir3d_n.png and /dev/null differ diff --git a/data/ui/options/grafful_d.png b/data/ui/options/grafful_d.png deleted file mode 100644 index c18b1786..00000000 Binary files a/data/ui/options/grafful_d.png and /dev/null differ diff --git a/data/ui/options/grafful_h.png b/data/ui/options/grafful_h.png deleted file mode 100644 index 1ed4a2e1..00000000 Binary files a/data/ui/options/grafful_h.png and /dev/null differ diff --git a/data/ui/options/grafful_n.png b/data/ui/options/grafful_n.png deleted file mode 100644 index 62c6b432..00000000 Binary files a/data/ui/options/grafful_n.png and /dev/null differ diff --git a/data/ui/options/grafopgl_d.png b/data/ui/options/grafopgl_d.png deleted file mode 100644 index e791011f..00000000 Binary files a/data/ui/options/grafopgl_d.png and /dev/null differ diff --git a/data/ui/options/grafopgl_h.png b/data/ui/options/grafopgl_h.png deleted file mode 100644 index 1fcd0579..00000000 Binary files a/data/ui/options/grafopgl_h.png and /dev/null differ diff --git a/data/ui/options/grafopgl_n.png b/data/ui/options/grafopgl_n.png deleted file mode 100644 index 1f722880..00000000 Binary files a/data/ui/options/grafopgl_n.png and /dev/null differ diff --git a/data/ui/options/grafwindo_d.png b/data/ui/options/grafwindo_d.png deleted file mode 100644 index 91e31f74..00000000 Binary files a/data/ui/options/grafwindo_d.png and /dev/null differ diff --git a/data/ui/options/grafwindo_h.png b/data/ui/options/grafwindo_h.png deleted file mode 100644 index 82cc2c16..00000000 Binary files a/data/ui/options/grafwindo_h.png and /dev/null differ diff --git a/data/ui/options/grafwindo_n.png b/data/ui/options/grafwindo_n.png deleted file mode 100644 index 340c1c36..00000000 Binary files a/data/ui/options/grafwindo_n.png and /dev/null differ diff --git a/data/ui/options/greenscroll.png b/data/ui/options/greenscroll.png new file mode 100644 index 00000000..8d4cd89c Binary files /dev/null and b/data/ui/options/greenscroll.png differ diff --git a/data/ui/options/home_d.png b/data/ui/options/home_d.png new file mode 100644 index 00000000..8ab56efc Binary files /dev/null and b/data/ui/options/home_d.png differ diff --git a/data/ui/options/home_h.png b/data/ui/options/home_h.png new file mode 100644 index 00000000..34085cec Binary files /dev/null and b/data/ui/options/home_h.png differ diff --git a/data/ui/options/home_i.png b/data/ui/options/home_i.png new file mode 100644 index 00000000..3ebd7e88 Binary files /dev/null and b/data/ui/options/home_i.png differ diff --git a/data/ui/options/home_n.png b/data/ui/options/home_n.png new file mode 100644 index 00000000..74fbfa3a Binary files /dev/null and b/data/ui/options/home_n.png differ diff --git a/data/ui/options/hotkeys_d.png b/data/ui/options/hotkeys_d.png new file mode 100644 index 00000000..dda7de10 Binary files /dev/null and b/data/ui/options/hotkeys_d.png differ diff --git a/data/ui/options/hotkeys_h.png b/data/ui/options/hotkeys_h.png new file mode 100644 index 00000000..226b7d19 Binary files /dev/null and b/data/ui/options/hotkeys_h.png differ diff --git a/data/ui/options/hotkeys_i.png b/data/ui/options/hotkeys_i.png new file mode 100644 index 00000000..f9a350bb Binary files /dev/null and b/data/ui/options/hotkeys_i.png differ diff --git a/data/ui/options/hotkeys_n.png b/data/ui/options/hotkeys_n.png new file mode 100644 index 00000000..115dbe69 Binary files /dev/null and b/data/ui/options/hotkeys_n.png differ diff --git a/data/ui/options/online_d.png b/data/ui/options/online_d.png new file mode 100644 index 00000000..ffe8aadc Binary files /dev/null and b/data/ui/options/online_d.png differ diff --git a/data/ui/options/online_h.png b/data/ui/options/online_h.png new file mode 100644 index 00000000..04c60fe1 Binary files /dev/null and b/data/ui/options/online_h.png differ diff --git a/data/ui/options/online_i.png b/data/ui/options/online_i.png new file mode 100644 index 00000000..5ff5dca4 Binary files /dev/null and b/data/ui/options/online_i.png differ diff --git a/data/ui/options/online_n.png b/data/ui/options/online_n.png new file mode 100644 index 00000000..7b19b90f Binary files /dev/null and b/data/ui/options/online_n.png differ diff --git a/data/ui/options/optionsBase.png b/data/ui/options/optionsBase.png new file mode 100644 index 00000000..f736c8e5 Binary files /dev/null and b/data/ui/options/optionsBase.png differ diff --git a/data/ui/options/optionsExtras/apply_d.png b/data/ui/options/optionsExtras/apply_d.png new file mode 100644 index 00000000..4813ba12 Binary files /dev/null and b/data/ui/options/optionsExtras/apply_d.png differ diff --git a/data/ui/options/optionsExtras/apply_h.png b/data/ui/options/optionsExtras/apply_h.png new file mode 100644 index 00000000..74cacae7 Binary files /dev/null and b/data/ui/options/optionsExtras/apply_h.png differ diff --git a/data/ui/options/optionsExtras/apply_n.png b/data/ui/options/optionsExtras/apply_n.png new file mode 100644 index 00000000..a2e4c53b Binary files /dev/null and b/data/ui/options/optionsExtras/apply_n.png differ diff --git a/data/ui/options/optionsExtras/defaults_d.png b/data/ui/options/optionsExtras/defaults_d.png new file mode 100644 index 00000000..76afc0e4 Binary files /dev/null and b/data/ui/options/optionsExtras/defaults_d.png differ diff --git a/data/ui/options/optionsExtras/defaults_h.png b/data/ui/options/optionsExtras/defaults_h.png new file mode 100644 index 00000000..ec0cfbb1 Binary files /dev/null and b/data/ui/options/optionsExtras/defaults_h.png differ diff --git a/data/ui/options/optionsExtras/defaults_n.png b/data/ui/options/optionsExtras/defaults_n.png new file mode 100644 index 00000000..afcac626 Binary files /dev/null and b/data/ui/options/optionsExtras/defaults_n.png differ diff --git a/data/ui/options/optionsExtras/fastoptions.png b/data/ui/options/optionsExtras/fastoptions.png new file mode 100644 index 00000000..a4f58f22 Binary files /dev/null and b/data/ui/options/optionsExtras/fastoptions.png differ diff --git a/data/ui/options/optionsExtras/fovText.png b/data/ui/options/optionsExtras/fovText.png new file mode 100644 index 00000000..dfba7270 Binary files /dev/null and b/data/ui/options/optionsExtras/fovText.png differ diff --git a/data/ui/options/optionsExtras/fpsText.png b/data/ui/options/optionsExtras/fpsText.png new file mode 100644 index 00000000..0c048d2b Binary files /dev/null and b/data/ui/options/optionsExtras/fpsText.png differ diff --git a/data/ui/options/optionsExtras/itemcollision.png b/data/ui/options/optionsExtras/itemcollision.png new file mode 100644 index 00000000..1c9bcccb Binary files /dev/null and b/data/ui/options/optionsExtras/itemcollision.png differ diff --git a/data/ui/options/optionsExtras/loadingbars.png b/data/ui/options/optionsExtras/loadingbars.png new file mode 100644 index 00000000..c56e7a08 Binary files /dev/null and b/data/ui/options/optionsExtras/loadingbars.png differ diff --git a/data/ui/options/optionsExtras/oeDlgBase.png b/data/ui/options/optionsExtras/oeDlgBase.png new file mode 100644 index 00000000..c09edcfa Binary files /dev/null and b/data/ui/options/optionsExtras/oeDlgBase.png differ diff --git a/data/ui/options/optionsExtras/oobText.png b/data/ui/options/optionsExtras/oobText.png new file mode 100644 index 00000000..acf06c81 Binary files /dev/null and b/data/ui/options/optionsExtras/oobText.png differ diff --git a/data/ui/options/optionsExtras/powerupparticles.png b/data/ui/options/optionsExtras/powerupparticles.png new file mode 100644 index 00000000..57a4ebb8 Binary files /dev/null and b/data/ui/options/optionsExtras/powerupparticles.png differ diff --git a/data/ui/options/optionsExtras/scorepredictor.png b/data/ui/options/optionsExtras/scorepredictor.png new file mode 100644 index 00000000..72254774 Binary files /dev/null and b/data/ui/options/optionsExtras/scorepredictor.png differ diff --git a/data/ui/options/optionsExtras/sliderBase.png b/data/ui/options/optionsExtras/sliderBase.png new file mode 100644 index 00000000..e2f2ab8c Binary files /dev/null and b/data/ui/options/optionsExtras/sliderBase.png differ diff --git a/data/ui/options/optionsExtras/sliderControl.png b/data/ui/options/optionsExtras/sliderControl.png new file mode 100644 index 00000000..d87a0219 Binary files /dev/null and b/data/ui/options/optionsExtras/sliderControl.png differ diff --git a/data/ui/options/optionsExtras/tabcompletions.png b/data/ui/options/optionsExtras/tabcompletions.png new file mode 100644 index 00000000..d0df7b8a Binary files /dev/null and b/data/ui/options/optionsExtras/tabcompletions.png differ diff --git a/data/ui/options/optionsExtras/text.png b/data/ui/options/optionsExtras/text.png new file mode 100644 index 00000000..7964f28b Binary files /dev/null and b/data/ui/options/optionsExtras/text.png differ diff --git a/data/ui/options/optionsExtras/title.png b/data/ui/options/optionsExtras/title.png new file mode 100644 index 00000000..7964f28b Binary files /dev/null and b/data/ui/options/optionsExtras/title.png differ diff --git a/data/ui/options/optionsExtras/trailparticles.png b/data/ui/options/optionsExtras/trailparticles.png new file mode 100644 index 00000000..da0383ea Binary files /dev/null and b/data/ui/options/optionsExtras/trailparticles.png differ diff --git a/data/ui/options/optionsExtras/tweening.png b/data/ui/options/optionsExtras/tweening.png new file mode 100644 index 00000000..f2d2253a Binary files /dev/null and b/data/ui/options/optionsExtras/tweening.png differ diff --git a/data/ui/options/optionsGuiGraphics.png b/data/ui/options/optionsGuiGraphics.png new file mode 100644 index 00000000..d4ff6812 Binary files /dev/null and b/data/ui/options/optionsGuiGraphics.png differ diff --git a/data/ui/options/record_d.png b/data/ui/options/record_d.png new file mode 100644 index 00000000..8545e159 Binary files /dev/null and b/data/ui/options/record_d.png differ diff --git a/data/ui/options/record_h.png b/data/ui/options/record_h.png new file mode 100644 index 00000000..f82a0899 Binary files /dev/null and b/data/ui/options/record_h.png differ diff --git a/data/ui/options/record_n.png b/data/ui/options/record_n.png new file mode 100644 index 00000000..f1e4d432 Binary files /dev/null and b/data/ui/options/record_n.png differ diff --git a/data/ui/options/remap.png b/data/ui/options/remap.png new file mode 100644 index 00000000..f4857076 Binary files /dev/null and b/data/ui/options/remap.png differ diff --git a/data/ui/options/rename_d.png b/data/ui/options/rename_d.png new file mode 100644 index 00000000..7d036ed8 Binary files /dev/null and b/data/ui/options/rename_d.png differ diff --git a/data/ui/options/rename_h.png b/data/ui/options/rename_h.png new file mode 100644 index 00000000..91850885 Binary files /dev/null and b/data/ui/options/rename_h.png differ diff --git a/data/ui/options/rename_i.png b/data/ui/options/rename_i.png new file mode 100644 index 00000000..63d43c3c Binary files /dev/null and b/data/ui/options/rename_i.png differ diff --git a/data/ui/options/rename_n.png b/data/ui/options/rename_n.png new file mode 100644 index 00000000..6c401660 Binary files /dev/null and b/data/ui/options/rename_n.png differ diff --git a/data/ui/options/serverpop_d.png b/data/ui/options/serverpop_d.png new file mode 100644 index 00000000..e4103fd0 Binary files /dev/null and b/data/ui/options/serverpop_d.png differ diff --git a/data/ui/options/serverpop_h.png b/data/ui/options/serverpop_h.png new file mode 100644 index 00000000..e4103fd0 Binary files /dev/null and b/data/ui/options/serverpop_h.png differ diff --git a/data/ui/options/serverpop_i.png b/data/ui/options/serverpop_i.png new file mode 100644 index 00000000..e4103fd0 Binary files /dev/null and b/data/ui/options/serverpop_i.png differ diff --git a/data/ui/options/serverpop_n.png b/data/ui/options/serverpop_n.png new file mode 100644 index 00000000..e4103fd0 Binary files /dev/null and b/data/ui/options/serverpop_n.png differ diff --git a/data/ui/options/slider.png b/data/ui/options/slider.png new file mode 100644 index 00000000..97b93318 Binary files /dev/null and b/data/ui/options/slider.png differ diff --git a/data/ui/options/textentry.png b/data/ui/options/textentry.png new file mode 100644 index 00000000..68603421 Binary files /dev/null and b/data/ui/options/textentry.png differ diff --git a/data/ui/options/textentrylarge-disabled.png b/data/ui/options/textentrylarge-disabled.png new file mode 100644 index 00000000..033aeb8f Binary files /dev/null and b/data/ui/options/textentrylarge-disabled.png differ diff --git a/data/ui/options/textentrylarge.png b/data/ui/options/textentrylarge.png new file mode 100644 index 00000000..0b88ede6 Binary files /dev/null and b/data/ui/options/textentrylarge.png differ diff --git a/data/ui/options/window.png b/data/ui/options/window.png new file mode 100644 index 00000000..9708153d Binary files /dev/null and b/data/ui/options/window.png differ diff --git a/data/ui/optionsgui.png b/data/ui/optionsgui.png deleted file mode 100644 index 457e9952..00000000 Binary files a/data/ui/optionsgui.png and /dev/null 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/back_d.png b/data/ui/play/back_d.png deleted file mode 100644 index f6183689..00000000 Binary files a/data/ui/play/back_d.png and /dev/null differ diff --git a/data/ui/play/back_h.png b/data/ui/play/back_h.png deleted file mode 100644 index 7e0cf388..00000000 Binary files a/data/ui/play/back_h.png and /dev/null differ diff --git a/data/ui/play/back_i.png b/data/ui/play/back_i.png deleted file mode 100644 index 040f9608..00000000 Binary files a/data/ui/play/back_i.png and /dev/null differ diff --git a/data/ui/play/back_n.png b/data/ui/play/back_n.png deleted file mode 100644 index fada42d0..00000000 Binary files a/data/ui/play/back_n.png and /dev/null 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/cust_tab.png b/data/ui/play/cust_tab.png deleted file mode 100644 index 7a3af762..00000000 Binary files a/data/ui/play/cust_tab.png and /dev/null 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/goldscore.png b/data/ui/play/goldscore.png deleted file mode 100644 index a5f1674e..00000000 Binary files a/data/ui/play/goldscore.png and /dev/null differ diff --git a/data/ui/play/level_window.png b/data/ui/play/level_window.png deleted file mode 100644 index 8c5d5397..00000000 Binary files a/data/ui/play/level_window.png and /dev/null 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/playgui.png b/data/ui/play/playgui.png deleted file mode 100644 index 16616298..00000000 Binary files a/data/ui/play/playgui.png and /dev/null 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/tab_adv.png b/data/ui/play/tab_adv.png deleted file mode 100644 index aa562b6f..00000000 Binary files a/data/ui/play/tab_adv.png and /dev/null differ diff --git a/data/ui/play/tab_begin.png b/data/ui/play/tab_begin.png deleted file mode 100644 index 18725dd3..00000000 Binary files a/data/ui/play/tab_begin.png and /dev/null differ diff --git a/data/ui/play/tab_inter.png b/data/ui/play/tab_inter.png deleted file mode 100644 index 240248c9..00000000 Binary files a/data/ui/play/tab_inter.png and /dev/null 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/data/ui/presents.jpg b/data/ui/presents.jpg deleted file mode 100644 index 7a2a9137..00000000 Binary files a/data/ui/presents.jpg and /dev/null differ diff --git a/data/ui/production.jpg b/data/ui/production.jpg deleted file mode 100644 index 74c1c3f9..00000000 Binary files a/data/ui/production.jpg and /dev/null differ diff --git a/data/ui/search/artist_d.png b/data/ui/search/artist_d.png new file mode 100644 index 00000000..7ff43106 Binary files /dev/null and b/data/ui/search/artist_d.png differ diff --git a/data/ui/search/artist_h.png b/data/ui/search/artist_h.png new file mode 100644 index 00000000..856d113b Binary files /dev/null and b/data/ui/search/artist_h.png differ diff --git a/data/ui/search/artist_n.png b/data/ui/search/artist_n.png new file mode 100644 index 00000000..62e158ef Binary files /dev/null and b/data/ui/search/artist_n.png differ diff --git a/data/ui/search/cancel_d.png b/data/ui/search/cancel_d.png new file mode 100644 index 00000000..bb2322ec Binary files /dev/null and b/data/ui/search/cancel_d.png differ diff --git a/data/ui/search/cancel_h.png b/data/ui/search/cancel_h.png new file mode 100644 index 00000000..5b0cc48f Binary files /dev/null and b/data/ui/search/cancel_h.png differ diff --git a/data/ui/search/cancel_n.png b/data/ui/search/cancel_n.png new file mode 100644 index 00000000..caf0e7e2 Binary files /dev/null and b/data/ui/search/cancel_n.png differ diff --git a/data/ui/search/file_d.png b/data/ui/search/file_d.png new file mode 100644 index 00000000..29edbe00 Binary files /dev/null and b/data/ui/search/file_d.png differ diff --git a/data/ui/search/file_h.png b/data/ui/search/file_h.png new file mode 100644 index 00000000..4625c33f Binary files /dev/null and b/data/ui/search/file_h.png differ diff --git a/data/ui/search/file_n.png b/data/ui/search/file_n.png new file mode 100644 index 00000000..199aac49 Binary files /dev/null and b/data/ui/search/file_n.png differ diff --git a/data/ui/search/more.png b/data/ui/search/more.png new file mode 100644 index 00000000..80f364a0 Binary files /dev/null and b/data/ui/search/more.png differ diff --git a/data/ui/search/name_d.png b/data/ui/search/name_d.png new file mode 100644 index 00000000..44743d9c Binary files /dev/null and b/data/ui/search/name_d.png differ diff --git a/data/ui/search/name_h.png b/data/ui/search/name_h.png new file mode 100644 index 00000000..af15c6ac Binary files /dev/null and b/data/ui/search/name_h.png differ diff --git a/data/ui/search/name_n.png b/data/ui/search/name_n.png new file mode 100644 index 00000000..2ad1d6ea Binary files /dev/null and b/data/ui/search/name_n.png differ diff --git a/data/ui/search/options_d.png b/data/ui/search/options_d.png new file mode 100644 index 00000000..96f0b38d Binary files /dev/null and b/data/ui/search/options_d.png differ diff --git a/data/ui/search/options_h.png b/data/ui/search/options_h.png new file mode 100644 index 00000000..e1333939 Binary files /dev/null and b/data/ui/search/options_h.png differ diff --git a/data/ui/search/options_n.png b/data/ui/search/options_n.png new file mode 100644 index 00000000..45080f07 Binary files /dev/null and b/data/ui/search/options_n.png differ diff --git a/data/ui/search/play_d.png b/data/ui/search/play_d.png new file mode 100644 index 00000000..bebfcfe5 Binary files /dev/null and b/data/ui/search/play_d.png differ diff --git a/data/ui/search/play_h.png b/data/ui/search/play_h.png new file mode 100644 index 00000000..a18c63cc Binary files /dev/null and b/data/ui/search/play_h.png differ diff --git a/data/ui/search/play_i.png b/data/ui/search/play_i.png new file mode 100644 index 00000000..ab5e5b3e Binary files /dev/null and b/data/ui/search/play_i.png differ diff --git a/data/ui/search/play_n.png b/data/ui/search/play_n.png new file mode 100644 index 00000000..49e3c931 Binary files /dev/null and b/data/ui/search/play_n.png differ diff --git a/data/ui/search/random_d.png b/data/ui/search/random_d.png new file mode 100644 index 00000000..ae75bda9 Binary files /dev/null and b/data/ui/search/random_d.png differ diff --git a/data/ui/search/random_h.png b/data/ui/search/random_h.png new file mode 100644 index 00000000..c0c32ec8 Binary files /dev/null and b/data/ui/search/random_h.png differ diff --git a/data/ui/search/random_n.png b/data/ui/search/random_n.png new file mode 100644 index 00000000..c308d873 Binary files /dev/null and b/data/ui/search/random_n.png differ diff --git a/data/ui/search/window-lb.png b/data/ui/search/window-lb.png new file mode 100644 index 00000000..9a9675b7 Binary files /dev/null and b/data/ui/search/window-lb.png differ diff --git a/data/ui/search/window.png b/data/ui/search/window.png new file mode 100644 index 00000000..27e512e4 Binary files /dev/null and b/data/ui/search/window.png differ diff --git a/data/ui/title.jpg b/data/ui/title.jpg deleted file mode 100644 index 909c0aeb..00000000 Binary files a/data/ui/title.jpg and /dev/null differ diff --git a/index.html b/index.html index c3c0d731..e9dcc3ba 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ -${Util.formatTime(timeState.gameplayClock)}
'; + egResult.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + pg.addChild(egResult); + + var egFirstLine = new GuiMLText(domcasual24, mlFontLoader); + egFirstLine.position = new Vector(340, 150); + egFirstLine.extent = new Vector(210, 25); + egFirstLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFirstLine); + + var egSecondLine = new GuiMLText(domcasual24, mlFontLoader); + egSecondLine.position = new Vector(341, 178); + egSecondLine.extent = new Vector(209, 25); + egSecondLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egSecondLine); + + var egThirdLine = new GuiMLText(domcasual24, mlFontLoader); + egThirdLine.position = new Vector(341, 206); + egThirdLine.extent = new Vector(209, 25); + egThirdLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egThirdLine); + + var egFourthLine = new GuiMLText(domcasual24, mlFontLoader); + egFourthLine.position = new Vector(341, 234); + egFourthLine.extent = new Vector(209, 25); + egFourthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFourthLine); + + var egFifthLine = new GuiMLText(domcasual24, mlFontLoader); + egFifthLine.position = new Vector(341, 262); + egFifthLine.extent = new Vector(209, 25); + egFifthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFifthLine); + + var egFirstLineScore = new GuiMLText(domcasual24, mlFontLoader); + egFirstLineScore.position = new Vector(475, 150); + egFirstLineScore.extent = new Vector(210, 25); + egFirstLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFirstLineScore); + + var egSecondLineScore = new GuiMLText(domcasual24, mlFontLoader); + egSecondLineScore.position = new Vector(476, 178); + egSecondLineScore.extent = new Vector(209, 25); + egSecondLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egSecondLineScore); + + var egThirdLineScore = new GuiMLText(domcasual24, mlFontLoader); + egThirdLineScore.position = new Vector(476, 206); + egThirdLineScore.extent = new Vector(209, 25); + egThirdLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egThirdLineScore); + + var egFourthLineScore = new GuiMLText(domcasual24, mlFontLoader); + egFourthLineScore.position = new Vector(476, 234); + egFourthLineScore.extent = new Vector(209, 25); + egFourthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFourthLineScore); + + var egFifthLineScore = new GuiMLText(domcasual24, mlFontLoader); + egFifthLineScore.position = new Vector(476, 262); + egFifthLineScore.extent = new Vector(209, 25); + egFifthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); + pg.addChild(egFifthLineScore); + + var egTitleText = new GuiMLText(expo50, mlFontLoader); + egTitleText.text.textColor = 0xffff00; + egTitleText.text.text = 'Your Time:'; + egTitleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + egTitleText.position = new Vector(34, 54); + egTitleText.extent = new Vector(247, 69); + pg.addChild(egTitleText); + + var egTopThreeText = new GuiMLText(domcasual32, mlFontLoader); + egTopThreeText.position = new Vector(341, 114); + egTopThreeText.extent = new Vector(209, 34); + egTopThreeText.text.text = 'Top 5 Times:'; // Make toggleable 3-5 + egTopThreeText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); + pg.addChild(egTopThreeText); + + var text = ''; + // Check for ultimate time TODO + if (mission.ultimateTime > 0 && timeState.gameplayClock < mission.ultimateTime) { + text += 'You beat the Ultimate Time!'; + } else { + if (mission.goldTime > 0 && timeState.gameplayClock < mission.goldTime) { + if (mission.game == "gold") + text += 'You beat the Gold Time!'; + else + text += 'You beat the Platinum Time!'; + } else { + if (mission.qualifyTime > timeState.gameplayClock) { + text += "You beat the Par Time!"; + } else { + text += 'You didn\'nt pass the Par Time!'; + } + } + } + text += '
'; var finishMessage = new GuiMLText(expo32, mlFontLoader); finishMessage.text.textColor = 0x00ff00; - var qualified = mission.qualifyTime > timeState.gameplayClock; - if (qualified) - finishMessage.text.text = timeState.gameplayClock < mission.goldTime ? 'You beat the GOLD time!' : "You've qualified!"; - else - finishMessage.text.text = 'You failed to qualify!'; + finishMessage.text.text = text; finishMessage.text.filter = new DropShadow(1, 0.785, 0, 1, 0, 0.4, 1, true); // finishMessage.justify = Center; - finishMessage.position = new Vector(155, 74); - if (timeState.gameplayClock < mission.goldTime) { - finishMessage.position.x = 110; - } - if (!qualified) - finishMessage.position.x = 125; - finishMessage.extent = new Vector(400, 100); + finishMessage.position = new Vector(25, 120); + finishMessage.extent = new Vector(293, 211); pg.addChild(finishMessage); + var qualified = mission.qualifyTime > timeState.gameplayClock; + var scoreData:Array1. ${scoreData[0].name}
'; + egSecondLine.text.text = '2. ${scoreData[1].name}
'; + egThirdLine.text.text = '3. ${scoreData[2].name}
'; + egFourthLine.text.text = '4. ${scoreData[3].name}
'; + egFifthLine.text.text = '5. ${scoreData[4].name}
'; + + var lineelems = [ + egFirstLineScore, + egSecondLineScore, + egThirdLineScore, + egFourthLineScore, + egFifthLineScore + ]; + + for (i in 0...5) { + if (scoreData[i].time < mission.ultimateTime) { + lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; + } else { + if (scoreData[i].time < mission.goldTime) { + if (mission.game == "gold") + lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; + else + lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; + } else { + lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; + } + } } - leftColumn.text.filter = new DropShadow(1.414, 0.785, 0xffffff, 1, 0, 0.4, 1, true); - leftColumn.position = new Vector(108, 113); - leftColumn.extent = new Vector(208, 50); + + var leftColumn = new GuiMLText(domcasual24, mlFontLoader); + leftColumn.text.lineSpacing = 5; + leftColumn.text.textColor = 0xFFFFFF; + leftColumn.text.text = 'Par Time:1. ${scoreData[0].name}
'; + egSecondLine.text.text = '2. ${scoreData[1].name}
'; + egThirdLine.text.text = '3. ${scoreData[2].name}
'; + egFourthLine.text.text = '4. ${scoreData[3].name}
'; + egFifthLine.text.text = '5. ${scoreData[4].name}
'; - rightColumn.text.text = '${Util.formatTime(mission.qualifyTime == Math.POSITIVE_INFINITY ? 5999.999 : mission.qualifyTime)}Congratulations!
You got the${["", " 2nd", " 3rd"][place]} best time!
Well Done!
You have the${["", " second", " third", " fourth", "fifth"][place]} top time!
Overview
Basic Controls
Camera Controls
Goals
Bonus Items (1/2)
Bonus Items (2/2)
Hazards (1/2)
Hazards (2/2)
About GarageGames
About the Torque
The Marble Blast Team
Special Thanks
${txtlines[0]}
'; + var finaltxt = txtlines.join('Title: ${songList[selectedIdx]}
'; + this.addChild(songTitle); + + var songStatus = new GuiMLText(markerFelt24, null); + songStatus.position = new Vector(56, 283); + songStatus.extent = new Vector(421, 22); + songStatus.text.filter = new DropShadow(1.414, 0.785, 0x0000007F, 1, 0, 0.4, 1, true); + songStatus.text.textColor = 0xFFFFFF; + songStatus.text.text = '${playing ? "Playing" : "Stopped"}
'; + this.addChild(songStatus); + + var scroll = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile()); + scroll.position = new Vector(51, 39); + scroll.extent = new Vector(439, 216); + this.addChild(scroll); + + var songCtrl = new GuiTextListCtrl(markerFelt24, songList); + songCtrl.position = new Vector(0, 0); + songCtrl.extent = new Vector(423, 456); + songCtrl.scrollable = true; + songCtrl.textYOffset = -6; + songCtrl.selectedColor = 0; + songCtrl._prevSelected = selectedIdx; + scroll.addChild(songCtrl); + scroll.setScrollMax(songCtrl.calculateFullHeight()); + + function setCurrentSong(idx:Int) { + selectedIdx = idx; + songCtrl._prevSelected = idx; + songTitle.text.text = 'Title: ${songList[idx]}
'; + songCtrl.redrawSelectionRect(songCtrl.getHitTestRect()); + + if (playing) { + songFiles[idx].load(() -> { + var audiores = ResourceLoader.getAudio(songFiles[idx].path).resource; + AudioManager.playMusic(audiores, songList[idx]); + }); + } + } + + songCtrl.onSelectedFunc = (idx) -> { + setCurrentSong(idx); + }; + + var stopBtn = new GuiButton(loadButtonImages("data/ui/jukebox/stop")); + stopBtn.position = new Vector(219, 306); + stopBtn.extent = new Vector(96, 45); + this.addChild(stopBtn); + + var playBtn = new GuiButton(loadButtonImages("data/ui/jukebox/play")); + playBtn.position = new Vector(219, 306); + playBtn.extent = new Vector(96, 45); + + stopBtn.pressedAction = (e) -> { + this.removeChild(stopBtn); + this.addChild(playBtn); + playBtn.render(MarbleGame.canvas.scene2d); + playing = false; + songStatus.text.text = '${playing ? "Playing" : "Stopped"}
'; + AudioManager.pauseMusic(true); + }; + + playBtn.pressedAction = (e) -> { + this.removeChild(playBtn); + this.addChild(stopBtn); + stopBtn.render(MarbleGame.canvas.scene2d); + playing = true; + songStatus.text.text = '${playing ? "Playing" : "Stopped"}
'; + if (AudioManager.currentMusicName != songList[selectedIdx]) { + songFiles[selectedIdx].load(() -> { + var audiores = ResourceLoader.getAudio(songFiles[selectedIdx].path).resource; + AudioManager.playMusic(audiores, songList[selectedIdx]); + }); + } else { + AudioManager.pauseMusic(false); + } + }; + + var prevBtn = new GuiButton(loadButtonImages("data/ui/play/prev")); + prevBtn.position = new Vector(145, 307); + prevBtn.extent = new Vector(72, 43); + prevBtn.pressedAction = (e) -> { + if (selectedIdx >= 1) { + setCurrentSong(selectedIdx - 1); + } else { + setCurrentSong(songList.length - 1); + } + } + this.addChild(prevBtn); + + var nextBtn = new GuiButton(loadButtonImages("data/ui/play/next")); + nextBtn.position = new Vector(317, 307); + nextBtn.extent = new Vector(72, 43); + nextBtn.pressedAction = (e) -> { + if (selectedIdx < songList.length - 1) { + setCurrentSong(selectedIdx + 1); + } else { + setCurrentSong(0); + } + } + this.addChild(nextBtn); + + var closeBtn = new GuiButton(loadButtonImages("data/ui/jukebox/close")); + closeBtn.position = new Vector(47, 307); + closeBtn.extent = new Vector(94, 45); + closeBtn.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(this); + } + this.addChild(closeBtn); + } +} diff --git a/src/gui/LoadingGui.hx b/src/gui/LoadingGui.hx index c58df043..4e3254aa 100644 --- a/src/gui/LoadingGui.hx +++ b/src/gui/LoadingGui.hx @@ -5,12 +5,13 @@ import h3d.Vector; import src.ResourceLoader; import src.MarbleGame; import src.Settings; +import src.Util; class LoadingGui extends GuiImage { public var setProgress:Float->Void; - public function new(missionName:String) { - var img = ResourceLoader.getImage("data/ui/background.jpg"); + public function new(missionName:String, game:String) { + var img = game == "platinum" ? ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg') : ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; @@ -36,16 +37,16 @@ class LoadingGui extends GuiImage { var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); var mapName = new GuiText(domcasual32); - mapName.position = new Vector(134, 78); - mapName.extent = new Vector(323, 32); + mapName.position = new Vector(6, 33); + mapName.extent = new Vector(456, 14); mapName.text.text = missionName; mapName.text.textColor = 0; mapName.justify = Center; var progress = new GuiProgress(); - progress.vertSizing = Bottom; - progress.position = new Vector(153, 133); - progress.extent = new Vector(269, 78); + progress.vertSizing = Top; + progress.position = new Vector(194, 145); + progress.extent = new Vector(225, 56); progress.progress = 0.5; setProgress = (progressPz) -> { @@ -53,15 +54,15 @@ class LoadingGui extends GuiImage { } var cancelButton = new GuiButton(loadButtonImages("data/ui/loading/cancel")); - cancelButton.position = new Vector(320, 233); - cancelButton.extent = new Vector(88, 50); + cancelButton.position = new Vector(333, 243); + cancelButton.extent = new Vector(112, 59); cancelButton.pressedAction = (sender) -> { MarbleGame.instance.quitMission(); } var overlay = new GuiImage(ResourceLoader.getResource("data/ui/loading/overlay.png", ResourceLoader.getImage, this.imageResources).toTile()); - overlay.position = new Vector(151, 131); - overlay.extent = new Vector(278, 86); + overlay.position = new Vector(188, 139); + overlay.extent = new Vector(242, 75); loadingGui.addChild(mapName); loadingGui.addChild(progress); diff --git a/src/gui/MainMenuGui.hx b/src/gui/MainMenuGui.hx index e007cce5..3e026b49 100644 --- a/src/gui/MainMenuGui.hx +++ b/src/gui/MainMenuGui.hx @@ -6,10 +6,12 @@ import hxd.res.BitmapFont; import h3d.Vector; import src.ResourceLoader; import src.Settings; +import src.Util; +import src.Replay; class MainMenuGui extends GuiImage { public function new() { - var img = ResourceLoader.getImage("data/ui/background.jpg"); + var img = Math.random() >= 0.7 ? ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg') : ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); super(img.resource.toTile()); var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); var domcasual32b = new BitmapFont(domcasual32fontdata.entry); @@ -21,21 +23,11 @@ class MainMenuGui extends GuiImage { this.position = new Vector(); this.extent = new Vector(640, 480); - var versionText = new GuiText(domcasual32); - - versionText.horizSizing = Center; - versionText.vertSizing = Top; - versionText.position = new Vector(289, 457); - versionText.extent = new Vector(62, 18); - versionText.text.text = "1.1.2"; - this.addChild(versionText); - - var homebase = new GuiImage(ResourceLoader.getResource("data/ui/home/homegui.png", ResourceLoader.getImage, this.imageResources).toTile()); - homebase.horizSizing = Center; - homebase.vertSizing = Center; - homebase.extent = new Vector(349, 477); - homebase.position = new Vector(145, 1); - this.addChild(homebase); + var mainMenuContent = new GuiControl(); + mainMenuContent.horizSizing = Center; + mainMenuContent.vertSizing = Center; + mainMenuContent.position = new Vector(-130, -110); + mainMenuContent.extent = new Vector(900, 700); function loadButtonImages(path:String) { var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); @@ -44,38 +36,117 @@ class MainMenuGui extends GuiImage { return [normal, hover, pressed]; } - var playButton = new GuiButton(loadButtonImages("data/ui/home/play")); - playButton.position = new Vector(50, 113); - playButton.extent = new Vector(270, 95); + var siteButton = new GuiButton(loadButtonImages('data/ui/menu/site')); + siteButton.horizSizing = Right; + siteButton.vertSizing = Top; + siteButton.position = new Vector(363, 664); + siteButton.extent = new Vector(400, 30); + siteButton.pressedAction = (sender) -> {} + mainMenuContent.addChild(siteButton); + + var motdButton = new GuiImage(ResourceLoader.getResource('data/ui/menu/totd_i.png', ResourceLoader.getImage, this.imageResources).toTile()); + motdButton.horizSizing = Left; + motdButton.vertSizing = Top; + motdButton.position = new Vector(706, 536); + motdButton.extent = new Vector(191, 141); + mainMenuContent.addChild(motdButton); + + var playButton = new GuiButton(loadButtonImages("data/ui/menu/play")); + playButton.position = new Vector(-5, -2); + playButton.extent = new Vector(247, 164); playButton.pressedAction = (sender) -> { cast(this.parent, Canvas).setContent(new PlayMissionGui()); } - homebase.addChild(playButton); + mainMenuContent.addChild(playButton); - var helpButton = new GuiButton(loadButtonImages("data/ui/home/help")); - helpButton.position = new Vector(59, 200); - helpButton.extent = new Vector(242, 84); - helpButton.pressedAction = (sender) -> { - MarbleGame.canvas.setContent(new HelpCreditsGui()); - } - homebase.addChild(helpButton); + var lbButton = new GuiImage(ResourceLoader.getResource('data/ui/menu/online_i.png', ResourceLoader.getImage, this.imageResources).toTile()); + lbButton.position = new Vector(-5, 128); + lbButton.extent = new Vector(247, 164); + mainMenuContent.addChild(lbButton); - var optionsButton = new GuiButton(loadButtonImages("data/ui/home/options")); - optionsButton.position = new Vector(55, 279); - optionsButton.extent = new Vector(253, 83); + var optionsButton = new GuiButton(loadButtonImages("data/ui/menu/options")); + optionsButton.position = new Vector(-5, 258); + optionsButton.extent = new Vector(247, 164); optionsButton.pressedAction = (sender) -> { cast(this.parent, Canvas).setContent(new OptionsDlg()); } - homebase.addChild(optionsButton); + mainMenuContent.addChild(optionsButton); - var exitButton = new GuiButton(loadButtonImages("data/ui/home/exit")); - exitButton.position = new Vector(82, 358); - exitButton.extent = new Vector(203, 88); + var exitButton = new GuiButton(loadButtonImages("data/ui/menu/quit")); + exitButton.position = new Vector(-5, 388); + exitButton.extent = new Vector(247, 164); exitButton.pressedAction = (sender) -> { #if hl Sys.exit(0); #end }; - homebase.addChild(exitButton); + mainMenuContent.addChild(exitButton); + + var replButton = new GuiButton(loadButtonImages("data/ui/menu/replay")); + replButton.horizSizing = Left; + replButton.vertSizing = Top; + replButton.position = new Vector(552, 536); + replButton.extent = new Vector(191, 141); + replButton.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 + if (MissionList.missions == null) + MissionList.buildMissionList(); + 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"] + } + ], + }); + }; + mainMenuContent.addChild(replButton); + + var helpButton = new GuiButton(loadButtonImages("data/ui/menu/help")); + helpButton.horizSizing = Left; + helpButton.vertSizing = Top; + helpButton.position = new Vector(398, 536); + helpButton.extent = new Vector(191, 141); + helpButton.pressedAction = (sender) -> { + MarbleGame.canvas.setContent(new HelpCreditsGui()); + } + mainMenuContent.addChild(helpButton); + + this.addChild(mainMenuContent); + + var mbp = new GuiImage(ResourceLoader.getResource("data/ui/menu/mbp.png", ResourceLoader.getImage, this.imageResources).toTile()); + mbp.horizSizing = Left; + mbp.vertSizing = Bottom; + mbp.position = new Vector(476, 12); + mbp.extent = new Vector(153, 150); + this.addChild(mbp); + + var versionText = new GuiMLText(domcasual32, null); + + versionText.horizSizing = Left; + versionText.vertSizing = Bottom; + versionText.position = new Vector(502, 66); + versionText.extent = new Vector(97, 72); + versionText.text.text = "1.2.0
"; + this.addChild(versionText); } } diff --git a/src/gui/MarbleSelectGui.hx b/src/gui/MarbleSelectGui.hx new file mode 100644 index 00000000..b7aceab4 --- /dev/null +++ b/src/gui/MarbleSelectGui.hx @@ -0,0 +1,226 @@ +package gui; + +import h2d.filter.DropShadow; +import hxd.res.BitmapFont; +import h3d.prim.Polygon; +import h3d.scene.Mesh; +import h3d.shader.AlphaChannel; +import src.MarbleGame; +import h3d.Vector; +import src.ResourceLoader; +import src.DtsObject; +import src.Settings; +import src.ResourceLoaderWorker; + +class MarbleSelectGui extends GuiImage { + public function new() { + var img = ResourceLoader.getImage("data/ui/marbleSelect/marbleSelect.png"); + super(img.resource.toTile()); + this.horizSizing = Center; + this.vertSizing = Center; + this.position = new Vector(73, -59); + this.extent = new Vector(493, 361); + + var marbleData = [ + {name: "Staff's Original", dts: "data/shapes/balls/ball-superball.dts", skin: "base"}, + {name: "3D Marble", dts: "data/shapes/balls/3dMarble.dts", skin: "base"}, + {name: "Mid P", dts: "data/shapes/balls/midp.dts", skin: "base"}, + {name: "Spade", dts: "data/shapes/balls/ball-superball.dts", skin: "skin4"}, + {name: "GMD Logo", dts: "data/shapes/balls/ball-superball.dts", skin: "skin5"}, + {name: "Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin6"}, + {name: "Golden Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin7"}, + {name: "Rainbow Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin8"}, + {name: "Brown Swirls", dts: "data/shapes/balls/ball-superball.dts", skin: "skin9"}, + {name: "Caution Stripes", dts: "data/shapes/balls/ball-superball.dts", skin: "skin10"}, + {name: "Earth", dts: "data/shapes/balls/ball-superball.dts", skin: "skin11"}, + {name: "Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin12"}, + {name: "Jupiter", dts: "data/shapes/balls/ball-superball.dts", skin: "skin13"}, + {name: "MB Gold Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin14"}, + {name: "MBP on the Marble!", dts: "data/shapes/balls/ball-superball.dts", skin: "skin15"}, + {name: "Moshe", dts: "data/shapes/balls/ball-superball.dts", skin: "skin16"}, + {name: "Strong Bad", dts: "data/shapes/balls/ball-superball.dts", skin: "skin17"}, + {name: "Venus", dts: "data/shapes/balls/ball-superball.dts", skin: "skin18"}, + {name: "Water", dts: "data/shapes/balls/ball-superball.dts", skin: "skin19"}, + {name: "Evil Eye", dts: "data/shapes/balls/ball-superball.dts", skin: "skin20"}, + {name: "Desert and Sky", dts: "data/shapes/balls/ball-superball.dts", skin: "skin21"}, + {name: "Dirt Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin22"}, + {name: "Friction Textured Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin23"}, + {name: "Grass", dts: "data/shapes/balls/ball-superball.dts", skin: "skin24"}, + {name: "Mars", dts: "data/shapes/balls/ball-superball.dts", skin: "skin25"}, + {name: "Phil's Golf Ball", dts: "data/shapes/balls/ball-superball.dts", skin: "skin26"}, + {name: "Molten", dts: "data/shapes/balls/ball-superball.dts", skin: "skin27"}, + {name: "Lightning", dts: "data/shapes/balls/ball-superball.dts", skin: "skin28"}, + {name: "Phil'sEmpire", dts: "data/shapes/balls/ball-superball.dts", skin: "skin29"}, + {name: "Matan's Red Dragon", dts: "data/shapes/balls/ball-superball.dts", skin: "skin30"}, + {name: "Metallic Marble", dts: "data/shapes/balls/ball-superball.dts", skin: "skin31"}, + {name: "Sun", dts: "data/shapes/balls/ball-superball.dts", skin: "skin32"}, + {name: "Underwater", dts: "data/shapes/balls/ball-superball.dts", skin: "skin33"}, + {name: "GarageGames logo", dts: "data/shapes/balls/garageGames.dts", skin: "base"}, + {name: "Big Marble 1", dts: "data/shapes/balls/bm1.dts", skin: "base"}, + {name: "Big Marble 2", dts: "data/shapes/balls/bm2.dts", skin: "base"}, + {name: "Big Marble 3", dts: "data/shapes/balls/bm3.dts", skin: "base"}, + {name: "Small Marble 1", dts: "data/shapes/balls/sm1.dts", skin: "base"}, + {name: "Small Marble 2", dts: "data/shapes/balls/sm2.dts", skin: "base"}, + {name: "Small Marble 3", dts: "data/shapes/balls/sm3.dts", skin: "base"}, + ]; + + var curSelection:Int = Settings.optionsSettings.marbleIndex; + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed, disabled]; + } + + 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 18 * Settings.uiScale, MultiChannel); + var markerFelt28 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + + var selectBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/select")); + selectBtn.horizSizing = Center; + selectBtn.vertSizing = Top; + selectBtn.position = new Vector(199, 270); + selectBtn.extent = new Vector(95, 45); + selectBtn.pressedAction = (e) -> { + Settings.optionsSettings.marbleIndex = curSelection; + Settings.optionsSettings.marbleSkin = marbleData[curSelection].skin; + Settings.optionsSettings.marbleModel = marbleData[curSelection].dts; + Settings.save(); + MarbleGame.canvas.popDialog(this); + } + this.addChild(selectBtn); + + var marbleShow = buildObjectShow(marbleData[curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, 0, + ["base.marble" => marbleData[curSelection].skin + ".marble"]); + marbleShow.horizSizing = Center; + marbleShow.vertSizing = Bottom; + marbleShow.visible = true; + this.addChild(marbleShow); + + var titleText = new GuiMLText(markerFelt28, null); + titleText.text.textColor = 0xFFFFFF; + titleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + titleText.horizSizing = Center; + titleText.vertSizing = Bottom; + titleText.position = new Vector(140, 67); + titleText.extent = new Vector(213, 27); + titleText.text.text = 'Official Marbles
'; + this.addChild(titleText); + + var marbleText = new GuiMLText(markerFelt24, null); + marbleText.text.textColor = 0xFFFFFF; + marbleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0x0000007F, 0.4, 1, true); + marbleText.horizSizing = Center; + marbleText.vertSizing = Bottom; + marbleText.position = new Vector(86, 243); + marbleText.extent = new Vector(320, 22); + marbleText.text.text = '${marbleData[curSelection].name}
'; + this.addChild(marbleText); + + var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + changeMarbleText.horizSizing = Center; + changeMarbleText.position = new Vector(96, 26); + changeMarbleText.extent = new Vector(300, 39); + this.addChild(changeMarbleText); + + function setMarbleSelection(idx:Int) { + if (idx < 0) + idx = marbleData.length + idx; + if (idx >= marbleData.length) + idx -= marbleData.length; + curSelection = idx; + var marble = marbleData[idx]; + + marbleText.text.text = '${marble.name}
'; + + var dtsObj = new DtsObject(); + dtsObj.dtsPath = marble.dts; + dtsObj.ambientRotate = true; + dtsObj.ambientSpinFactor /= -2; + dtsObj.showSequences = false; + dtsObj.useInstancing = false; + dtsObj.matNameOverride.set("base.marble", marble.skin + ".marble"); + + ResourceLoader.load(dtsObj.dtsPath).entry.load(() -> { + var dtsFile = ResourceLoader.loadDts(dtsObj.dtsPath); + var directoryPath = haxe.io.Path.directory(dtsObj.dtsPath); + var texToLoad = []; + for (i in 0...dtsFile.resource.matNames.length) { + var matName = dtsObj.matNameOverride.exists(dtsFile.resource.matNames[i]) ? dtsObj.matNameOverride.get(dtsFile.resource.matNames[i]) : dtsFile.resource.matNames[i]; + var fullNames = ResourceLoader.getFullNamesOf(directoryPath + '/' + matName).filter(x -> haxe.io.Path.extension(x) != "dts"); + var fullName = fullNames.length > 0 ? fullNames[0] : null; + if (fullName != null) { + texToLoad.push(fullName); + } + } + + var worker = new ResourceLoaderWorker(() -> { + dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway + for (mat in dtsObj.materials) { + mat.mainPass.enableLights = false; + mat.mainPass.culling = None; + if (mat.blendMode != Alpha && mat.blendMode != Add) + mat.mainPass.addShader(new AlphaChannel()); + } + marbleShow.changeObject(dtsObj); + }); + + for (texPath in texToLoad) { + worker.loadFile(texPath); + } + worker.run(); + }); + } + + var nextBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/next")); + nextBtn.position = new Vector(296, 270); + nextBtn.extent = new Vector(75, 45); + nextBtn.pressedAction = (e) -> { + setMarbleSelection(curSelection + 1); + } + this.addChild(nextBtn); + + var prevBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/prev")); + prevBtn.position = new Vector(123, 270); + prevBtn.extent = new Vector(75, 45); + prevBtn.pressedAction = (e) -> { + setMarbleSelection(curSelection - 1); + } + setMarbleSelection(curSelection); + this.addChild(prevBtn); + } + + function buildObjectShow(dtsPath:String, position:Vector, extent:Vector, dist:Float = 5, pitch:Float = 0, matnameOverride:Map${title}
'; + this.addChild(titleText); + + var contentText = new GuiMLText(arial14, null); + contentText.horizSizing = Center; + contentText.position = new Vector(33, 66); + contentText.extent = new Vector(377, 350); + contentText.text.textColor = 0; + contentText.text.text = text; + this.addChild(contentText); + + var okBtn = new GuiButton(loadButtonImages("data/ui/motd/ok")); + okBtn.position = new Vector(179, 254); + okBtn.extent = new Vector(88, 41); + okBtn.vertSizing = Top; + okBtn.pressedAction = (e) -> { + MarbleGame.instance.paused = false; + MarbleGame.canvas.popDialog(this); + MarbleGame.instance.world.setCursorLock(true); + } + this.addChild(okBtn); + } + + public static function OOBCheck() { + var oobMsgs = [ + "Let\'s be clear of the blatant truth: You suck!", + "Honestly, do you have any control over the marble? It seems to have a life on its own...", + "Are you sure you know how to play Marble Blast?", + "I really hope you\'re seeing this message on Manic Bounce right now. If you\'re not, man do YOU have some practicing to do.", + "Look at the bright side, it\'s part of the learning experience, but it doesn\'t change the fact that you still suck.", + "If we ever had a \'You suck\' achievement, you\'d be having the honour to wear it today.", + "200 more times to go Out of Bounds before you see this message again. For your sake, try and do better.", + "\"I didn\'t play on the computer! It...it was.. my auntie!\" Yeah, right. Admit it, you suck.", + "Are you having fun going Out of Bounds all the time? It seriously looks like it.", + "Don\'t you just hate all these messages that make a mockery of your suckiness? It\'s a joke of course, but it\'s a nice easter egg.\nIf you don\'t want to see them anymore, then stop going Out of Bounds so many times!", + "My grandmother is better than you!", + "We\'ll see what happens first: You finishing the level, or the clock hitting the 100 minute mark.", + "Can we put this on the video show? I mean, that was absolutely stupid of you to go Out of Bounds like that!", + "While we\'re on the subject of you going Out of Bounds, you should try and find out all the possible ways to go Out of Bounds, including the stupid ways which you seem to excel in.", + "This level isn\'t made out completely out of tiny thin tightropes! You have no excuse whatsoever on failing this badly. If you see this message on Tightropes, Under Construction, Catwalks, or Slopwropes, ignore it. Instead, change it to \"HAHAHA!\"", + "Excuse of the Day: \"I was pushed Out of Bounds by an invisible Mega Marble!\"", + "Congratulations, you win--- wait, no, no you don\'t. You went Out of Bounds. Sorry, you lose. Again.", + "I found a way for you not to go Out of Bounds. We\'ll change the shape of the marble to a cube. Wait, never mind, you\'ll still find a way, because you can.", + "You sure you played the beginner levels? You did? Doesn\'t look like it.", + "You know what would be hilarious? This message popping up on \'Training Wheels\'. I hope you aren\'t playing that level right now... are you?", + "Mind if we\'ll change your name to \'Mr. McFail?\'", + "Excuse of the Day: \"But I was distracted by ________ and he/she/it wouldn\'t stop and forced me to go Out of Bounds.\"", + "Which one are you: a bad player or a bad player? We willl go with option C: a really bad player.", + "Excuse of the Day: WHO PUT THAT GRAVITY MODIFIER IN THERE??!?!", + "Excuse of the Day: That In Bounds Trigger WAS NOT in the level last time I played it! Somebody hacked the level and put one in there!", + "Excuse of the Day: My awesome marble was abducted by aliens and was replaced by a really crap one!", + "Excuse of the Day: That Out of Bounds trigger was NOT there before! I swear!", + "Excuse of the Day: I\'m not Xelna :(", + "Excuse of the Day: I don\'t suck, I fell off because I wanted to get to the next 200 Out of Bounds multiplier so I can see the awesome messages that are written down.", + "You know, you won\'t beat the level if you keep falling off. You will, however, see more of these messages. Try and stay on the level next time. Our guess is that you can\'t, because you\'re bad.", + "Look at the statistics page! I bet you fell more times than the amount of levels you beat!", + "Excuse of the Day: I\'m learning to play... the hard way.", + "Apparently your marble isn\'t supermarble. It is suckmarble.", + "Foo-Foo Marble laughs at how bad you are.", + "A Rock Can Do Better!", + "Please, Quit Embarrassing Yourself.", + "Keep this up and you\'ll win the \'Award of LOL\', courtesy of Marble Blast Fubar creators!", + "Marble Blast Fubar creators would like to give you the title of \'Official NOOB of the Year\'. Congratulations!", + "Did you hear that \'Practice Makes Perfect\'? Apparently not.", + "You should create a new level and title it \'Learn the In Bounds and Out of Bounds Triggers\' because you\'re so experienced with them.", + "We\'ve seen the ways you fell while playing this game and we gotta admit, some of their are epic fails. We still can\'t stop laughing!", + "SING WITH ME:\n\nOne hundred and ninety nine times Out of Bounds, one hundred and ninety nine times Out of Bounds, throw the marble off the level, two hundred times Out of Bounds!", + "*sigh*, you just can\'t stop yourself from going Out of Bounds, can you?", + "Excuse of the Day: I\'m playing one of those special levels from Technostick where you must fall off in order to beat them.", + "Excuse of the Day: I\'m under bad karma today.", + "Excuse of the Day: So THAT\'S what my astrologist referred to when he said I\'ll keep falling off today.", + "What do you have against the marble that you keep making it fall off the level?!", + "I bet having a Blast powerup would have really helped you there, no? Well, too bad! \nOh, and if you\'re playing an Ultra level, pretend this message says \"HAHAHA!\" instead.", + "And how is it OUR fault that you\'re playing so badly?", + "Do you ever think about the marble\'s safety when you\'re playing? Apparently not because you\'re really careless with it." + ]; + + var oobSpecial = [ + "You went Out of Bounds for 1,250 times. This program will now sit in the corner and cry about how bad you are and hope that when you open it again you won\'t repeat it. False hopes are still hopes.", + "You went Out of Bounds for 2,500 times. If you aren\'t tired of going Out of Bounds all the time, we sure did. Stop it already!", + "Another 1,250 marbles had fallen to the great sea below, and you\'ve reached the 3,750 Out of Bounds mark. You definitely suck. Ah yes, greenpeace would like to see you in court for your \"contribution\" to rising sea levels.", + "If I had a nickel for every marble that fell Out of Bounds I\'d be rich right now and all thanks to you. However, I\'m not going to give you any money. Instead, I\'ll stick my tongue out at you and then laugh at you. Ah yes, congratulations on hitting the 5,000 Out of Bounds mark.", + "6,750 times Out of Bounds. Let\'s assume, hypothetically, that you won\'t go Out of Bounds ever again. Actually, never mind that, you will still suck even if you don\'t go Out of Bounds again.", + "I have an awesome gut feeling that you are going 7,500 times Out of Bounds on purpose if only to see these messages and to hear about how bad you are.\nWell then, I won\'t keep it away from you.\nYou suck!", + "8,750 times Out of Bounds. For reaching this landmark, I\'m giving you a nice Australian Slang sentence to answer the question: Will you ever stop sucking in this game and go Out of Bounds? Answer:\nTill it rains in Marble Bar\n\n\nIn your language it means:\nNever.", + "Wow, you truly are bad, probably one of the worst Marble Blast players to ever live on this planet. Or you just keep failing to good runs. Are you sure you aren\'t playing an easy level while this message pops up? Whatever, those messages will now repeat themselves (with a few exceptions), but for now, please remember this:\n\n\nYOU suck!", + "SING WITH ME:\n\nForty nine thousand nine hundred and ninety nine times Out of Bounds, forty nine thousand nine hundred and ninety nine times Out of Bounds, knock a marble off the level, fifty thousand times Out of Bounds!", + "What\'s that in the sky? Is it a plane? Is it a bird? No! It\'s the marble! And it\'s way off the level!!! Congratulations on hitting 300,000 Out of Bounds mark. You may now suck more.", + "1,000,000 times Out of Bounds?!?! You seriously love this game, don\'t you? Well then, thanks for playing Marble Blast Platinum! Please keep this bad playing up and continue to go Out of Bounds. We\'ll just laugh at how bad you are. Also, this is the final message as from now on they\'re all repeats. Thank you for sucking at Marble Blast Platinum!", + "You have no life. This is official." + ]; + + var oobMsg = ""; + var oobTitle = "Out of Bounds"; + + switch (Settings.playStatistics.oobs) { + case 1250: + oobMsg = oobSpecial[0]; + case 2500: + oobMsg = oobSpecial[1]; + case 3750: + oobMsg = oobSpecial[2]; + case 5000: + oobMsg = oobSpecial[3]; + case 6250: + oobMsg = oobSpecial[4]; + case 7500: + oobMsg = oobSpecial[5]; + case 8750: + oobMsg = oobSpecial[6]; + case 10000: + oobMsg = oobSpecial[7]; + case 50000: + oobMsg = oobSpecial[8]; + case 300000: + oobMsg = oobSpecial[9]; + case 1000000: + oobMsg = oobSpecial[10]; + case 30000000: + oobMsg = oobSpecial[11]; + } + + if (oobMsg == "") { + if (Settings.playStatistics.oobs != 0 && Settings.playStatistics.oobs % 200 == 0) { + oobTitle = 'Out of Bounds ${Settings.playStatistics.oobs} times'; + oobMsg = oobMsgs[Math.floor(Math.random() * oobMsgs.length)]; + } + } + + if (oobMsg != "") { + MarbleGame.canvas.pushDialog(new OOBInsultGui(oobTitle, oobMsg)); + } + } +} diff --git a/src/gui/OptionsDlg.hx b/src/gui/OptionsDlg.hx index e2dee61a..8abced36 100644 --- a/src/gui/OptionsDlg.hx +++ b/src/gui/OptionsDlg.hx @@ -1,5 +1,7 @@ package gui; +import h2d.filter.DropShadow; +import h2d.Text; import gui.GuiControl.MouseState; import src.AudioManager; import hxd.Key; @@ -17,7 +19,7 @@ class OptionsDlg extends GuiImage { var musicSliderFunc:(dt:Float, mouseState:MouseState) -> Void; public function new() { - var img = ResourceLoader.getImage("data/ui/background.jpg"); + var img = Math.random() >= 0.7 ? ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg') : ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; @@ -36,350 +38,251 @@ class OptionsDlg extends GuiImage { return [normal, hover, pressed]; } - var tabs = new GuiControl(); - tabs.horizSizing = Center; - tabs.vertSizing = Center; - tabs.position = new Vector(60, 15); - tabs.extent = new Vector(520, 450); - this.addChild(tabs); + var window = new GuiImage(ResourceLoader.getResource("data/ui/options/window.png", ResourceLoader.getImage, this.imageResources).toTile()); + window.horizSizing = Center; + window.vertSizing = Center; + window.position = new Vector(-72, -47); + window.extent = new Vector(784, 573); + this.addChild(window); - var setTab:String->Void = null; + var generalBtn = new GuiButton(loadButtonImages('data/ui/options/general')); + generalBtn.position = new Vector(102, 19); + generalBtn.extent = new Vector(134, 65); + window.addChild(generalBtn); - var graphicsTab = new GuiImage(ResourceLoader.getResource("data/ui/options/graf_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); - graphicsTab.position = new Vector(58, 44); - graphicsTab.extent = new Vector(149, 86); + var hotkeysBtn = new GuiButton(loadButtonImages('data/ui/options/hotkeys')); + hotkeysBtn.position = new Vector(325, 19); + hotkeysBtn.extent = new Vector(134, 65); + window.addChild(hotkeysBtn); - var controlsTab = new GuiImage(ResourceLoader.getResource("data/ui/options/cntr_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); - controlsTab.position = new Vector(315, 15); - controlsTab.extent = new Vector(149, 65); + var onlineBtn = new GuiImage(ResourceLoader.getResource("data/ui/options/online_i.png", ResourceLoader.getImage, this.imageResources).toTile()); + onlineBtn.position = new Vector(548, 19); + onlineBtn.extent = new Vector(134, 65); + window.addChild(onlineBtn); - var boxFrame = new GuiImage(ResourceLoader.getResource("data/ui/options/options_base.png", ResourceLoader.getImage, this.imageResources).toTile()); - boxFrame.position = new Vector(25, 14); - boxFrame.extent = new Vector(470, 422); - boxFrame.horizSizing = Center; - boxFrame.vertSizing = Center; + var applyFunc:Void->Void = () -> { + Settings.applySettings(); + }; - var audioTab = new GuiImage(ResourceLoader.getResource("data/ui/options/aud_tab.png", ResourceLoader.getImage, this.imageResources).toTile()); - audioTab.position = new Vector(204, 33); - audioTab.extent = new Vector(114, 75); - - tabs.addChild(audioTab); - tabs.addChild(controlsTab); - tabs.addChild(boxFrame); - tabs.addChild(graphicsTab); - - var mainPane = new GuiControl(); - mainPane.position = new Vector(60, 15); - mainPane.extent = new Vector(520, 480); - mainPane.horizSizing = Center; - mainPane.vertSizing = Center; - this.addChild(mainPane); - - // GRAPHICS PANEL - var graphicsPane = new GuiControl(); - graphicsPane.position = new Vector(35, 110); - graphicsPane.extent = new Vector(438, 298); - - mainPane.addChild(graphicsPane); - var applyFunc:Void->Void = null; - - var mainMenuButton = new GuiButton(loadButtonImages("data/ui/options/mainm")); - mainMenuButton.position = new Vector(330, 356); - mainMenuButton.extent = new Vector(121, 53); - mainMenuButton.pressedAction = (sender) -> { + var homeBtn = new GuiButton(loadButtonImages('data/ui/options/home')); + homeBtn.position = new Vector(292, 482); + homeBtn.extent = new Vector(94, 46); + homeBtn.pressedAction = (sender) -> { applyFunc(); MarbleGame.canvas.setContent(new MainMenuGui()); } - mainPane.addChild(mainMenuButton); + window.addChild(homeBtn); - // Hacky radio box logic - var windowBoxes = []; + var applyBtn = new GuiButton(loadButtonImages('data/ui/options/apply')); + applyBtn.position = new Vector(398, 482); + applyBtn.extent = new Vector(94, 46); + applyBtn.pressedAction = (sender) -> { + applyFunc(); + } + window.addChild(applyBtn); - function updateWindowFunc(sender:GuiButton) { - for (box in windowBoxes) { - if (box != sender) - box.pressed = false; + var generalPanel = new GuiControl(); + generalPanel.position = new Vector(30, 88); + generalPanel.extent = new Vector(726, 394); + window.addChild(generalPanel); + + var currentTab = "general"; + + var hotkeysPanel = new GuiControl(); + hotkeysPanel.position = new Vector(30, 88); + hotkeysPanel.extent = new Vector(726, 394); + + 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 18 * Settings.uiScale, MultiChannel); + var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); + + var optBtns = []; + var optSliders = []; + + var transparentbmp = new hxd.BitmapData(1, 1); + transparentbmp.setPixel(0, 0, 0); + var transparentTile = Tile.fromBitmap(transparentbmp); + + var currentDropDown:GuiImage = null; + + function setAllBtnState(enabled:Bool) { + for (b in optBtns) { + b.disabled = !enabled; } } - var gfxWindow = new GuiButton(loadButtonImages("data/ui/options/grafwindo")); - gfxWindow.position = new Vector(174, 116); - gfxWindow.extent = new Vector(97, 55); - gfxWindow.buttonType = Toggle; - gfxWindow.pressedAction = (sender) -> { - updateWindowFunc(gfxWindow); - } - if (!Settings.optionsSettings.isFullScreen) { - gfxWindow.pressed = true; - } - graphicsPane.addChild(gfxWindow); - windowBoxes.push(gfxWindow); - - var gfxFull = new GuiButton(loadButtonImages("data/ui/options/grafful")); - gfxFull.position = new Vector(288, 118); - gfxFull.extent = new Vector(61, 55); - gfxFull.buttonType = Toggle; - gfxFull.pressedAction = (sender) -> { - updateWindowFunc(gfxFull); - } - if (Settings.optionsSettings.isFullScreen) { - gfxFull.pressed = true; - } - graphicsPane.addChild(gfxFull); - windowBoxes.push(gfxFull); - - var gfxText = new GuiImage(ResourceLoader.getResource("data/ui/options/graf_txt.png", ResourceLoader.getImage, this.imageResources).toTile()); - gfxText.horizSizing = Right; - gfxText.vertSizing = Bottom; - gfxText.position = new Vector(12, 12); - gfxText.extent = new Vector(146, 261); - graphicsPane.addChild(gfxText); - - var resolutionBoxes = []; - - function updateResolutionFunc(sender:GuiButton) { - for (box in resolutionBoxes) { - if (box != sender) - box.pressed = false; + window.pressedAction = (sender) -> { + if (currentDropDown != null) { + var dropdownparent = currentDropDown.parent; + currentDropDown.parent.removeChild(currentDropDown); + currentDropDown = null; + haxe.Timer.delay(() -> setAllBtnState(true), 5); // delay this a bit to avoid update(); } } - var gfx640480 = new GuiButton(loadButtonImages("data/ui/options/graf640")); - gfx640480.position = new Vector(157, -3); - gfx640480.extent = new Vector(84, 53); - gfx640480.buttonType = Radio; - resolutionBoxes.push(gfx640480); - gfx640480.pressedAction = (sender) -> { - updateResolutionFunc(gfx640480); - } - graphicsPane.addChild(gfx640480); - if (Settings.optionsSettings.screenWidth == 640) - gfx640480.pressed = true; + function makeOption(text:String, valueFunc:Void->String, yPos:Float, parent:GuiControl, size:String, options:Array${this.scoreShowing ? "Hide" : "Show"} 5 Top Times
'; + } else { + pmScoreText.text.text = 'Best Time: ${scoreTextTime}
'; + } + } setSelectedFunc = function setSelected(index:Int) { if (index > currentList.length - 1) { @@ -458,18 +796,31 @@ class PlayMissionGui extends GuiImage { } else pmNext.disabled = false; - if (currentCategory != "custom" - && Settings.progression[["beginner", "intermediate", "advanced"].indexOf(currentCategory)] < currentSelection) { - noQualText.text.visible = true; - filt.matrix.identity(); - filt.matrix.colorGain(0, 96 / 255); - pmPlay.disabled = true; - } else { - noQualText.text.visible = false; - filt.matrix.identity(); - pmPlay.disabled = false; + if (pmPreview.children.contains(pmEgg)) + pmPreview.removeChild(pmEgg); + if (currentMission.hasEgg) { + if (Settings.easterEggs.exists(currentMission.path)) { + pmEgg.bmp.tile = ResourceLoader.getResource('data/ui/play/eggfound.png', ResourceLoader.getImage, this.imageResources).toTile(); + } else { + pmEgg.bmp.tile = ResourceLoader.getResource('data/ui/play/eggnotfound.png', ResourceLoader.getImage, this.imageResources).toTile(); + } + + pmPreview.addChild(pmEgg); + pmEgg.render(MarbleGame.canvas.scene2d); } + // if (currentCategory != "custom" + // && Settings.progression[["beginner", "intermediate", "advanced", "expert"].indexOf(currentCategory)] < currentSelection) { + // noQualText.text.visible = true; + // filt.matrix.identity(); + // filt.matrix.colorGain(0, 96 / 255); + // pmPlay.disabled = true; + // } else { + noQualText.text.visible = false; + filt.matrix.identity(); + pmPlay.disabled = false; + // } + if (currentMission == null) { noQualText.text.visible = true; filt.matrix.identity(); @@ -485,69 +836,102 @@ class PlayMissionGui extends GuiImage { currentSelection = -1; } - var scoreData:Array#${currentList.indexOf(currentMission) + 1}: ${currentMission.title}
'; + + if (this.scoreShowing) { + var scoreData:Array${Util.formatTime(score.time)}
'; + rightText += scoreTextTime; + + descText += '${i + 1}. ${score.name}Author: ${currentMission.artist}
'; + descText += '${currentMission.description}'; + pmDescriptionRight.text.text = ''; } pmDescription.text.text = descText; - var descText2 = '
';
+ 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) {
+ if (currentMission.game == "platinum") {
+ pmParText.text.text = 'Platinum: ${Util.formatTime(currentMission.goldTime)}';
+ pmParTextRight.text.text = 'Ultimate: ${Util.formatTime(currentMission.ultimateTime)}
'; } + if (currentMission.game == "gold") { + pmParText.text.text = 'Qualify: ${(currentMission.qualifyTime != Math.POSITIVE_INFINITY) ? Util.formatTime(currentMission.qualifyTime) : "N/A"}'; + pmParTextRight.text.text = 'Gold: ${Util.formatTime(currentMission.goldTime)}
'; + } + } else { + pmParText.text.text = '${currentMission.game == "gold" ? "Qualify" : "Par"} Time: ${(currentMission.qualifyTime != Math.POSITIVE_INFINITY) ? Util.formatTime(currentMission.qualifyTime) : "N/A"}
'; + pmParTextRight.text.text = ''; } - pmDescriptionOther.text.text = descText2; - pmDescriptionOther.text.loadImage = (name) -> goldBadge; - pmPreview.bmp.tile = tmpprevtile; + setScoreHover(scoreButtonHover); + + // pmPreview.bmp.tile = tmpprevtile; #if js switch (previewTimeoutHandle) { case None: previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - currentMission.getPreviewImage(prevImg -> { + var prevpath = currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); + if (prevpath != pmPreview.bmp.tile.getTexture().name) { + pmPreview.bmp.tile = tmpprevtile; + } }, 75)); case Some(previewTimeoutHandle_id): js.Browser.window.clearTimeout(previewTimeoutHandle_id); previewTimeoutHandle = Some(js.Browser.window.setTimeout(() -> { - currentMission.getPreviewImage(prevImg -> { + var prevpath = currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); + if (prevpath != pmPreview.bmp.tile.getTexture().name) { + pmPreview.bmp.tile = tmpprevtile; + } }, 75)); } #end #if hl - currentMission.getPreviewImage(prevImg -> { + var prevpath = currentMission.getPreviewImage(prevImg -> { pmPreview.bmp.tile = prevImg; }); // Shit be sync + if (prevpath != pmPreview.bmp.tile.getTexture().name) { + pmPreview.bmp.tile = tmpprevtile; + } #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); + setCategoryFunc(currentGame, currentCategoryStatic, false); } public override function render(scene2d:Scene) { @@ -564,5 +948,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; + } } } diff --git a/src/gui/Rect.hx b/src/gui/Rect.hx index 5ed559e0..be1e658f 100644 --- a/src/gui/Rect.hx +++ b/src/gui/Rect.hx @@ -6,10 +6,12 @@ import h3d.Vector; class Rect { var position:Vector; var extent:Vector; + var scroll:Vector; public function new(position:Vector, extent:Vector) { this.position = position.clone(); this.extent = extent.clone(); + this.scroll = new Vector(); } public function inRect(point:Vector) { diff --git a/src/gui/SearchGui.hx b/src/gui/SearchGui.hx new file mode 100644 index 00000000..360462e3 --- /dev/null +++ b/src/gui/SearchGui.hx @@ -0,0 +1,245 @@ +package gui; + +import h2d.Tile; +import hxd.BitmapData; +import src.MarbleGame; +import hxd.res.BitmapFont; +import h3d.Vector; +import src.ResourceLoader; +import src.Settings; + +class SearchGui extends GuiImage { + public function new(game:String) { + var img = ResourceLoader.getImage("data/ui/search/window.png"); + super(img.resource.toTile()); + + this.horizSizing = Center; + this.vertSizing = Center; + this.position = new Vector(76, 8); + this.extent = new Vector(487, 463); + + var missionList = []; + for (diff in MissionList.missionList[game]) { + for (mis in diff) { + missionList.push({ + mis: mis, + name: mis.title, + artist: mis.artist, + path: mis.path + }); + } + } + + var displayList = missionList.map(x -> x.name); + displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1)); + missionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1)); + var retrieveMissionList = missionList; + + var searchMissionList:GuiTextListCtrl = null; + var scrollCtrl:GuiScrollCtrl = null; + + var currentSortBy = "title"; + + function sortBy(type:String, txt:String = "") { + if (type == "title") { + retrieveMissionList = missionList.filter(x -> StringTools.contains(x.name.toLowerCase(), txt.toLowerCase())); + displayList = retrieveMissionList.map(x -> x.name); + displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1)); + retrieveMissionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1)); + } + if (type == "artist") { + retrieveMissionList = missionList.filter(x -> StringTools.contains(x.artist.toLowerCase(), txt.toLowerCase())); + retrieveMissionList.sort((x, y) -> x.artist > y.artist ? 1 : (x.artist == y.artist ? 0 : -1)); + displayList = retrieveMissionList.map(x -> '${x.name} By ${x.artist}'); + } + if (type == "file") { + retrieveMissionList = missionList.filter(x -> StringTools.contains(x.path.toLowerCase(), txt.toLowerCase())); + retrieveMissionList.sort((x, y) -> x.path > y.path ? 1 : (x.path == y.path ? 0 : -1)); + var idxofslash = 0; + displayList = retrieveMissionList.map(x -> { + var idxofslash = 0; + var slashcount = 0; + for (i in 0...x.path.length) { + if (x.path.charCodeAt(x.path.length - i - 1) == '/'.code) { + slashcount++; + if (slashcount == 2) { + idxofslash = x.path.length - i - 1; + break; + } + } + } + return '${x.path.substr(idxofslash + 1)}'; + }); + } + searchMissionList.setTexts(displayList); + scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight()); + } + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + var disabledObj = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources); + var disabled = disabledObj != null ? disabledObj.toTile() : null; + return [normal, hover, pressed, disabled]; + } + + 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 18 * Settings.uiScale, MultiChannel); + var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); + + var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual32b = new BitmapFont(domcasual32fontdata.entry); + @:privateAccess domcasual32b.loader = ResourceLoader.loader; + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel); + var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + + var searchCancel = new GuiButton(loadButtonImages("data/ui/search/cancel")); + searchCancel.vertSizing = Top; + searchCancel.position = new Vector(21, 395); + searchCancel.extent = new Vector(94, 45); + searchCancel.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(this); + } + this.addChild(searchCancel); + + var selectedIdx:Int = -1; + + var searchPlay = new GuiButton(loadButtonImages("data/ui/search/play")); + searchPlay.position = new Vector(370, 395); + searchPlay.extent = new Vector(94, 45); + searchPlay.disabled = true; + searchPlay.pressedAction = (e) -> { + if (selectedIdx != -1) { + var mis = retrieveMissionList[selectedIdx]; + cast(this.parent, Canvas).marbleGame.playMission(mis.mis); + } + } + this.addChild(searchPlay); + + var searchTitle = new GuiText(domcasual24); + searchTitle.position = new Vector(52, 19); + searchTitle.extent = new Vector(64, 25); + searchTitle.text.textColor = 0x696969; + searchTitle.text.text = "Title:"; + this.addChild(searchTitle); + + var searchEdit = new GuiTextInput(domcasual24); + searchEdit.position = new Vector(91, 19); + searchEdit.extent = new Vector(373, 29); + searchEdit.onTextChange = (txt) -> { + sortBy(currentSortBy, txt); + }; + this.addChild(searchEdit); + + scrollCtrl = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile()); + scrollCtrl.position = new Vector(19, 65); + scrollCtrl.extent = new Vector(447, 317); + this.addChild(scrollCtrl); + + searchMissionList = new GuiTextListCtrl(markerFelt24, displayList); + searchMissionList.selectedColor = 0; + searchMissionList.horizSizing = Width; + searchMissionList.position = new Vector(4, -1); + searchMissionList.extent = new Vector(432, 2880); + searchMissionList.textYOffset = -6; + searchMissionList.scrollable = true; + searchMissionList.onSelectedFunc = (sel) -> { + selectedIdx = sel; + if (retrieveMissionList.length <= selectedIdx || selectedIdx < 0) { + searchPlay.disabled = true; + } else { + searchPlay.disabled = false; + } + } + scrollCtrl.addChild(searchMissionList); + scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight()); + + var optionsPopup:GuiButton = null; + + var searchOptions = new GuiButton(loadButtonImages("data/ui/search/options")); + searchOptions.vertSizing = Top; + searchOptions.horizSizing = Right; + searchOptions.position = new Vector(121, 395); + searchOptions.extent = new Vector(94, 45); + searchOptions.pressedAction = (e) -> { + MarbleGame.canvas.pushDialog(optionsPopup); + } + this.addChild(searchOptions); + + var temprev = new BitmapData(1, 1); + temprev.setPixel(0, 0, 0); + var tmpprevtile = Tile.fromBitmap(temprev); + + optionsPopup = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]); + optionsPopup.horizSizing = Width; + optionsPopup.vertSizing = Height; + optionsPopup.position = new Vector(0, 0); + optionsPopup.extent = new Vector(640, 480); + optionsPopup.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(optionsPopup, false); + } + + var optionsPopupInner = new GuiControl(); + optionsPopupInner.horizSizing = Center; + optionsPopupInner.vertSizing = Center; + optionsPopupInner.position = new Vector(80, 7); + optionsPopupInner.extent = new Vector(480, 465); + optionsPopup.addChild(optionsPopupInner); + + var optionsBgR = ResourceLoader.getResource('data/ui/search/more.png', ResourceLoader.getImage, this.imageResources).toTile(); + + var optionsBg = new GuiImage(optionsBgR); + optionsBg.position = new Vector(0, 281); + optionsBg.extent = new Vector(348, 148); + optionsPopupInner.addChild(optionsBg); + + var searchByFile = new GuiButton(loadButtonImages("data/ui/search/file")); + searchByFile.buttonType = Radio; + searchByFile.position = new Vector(229, 32); + searchByFile.extent = new Vector(68, 45); + searchByFile.pressedAction = (e) -> { + searchTitle.text.text = "File:"; + currentSortBy = "file"; + sortBy("file"); + }; + optionsBg.addChild(searchByFile); + + var searchByartist = new GuiButton(loadButtonImages("data/ui/search/artist")); + searchByartist.buttonType = Radio; + searchByartist.position = new Vector(159, 32); + searchByartist.extent = new Vector(72, 45); + searchByartist.pressedAction = (e) -> { + searchTitle.text.text = "Artist:"; + currentSortBy = "artist"; + sortBy("artist"); + }; + optionsBg.addChild(searchByartist); + + var searchByTitle = new GuiButton(loadButtonImages("data/ui/search/name")); + searchByTitle.buttonType = Radio; + searchByTitle.position = new Vector(92, 32); + searchByTitle.extent = new Vector(68, 45); + searchByTitle.pressed = true; + searchByTitle.pressedAction = (e) -> { + searchTitle.text.text = "Title:"; + currentSortBy = "title"; + sortBy("title"); + }; + optionsBg.addChild(searchByTitle); + + var searchRandom = new GuiButton(loadButtonImages("data/ui/search/random")); + searchRandom.vertSizing = Top; + searchRandom.position = new Vector(44, 32); + searchRandom.extent = new Vector(44, 44); + searchRandom.pressedAction = (e) -> { + var mis = missionList[Math.floor(Math.random() * missionList.length)]; + cast(this.parent, Canvas).marbleGame.playMission(mis.mis); + } + optionsBg.addChild(searchRandom); + } +} diff --git a/src/gui/StatisticsGui.hx b/src/gui/StatisticsGui.hx new file mode 100644 index 00000000..3635c611 --- /dev/null +++ b/src/gui/StatisticsGui.hx @@ -0,0 +1,211 @@ +package gui; + +import hxd.res.BitmapFont; +import h3d.Vector; +import src.ResourceLoader; +import src.MarbleGame; +import src.Settings; +import src.Settings.PlayStatistics; +import src.Mission; +import src.Util; + +class StatisticsGui extends GuiImage { + public function new(game:String) { + var img = ResourceLoader.getImage("data/ui/achiev/window.png"); + super(img.resource.toTile()); + this.horizSizing = Center; + this.vertSizing = Center; + this.position = new Vector(73, -21); + this.extent = new Vector(493, 512); + + var stat = new GuiImage(ResourceLoader.getResource("data/ui/play/statistics_text.png", ResourceLoader.getImage, this.imageResources).toTile()); + stat.position = new Vector(176, 25); + stat.extent = new Vector(160, 39); + this.addChild(stat); + + var arial14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); + var arial14b = new BitmapFont(arial14fontdata.entry); + @:privateAccess arial14b.loader = ResourceLoader.loader; + var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); + + var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); + var domcasual32b = new BitmapFont(domcasual32fontdata.entry); + @:privateAccess domcasual32b.loader = ResourceLoader.loader; + var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel); + var domcasual24 = domcasual32b.toSdfFont(cast 21 * Settings.uiScale, MultiChannel); + + function mlFontLoader(text:String) { + switch (text) { + case "DomCasual24": + return domcasual24; + case "Arial14": + return arial14; + default: + return null; + } + } + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed, disabled]; + } + + var statLabel = new GuiMLText(domcasual24, mlFontLoader); + statLabel.position = new Vector(39, 51); + statLabel.extent = new Vector(341, 375); + statLabel.text.textColor = 0; + statLabel.text.lineSpacing = 4; + this.addChild(statLabel); + + var statText = new GuiMLText(domcasual24, mlFontLoader); + statText.position = new Vector(59, 54); + statText.extent = new Vector(389, 375); + statText.horizSizing = Left; + statText.text.textColor = 0; + statText.text.lineSpacing = 4; + + if (game == "platinum") { + statLabel.text.text = "Beginner:${Math.floor(beginnerCompletion * 100)}%
' + + '${Math.floor(intermediateCompletion * 100)}%
' + + '${Math.floor(advancedCompletion * 100)}%
' + + '${Math.floor(expertCompletion * 100)}%
' + + '${Math.floor(totalCompletion * 100)}%
' + + '${totalPlatinums}/120 ${Math.floor(totalPlatinums / 120.0 * 100)}%
' + + '${totalUltimates}/120 ${Math.floor(totalUltimates / 120.0 * 100)}%
' + + '${totalEggs}/96 ${Math.floor(totalEggs / 96 * 100)}%
' + + '${Settings.playStatistics.oobs}
' + + '${Settings.playStatistics.respawns}
' + + '${hardestLevel != null ? hardestLevel.title : ""}
' + + + '${hardestLevel != null ? 'With ${hardestStats.oobs} OOBs, ${hardestStats.respawns} Respawns, and ${Util.formatTimeHours(hardestStats.totalTime)} Played': ""}
' + + '${Util.formatTimeHours(totalBestTime)}
' + + '${Util.formatTimeHours(Settings.playStatistics.totalTime)}
'; + } + if (game == "gold") { + var beginnerCompletion = completions["beginner"].filter(x -> x.beatPar).length / completions["beginner"].length; + var intermediateCompletion = completions["intermediate"].filter(x -> x.beatPar).length / completions["intermediate"].length; + var advancedCompletion = completions["advanced"].filter(x -> x.beatPar).length / completions["advanced"].length; + var totalCompletion:Float = completions["beginner"].filter(x -> x.beatPar).length + + completions["intermediate"].filter(x -> x.beatPar).length + completions["advanced"].filter(x -> x.beatPar).length; + totalCompletion /= completions["beginner"].length + completions["intermediate"].length + completions["advanced"].length; + + statText.text.text = '${Math.floor(beginnerCompletion * 100)}%
' + + '${Math.floor(intermediateCompletion * 100)}%
' + + '${Math.floor(advancedCompletion * 100)}%
' + + '${Math.floor(totalCompletion * 100)}%
' + + '${totalPlatinums}/100 ${Math.floor(totalPlatinums / 100.0 * 100)}%
' + + '${Settings.playStatistics.oobs}
' + + '${Settings.playStatistics.respawns}
' + + '${hardestLevel != null ? hardestLevel.title : ""}
' + + + '${hardestLevel != null ? 'With ${hardestStats.oobs} OOBs, ${hardestStats.respawns} Respawns, and ${Util.formatTimeHours(hardestStats.totalTime)} Played': ""}
' + + '${Util.formatTimeHours(totalBestTime)}
' + + '${Util.formatTimeHours(Settings.playStatistics.totalTime)}
'; + } + } +} diff --git a/src/gui/TouchCtrlsEditGui.hx b/src/gui/TouchCtrlsEditGui.hx index b44cc827..122aa98d 100644 --- a/src/gui/TouchCtrlsEditGui.hx +++ b/src/gui/TouchCtrlsEditGui.hx @@ -8,10 +8,11 @@ import h3d.Vector; import src.ResourceLoader; import src.MarbleGame; import src.Settings; +import src.Util; class TouchCtrlsEditGui extends GuiImage { public function new() { - var img = ResourceLoader.getImage("data/ui/background.jpg"); + var img = Math.random() >= 0.7 ? ResourceLoader.getImage('data/ui/backgrounds/platinum/${cast (Math.floor(Util.lerp(1, 28, Math.random())), Int)}.jpg') : ResourceLoader.getImage('data/ui/backgrounds/gold/${cast (Math.floor(Util.lerp(1, 12, Math.random())), Int)}.jpg'); super(img.resource.toTile()); this.horizSizing = Width; this.vertSizing = Height; @@ -30,11 +31,11 @@ class TouchCtrlsEditGui extends GuiImage { @:privateAccess domcasual32b.loader = ResourceLoader.loader; var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); - var mainMenuButton = new GuiButton(loadButtonImages("data/ui/options/mainm")); - mainMenuButton.position = new Vector(500, 400); - mainMenuButton.extent = new Vector(121, 53); + var mainMenuButton = new GuiButton(loadButtonImages("data/ui/menu/options")); + mainMenuButton.position = new Vector(380, 15); + mainMenuButton.extent = new Vector(247, 164); mainMenuButton.horizSizing = Left; - mainMenuButton.vertSizing = Top; + mainMenuButton.vertSizing = Bottom; mainMenuButton.pressedAction = (sender) -> { MarbleGame.canvas.setContent(new OptionsDlg()); } diff --git a/src/mis/MisParser.hx b/src/mis/MisParser.hx index ace186cd..c719e585 100644 --- a/src/mis/MisParser.hx +++ b/src/mis/MisParser.hx @@ -1,5 +1,6 @@ package mis; +import Macros.MisParserMacros; import haxe.Exception; import mis.MissionElement.MissionElementPathedInterior; import mis.MissionElement.MissionElementPath; @@ -144,35 +145,35 @@ class MisParser { case "SimGroup": element = this.readSimGroup(name); case "ScriptObject": - element = this.readScriptObject(name); + MisParserMacros.parseObject(name, MissionElementScriptObject, MissionElementType.ScriptObject); case "MissionArea": - element = this.readMissionArea(name); + MisParserMacros.parseObject(name, MissionElementMissionArea, MissionElementType.MissionArea); case "Sky": - element = this.readSky(name); + MisParserMacros.parseObject(name, MissionElementSky, MissionElementType.Sky); case "Sun": - element = this.readSun(name); + MisParserMacros.parseObject(name, MissionElementSun, MissionElementType.Sun); case "InteriorInstance": - element = this.readInteriorInstance(name); + MisParserMacros.parseObject(name, MissionElementInteriorInstance, MissionElementType.InteriorInstance); case "StaticShape": - element = this.readStaticShape(name); + MisParserMacros.parseObject(name, MissionElementStaticShape, MissionElementType.StaticShape); case "Item": - element = this.readItem(name); + MisParserMacros.parseObject(name, MissionElementItem, MissionElementType.Item); case "Path": element = this.readPath(name); case "Marker": - element = this.readMarker(name); + MisParserMacros.parseObject(name, MissionElementMarker, MissionElementType.Marker); case "PathedInterior": - element = this.readPathedInterior(name); + MisParserMacros.parseObject(name, MissionElementPathedInterior, MissionElementType.PathedInterior); case "Trigger": - element = this.readTrigger(name); + MisParserMacros.parseObject(name, MissionElementTrigger, MissionElementType.Trigger); case "AudioProfile": - element = this.readAudioProfile(name); + MisParserMacros.parseObject(name, MissionElementAudioProfile, MissionElementType.AudioProfile); case "MessageVector": - element = this.readMessageVector(name); + MisParserMacros.parseObject(name, MissionElementMessageVector, MissionElementType.MessageVector); case "TSStatic": - element = this.readTSStatic(name); + MisParserMacros.parseObject(name, MissionElementTSStatic, MissionElementType.TSStatic); case "ParticleEmitterNode": - element = this.readParticleEmitterNode(name); + MisParserMacros.parseObject(name, MissionElementParticleEmitterNode, MissionElementType.ParticleEmitterNode); default: trace("Unknown element type! " + type); // Still advance the index @@ -274,76 +275,8 @@ class MisParser { Reflect.setField(obj, key, value[0]); } } - } - function readScriptObject(name:String) { - var obj = new MissionElementScriptObject(); - obj._type = MissionElementType.ScriptObject; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readMissionArea(name:String) { - var obj = new MissionElementMissionArea(); - obj._type = MissionElementType.MissionArea; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readSky(name:String) { - var obj = new MissionElementSky(); - obj._type = MissionElementType.Sky; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readSun(name:String) { - var obj = new MissionElementSun(); - obj._type = MissionElementType.Sun; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readInteriorInstance(name:String) { - var obj = new MissionElementInteriorInstance(); - obj._type = MissionElementType.InteriorInstance; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readStaticShape(name:String) { - var obj = new MissionElementStaticShape(); - obj._type = MissionElementType.StaticShape; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readItem(name:String) { - var obj = new MissionElementItem(); - obj._type = MissionElementType.Item; - obj._name = name; - - copyFields(obj); - - return obj; + Reflect.setField(obj, "fields", values); } function readPath(name:String) { @@ -357,76 +290,6 @@ class MisParser { return obj; } - function readMarker(name:String) { - var obj = new MissionElementMarker(); - obj._type = MissionElementType.Marker; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readPathedInterior(name:String) { - var obj = new MissionElementPathedInterior(); - obj._type = MissionElementType.PathedInterior; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readTrigger(name:String) { - var obj = new MissionElementTrigger(); - obj._type = MissionElementType.Trigger; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readAudioProfile(name:String) { - var obj = new MissionElementAudioProfile(); - obj._type = MissionElementType.AudioProfile; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readMessageVector(name:String) { - var obj = new MissionElementMessageVector(); - obj._type = MissionElementType.MessageVector; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readTSStatic(name:String) { - var obj = new MissionElementTSStatic(); - obj._type = MissionElementType.TSStatic; - obj._name = name; - - copyFields(obj); - - return obj; - } - - function readParticleEmitterNode(name:String) { - var obj = new MissionElementParticleEmitterNode(); - obj._type = MissionElementType.ParticleEmitterNode; - obj._name = name; - - copyFields(obj); - - return obj; - } - /** Resolves a TorqueScript rvalue expression. Currently only supports the concatenation @ operator. */ function resolveExpression(expr:String) { var parts = Util.splitIgnoreStringLiterals(expr, ' @ ').map(x -> { @@ -519,4 +382,15 @@ class MisParser { } return result; } + + /** Parses a boolean value. */ + public static function parseBoolean(string:String) { + if (string == null) + return false; + if (string == "") + return false; + if (string == "0") + return false; + return true; + } } diff --git a/src/mis/MissionElement.hx b/src/mis/MissionElement.hx index 26bd34fe..e597fd4e 100644 --- a/src/mis/MissionElement.hx +++ b/src/mis/MissionElement.hx @@ -30,6 +30,8 @@ class MissionElementBase { /** Is unique for every element in the mission file. */ var _id:Int; + + var fields:Map