diff options
author | Jared Adams <jaxad0127@gmail.com> | 2009-04-08 20:34:11 -0600 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2009-04-08 20:41:45 -0600 |
commit | 801da408e5756f19ee50bdc463f2fc6390573b65 (patch) | |
tree | d791d5e4cbc8e7d84900034c03b2a43a7a906bbb /src | |
parent | d6f7a1d18f4d31565f756200f017fe8ee5262b27 (diff) | |
download | mana-801da408e5756f19ee50bdc463f2fc6390573b65.tar.gz mana-801da408e5756f19ee50bdc463f2fc6390573b65.tar.bz2 mana-801da408e5756f19ee50bdc463f2fc6390573b65.tar.xz mana-801da408e5756f19ee50bdc463f2fc6390573b65.zip |
Add a more flexible wallpaper system
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/main.cpp | 60 | ||||
-rw-r--r-- | src/resources/wallpaper.cpp | 99 | ||||
-rw-r--r-- | src/resources/wallpaper.h | 53 |
5 files changed, 198 insertions, 18 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 09ea3536..0ffb7c5a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -294,6 +294,8 @@ SET(SRCS resources/soundeffect.cpp resources/spritedef.h resources/spritedef.cpp + resources/wallpaper.cpp + resources/wallpaper.h utils/base64.cpp utils/base64.h utils/dtor.h diff --git a/src/Makefile.am b/src/Makefile.am index b19c065f..d48dbe60 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -249,6 +249,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ resources/soundeffect.cpp \ resources/spritedef.h \ resources/spritedef.cpp \ + resources/wallpaper.cpp \ + resources/wallpaper.h \ utils/base64.cpp \ utils/base64.h \ utils/dtor.h \ diff --git a/src/main.cpp b/src/main.cpp index de1ce635..27e61f19 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,6 +93,7 @@ #include "resources/monsterdb.h" #include "resources/npcdb.h" #include "resources/resourcemanager.h" +#include "resources/wallpaper.h" #include "utils/gettext.h" #include "utils/stringutils.h" @@ -977,25 +978,14 @@ int main(int argc, char *argv[]) Net::getGeneralHandler()->load(); // Set the most appropriate wallpaper, based on screen width + Wallpaper::loadWallpapers(); + int screenWidth = (int) config.getValue("screenwidth", defaultScreenWidth); -#ifdef EATHENA_SUPPORT int screenHeight = static_cast<int>(config.getValue("screenheight", defaultScreenHeight)); -#endif - std::string wallpaperName; - wallpaperName = "graphics/images/login_wallpaper.png"; - if (screenWidth >= 1024 && screenWidth < 1280) - wallpaperName = "graphics/images/login_wallpaper_1024x768.png"; - else if (screenWidth >= 1280 && screenWidth < 1440) - wallpaperName = "graphics/images/login_wallpaper_1280x960.png"; - else if (screenWidth >= 1440 && screenWidth < 1600) - wallpaperName = "graphics/images/login_wallpaper_1440x1080.png"; - else if (screenWidth >= 1600) - wallpaperName = "graphics/images/login_wallpaper_1600x1200.png"; - - if (!ResourceManager::getInstance()->exists(wallpaperName)) - wallpaperName = "graphics/images/login_wallpaper.png"; + std::string wallpaperName = Wallpaper::getWallpaper(screenWidth, + screenHeight); login_wallpaper = ResourceManager::getInstance()->getImage(wallpaperName); @@ -1206,6 +1196,25 @@ int main(int argc, char *argv[]) EmoteDB::load(); Units::loadUnits(); + Wallpaper::loadWallpapers(); + + { + int screenWidth = (int) config.getValue("screenwidth", + defaultScreenWidth); + int screenHeight = (int) config.getValue("screenheight", + defaultScreenHeight); + + Image *temp = ResourceManager::getInstance() + ->getImage(Wallpaper::getWallpaper(screenWidth, + screenHeight)); + + if (temp) + { + login_wallpaper->decRef(); + login_wallpaper = temp; + } + } + state = STATE_LOGIN; break; @@ -1401,9 +1410,24 @@ int main(int argc, char *argv[]) case STATE_UPDATE: loadUpdates(); // Reload the wallpaper in case that it was updated - login_wallpaper->decRef(); - login_wallpaper = ResourceManager::getInstance()-> - getImage(wallpaperName); + Wallpaper::loadWallpapers(); + + { + int screenWidth = (int) config.getValue("screenwidth", + defaultScreenWidth); + int screenHeight = (int) config.getValue("screenheight", + defaultScreenHeight); + + Image *temp = ResourceManager::getInstance() + ->getImage(Wallpaper::getWallpaper(screenWidth, + screenHeight)); + + if (temp) + { + login_wallpaper->decRef(); + login_wallpaper = temp; + } + } break; // Those states don't cause a network disconnect diff --git a/src/resources/wallpaper.cpp b/src/resources/wallpaper.cpp new file mode 100644 index 00000000..24c6fff2 --- /dev/null +++ b/src/resources/wallpaper.cpp @@ -0,0 +1,99 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <algorithm> +#include <cstring> +#include <physfs.h> + +#include "resources/wallpaper.h" + +#include "log.h" + +#include "utils/strprintf.h" + +#define WALLPAPER_FOLDER "graphics/images/" + +#define WALLPAPER_BASE "login_wallpaper" + +struct wallpaper { + Uint16 width; + Uint16 height; +}; + +std::vector<struct wallpaper> wallpapers; +bool haveBackup; // Is the backup (no size given) version availabnle? + +bool wallpaperCompare(struct wallpaper x, struct wallpaper y) +{ + int aX = x.width * x.height; + int aY = y.width * y.height; + + if (aX > aY || (aX == aY && x.width > y.width)) return true; + return false; +} + +void Wallpaper::loadWallpapers() +{ + char **imgs = PHYSFS_enumerateFiles(WALLPAPER_FOLDER); + char **i; + int baseLen = strlen(WALLPAPER_BASE), width, height; + + wallpapers.clear(); + + haveBackup = false; + + for (i = imgs; *i != NULL; i++) + if (strncmp(*i, WALLPAPER_BASE, baseLen) == 0) + if (strlen(*i) == baseLen + 4) + if (haveBackup) + logger->log("Duplicate default wallpaper!"); + else haveBackup = true; + else if (sscanf(*i, WALLPAPER_BASE "_%dx%d.png", &width, + &height) == 2) + { + struct wallpaper wp; + wp.width = width; + wp.height = height; + wallpapers.push_back(wp); + } + + PHYSFS_freeList(imgs); + + std::sort(wallpapers.begin(), wallpapers.end(), wallpaperCompare); +} + +std::string Wallpaper::getWallpaper(int width, int height) +{ + std::vector<wallpaper>::iterator iter; + wallpaper wp; + + for(iter = wallpapers.begin(); iter != wallpapers.end(); iter++) + { + wp = *iter; + if (wp.width <= width && wp.height <= height) + return std::string(strprintf(WALLPAPER_FOLDER WALLPAPER_BASE + "_%dx%d.png", wp.width, wp.height)); + } + + if (haveBackup) return std::string(WALLPAPER_FOLDER WALLPAPER_BASE ".png"); + + return std::string(""); +} diff --git a/src/resources/wallpaper.h b/src/resources/wallpaper.h new file mode 100644 index 00000000..9a0a3585 --- /dev/null +++ b/src/resources/wallpaper.h @@ -0,0 +1,53 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef WALLPAPER_H +#define WALLPAPER_H + +#include <string> +#include <vector> + +#include <SDL_types.h> + +/** + * Handles organizing and choosing of wallpapers. + */ +class Wallpaper +{ + public: + /** + * Reads the folder that contains wallpapers and organizes the + * wallpapers found by area, width, and height. + */ + static void loadWallpapers(); + + /** + * Returns the larget wallpaper for the given resolution, or the + * default wallpaper if none are found. + * + * @param width the desired width + * @param height the desired height + * @return the file to use, or empty if no wallpapers are useable + */ + static std::string getWallpaper(int width, int height); +}; + +#endif // WALLPAPER_H |