230 lines
6.4 KiB
C++
230 lines
6.4 KiB
C++
/* -*- C++ -*- */
|
|
/*
|
|
GAV - Gpl Arcade Volleyball
|
|
|
|
Copyright (C) 2002
|
|
GAV team (http://sourceforge.net/projects/gav/)
|
|
|
|
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
|
|
(at your option) 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#ifndef _THEMES_H_
|
|
#define _THEMES_H_
|
|
#include <string>
|
|
#include <iostream>
|
|
|
|
#include <sys/types.h>
|
|
#ifndef WIN32
|
|
#include <dirent.h>
|
|
#else
|
|
#include <windows.h>
|
|
#endif /* WIN32 */
|
|
|
|
#include <SDL.h>
|
|
#include <SDL_image.h>
|
|
|
|
#include "SoundMgr.h"
|
|
#include "globals.h"
|
|
#include "GameRenderer.h"
|
|
#include "Menu.h"
|
|
#include "MenuItem.h"
|
|
#include "MenuItemMonitor.h"
|
|
|
|
#define TH_DIR "themes"
|
|
|
|
#define TH_NET "net.png"
|
|
#define TH_LEFTMALE "plml.png"
|
|
#define TH_RIGHTMALE "plmr.png"
|
|
#define TH_LEFTFEMALE "plfl.png"
|
|
#define TH_RIGHTFEMALE "plfr.png"
|
|
#define TH_BACKGROUND_JPG "background.jpg"
|
|
#define TH_BACKGROUND_PNG "background.png"
|
|
#define TH_BACKGROUND_BIG_JPG "background_big.jpg"
|
|
#define TH_BACKGROUND_BIG_PNG "background_big.png"
|
|
#define TH_BALL "ball.png"
|
|
#define TH_FONT "Font.png"
|
|
#define TH_FONTINV "FontInv.png"
|
|
#define TH_CONFNAME "theme.conf"
|
|
|
|
extern std::string ThemeDir;
|
|
|
|
class Theme {
|
|
private:
|
|
std::string _name;
|
|
bool _hasnet; // To possibly add the image of the net (not used yet)
|
|
std::string _background;
|
|
std::string _net;
|
|
std::string _font;
|
|
std::string _fontinv;
|
|
std::string _leftmale;
|
|
std::string _rightmale;
|
|
std::string _leftfemale;
|
|
std::string _rightfemale;
|
|
std::string _ball;
|
|
std::string _confFile;
|
|
std::string TD;
|
|
bool _hasConfFile;
|
|
bool _bigBackground;
|
|
bool _checkTheme(); // Theme Validation
|
|
|
|
public:
|
|
Theme(std::string name) {
|
|
#ifndef WIN32
|
|
DIR *dir;
|
|
if ((dir = opendir(ThemeDir.c_str())) == NULL) {
|
|
ThemeDir = "/usr/share/games/gav/" + ThemeDir;
|
|
if ((dir = opendir(ThemeDir.c_str())) == NULL) {
|
|
std::cerr << "Cannot find themes directory\n";
|
|
exit(0);
|
|
} else
|
|
closedir(dir);
|
|
} else
|
|
closedir(dir);
|
|
|
|
configuration.currentTheme = name;
|
|
TD = ThemeDir + "/" + name + "/";
|
|
|
|
#else
|
|
HANDLE hFindFile ;
|
|
WIN32_FIND_DATA ffdData ;
|
|
|
|
hFindFile = FindFirstFile (ThemeDir.c_str(), &ffdData) ;
|
|
if (hFindFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
std::cerr << "Cannot find themes directory\n" ;
|
|
exit(0) ;
|
|
}
|
|
|
|
FindClose (hFindFile) ;
|
|
|
|
TD = ThemeDir + "\\" + name + "\\" ;
|
|
|
|
#endif /* WIN32 */
|
|
|
|
_name = name;
|
|
|
|
_bigBackground = configuration.bgBig;
|
|
|
|
if ( _bigBackground ) {
|
|
printf("Big Background hack: FIX IT!\n");
|
|
configuration.env.w = BIG_ENVIRONMENT_WIDTH;
|
|
configuration.env.h = BIG_ENVIRONMENT_HEIGHT;
|
|
double rat = ((double) configuration.desiredResolution.y) /
|
|
(double) BIG_ENVIRONMENT_HEIGHT;
|
|
int w = (int) (rat * BIG_ENVIRONMENT_WIDTH);
|
|
int h = configuration.desiredResolution.y;
|
|
configuration.setResolution(w, h);
|
|
configuration.scaleFactors(BIG_ENVIRONMENT_WIDTH,
|
|
BIG_ENVIRONMENT_HEIGHT);
|
|
} else {
|
|
configuration.env.w = ENVIRONMENT_WIDTH;
|
|
configuration.env.h = ENVIRONMENT_HEIGHT;
|
|
configuration.setResolutionToDesired();
|
|
configuration.scaleFactors(ENVIRONMENT_WIDTH, ENVIRONMENT_HEIGHT);
|
|
}
|
|
|
|
_net = TD + TH_NET;
|
|
|
|
if (!_bigBackground)
|
|
_background = TD + TH_BACKGROUND_PNG;
|
|
else
|
|
_background = TD + TH_BACKGROUND_BIG_PNG;
|
|
|
|
_font = TD + TH_FONT;
|
|
_fontinv = TD + TH_FONTINV;
|
|
|
|
_leftmale = TD + TH_LEFTMALE;
|
|
_rightmale = TD + TH_RIGHTMALE;
|
|
_leftfemale = TD + TH_LEFTFEMALE;
|
|
_rightfemale = TD + TH_RIGHTFEMALE;
|
|
_confFile = TD + TH_CONFNAME;
|
|
|
|
_ball = TD + TH_BALL;
|
|
|
|
_hasnet = Theme::_checkTheme();
|
|
|
|
// ::background = IMG_Load(background());
|
|
// TODO: fetch the environment size (and therefore the ratios)
|
|
// from the background image
|
|
|
|
//if ( CurrentTheme->hasnet() ) IMG_Load(CurrentTheme->net());
|
|
|
|
//screenFlags = SDL_DOUBLEBUF|SDL_HWSURFACE;
|
|
//screenFlags |= SDL_DOUBLEBUF;
|
|
screen = SDL_SetVideoMode(configuration.resolution.x,
|
|
configuration.resolution.y,
|
|
videoinfo->vfmt->BitsPerPixel,
|
|
screenFlags);
|
|
|
|
::background = new LogicalFrameSeq(background(), 1, false);
|
|
|
|
gameRenderer = new GameRenderer(configuration.resolution.x,
|
|
configuration.resolution.y,
|
|
configuration.env.w,
|
|
configuration.env.h);
|
|
|
|
cga = new ScreenFont(font(), FONT_FIRST_CHAR, FONT_NUMBER);
|
|
cgaInv = new ScreenFont(fontinv(), FONT_FIRST_CHAR, FONT_NUMBER);
|
|
|
|
MenuItemMonitor().apply();
|
|
|
|
#ifdef AUDIO
|
|
if ( soundMgr )
|
|
delete(soundMgr);
|
|
soundMgr = new SoundMgr((TD+"sounds").c_str(),
|
|
(ThemeDir+"/../sounds").c_str());
|
|
#endif // AUDIO
|
|
}
|
|
|
|
~Theme() {
|
|
delete(::background);
|
|
delete(cga);
|
|
delete(cgaInv);
|
|
delete(gameRenderer);
|
|
}
|
|
|
|
#define _CCS(str) ((str).c_str())
|
|
|
|
inline const char * name() { return( _CCS(_name) );}
|
|
inline bool hasnet() { return( _hasnet );}
|
|
inline bool bigBackground() { return( _bigBackground );}
|
|
inline const char * background() { return( _CCS(_background) );}
|
|
inline const char * net() { return( _CCS(_net) );}
|
|
inline const char * font() { return( _CCS(_font) );}
|
|
inline const char * fontinv() { return( _CCS(_fontinv) );}
|
|
inline const char * leftmale() { return( _CCS(_leftmale) );}
|
|
inline const char * rightmale() { return( _CCS(_rightmale) );}
|
|
inline const char * leftfemale() { return( _CCS(_leftfemale) );}
|
|
inline const char * rightfemale(){ return( _CCS(_rightfemale) );}
|
|
inline const char * ball() { return( _CCS(_ball) );}
|
|
|
|
void loadConf();
|
|
|
|
class ThemeErrorException {
|
|
public:
|
|
std::string message;
|
|
ThemeErrorException(std::string msg) {
|
|
message = msg;
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
extern Theme *CurrentTheme;
|
|
|
|
|
|
inline void setThemeDir(std::string h) { ThemeDir = h; }
|
|
#endif
|